Exploitez TwitterBot avec Lambda, Python

Certaines parties sont omises, les paramètres S3, etc. Voici les étapes pour implémenter TwitBot sur AWS Lambda.

Données JSON dans 0.S3

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 ↓ ↓ スクリーンショット 2016-02-25 10.27.11.png

1. Préparation de l'environnement de développement

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
  1. 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é.

  2. 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) _

  3. 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.

  1. Décrivez la bibliothèque Python à utiliser. requirements.txt
requests_oauthlib
beautifulsoup4
pytz

Créer un fichier Python à exécuter

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.

  1. Connectez-vous à S3 avec _getTweetList et récupérez le contenu du fichier json de la date d'exécution s'il y en a un
  2. Balayez les données qui spécifient la minute en même temps que l'heure actuelle à l'emplacement de la boucle
  3. Gratter et télécharger des images à partir de la page WEB spécifiée par un lien avec _getImages
  4. Téléchargez l'image sur Twitter avec _uploadTweetImage
  5. Exécutez Tweet avec _tweet

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.

Transférer vers Lambda

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.

paramètres cron

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.

Comment configurer 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.

Lien de référence API Lambda, Python, Twitter

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

Exploitez TwitterBot avec Lambda, Python
Utiliser Kinesis avec Python
Faire fonctionner Blender avec Python
Utiliser Excel avec Python (1)
Utiliser Excel avec Python (2)
Exploitez Excel avec Python open pyxl
[Note] Faites fonctionner MongoDB avec Python
[Python] [SQLite3] Exploiter SQLite avec Python (basique)
Faites fonctionner l'imprimante de reçus avec python
Essayez d'exploiter Facebook avec Python
Détection de visage avec Lambda (Python) + Rekognition
Faites fonctionner les appareils électroménagers ECHONET Lite avec Python
Notifier HipChat avec AWS Lambda (Python)
Utiliser PostgreSQL avec Lambda (Python + psycopg2)
Utilisez Google Agenda à partage limité avec Lambda (Python) [cloudpack Osaka]
[AWS] Utilisation de fichiers ini avec Lambda [Python]
Statistiques avec python
Grattage avec Python
Python avec Go
Faire fonctionner l'alimentation smartlife avec python (de-IFTTT)
Twilio avec Python
Intégrer avec Python
Jouez avec 2016-Python
AES256 avec python
Testé avec Python
Manipulation des données DynamoDB avec Lambda (Node et Python)
python commence par ()
[GCP] Exploitez Google Cloud Storage avec Python
LoL ~ Lambda exploite Lambda ~
avec syntaxe (Python)
[Pyto] Faites fonctionner le Taptic Engine de l'iPhone avec Python
Bingo avec python
Zundokokiyoshi avec python
Connectez-vous à s3 avec AWS Lambda Python
[Python] Utiliser automatiquement le navigateur avec Selenium
Faites fonctionner des appareils électroménagers avec Python et IRKit
Essayez d'attribuer ou de changer avec Python: lambda
Excel avec Python
Micro-ordinateur avec Python
Cast avec python
Exécutez régulièrement le scraping WEB avec AWS-Lambda + Python + Cron
Obtenez une authentification de base avec CloudFront Lambda @ Edge avec Python 3.8
LINE BOT avec Python + AWS Lambda + API Gateway
Application sans serveur avec AWS SAM! (APIGATEWAY + Lambda (Python))
Exemple de notification Slack avec python lambda
Exporter un instantané RDS vers S3 avec Lambda (Python)
Télécharger des fichiers sur Google Drive avec Lambda (Python)
Zip, décompressez avec python
Django 1.11 a démarré avec Python3.6
Jugement des nombres premiers avec Python
Python avec eclipse + PyDev.
Créer des couches Lambda avec Lambda
Grattage en Python (préparation)
Essayez de gratter avec Python.
Apprendre Python avec ChemTHEATER 03
Recherche séquentielle avec Python
"Orienté objet" appris avec python
Manipuler Redmine à l'aide de Python Redmine
Exécutez Python avec VBA