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).
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.
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
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
Melden Sie sich zunächst bei LINE Developers an, gehen Sie zu Console und wählen Sie Provider (falls nicht). Erstellen).
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.
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".
Die Einstellung ist bis zu diesem Punkt abgeschlossen.
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.
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.
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