[PYTHON] Jouez avec le cadre gratuit GCP ① ~ Cloud Run, Datastore et API de messagerie LINE ~

À propos de cet article

Je vais vous présenter ce que vous pouvez faire avec le cadre gratuit de GCP en plusieurs parties. Le contenu de l'offre gratuite est sujet à changement, et les paiements à l'utilisation peuvent être facturés si la limite est dépassée, donc Informations officielles Veuillez utiliser à vos risques et périls en vérifiant = ja).

Cette fois, nous associerons ** Cloud Run ** et ** Datastore ** à la ** API de messagerie ** de LINE pour créer le robot simple suivant. À la fin de l'article, je présenterai un bot plus pratique créé de la même manière, alors jetez-y également un œil (je l'ai implémenté avec App Engine, mais il y a beaucoup de choses en commun).

4.png
  1. Lorsque vous recevez un message, enregistrez l'heure
  2. Retournez "Ravi de vous rencontrer!" Pour la première fois
  3. À partir de la deuxième fois, l'heure du dernier message est renvoyée (l'image ci-dessus est décalée de 9 heures en raison du décalage horaire au Japon)

Une brève introduction à chaque service

Cloud Run Un service GCP qui permet aux conteneurs sans état de s'exécuter dans un environnement sans serveur. Cette fois, il n'exécute que le serveur Web de Flask, donc utiliser App Engine peut être la voie royale, mais Cloud Run semble avoir moins d'articles, donc je vais le présenter.

Datastore Base de données NoSQL évolutive de GCP. Comme il est actuellement intégré à Firestore, nous utiliserons Firestore en mode Datastore pour être exact. À propos, l'utilisation du mode Datastore et du mode natif est expliquée dans Officiel comme suit.

Pour les nouveaux projets de serveur, utilisez Cloud Firestore en mode Datastore.

Messaging API Vous pouvez créer un bot qui s'exécute sur LINE. Le bot créé est lié au compte LINE officiel, de sorte que les personnes qui se sont inscrites en tant qu'amis peuvent l'utiliser.

Paramètres de Cloud Run

Les 3 fichiers suivants sont préparés cette fois. Placez-les tous dans le même répertoire.

app.py Le premier est app.py, qui décrit le contenu principal du traitement. Le plan est basé sur ici.

app.py


from flask import Flask, request, abort
from linebot import LineBotApi, WebhookHandler
from linebot.exceptions import InvalidSignatureError
from linebot.models import MessageEvent, TextMessage, TextSendMessage
import config #Jeton d'accès à l'API de messagerie, etc.
from google.cloud import datastore
import datetime
import os

app = Flask(__name__)
client = datastore.Client()
line_bot_api = LineBotApi(config.token)
handler = WebhookHandler(config.secret)

@app.route("/callback", methods=['POST'])
def callback():
    # get X-Line-Signature header value
    signature = request.headers['X-Line-Signature']
    # get request body as text
    body = request.get_data(as_text=True)
    app.logger.info("Request body: " + body)
    # handle webhook body
    try:
        handler.handle(body, signature)
    except InvalidSignatureError:
        print("Invalid signature. Please check your channel access token/channel secret.")
        abort(400)
    return 'OK'

@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
    user_id = event.source.user_id
    user_key = client.key("TestTable", user_id) #Obtenir la clé avec kind et id comme arguments
    user_entity = client.get(user_key) #Obtenir l'entité avec la clé comme argument
    if user_entity is None:
        user_entity = datastore.Entity(key=user_key, exclude_from_indexes=("timestamp",))
        msg = "Ravi de vous rencontrer!"
    else:
        timestamp = user_entity["timestamp"]
        ts = datetime.datetime.fromtimestamp(timestamp/1000)
        msg = "{}Année{}Mois{}journée{}Temps{}Depuis quelques minutes!".format(ts.year, ts.month, ts.day, ts.hour, ts.minute)
    user_entity.update({ #Mettre à jour l'entité
        "timestamp": event.timestamp
    })
    client.put(user_entity) #Enregistrer l'argument Entity dans le magasin de données
    line_bot_api.reply_message(
        event.reply_token,
        TextSendMessage(text=msg))

if __name__ == "__main__":
    app.run(debug=True, host="0.0.0.0", port=int(os.environ.get("PORT", 8080)))

handle_message immédiatement après le décorateur @ handler.add est la fonction correspondant au message de l'API de messagerie. L'événement d'argument contient diverses informations telles que l'identifiant_utilisateur de l'expéditeur (répertorié dans ici). Peut être vu). Je ne suis pas familier avec les fonctions liées à Datastore, j'ai donc fait un bref commentaire, mais veuillez consulter la Documentation pour plus de détails.

config.py Il s'agit du fichier lu par ʻimport config` dans app.py. Les jetons d'accès sont définis pour être liés à l'API de messagerie (la méthode de confirmation sera décrite plus tard). Vous pouvez l'écrire directement dans app.py, mais il est recommandé d'en faire un fichier séparé afin qu'il puisse être facilement géré avec .gitignore.

config.py


token = "xxxxx"
secret = "xxxxx"

Dockerfile Enfin, le Dockerfile. Les packages Python requis sont installés avec RUN pip install ....

# Use the official Python image.
# https://hub.docker.com/_/python
FROM python:3.7

# Copy local code to the container image.
ENV APP_HOME /app
WORKDIR $APP_HOME
COPY . .

# Install production dependencies.
RUN pip install Flask gunicorn line-bot-sdk google-cloud-datastore

# Run the web service on container startup. Here we use the gunicorn
# webserver, with one worker process and 8 threads.
# For environments with multiple CPU cores, increase the number of workers
# to be equal to the cores available.
CMD exec gunicorn --bind :$PORT --workers 1 --threads 8 app:app

Déployer

Lorsque vous atteignez ce point, déployez avec la commande suivante. Veuillez lire le nom du projet et la région selon le cas. En chemin, il vous sera demandé ʻAutoriser les invocations non authentifiées à [qiita-sample](y / N)? , Mais cette fois c'est un test, alors réglez-le sur y`. Lorsque vous avez terminé, vérifiez l'URL depuis la console GCP.

gcloud builds submit --tag gcr.io/$gcp_project/qiita-sample
gcloud beta run deploy qiita-sample --image gcr.io/$gcp_project/qiita-sample --platform managed --region us-west1

console.png

Paramètres de l'API de messagerie

Tout d'abord, connectez-vous à LINE Developers, accédez à Console et sélectionnez Fournisseur (sinon) Créer).

1.png

S'il n'y a pas encore de chaîne, l'écran ci-dessous s'affiche. Accédez à Créer un canal API de messagerie et remplissez les informations requises.

2.png

Vient ensuite le changement de réglage et la confirmation.

retry.png

Le réglage est terminé jusqu'à ce point.

Contrôle de fonctionnement

Ajoutez-le à vos amis LINE avec le code QR ou l'ID sur l'écran des paramètres et parlez-leur. Si vous avez déjà déployé Cloud Run, vous obtiendrez une réponse comme indiqué dans l'image au début. Vous pouvez également confirmer que le dernier temps de réponse est enregistré normalement à partir de la console Datastore.

5.png

finalement

En fait, c'était mon premier message, donc je pense qu'il y avait beaucoup de parties qui étaient difficiles à lire, mais j'espère que cela sera utile autant que possible. Enfin, je vais vous présenter le bot que j'ai créé comme dans cet article.

logo.png

Le parc est fermé à cause de Corona, mais c'est un bot pratique dans le parc à thème que j'ai fait rêver d'aller à nouveau à Disney. Si vous invitez avec un code QR ou un ID (@ 541rhynx), vous pouvez ** diviser ** et ** paire ** de véhicules en conversation LINE. Cette implémentation est App Engine, mais vous devriez pouvoir faire de même en réécrivant simplement l'app.py du bot que j'ai créé cette fois. Le code et les instructions sont disponibles sur github.

Recommended Posts

Jouez avec le cadre gratuit GCP ① ~ Cloud Run, Datastore et API de messagerie LINE ~
Jouez avec le cadre gratuit GCP ② ~ Airflow (sur Compute Engine), Cloud Functions ~
Extraction de texte avec l'API GCP Cloud Vision (Python3.6)
[LINE Messaging API] Créer un BOT de retour de perroquet avec Python
J'ai essayé de créer LINE-bot avec Python + Flask + ngrok + LINE Messaging API
[LINE Messaging API] Créez un BOT qui se connecte à quelqu'un avec Python
Traduire les sous-titres au format WebVTT de Coursera avec l'API GCP Cloud Translation
Exécutez Rotrics DexArm avec l'API Python
Exécutez XGBoost avec Cloud Dataflow (Python)
Comment créer un bot LINE à intelligence artificielle avec l'API de messagerie Flask + LINE