[PYTHON] Spielen Sie mit dem kostenlosen GCP-Frame ~ Cloud Run, Datastore & LINE Messaging API ~

Über diesen Artikel

Ich werde in mehreren Teilen vorstellen, was Sie mit dem freien Rahmen von GCP tun können. Der Inhalt der kostenlosen Stufe kann sich ändern, und Pay-as-you-go-Gebühren können erhoben werden, wenn das Limit überschritten wird. Offizielle Informationen Bitte verwenden Sie auf eigenes Risiko bei der Überprüfung = ja).

Dieses Mal werden wir ** Cloud Run ** und ** Datastore ** mit der ** Messaging API ** von LINE verknüpfen, um den folgenden einfachen Bot zu erstellen. Am Ende des Artikels werde ich einen praktischeren Bot vorstellen, der auf die gleiche Weise erstellt wurde. Schauen Sie also auch dort nach (ich habe ihn mit App Engine implementiert, aber es gibt viele Gemeinsamkeiten).

4.png
  1. Wenn Sie eine Nachricht erhalten, notieren Sie die Uhrzeit
  2. Geben Sie zum ersten Mal "Schön, Sie kennenzulernen!" Zurück
  3. Ab dem zweiten Mal wird die Zeit der letzten Nachricht zurückgegeben (das obige Bild ist aufgrund des Zeitunterschieds in Japan um 9 Stunden verschoben).

Eine kurze Einführung zu jedem Service

Cloud Run Ein GCP-Dienst, mit dem zustandslose Container in einer Umgebung ohne Server ausgeführt werden können. Dieses Mal läuft nur der Webserver von Flask, daher ist die Verwendung von App Engine vielleicht der Königsweg, aber Cloud Run scheint weniger Artikel zu haben, daher werde ich es vorstellen.

Datastore Die skalierbare NoSQL-Datenbank von GCP. Da es derzeit in Firestore integriert ist, verwenden wir Firestore im Datenspeichermodus, um genau zu sein. Übrigens erklärt Official, wie der Datenspeichermodus und der native Modus wie folgt richtig verwendet werden.

Verwenden Sie für neue Serverprojekte den Cloud Firestore im Datenspeichermodus.

Messaging API Sie können einen Bot erstellen, der auf LINE ausgeführt wird. Der erstellte Bot ist mit dem offiziellen LINE-Konto verknüpft, sodass Personen, die sich als Freunde registriert haben, ihn verwenden können.

Cloud Run-Einstellungen

Die folgenden 3 Dateien werden dieses Mal vorbereitet. Legen Sie sie alle im selben Verzeichnis ab.

app.py Das erste ist app.py, das den Hauptinhalt der Verarbeitung beschreibt. Die Gliederung basiert auf hier.

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 #Messaging-API-Zugriffstoken usw.
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) #Get Key mit Art und ID als Argumenten
    user_entity = client.get(user_key) #Holen Sie sich Entität mit Schlüssel als Argument
    if user_entity is None:
        user_entity = datastore.Entity(key=user_key, exclude_from_indexes=("timestamp",))
        msg = "Freut mich, dich kennenzulernen!"
    else:
        timestamp = user_entity["timestamp"]
        ts = datetime.datetime.fromtimestamp(timestamp/1000)
        msg = "{}Jahr{}Mond{}Tag{}Zeit{}Seit Minuten!".format(ts.year, ts.month, ts.day, ts.hour, ts.minute)
    user_entity.update({ #Entität aktualisieren
        "timestamp": event.timestamp
    })
    client.put(user_entity) #Speichern Sie das Argument Entität im Datenspeicher
    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 unmittelbar nach dem @ handler.add -Dekorator ist die Funktion, die der Nachricht von der Messaging-API entspricht. Das Argumentereignis enthält verschiedene Informationen, z. B. die Benutzer-ID des Absenders (aufgeführt in hier). Kann gesehen werden). Ich bin mit den Funktionen des Datenspeichers nicht vertraut, daher habe ich einen kurzen Kommentar abgegeben. Weitere Informationen finden Sie in der Dokumentation.

config.py Dies ist die Datei, die von import config in app.py geladen wurde. Zugriffstoken sind so eingestellt, dass sie mit der Messaging-API verknüpft sind (die Bestätigungsmethode wird später beschrieben). Sie können es direkt in app.py schreiben, es wird jedoch empfohlen, es als separate Datei zu erstellen, damit es problemlos mit .gitignore verwaltet werden kann.

config.py


token = "xxxxx"
secret = "xxxxx"

Dockerfile Endlich die Dockerfile. Die erforderlichen Python-Pakete werden mit RUN pip install ... installiert.

# 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

Bereitstellen

Wenn Sie diesen Punkt erreicht haben, stellen Sie ihn mit dem folgenden Befehl bereit. Bitte lesen Sie den Projektnamen und die Region entsprechend. Unterwegs werden Sie gefragt: "Nicht authentifizierte Aufrufe von [qiita-sample](j / n) zulassen?". Diesmal handelt es sich jedoch um einen Test. Setzen Sie ihn daher auf "y". Wenn Sie fertig sind, überprüfen Sie die URL in der GCP-Konsole.

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

Messaging-API-Einstellungen

Melden Sie sich zunächst bei LINE Developers an, gehen Sie zu Console und wählen Sie Provider (falls nicht). Erstellen).

1.png

Wenn noch kein Kanal vorhanden ist, wird der folgende Bildschirm angezeigt. Gehen Sie zu Erstellen eines Messaging-API-Kanals und geben Sie die erforderlichen Informationen ein.

2.png

Als nächstes folgt die Änderung und Bestätigung der Einstellungen.

--Überprüfen Sie "Kanalgeheimnis" in den Grundeinstellungen und "Kanalzugriffstoken" in den Messaging-API-Einstellungen (Problem mit Problem, falls nicht ausgegeben) und beschreiben Sie es in config.py. --Stellen Sie den Webhook in den Messaging-API-Einstellungen ein. Fügen Sie diesmal am Ende der in der Cloud Run-Konsole bestätigten URL "/ callback" und die in der folgenden Abbildung gezeigte URL hinzu. Aktivieren Sie nach der Eingabe "Webhook verwenden".

retry.png

Die Einstellung ist bis zu diesem Punkt abgeschlossen.

Funktionsprüfung

Fügen Sie es Ihren LINE-Freunden mit dem QR-Code oder der ID auf dem Einstellungsbildschirm hinzu und sprechen Sie mit ihnen. Wenn Sie Cloud Run bereits bereitgestellt haben, erhalten Sie eine Antwort, wie im Bild am Anfang gezeigt. Sie können auch bestätigen, dass die letzte Antwortzeit normalerweise über die Datenspeicherkonsole aufgezeichnet wird.

5.png

Schließlich

Eigentlich war es mein erster Beitrag, daher denke ich, dass es viele Teile gab, die schwer zu lesen waren, aber ich hoffe, dass er so hilfreich wie möglich ist. Abschließend werde ich den Bot vorstellen, den ich wie in diesem Artikel erstellt habe.

logo.png

Der Park ist wegen Corona geschlossen, aber es ist ein praktischer Bot im Themenpark, von dem ich geträumt habe, wieder nach Disney zu gehen. Wenn Sie mit einem QR-Code oder einer ID (@ 541rhynx) einladen, können Sie ** und ** Paar ** von Fahrzeugen in LINE talk teilen. Diese Implementierung ist App Engine, aber Sie sollten in der Lage sein, dasselbe zu tun, indem Sie die app.py des Bot, den ich dieses Mal erstellt habe, neu schreiben. Code und Anweisungen finden Sie unter github.

Recommended Posts

Spielen Sie mit dem kostenlosen GCP-Frame ~ Cloud Run, Datastore & LINE Messaging API ~
Spielen Sie mit GCP Free Frame ② ~ Luftstrom (auf Compute Engine), Cloud-Funktionen ~
Textextraktion mit GCP Cloud Vision API (Python3.6)
[LINE Messaging API] Erstellen Sie einen Papageienrückgabe-BOT mit Python
Ich habe versucht, LINE-Bot mit Python + Flask + ngrok + LINE Messaging API zu erstellen
[LINE Messaging API] Erstellen Sie einen BOT, der eine Verbindung zu jemandem mit Python herstellt
Übersetzen Sie die Untertitel im WebVTT-Format von Coursera mit der GCP Cloud Translation API
Führen Sie Rotrics DexArm mit der Python-API aus
Führen Sie XGBoost mit Cloud Dataflow (Python) aus.
So erstellen Sie einen LINE-Bot mit künstlicher Intelligenz mit der Flask + LINE Messaging-API