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.
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.
(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).
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".
Erstellen Sie eine Kopie der angezeigten Webhook-URL
(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.
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.
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.
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.
Die folgenden Bilder werden zur festgelegten Zeit veröffentlicht.
Es ist ein gutes Papillon!
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!
Recommended Posts