Betreiben Sie TwitterBot mit Lambda, Python

Es gibt einige Teile, die weggelassen werden, S3-Einstellungen usw. Hier sind die Schritte zum Implementieren von TwitBot auf AWS Lambda.

JSON-Daten in 0.S3

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

1. Vorbereitung der Entwicklungsumgebung

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

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

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

  1. Beschreiben Sie die zu verwendende Python-Bibliothek. requirements.txt
requests_oauthlib
beautifulsoup4
pytz

Erstellen Sie eine Python-Datei zum Ausführen

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.

  1. Stellen Sie mit _getTweetList eine Verbindung zu S3 her und rufen Sie den Inhalt der JSON-Datei mit dem Ausführungsdatum ab, falls vorhanden
  2. Scannen Sie die Daten, die die Minute angeben, gleichzeitig mit der aktuellen Zeit am Schleifenort
  3. Scraping und Herunterladen von Bildern von der WEB-Seite, die durch den Link mit _getImages angegeben wird
  4. Laden Sie das Bild mit _uploadTweetImage auf Twitter hoch
  5. Führen Sie Tweet mit _tweet aus

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.

Auf Lambda hochladen

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.

Cron-Einstellungen

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.

Wie man cron einrichtet

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.

Lambda, Python, Twitter API Referenzlink

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

Betreiben Sie TwitterBot mit Lambda, Python
Kinesis mit Python betreiben
Betreiben Sie Blender mit Python
Betreiben Sie Excel mit Python (1)
Betreiben Sie Excel mit Python (2)
Betreiben Sie Excel mit Python Open Pyxl
[Hinweis] Betreiben Sie MongoDB mit Python
[Python] [SQLite3] Betreiben Sie SQLite mit Python (Basic)
Bedienen Sie den Belegdrucker mit Python
Versuchen Sie, Facebook mit Python zu betreiben
Gesichtserkennung mit Lambda (Python) + Erkennung
Betreiben Sie ECHONET Lite-Haushaltsgeräte mit Python
Benachrichtigen Sie HipChat mit AWS Lambda (Python)
Verwenden Sie PostgreSQL mit Lambda (Python + psycopg2)
Betreiben Sie die eingeschränkte Freigabe von Google Kalender mit Lambda (Python) [Cloudpack Osaka]
[AWS] Verwenden von INI-Dateien mit Lambda [Python]
Statistik mit Python
Scraping mit Python
Python mit Go
Betreiben Sie das Smartlife-Netzteil mit Python (de-IFTTT).
Twilio mit Python
In Python integrieren
Spielen Sie mit 2016-Python
AES256 mit Python
Getestet mit Python
Bearbeiten von DynamoDB-Daten mit Lambda (Node & Python)
Python beginnt mit ()
[GCP] Betreiben Sie Google Cloud Storage mit Python
LoL ~ Lambda betreiben Lambda ~
mit Syntax (Python)
[Pyto] Betreibe die Taptic Engine des iPhone mit Python
Bingo mit Python
Zundokokiyoshi mit Python
Stellen Sie mit AWS Lambda Python eine Verbindung zu s3 her
[Python] Betreiben Sie den Browser automatisch mit Selenium
Betreiben Sie Haushaltsgeräte mit Python und IRKit
Versuchen Sie, Python: Lambda zuzuweisen oder zu wechseln
Excel mit Python
Mikrocomputer mit Python
Mit Python besetzen
Führen Sie das WEB-Scraping regelmäßig mit AWS-Lambda + Python + Cron aus
Erreichen Sie eine grundlegende Authentifizierung mit CloudFront Lambda @ Edge mit Python 3.8
LINE BOT mit Python + AWS Lambda + API Gateway
Serverlose Anwendung mit AWS SAM! (APIGATEWAY + Lambda (Python))
Beispiel für eine Slack-Benachrichtigung mit Python Lambda
Exportieren Sie den RDS-Snapshot mit Lambda (Python) nach S3.
Laden Sie Dateien mit Lambda (Python) auf Google Drive hoch.
Zip, entpacken mit Python
Django 1.11 wurde mit Python3.6 gestartet
Primzahlbeurteilung mit Python
Python mit Eclipse + PyDev.
Bilden Sie Lambda-Schichten mit Lambda
Scraping in Python (Vorbereitung)
Versuchen Sie es mit Python.
Python lernen mit ChemTHEATER 03
Sequentielle Suche mit Python
"Objektorientiert" mit Python gelernt
Bearbeiten Sie Redmine mit Python Redmine
Führen Sie Python mit VBA aus