[PYTHON] Machen Sie einen LINE BOT

Ich habe mit LINEBOT mit Heroku, Flask und Line-Bot-SDK eine einfache Papageien-Rückkehr gemacht. Es dauerte volle zwei Tage und es gab viele Punkte, die stecken blieben, also teile es mit Notizen.

· Mac ・ Python

(1) Umgebungspflege, Verzeichnisstruktur

Erstellen Sie ein Verzeichnis test_linebot auf Ihrem Desktop. Erstellen Sie eine virtuelle Umgebung im Verzeichnis und starten Sie sie.

python3 -m venv .
source bin/activate

Die endgültige Verzeichnisstruktur lautet wie folgt

test_linebot
├main.py
├runtime.txt
├Procfile
└requirements.txt

(2) Installieren Sie das erforderliche Framework

pip install flask
pip install gunicorn
pip install line-bot-sdk

(3) Erstellen Sie main.py

.py:main.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 os

app = Flask(__name__)

#LINE Entwickler greifen auf Token und Channel Secret zu, die in der Heroku-Umgebungsvariablen festgelegt sind
#Code zu bekommen
YOUR_CHANNEL_ACCESS_TOKEN = os.environ["YOUR_CHANNEL_ACCESS_TOKEN"]
YOUR_CHANNEL_SECRET = os.environ["YOUR_CHANNEL_SECRET"]
line_bot_api = LineBotApi(YOUR_CHANNEL_ACCESS_TOKEN)
handler = WebhookHandler(YOUR_CHANNEL_SECRET)

#Code, um zu überprüfen, ob die Bereitstellung für Heroku erfolgreich war
@app.route("/")
def hello_world():
    return "hello world!"


#Geben Sie eine URL für den Webhook von LINE Developers an, damit der Webhook ein Ereignis an die URL sendet
@app.route("/callback", methods=['POST'])
def callback():
    #Rufen Sie den Wert für die Signaturüberprüfung aus dem Anforderungsheader ab
    signature = request.headers['X-Line-Signature']

    #Anfragetext abrufen
    body = request.get_data(as_text=True)
    app.logger.info("Request body: " + body)

    #Überprüfen Sie die Signatur und rufen Sie die im Handle definierte Funktion auf, wenn kein Problem vorliegt
    try:
        handler.handle(body, signature)
    except InvalidSignatureError:
        abort(400)
    return 'OK'


#Im Folgenden wird beschrieben, wie das vom Webhook gesendete Ereignis behandelt wird
@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
    line_bot_api.reply_message(
        event.reply_token,
        TextSendMessage(text=event.message.text))

#Einstellung der Portnummer
if __name__ == "__main__":
    port = int(os.getenv("PORT", 5000))
    app.run(host="0.0.0.0", port=port)

* Ergänzende Erläuterung des obigen Codes

try:〜 Eine Beschreibung des Webhooks. Ein Webhook ist ein Prozess, der ein Ereignis an einen Server sendet, der das Ereignis verarbeitet, wenn ein Ereignis (Senden einer Nachricht, Hinzufügen eines Freundes usw.) auftritt (eine URL muss im Webhook von LINE Developers angegeben werden, um es an den Server zu senden).

@handler.add(MessageEvent, message=TextMessage) Geben Sie den Ereignistyp im ersten Argument ein (diesmal möchte ich antworten, wenn eine Nachricht gesendet wird, also habe ich MessageEvent ausgewählt). Im zweiten Argument möchte ich den Nachrichtentyp eingeben (diesmal möchte ich Text zurückgeben). Daher message = TextMessage).

def handle_message(event): Die Ereignisverarbeitungsfunktion handle_message wird aufgerufen, und der Wert des zweiten Arguments von reply_message wird als LINE-Antwort zurückgegeben. Verwenden Sie die Funktion reply_message von lineb_bot_api, um sie als Zeilennachricht zurückzugeben. Das erste Argument event.reply_token, das reply_message ist, enthält reply_token. Dies kann vom Webhook-Objekt abgerufen werden und gibt an, auf welches Ereignis geantwortet werden soll. Bedeutet das Antwort-Token für ein Ereignis. Fügen Sie im zweiten Argument eine Funktion namens TextSendMessage für die in linebot.models definierte Antwort ein, und diese Funktion fügt die zurückzugebende Nachricht in das Argument ein. Darüber hinaus speichert event.message.text die von LINE gesendete Nachricht. Wenn beispielsweise "Guten Morgen" gesendet wird, wird event.message.text = "Guten Morgen" gespeichert. Wenn TextSendMessage (text = 'Guten Morgen')), geben alle Antworten "Guten Morgen" zurück. Der Inhalt der Veranstaltung ist übrigens wie folgt.

{
  "message": {
    "id": "***************",
    "text": "Guten Morgen",
    "type": "text"
  },
  "replyToken": "***********************",
  "source": {
    "type": "user",
    "userId": "************************"
  },
  "timestamp": *********************,
  "type": "message"
}

port = int(os.getenv("PORT", 5000)) Heroku scheint Portnummern dynamisch zuzuweisen. Verwenden Sie daher os.getenv, um Folgendes zu tun: os.getenv ("PORT", 5000) versucht, die Umgebungsvariable 'PORT' zu erfassen. Wenn sie erfasst werden kann, wird der erfasste Wert zurückgegeben. Wenn er nicht erfasst werden kann, wird 5000 zurückgegeben. 5000 ist für die Arbeit in einer lokalen Umgebung vorgesehen.

#Einstellung der Portnummer
if __name__ == "__main__":
    port = int(os.getenv("PORT", 5000))
    app.run(host="0.0.0.0", port=port)

(4) Registrieren Sie sich bei LINE-Entwicklern

Greifen Sie auf LINE Developers zu und erstellen Sie nach der Registrierung einen "Anbieter", der den Dienstanbieter darstellt. Erstellen Sie einen neuen Kanal innerhalb des Anbieters. Wählen Sie als Kanaltyp die Nachrichten-API aus.

(5) Legen Sie die Heroku-Umgebungsvariablen fest

Melden Sie sich bei Heroku an und erstellen Sie eine App. Dieses Mal habe ich es testlinebot0319 genannt.

heroku login
heroku create testlinebot0319

Initialisieren

git init

Verknüpfe Herokus App mit Git,

heroku git:remote -a testlinebot0319

Legen Sie die "Zugriffstoken-Zeichenfolge" und "Kanal-Geheimzeichenfolge" der Zeilenentwickler in den Heroku-Umgebungsvariablen fest. Beispiel: heroku config: set YOUR_CHANNEL_ACCESS_TOKEN = "Zeichenfolge für Kanalzugriffstoken" -a (App-Name).

heroku config:set YOUR_CHANNEL_ACCESS_TOKEN="Kanalzugriffstoken-Zeichenfolge" -a testlinebot0319
heroku config:set YOUR_CHANNEL_SECRET="Geheime Zeichenfolge des Kanals" -a testlinebot0319

Überprüfen Sie, ob die Umgebungsvariable in Heroku richtig eingestellt ist.

heroku config

(6) Bereiten Sie andere erforderliche Dateien vor

Erstellen Sie Procfile, runtime.txt, require.txt.

Erstellen Sie runtime.txt, nachdem Sie Ihre eigene Python-Version überprüft haben.

.txt:runtime.txt



python-3.8.0

Procfile beschreibt Folgendes.

Prockfile


web: python main.py

Beschreiben Sie die Datei "resources.txt", indem Sie im Terminal Folgendes eingeben.

pip freeze > requirements.txt

(7) In Heroku bereitstellen

Initialisieren Sie git erneut, ordnen Sie es zu, fügen Sie es hinzu und schreiben Sie es zuerst mit dem Namen fest. Schieben Sie schließlich zu Heroku.

git init
heroku git:remote -a testlinebot0319
git add .
git commit -m'the-first'
git push heroku master

Heroku offen,

heroku open

Erfolg, wenn im Browser Folgendes angezeigt wird.

スクリーンショット 2020-03-19 22.32.28.png

(8) Webhook-Einstellungen für LINE-Entwickler

Legen Sie den Namen Ihrer Heroku-App im Feld LINE Developers Webhook wie unten gezeigt fest. App-Name auf Heroku = testlinebot0319 スクリーンショット 2020-03-19 22.34.25.png

Aktivieren Sie zu diesem Zeitpunkt die Verwendung von Webhook. Wenn Sie den obigen QR-Code von LINE Developers lesen und sich als Freund registrieren, ist der Antrag auf Rückgabe von Papageien abgeschlossen. Wenn LINE BOT nicht funktioniert, z. B. wenn der Papagei nicht zurückgegeben wird, kann ich den Webhook wiederholt ein- und ausschalten (in meinem Fall hat das funktioniert).

Referenzierte Site

Lassen Sie uns einen LINE BOT erstellen, der in einer Stunde auf Wikipedia gesucht werden kann! LINE BOT mit Python + Flask + Heroku [Python-Anfänger! - Papagei mit LINE Bot zurückgeben-]

Recommended Posts

Machen Sie einen LINE BOT
Machen Sie einen LINE BOT (Chat)
[Python] Erstelle deinen eigenen LINE-Bot
LINE BOT, wenn ~ gestolpert ist
Erstellen Sie mit Amazon Lex einen LINE WORKS-Bot
Machen Sie mit LINE + Flask einen morphologischen Analyse-Bot
Lassen Sie einen Papagei LINE Bot mit AWS Cloud9 zurückgeben
[Zum Spielen] Versuche Yuma zu einem LINE Bot zu machen (Python)
[Super einfach] Machen wir einen LINE BOT mit Python.
Machen wir einen Discord Bot.
Papagei gibt LINE BOT-Erstellung zurück
Sicherheitsbestätigung LINE bot [Erklärung]
Erstellen Sie mit GoogleAppEngine / py einen LINE-Bot. Einfache nackte Version
Lassen Sie uns einen LINE-Bot mit verschiedenen Diensten erstellen [ngrok edition]
Segfo Python in einer Zeile
Erstelle einen LINE-Bot mit Python + Heroku
Machen Sie Perl Segfo in einer Zeile
Wie man einen lockeren Bot macht
[LINE Bot] Ich bin ein Ranger! Teil 2
Erstellen Sie mit Django einen LINE-Bot
So erstellen Sie einen LINE-Bot mit künstlicher Intelligenz mit der Flask + LINE Messaging-API
Python-Anfänger haben beschlossen, einen LINE-Bot mit Flask zu erstellen (Flask-Kommentar)
Ich habe versucht, "Sakurai-san" LINE BOT mit API Gateway + Lambda zu erstellen
Machen Sie es sichtbar, indem Sie die von journalctrl abgeschnittene Linie durchbrechen
Zeigen Sie Disneys Wartezeit mit dem LINE-Bot an
Erstellen eines LINE-Bots ~ Erstellen, Bereitstellen und Starten von ~
[Python] [LINE Bot] Erstellen Sie einen LINE Bot mit Papageienrückgabe
Überwachen Sie Webseitenaktualisierungen mit LINE BOT
Machen wir einen Twitter-Bot mit Python!