Publiez régulièrement des images de Papillon sur Python + AWS Lambda + Slack

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.

Aperçu

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.

python_advent_01.png

(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).

Paramètres du 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». Capture d'écran 2015-06-22 18.47.17.png

Faire une copie de l'URL du webhook affichée Capture d'écran 2015-06-22 18.48.30.png

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

Enregistrement des tâches de planification

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

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

Programmer l'inscription

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.

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

Paramètres de tâche

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.

Résultat d'exécution

Les images suivantes sont publiées à l'heure définie.

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

C'est un bon papillon!

À la fin

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!

Article de référence

Recommended Posts

Publiez régulièrement des images de Papillon sur Python + AWS Lambda + Slack
Prise en charge de l'environnement d'exécution Python 2.7 sur AWS Lambda (à partir de 2020.1)
Publié en tant que pièce jointe à Slack sur AWS Lambda (Python)
Exécutez Python selon la planification sur AWS Lambda
Publiez régulièrement sur Twitter en utilisant AWS lambda!
[Python] Exécutez Headless Chrome sur AWS Lambda
Exécutez régulièrement des programmes Python sur AWS Lambda
Résumé de l'étude de Python pour utiliser AWS Lambda
Vérifiez types_map lors de l'utilisation de mimetypes avec AWS Lambda (Python)
Déployer la fonction Python 3 avec Serverless Framework sur AWS Lambda
Je veux AWS Lambda avec Python sur Mac!
Publier de Python vers Slack
publier sur vim → Python → Slack
[Python] Scraping dans AWS Lambda
Publiez sur Slack avec Python 3
Manipulation de python sur mac
Post-traitement de python (NG)
Accélérer le chargement des images Python
[Python] Permet d'importer les packages pip3 sur AWS Lambda
Surveillance du site et notification d'alerte avec AWS Lambda + Python + Slack
Publier sur Slack en Python
xgboost (python) sur l'environnement d'instance EC2 Spot préparé par AWS Lambda
Précautions lors de l'exécution de Python sur EC2 à partir d'AWS Lambda (Exécuter la commande)
Bonnes pratiques pour la journalisation au format JSON sur AWS Lambda / Python
Manipulation des pixels d'image en Python
Ecrire une fonction AWS Lambda en Python
Publiez plusieurs images Twitter avec python
Publier une image de Python sur Tumblr
Notifier HipChat avec AWS Lambda (Python)
Utilisez AWS lambda pour récupérer les actualités et notifier régulièrement LINE des mises à jour [python]
Surveillance simple du serveur avec AWS Lambda (Python) et notification des résultats avec Slack
Le module ne peut pas être importé en Python sur EC2 exécuté à partir d'AWS Lambda
Préparer l'environnement de Chainer sur l'instance spot EC2 avec AWS Lambda
[AWS] Utilisation de fichiers ini avec Lambda [Python]
Installez la bibliothèque python sur Lambda à l'aide de [/ tmp]
Informer régulièrement Slack des problèmes de backlog manqués
Publier le sujet de Gmail sur Twitter
Notification Slack des informations météorologiques avec Open Whisk
Étude sur Tokyo Rent en utilisant Python (3-1 sur 3)
Connectez-vous à s3 avec AWS Lambda Python
[Python] Localisation japonaise de matplotlib sur Ubuntu
Résumé de l'écriture d'AWS Lambda
Débarrassez-vous des images DICOM en Python
Créez des paramètres dans terraform pour envoyer des messages depuis AWS Lambda Python3.8 vers Slack