Wie der Titel schon sagt, habe ich mit der Python + Flask + ngrok + LINE Messaging API einen LINE-Bot mit einer einfachen Timer-Funktion erstellt. Es kann in kurzer Zeit erstellt werden. Wenn Sie interessiert sind, können Sie es gerne ausprobieren.
Dieses Mal werden wir "venv" verwenden, um eine virtuelle Umgebung mit dem Namen "lineVenv" im Verzeichnis "Workspace" zu erstellen.
% mkdir Workspace
% cd Workspace
% python3 -m venv lineVenv
Wenn nach dem Ausführen des folgenden Befehls am Anfang der Terminalzeile eine Notation "(lineVenv)" steht, ist dies erfolgreich.
% . lineVenv/bin/active
Verwenden Sie dann "pip", um "Flask" und "LINE Messaging API SDK for Python" zu installieren. Die erforderlichen Pakete können mit dem folgenden Befehl installiert werden.
% pip3 install flask
% pip3 install line-bot-sdk
Damit ist der Aufbau der virtuellen Umgebung abgeschlossen.
Übrigens ein Bot-Programm mit einer Timer-Funktion unter Bezugnahme auf "README.rst" in GitHub der zuvor installierten LINE Messaging API für SDK. Wird implementiert werden. Erstellen Sie "app.py" im vorherigen Verzeichnis und schreiben Sie wie folgt.
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,
)
from time import time
from datetime import timedelta
app = Flask(__name__)
line_bot_api = LineBotApi('YOUR_CHANNEL_ACCESS_TOKEN') #Kanalzugriffstoken
handler = WebhookHandler('YOUR_CHANNEL_SECRET') #Kanalgeheimnis
@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'
user = {}
@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
id = event.source.user_id #Abrufen einer LINE-Benutzer-ID
if event.message.text == "start":
if not id in user: #Für neue Benutzer
user[id] = {}
user[id]["total"] = 0
user[id]["start"] = time() #Holen Sie sich die Zeit, zu der der Start ausgeführt wird
totalTimeStr = timedelta(seconds = user[id]["total"]) #s -> h:m:s
reply_message = f"Start Timer\n\nTotal: {totalTimeStr}"
elif event.message.text == "stop":
end = time() #Ende Laufzeit abrufen
dif = int(end - user[id]["start"]) #Verstrichene Zeit
user[id]["total"] += dif #Gesamtzeit aktualisieren
timeStr = timedelta(seconds = dif)
totalTimeStr = timedelta(seconds = user[id]["total"])
reply_message = f"Stop Timer\n\nTime: {timeStr}s\nTotal: {totalTimeStr}"
elif event.message.text == "reset":
user[id]["total"] = 0 #Gesamtzeit auf 0 zurücksetzen
totalTimeStr = timedelta(seconds = user[id]["total"])
reply_message = f"Reset Timer\n\nTotal: {totalTimeStr}"
else:
reply_message = "Please send \"start\" or \"stop\"or \"reset\"" #Antwort auf 3 nicht spezifizierte Wörter
line_bot_api.reply_message(
event.reply_token,
TextSendMessage(text=reply_message))
if __name__ == "__main__":
app.run()
Es sieht so aus, als wäre es erledigt, aber es gibt zwei weitere Änderungen an den folgenden:
line_bot_api = LineBotApi('YOUR_CHANNEL_ACCESS_TOKEN') #Kanalzugriffstoken
handler = WebhookHandler('YOUR_CHANNEL_SECRET') #Kanalgeheimnis
Was Sie hier brauchen, ist das Kanalzugriffstoken und das Kanalgeheimnis, die Sie in ① notiert haben. Bitte kopieren Sie sie und fügen Sie sie in "YOUR_CHANNEL_ACCESS_TOKEN" bzw. "YOUR_CHANNEL_SECRET" ein.
Fahren wir nun mit der Ausführung fort. Wenn Sie "flask run" in der virtuellen Umgebung ausführen, wird Folgendes angezeigt.
% flask run
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
Es gibt eine Adresse von "http: //127.0.0.1: 5000", aber da es sich um localhost handelt, kann nicht von außerhalb des LAN darauf zugegriffen werden. (Mit anderen Worten, vom LINE-Server aus kann nicht darauf zugegriffen werden, und der Webhook kann nicht verwendet werden.) Es gibt eine Möglichkeit, es bereitzustellen, aber als ich nach einer anderen Methode suchte, schien ein Tool namens "ngrok" nützlich zu sein.
Verwendung von ngrok https://qiita.com/hirokisoccer/items/7033c1bb9c85bf6789bd
Öffnen Sie also ein anderes Terminal als das Terminal, auf dem "Flask Run" ausgeführt wird, und installieren Sie es mit dem folgenden Befehl.
% brew install ngrok
Sie können die ausführbare Datei auch von der offiziellen Website von ngrok herunterladen.
Führen Sie nach Abschluss der Installation ngrok http 5000
aus und Sie sehen Folgendes:
% ngrok http 5000
ngrok by @inconshreveable (Ctrl+C to quit)
Session Status online
Session Expires 7 hours, 59 minutes
Version 2.3.35
Region United States (us)
Web Interface http://127.0.0.1:4040
Forwarding http://xxxxxxxxxxxx.ngrok.io -> http://localhost:5000
Forwarding https://xxxxxxxxxxxx.ngrok.io -> http://localhost:5000
Connections ttl opn rt1 rt5 p50 p90
0 0 0.00 0.00 0.00 0.00
Sie können jetzt über die öffentliche URL https: // xxxxxxxxxxx.ngrok.io auf http: //127.0.0.1: 5000 zugreifen.
Nachdem wir die URL für den Webhook haben, sind wir wieder bei LINE Developers. Ändern Sie die folgenden zwei Punkte unter Messaging-API-Einstellungen-> Webhook-Einstellungen.
https://xxxxxxxxxxxx.ngrok.io
Die folgenden zwei Punkte der offiziellen Kontofunktion von LINE werden geändert.
Dies ist das Ende aller Schritte.
Fügen Sie folgende LINE-Freunde hinzu und senden Sie die im Programm angegebene Anfrage. Messaging-API-Einstellungen-> QR-Code / Bot-Basis-ID
Here ist ein Bot, der den Inhalt dieses Artikels reproduziert. (Bereitgestellt) Sie können dies verweisen, wenn Sie möchten.
Heroku (kostenlose Version) war nicht für die Bereitstellung des diesmal erstellten LINE-Bots geeignet. In Heroku ist die Nummer des öffentlichen Ports nicht festgelegt, sodass der Prozess, mehrere Anforderungen zu stellen und zu gruppieren, nicht stabil ist. PythonAnywhere funktionierte gut, vorausgesetzt, es war kostenlos und stabil.
LINE Developers - Documents - Messaging API LINE Messaging API SDK for Python Verwendung von ngrok
Recommended Posts