Veröffentlichen Sie regelmäßig Bilder von Papillon auf Python + AWS Lambda + Slack

Dies ist der Artikel am 15. Tag von Adventskalender 2015 Python Teil 2. Unmittelbar nachdem ich zur Arbeit gekommen war, habe ich kürzlich ein Papillon-Bild in Slacks Papillon-Raum hochgeladen, aber es wurde ein wenig problematisch, also habe ich versucht, es zu automatisieren.

Überblick

Wir veröffentlichen regelmäßig Bilder von Papillon (Hund) bei Slack, was ein allgemeiner Chat innerhalb des Unternehmens ist. Da es schwierig ist, ein Bild selbst auszuwählen und zu veröffentlichen, habe ich mir eine Struktur ausgedacht, die in regelmäßigen Abständen automatisch veröffentlicht werden kann.

Ich werde unten ein einfaches Konfigurationsdiagramm schreiben.

python_advent_01.png

(1) AWS Lambda startet regelmäßig und erhält mehrere Papillon-Bild-URLs von der GCS-API. (2) Wählen Sie ein Bild aus mehreren Bildern aus (3) Veröffentlichen Sie die ausgewählte Bild-URL in Slack

Mit AWS Lambda kann es ohne Server konfiguriert werden.

Google Custom Search API

Mit der benutzerdefinierten Google-Such-API können Sie benutzerdefinierte Google-Suchen anhand von Code durchführen. Dieses Mal verwenden wir die Bildsuche. Bis November 2015 war die Google-Bildsuch-API verfügbar, sie ist jedoch derzeit nicht verfügbar. Ich werde sie daher verwenden. Für die Verwendung der GCS-API ist API KEY erforderlich, aber der kostenlose Plan hat ein 1000-faches tägliches Nutzungslimit, was nicht viele sind, aber es gibt kein Problem für diese Verwendung. Holen Sie sich den KEY mit dem kostenlosen Plan Machen.

Details werden im Blog hier erklärt. Wenn Sie möchten, lesen Sie bitte den Blog.

Slack

Slack ist ein Dienst, der als Hauptchat für unsere Ingenieure verwendet wird. Es gibt verschiedene Methoden zur Integration, aber es gibt einen Mechanismus zum Posten, um mit POST-Nachrichten zu chatten. Dieses Mal werden wir eine Nachricht mit diesem Mechanismus veröffentlichen (Incoming Webhook).

Eingehende WebHook-Einstellungen

Sie müssen die URL für den Beitrag abrufen, an den die POST-Nachricht gesendet wird. Veröffentlichen Sie die Posting-URL auf der Seite mit den eingehenden WebHook-Einstellungen von Slack (https://my.slack.com/services/new/incoming-webhook/).

Wählen Sie einen Kanal aus und klicken Sie auf die Schaltfläche "Eingehende WebHooks-Integration hinzufügen". Screenshot 2015-06-22 18.47.17.png

Erstellen Sie eine Kopie der angezeigten Webhook-URL Screenshot 2015-06-22 18.48.30.png

(Optional) Sie können die Standard-Post-Einstellungen ändern, wenn Sie möchten.

AWS Lambda

AWS Lambda ist ein Dienst, mit dem Sie Code ausführen können, ohne einen Server vorzubereiten, indem Sie ausführbaren Code hochladen. Eine einfache API kann ohne Server implementiert werden, indem Planungsaufgaben wie Cron ausgeführt oder mit API Gateway kombiniert werden. Bisher wurden nur node.js und Java unterstützt, im Oktober 2015 wurde jedoch Python unterstützt. Dieses Mal werde ich es mit AWS Lambda Python implementieren.

Registrierung von Planungsaufgaben

Wählen Sie Lambda aus AWS aus und erstellen Sie eine neue Lambda-Funktion. Sie können Aufgaben registrieren, die regelmäßig ausgeführt werden können, indem Sie "Lambda-Kanarienvogel" unter "Blaupause auswählen" auswählen.

スクリーンショット 2015-12-13 17.59.44.png

Registrierung planen

Legen Sie den Zeitplan für die Aufgaben fest, die Sie regelmäßig ausführen möchten. Es kann wie cron im Zeitplanausdruck beschrieben werden. Beachten Sie, dass bei Angabe durch cron die angegebene Zeit UTC ist. Weitere Informationen finden Sie unter Verarbeiten geplanter Ereignisse mit der Lambda-Funktion.

Hier soll es alle 5 Minuten ausgeführt werden.

スクリーンショット 2015-12-13 18.01.58.png

Aufgabeneinstellungen

Stellen Sie die Aufgabe ein. Fügen Sie grundsätzlich den folgenden Code als Standardeinstellung ein. Danach setzen Sie "CUSTOM_SEARCH_API_KEY", "CUSTOM_ENGINE_ID" und "SLACK_POST_URL", die im vorherigen Schritt erhalten wurden.

.python


#-*- coding:utf-8 -*-
from urlparse import urljoin
from urllib import urlencode
import urllib2 as urlrequest
import json
import random


#Einstellungen rund um die CUSTOM SEARCH API
CUSTOM_SEARCH_API_KEY = "XXXXXXXXXXXXXXXXXXXXXXX"
CUSTOM_ENGINE_ID = "XXXXXXXXXXXXXXXXXXXXXXX"
URL_TEMPLATE = "https://www.googleapis.com/customsearch/v1?key={key}&cx={cx}&searchType=image&q={search_word}"

#Einstellungen rund um SLACK
SLACK_POST_URL = "https://hooks.slack.com/services/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"


def post_image_to_slack(search_word):
    """
Holen Sie sich die Bild-URL mit Google Custom Serach und senden Sie sie nach dem Zufallsprinzip an SLACK
    """
    #Holen Sie sich mehrere URLs
    urls = get_image_urls(search_word)

    #Posten Sie nicht, wenn die URL nicht abgerufen werden konnte
    if len(urls) == 0:
        return "no images were found."

    #URL nach dem Zufallsprinzip auswählen
    url = random.choice(urls)

    #Verfassen Sie eine Nachricht für Slack
    post_msg = build_message(url)

    #Post zu locker
    return post(post_msg)


def get_image_urls(search_word):
    """
Rufen Sie die URL eines Bildes mit einem Schlüsselwort von der GOOGLE CUSTOM SEARCH API ab
    """
    encoded_search_word = urlrequest.quote(search_word)
    url = URL_TEMPLATE.format(key=CUSTOM_SEARCH_API_KEY, cx=CUSTOM_ENGINE_ID, search_word=encoded_search_word)
    req = urlrequest.Request(url)
    res = urlrequest.build_opener(urlrequest.HTTPHandler()).open(req)
    data = json.load(res)

    if "items" not in data:
        return []

    links = []
    for item in data["items"]:
        links.append(item["link"])
    return links


def post(payload):
    """
POST eine Nachricht an Slack
    """
    payload_json = json.dumps(payload)
    data = urlencode({"payload": payload_json})
    req = urlrequest.Request(SLACK_POST_URL)
    response = urlrequest.build_opener(urlrequest.HTTPHandler()).open(req, data.encode('utf-8')).read()
    return response.decode('utf-8')


def build_message(url, **kwargs):
    """
Verfassen Sie eine Nachricht für Slack
    """
    post_message = {}
    post_message["text"] = url
    post_message.update(kwargs)
    return post_message


def lambda_handler(event, context):
    post_image_to_slack('Papillon')

Wenn die Aufgabe ausgeführt wird, wird der Teil def lambda_handler (Ereignis, Kontext): ausgeführt (kann in den Einstellungen geändert werden). Dieses Mal ist es statisch als Papillon festgelegt. Da JSON jedoch zur Laufzeit übergeben werden kann, können auch Suchparameter als Argumente angegeben werden. Wenn es nicht ausgeführt wird, ist der registrierte Zeitplan möglicherweise deaktiviert. Überprüfen Sie ihn daher bitte.

Ausführungsergebnis

Die folgenden Bilder werden zur festgelegten Zeit veröffentlicht.

スクリーンショット 2015-12-14 22.54.51.png

Es ist ein gutes Papillon!

Am Ende

Mit AWS Lambda Python konnte ich regelmäßig bei Google nach Bildern suchen und Bilder von Papillon veröffentlichen, ohne einen Server vorzubereiten. Sie können Papillon auch interaktiv mithilfe von API Gateway veröffentlichen. (Es ist vielleicht besser, Hubot zu verwenden, aber ...)

Haben Sie ein gutes Python-Leben mit AWS Lambda!

Referenzartikel

Recommended Posts

Veröffentlichen Sie regelmäßig Bilder von Papillon auf Python + AWS Lambda + Slack
Unterstützung für Python 2.7-Laufzeit auf AWS Lambda (ab 2020.1)
Gepostet als Anhang zu Slack auf AWS Lambda (Python)
Führen Sie Python planmäßig auf AWS Lambda aus
Poste regelmäßig mit AWS Lambda auf Twitter!
[Python] Führen Sie Headless Chrome unter AWS Lambda aus
Führen Sie regelmäßig Python-Programme auf AWS Lambda aus
Zusammenfassung des Studiums von Python zur Verwendung von AWS Lambda
Überprüfen Sie types_map, wenn Sie Mimetypen mit AWS Lambda (Python) verwenden.
Stellen Sie die Python 3-Funktion mit Serverless Framework unter AWS Lambda bereit
Ich möchte Lambda mit Python auf Mac AWS!
Post von Python nach Slack
poste an vim → Python → Slack
[Python] Scraping in AWS Lambda
Post to Slack mit Python 3
Umgang mit Python auf Mac
Nachbearbeitung von Python (NG)
Beschleunigen Sie das Laden von Python-Bildern
[Python] Ermöglicht den Import von pip3-Paketen in AWS Lambda
Site-Überwachung und Alarmbenachrichtigung mit AWS Lambda + Python + Slack
Post an Slack in Python
xgboost (Python) in einer von AWS Lambda erstellten EC2 Spot-Instanzumgebung
Vorsichtsmaßnahmen beim Ausführen von Python unter EC2 über AWS Lambda (Befehl ausführen)
Best Practice für die Anmeldung im JSON-Format unter AWS Lambda / Python
Bildpixel-Manipulation in Python
Schreiben Sie die AWS Lambda-Funktion in Python
Veröffentlichen Sie mehrere Twitter-Bilder mit Python
Poste ein Bild von Python auf Tumblr
Benachrichtigen Sie HipChat mit AWS Lambda (Python)
Verwenden Sie AWS Lambda, um Nachrichten zu kratzen und LINE regelmäßig über Updates zu informieren [Python]
Einfache Serverüberwachung mit AWS Lambda (Python) und Ergebnisbenachrichtigung mit Slack
Das Modul kann nicht in Python auf EC2 importiert werden, das von AWS Lambda ausgeführt wird
Bereiten Sie die Umgebung von Chainer auf der EC2-Spot-Instanz mit AWS Lambda vor
[AWS] Verwenden von INI-Dateien mit Lambda [Python]
Installieren Sie die Python-Bibliothek auf Lambda mit [/ tmp]
Benachrichtigen Sie Slack regelmäßig über verpasste Backlog-Probleme
Veröffentlichen Sie das Thema Google Mail auf Twitter
Schlaffe Benachrichtigung über Wetterinformationen mit Open Whisk
Studie über die Miete in Tokio mit Python (3-1 von 3)
Stellen Sie mit AWS Lambda Python eine Verbindung zu s3 her
[Python] Japanische Lokalisierung von matplotlib unter Ubuntu
Zusammenfassung des Schreibens von AWS Lambda
Entfernen Sie DICOM-Bilder in Python
Erstellen Sie Einstellungen in Terraform, um Nachrichten von AWS Lambda Python3.8 an Slack zu senden