Es gibt einige Teile, die weggelassen werden, S3-Einstellungen usw. Hier sind die Schritte zum Implementieren von TwitBot auf AWS Lambda.
Es wird angenommen, dass S3 im Voraus über JSON-Daten verfügt.
Der Dateiname der JSON-Daten lautet yyyymmdd.json
Die Struktur ist wie folgt: ↓ ↓
Zuerst aus der Entwicklungsumgebung. Für Mac arbeiten Sie im Terminal.
Nach dem Erstellen des Arbeitsverzeichnisses (hier lambda_function) Führen Sie die folgenden Befehle der Reihe nach aus.
pip install virtualenv
source /{your path}/lambda_function/bin/activate
cd /{your path}/lambda_function/
pip install python-lambda-local
pip install lambda-uploader
virtualenv Dadurch wird eine virtuelle Ausführungsumgebung für Python im angegebenen Verzeichnis erstellt. Auf diese Weise können Sie das Modul in einer begrenzten Umgebung testen.
python-lambda-local
Dies ist ein Tool zum Ausführen von Lambda-Funktionen in der lokalen Umgebung.
Erstellen Sie zum Ausführen eine Datei mit dem Namen event.json und geben Sie sie in Lambda an
Erstellen Sie einen vorläufigen Eingabewert.
Mit dem folgenden Befehl ausführen ↓ ↓
python-lambda-local -f {Name der Lambda-Ausführungsfunktion} {Lambda-Ausführungsdatei} .py ./event.json -t 5
_ Letzte Option t gibt Sekunden für die Ausführung des Lambda-Timeouts an (optional) _
lambda-uploader Sie können die Quelle zum letzten Lambda hochladen. Erstellen Sie zum Ausführen lambda.json und require.txt und geben Sie die Einstellungen ein. lambda.json
{
"name": "{Der Name der Lambda-Funktion}",
"description": "{Erläuterung}",
"region": "ap-northeast-1",
"handler": "{Name der Ausführungsdatei(Erweiterung.Nein py)}.{Name der Ausführungsfunktion}",
"role": "{Geben Sie die Rolle an}",
"timeout": 300,
"memory": 128
}
Erstellen Sie im Voraus eine Rolle, um die Berechtigungen der Lambda-Funktion bei ihrer Ausführung anzugeben.
requests_oauthlib
beautifulsoup4
pytz
Erstellen Sie die folgende Datei. canary.py (Dateiname ist beliebig)
from boto3 import Session, resource
from requests_oauthlib import OAuth1Session
from bs4 import BeautifulSoup
import pytz
from pprint import pprint
from datetime import datetime,timedelta
import urllib2
import random
import os.path
import urllib
import json
# Twitter API
CK = '{your twitter CK}'
CS = '{your twitter CS}'
AT = '{your twitter AT}'
AS = '{your twitter AS}'
TMP_DIR = '/tmp'
UPDATE_URL = 'https://api.twitter.com/1.1/statuses/update.json'
UPDATE_MEDIA = 'https://upload.twitter.com/1.1/media/upload.json'
IMAGES_SELECTOR = 'img'
IMAGES_NUM = 4
AWS_S3_BUCKET_NAME = "{* enter your backet name *}"
INTERVAL = 1
def _exists(bucket, key):
return 'Contents' in Session().client('s3').list_objects(Prefix=key, Bucket=bucket)
def _getTweetList(keyName):
if( _exists(AWS_S3_BUCKET_NAME, keyName) == False ):
print("No JSON FILE"); return False
s3 = resource('s3', region_name='ap-northeast-1')
obj = s3.Bucket(AWS_S3_BUCKET_NAME).Object(keyName)
response = obj.get()
body = response['Body'].read()
return body.decode('utf-8')
def _getImages(url):
img_urls = []
html = urllib2.urlopen(url)
soup = BeautifulSoup(html, "html.parser")
for img in soup.select(IMAGES_SELECTOR):
img_urls.append(img['src'])
if len(img_urls) > IMAGES_NUM:
fetch_urls = random.sample(img_urls, IMAGES_NUM)
else:
fetch_urls = img_urls
filenames = []
count = 1
for img_url in fetch_urls:
name, ext = os.path.splitext(img_url)
filename = TMP_DIR+'/'+str(count)+ext
urllib.urlretrieve(img_url, filename)
filenames.append(filename)
count = count+1
return filenames
def _uploadTweetImage( images ):
media_ids = []
tw = OAuth1Session(CK, CS, AT, AS)
for image in images:
files = {"media": open(image, 'rb')}
req_media = tw.post(UPDATE_MEDIA, files = files)
if req_media.status_code == 200:
media_ids.append(json.loads(req_media.text)['media_id'])
else:
media_ids.append(req_media.status_code)
return media_ids
def _tweet(text, media_ids):
params = {"status": text, "media_ids": media_ids}
tw = OAuth1Session(CK, CS, AT, AS)
req = tw.post(UPDATE_URL, params = params)
if req.status_code == 200:
return text
else:
return req.status_code
def _testAllFunction(event, context):
ret = {}
ret['getImages'] = _getImages("http://yahoo.co.jp")
ret['uploadTweetImage'] = _uploadTweetImage([TMP_DIR+'/1.jpg', TMP_DIR+'/2.jpg', TMP_DIR+'/3.jpg', TMP_DIR+'/4.jpg'])
ret['tweet'] = _tweet("Hello", [])
ret['exists'] = _exists(AWS_S3_BUCKET_NAME, '20160209.json')
ret['getTweetList'] = _getTweetList('20160209.json')
return ret
def lambda_handler(event, context):
ret = {}
jst = pytz.timezone('Asia/Tokyo')
jst_now = datetime.now(jst)
today = jst_now.strftime("%Y%m%d")
object_name = today + ".json"
pprint(object_name)
json_data = _getTweetList(object_name)
if ( json_data != False ):
tweets = json.loads(json_data)
td_now = timedelta(hours=jst_now.hour, minutes=jst_now.minute)
ret['main'] = [{'now': str(jst_now.hour)+':'+str(jst_now.minute)}]
targetTweetList = []
for tweet in tweets:
td_tweet = timedelta(hours=tweet["hour"], minutes=tweet["minute"])
if(td_now < td_tweet and (td_tweet - td_now).seconds/60 <= INTERVAL):
pprint(tweet)
targetTweetList.append( { "text" : tweet["text"], "link": tweet["link"] } )
pprint(targetTweetList)
for ttweet in targetTweetList:
images = _getImages(ttweet["link"])
media_ids = _uploadTweetImage(images)
status = _tweet(ttweet["text"], media_ids)
ret['main'].append(status)
else:
ret['main'] = "no data"
return ret
Ich werde den Ablauf kurz erklären.
Installieren Sie nach dem Erstellen der obigen Datei zunächst die Bibliothek, um sie lokal zu testen.
pip install requests_oauthlib
pip install beautifulsoup4
pip install pytz
pip install boto3
Überprüfen Sie vor Ort.
python-lambda-local -f lambda_handler canary.py event.json
Wenn kein Fehler vorliegt, ist dies in Ordnung.
Geben Sie Folgendes in lambda.json ein
{
"name": "Canary",
"description": "sugoroku schedule tweet",
"region": "ap-northeast-1",
"handler": "canary.lambda_handler",
"role": "{Geben Sie die Rolle an}",
"timeout": 300,
"memory": 128
}
Da die Datei require.txt bereits erstellt wurde, führen Sie Folgendes aus: ↓
python-uploader
Hoffentlich sollten Sie der Lambda-Funktion in der AWS Management Console Canary hinzugefügt haben.
Führen Sie vorerst die Schaltfläche Test in der Verwaltungskonsole aus und überprüfen Sie die Ausführung auf Lambda. Wenn es kein Problem gibt, geben Sie die Cron-Einstellungen ein.
Evnt-Quellen> Ereignisquelle hinzufügen
Danach fügen Sie bitte einen reservierten Beitrag in die JSON-Datei ein und überprüfen den Vorgang.
Übrigens habe ich das nicht angesprochen, sondern als Eindruck, Python zu berühren
Ich hatte es mit den oben genannten Punkten schwer, aber der Eindruck war, dass es im Allgemeinen leicht zu berühren war.
Tweet mit Bild in Python-Qiita http://qiita.com/yubais/items/864eedc8dccd7adaea5d
Lernen Sie, indem Sie den Twitter-Retrobot AWS Lambda Python - Qiita erstellen http://qiita.com/ketancho/items/6d5137b48d94eced401e
So erstellen Sie einfach ein Einstellungswerkzeug für den Servicebetrieb mit GAS + S3 --Qiita http://qiita.com/hirokidaichi/items/769e330284302a799095
Lambda | Sonderkategorie | Entwickler.IO http://dev.classmethod.jp/referencecat/aws-lambda/
Stellen Sie AWS Lambda Python mit dem Lambda-Uploader | Developers.IO bereit http://dev.classmethod.jp/cloud/deploy-aws-lambda-python-with-lambda-uploader/
Führen Sie AWS Lambda Python lokal aus | Developers.IO http://dev.classmethod.jp/cloud/aws/invoke-aws-lambda-python-locally/
Recommended Posts