Certaines parties sont omises, les paramètres S3, etc. Voici les étapes pour implémenter TwitBot sur AWS Lambda.
On suppose que S3 a des données JSON à l'avance. Le nom de fichier des données JSON est aaaammjj.json La structure est la suivante ↓ ↓
D'abord de l'environnement de développement. Pour Mac, vous travaillerez dans le terminal.
Après avoir créé le répertoire de travail (ici, lambda_function) Exécutez les commandes suivantes dans l'ordre.
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 Cela créera un environnement d'exécution virtuelle pour python dans le répertoire spécifié. Cela vous permet d'essayer le module dans un environnement limité.
python-lambda-local
Il s'agit d'un outil pour exécuter des fonctions lambda dans l'environnement local.
Pour exécuter, créez un fichier appelé event.json et spécifiez-le à lambda
Créez une valeur d'entrée provisoire.
Exécuter avec la commande suivante ↓ ↓
python-lambda-local -f {nom de la fonction d'exécution lambda} {fichier d'exécution lambda} .py ./event.json -t 5
_ La dernière option t spécifie les secondes d'exécution du délai lambda (facultatif) _
lambda-uploader Vous pouvez télécharger la source vers le dernier lambda. Pour exécuter, créez lambda.json et requirements.txt et remplissez les paramètres. lambda.json
{
"name": "{Le nom de la fonction Lambda}",
"description": "{La description}",
"region": "ap-northeast-1",
"handler": "{Nom du fichier d'exécution(extension.Pas de py)}.{Nom de la fonction d'exécution}",
"role": "{Spécifiez l'arn du rôle}",
"timeout": 300,
"memory": 128
}
Créez un rôle à l'avance pour spécifier les autorisations de la fonction Lambda lors de son exécution.
requests_oauthlib
beautifulsoup4
pytz
Créez le fichier suivant. canary.py (le nom du fichier est arbitraire)
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
Je vais expliquer brièvement le déroulement.
Après avoir créé le fichier ci-dessus, installez d'abord la bibliothèque pour l'essayer localement.
pip install requests_oauthlib
pip install beautifulsoup4
pip install pytz
pip install boto3
Vérifiez localement.
python-lambda-local -f lambda_handler canary.py event.json
S'il n'y a pas d'erreur, c'est OK.
Entrez ce qui suit dans lambda.json
{
"name": "Canary",
"description": "sugoroku schedule tweet",
"region": "ap-northeast-1",
"handler": "canary.lambda_handler",
"role": "{Spécifiez l'arn du rôle}",
"timeout": 300,
"memory": 128
}
Puisque requirements.txt a déjà été créé, exécutez la commande suivante ↓
python-uploader
J'espère que vous devriez avoir ajouté Canary à la fonction Lambda sur AWS Management Console.
Pour le moment, exécutez le bouton Test depuis la console de gestion et vérifiez l'exécution sur Lambda. S'il n'y a pas de problème, entrez les paramètres cron.
Sources Evnt> Ajouter une source d'événement
Après cela, veuillez mettre un article réservé dans le fichier json et vérifier l'opération.
Au fait, je n'ai pas abordé cela, mais comme une impression de toucher Python
J'ai eu du mal avec les points ci-dessus, mais l'impression était que c'était généralement facile à toucher.
Tweet avec image en Python-Qiita http://qiita.com/yubais/items/864eedc8dccd7adaea5d
Apprenez en créant un retrobot Twitter AWS Lambda Python - Qiita http://qiita.com/ketancho/items/6d5137b48d94eced401e
Comment créer facilement un outil de paramétrage pour le fonctionnement du service à l'aide de GAS + S3 - Qiita http://qiita.com/hirokidaichi/items/769e330284302a799095
Lambda | Catégorie spéciale | Developers.IO http://dev.classmethod.jp/referencecat/aws-lambda/
Déployez AWS Lambda Python avec lambda-uploader | Developers.IO http://dev.classmethod.jp/cloud/deploy-aws-lambda-python-with-lambda-uploader/
Exécutez AWS Lambda Python localement | Developers.IO http://dev.classmethod.jp/cloud/aws/invoke-aws-lambda-python-locally/
Recommended Posts