Ceci est l'article sur le 15e jour du Calendrier de l'Avent 2015 Python Partie 2. Immédiatement après mon arrivée au travail, j'ai récemment téléchargé une image Papillon dans la salle Papillon de Slack, mais cela est devenu un peu gênant, alors j'ai essayé de l'automatiser.
Nous publions régulièrement des images de Papillon (chien) sur Slack, qui est une discussion courante au sein de l'entreprise. Comme il est difficile de sélectionner et de publier une image par moi-même, j'ai pensé à une structure qui peut être affichée automatiquement à intervalles réguliers.
J'écrirai un schéma de configuration simple ci-dessous.
(1) AWS Lambda démarre régulièrement et obtient plusieurs URL d'image Papillon à partir de l'API GCS. (2) Sélectionnez une image parmi plusieurs images (3) Publier l'URL de l'image sélectionnée sur Slack
En utilisant AWS Lambda, il peut être configuré sans serveur.
Google Custom Search API
L'API de recherche personnalisée Google vous permet d'effectuer des recherches personnalisées Google à partir du code. Cette fois, nous utiliserons la recherche d'images. Jusqu'en novembre 2015, l'API de recherche d'images Google était disponible, mais elle n'est actuellement pas disponible, je vais donc l'utiliser. L'API GCS nécessite l'utilisation de la clé API, mais le plan gratuit a une limite d'utilisation quotidienne de 1000 fois, ce qui n'est pas beaucoup, mais il n'y a pas de problème pour cette utilisation, alors obtenez la clé avec le plan gratuit Faire.
Les détails sont expliqués dans le blog ici, veuillez donc vous y référer si vous le souhaitez.
Slack
Slack est un service utilisé comme chat principal pour nos ingénieurs. Il existe différentes méthodes d'intégration, mais il existe un mécanisme de publication pour discuter avec les messages POST. Cette fois, nous publierons un message en utilisant ce mécanisme (Webhook entrant).
Vous devez obtenir l'URL de la publication à laquelle le message POST sera envoyé. Publiez l'URL de publication sur la page des paramètres du WebHook entrant de Slack (https://my.slack.com/services/new/incoming-webhook/).
Sélectionnez un canal et cliquez sur le bouton «Ajouter l'intégration des WebHooks entrants».
Faire une copie de l'URL du webhook affichée
(Facultatif) Vous pouvez modifier les paramètres de publication par défaut si vous le souhaitez.
AWS Lambda
AWS Lambda est un service qui vous permet d'exécuter du code sans préparer de serveur en téléchargeant du code exécutable. Une API simple peut être implémentée sans serveur en exécutant une tâche de planification telle que Cron ou en la combinant avec API Gateway. Jusqu'à présent, seuls node.js et java étaient pris en charge, mais en octobre 2015, python était pris en charge. Cette fois, je vais l'implémenter à l'aide d'AWS Lambda Python.
Sélectionnez Lambda depuis AWS et créez une nouvelle fonction Lambda.
Vous pouvez enregistrer des tâches qui peuvent être exécutées régulièrement en sélectionnant lambda-canary
dans sélectionnez
blue print`.
Définissez le calendrier des tâches que vous souhaitez exécuter régulièrement. Il peut être décrit comme cron dans l'expression Schedule. Notez que si spécifié par cron, l'heure spécifiée sera UTC. Pour plus de détails, reportez-vous à Traitement des événements planifiés à l'aide de la fonction Lambda.
Ici, il est configuré pour être exécuté toutes les 5 minutes.
Définissez la tâche.
En gros, collez le code suivant comme paramètre par défaut.
Après cela, définissez CUSTOM_SEARCH_API_KEY
, CUSTOM_ENGINE_ID
et SLACK_POST_URL
obtenus à l'étape précédente.
.python
#-*- coding:utf-8 -*-
from urlparse import urljoin
from urllib import urlencode
import urllib2 as urlrequest
import json
import random
#Paramètres de l'API CUSTOM SEARCH
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}"
#Paramètres autour de SLACK
SLACK_POST_URL = "https://hooks.slack.com/services/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
def post_image_to_slack(search_word):
"""
Obtenez l'URL de l'image avec Google Custom Serach et publiez-la sur SLACK au hasard
"""
#Obtenez plusieurs URL
urls = get_image_urls(search_word)
#Ne pas publier si l'URL n'a pas pu être obtenue
if len(urls) == 0:
return "no images were found."
#Sélectionnez une URL au hasard
url = random.choice(urls)
#Créer un message pour Slack
post_msg = build_message(url)
#Publier sur Slack
return post(post_msg)
def get_image_urls(search_word):
"""
Obtenez l'URL d'une image avec un mot-clé à partir de l'API GOOGLE CUSTOM SEARCH
"""
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):
"""
POSTER un message à 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):
"""
Rédiger un message pour Slack
"""
post_message = {}
post_message["text"] = url
post_message.update(kwargs)
return post_message
def lambda_handler(event, context):
post_image_to_slack('Papillon')
Lorsque la tâche est exécutée, la partie def lambda_handler (event, context):
est exécutée (peut être modifiée dans les paramètres).
Cette fois, il est défini statiquement sur Papillon, mais comme JSON peut être passé à l'exécution, il est également possible de spécifier des paramètres de recherche comme arguments.
De plus, s'il n'est pas exécuté, le programme enregistré peut être désactivé, veuillez donc le vérifier.
Les images suivantes sont publiées à l'heure définie.
C'est un bon papillon!
En utilisant AWS Lambda Python, j'ai pu régulièrement rechercher des images sur Google et publier des images de Papillon sans préparer de serveur. Vous pouvez également publier Papillon de manière interactive en utilisant API Gateway. (Il vaut peut-être mieux utiliser Hubot, mais ...)
Ayez une bonne vie Python avec AWS Lambda!
Recommended Posts