Ich habe versucht, LINE-Bot mit Python + Flask + ngrok + LINE Messaging API zu erstellen

Einführung

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.

Umgebung

Verfahren

① LINE-Entwickler - Kanäle erstellen

② Aufbau einer virtuellen Umgebung

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.

③ Implementierung des Bot-Programms

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

⑤ Ausführung

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.

⑥ LINE-Entwickler - Webhook-Einstellungen ・ Antworteinstellungen

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.

Die folgenden zwei Punkte der offiziellen Kontofunktion von LINE werden geändert.

Dies ist das Ende aller Schritte.

Prüfung

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.

Bonus

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.

Referenzseite

LINE Developers - Documents - Messaging API LINE Messaging API SDK for Python Verwendung von ngrok

Recommended Posts

Ich habe versucht, LINE-Bot mit Python + Flask + ngrok + LINE Messaging API zu erstellen
Ich habe Chatbot mit LINE Messaging API und Python erstellt
Ich habe Chatbot mit der LINE Messaging API und Python (2) ~ Server ~ erstellt
Mattermost Bot mit Python gemacht (+ Flask)
Ich habe einen Blackjack mit Python gemacht!
Ich habe mit Python einen Blackjack gemacht.
Ich habe Wordcloud mit Python gemacht.
Ich habe versucht, LINE BOT mit Python und Heroku zu machen
[LINE Messaging API] Erstellen Sie einen Papageienrückgabe-BOT mit Python
Mit Flask erstellte SNS Python-Grundlagen
Ich habe einen Line-Bot mit Python gemacht!
Ich habe eine einfache Buch-App mit Python + Flask ~ Introduction ~ erstellt
Ich habe mit Python eine Lotterie gemacht.
Ich habe mit Python einen Daemon erstellt
"Inoffizielle Apple Refurbished Product Introduction" BOT mit LINE Messaging API (v2) + API Gateway + Lambda (Python)
Ich habe mit Python, Flask und Heroku ein Nyanko-Tweet-Formular erstellt
[LINE Messaging API] Erstellen Sie einen BOT, der eine Verbindung zu jemandem mit Python herstellt
Ich habe Linebot mit Flasche (Anaconda) + Heroku ausprobiert
Einfacher Slack API-Client mit Python
Ich habe mit Python einen Zeichenzähler erstellt
[Python] Erstellen Sie schnell eine API mit Flask
Ich habe mit Python eine Hex-Map erstellt
Serverlose Gesichtserkennungs-API mit Python
Ich habe mit Python ein schurkenhaftes Spiel gemacht
Ich habe mit Python einen einfachen Blackjack gemacht
Ich habe mit Python eine Einstellungsdatei erstellt
Ich habe mit Python einen Neuronensimulator erstellt
So erstellen Sie einen LINE-Bot mit künstlicher Intelligenz mit der Flask + LINE Messaging-API
Ich habe mit Python eine Bot-Wettervorhersage gemacht.
Ich habe eine GUI-App mit Python + PyQt5 erstellt
Ich habe meinen Hund "Monaka Bot" mit Line Bot gemacht
Ich habe versucht, mit Python einen Twitter-Blocker für faule Mädchen zu machen
Vorgehensweise zum Erstellen eines mit Python erstellten LineBot
[Python] Ich habe mit Tkinter einen Youtube Downloader erstellt.
LINE BOT mit Python + AWS Lambda + API Gateway
Ich habe einen LINE Bot mit Serverless Framework erstellt!
Ich habe mit Python ein Bin-Picking-Spiel gemacht
Python Qiita API Wrapper "qiipy" gemacht
Entscheidungsunterstützungssystem für ältere Menschen mit LINE Messaging API + Serverless Framework
Programmieren mit Python Flask
[AWS] Ich habe BOT mit LINE WORKS daran erinnert
Ich habe mit LINE Bot ein Haushaltsbuch für Bot erstellt
Ich habe mit Python ein Weihnachtsbaum-Beleuchtungsspiel gemacht
[LINE Messaging API] Erstellen Sie mit Python ein umfangreiches Menü
Ich habe mit Python eine App für die Benachrichtigung über Netznachrichten erstellt
Ich habe eine Python3-Umgebung unter Ubuntu mit direnv erstellt.
Ich habe versucht, die API mit dem Python-Client von echonest zu erreichen
Verschiedene Memoranden bei Verwendung von SDK der LINE Messaging API mit Python (2.7.9) + Google App Engine
Ich habe fp-Wachstum mit Python versucht
Verwenden Sie die Trello-API mit Python
Als ich CaboCha in Python3 verfügbar machte, blieb ich stecken (Windows 10)
Verwenden Sie die Twitter-API mit Python
Ich habe ein Paket erstellt, um Zeitreihen mit Python zu filtern
API mit Flask + uWSGI + Nginx
Ich habe versucht, Follow Management mit Twitter API und Python (einfach)
Web-API mit Python + Falcon