[PYTHON] Ich habe versucht, einen Linebot zu erstellen (Implementierung)

Vorbereitung: https://qiita.com/maihamada/items/2c4d5b4f6ae82db45970 Nachdem die Vorbereitungen abgeschlossen sind, werden wir sie tatsächlich umsetzen.

(1) Das System, das Sie dieses Mal erstellen möchten

Wenn die Eingabe "Diakonendiagnose" empfangen wird, führen Sie "Diakonendiagnose" durch. Die Frage ist der folgende Ablauf. スクリーンショット 2020-05-09 19.09.01.png Das fertige Bild sieht so aus. S__3842059.jpg

Abhängig von der Reaktion des Schaltflächenereignisses kann das Schaltflächenereignis zurückgegeben werden, das Nachrichtenereignis kann zurückgegeben werden und so weiter.

(2) Erstellen eines Ordners

Ein Arbeitsverzeichnis wurde erstellt, daher werden wir daran arbeiten. Erstellen Sie einen Ordner mit der folgenden Dateistruktur.

situji-bot/ [Arbeitsverzeichnis(Alles wird gut)]
 ├app.py 
 ├conf.json
 ├Procfile
 ├requirements.txt
 ├runtime.txt
 └template/
  └button_event.py

(3) Dateibeschreibung

app.py Ich schreibe das Haupt für die Anwendung.


import os
import sys
import json

#Kolbenbibliothek importieren
from flask import Flask, request, abort
#Linebot-Bibliothek importieren
from linebot import LineBotApi, WebhookHandler
from linebot.exceptions import InvalidSignatureError
from linebot.models import (
    MessageEvent, PostbackEvent, TextMessage, TextSendMessage
)

#Importieren Sie Ihre eigene Bibliothek
from template import button_event

app = Flask(__name__)

#Einstellungsdatei lesen
ABS_PATH = os.path.dirname(os.path.abspath(__file__))
with open(ABS_PATH+'/conf.json', 'r') as f:
    CONF_DATA = json.load(f)
CHANNEL_SECRET = CONF_DATA['CHANNEL_SECRET']
CHANNEL_ACCESS_TOKEN = CONF_DATA['CHANNEL_ACCESS_TOKEN']

#Erstellen Sie eine Instanz der Clientbibliothek
line_bot_api = LineBotApi(CHANNEL_ACCESS_TOKEN)
handler = WebhookHandler(CHANNEL_SECRET)

#Code zum Testen
@app.route("/")
def test():
    app.logger.info("test")
    return('test OK')

#LINE API-Code
@app.route("/callback", methods=['POST'])
def callback():
    signature = request.headers['X-Line-Signature']
    body = request.get_data(as_text=True)
    app.logger.info(f"Request body: {body}")
    try:
        handler.handle(body, signature)
    except InvalidSignatureError as e:
        print(e)
        abort(400)
    return 'OK'

#Reaktion, wenn eine Nachricht kommt
@handler.add(MessageEvent, message=TextMessage)
def message_text(event):
    message_text = event.message.text
    app.logger.info(message_text)

    if message_text == 'Butler-Diagnose':
        line_bot_api.reply_message(
            event.reply_token,
            button_event.SitujiSindan().question_a()
        )
    else:
        msg = 'Es tut uns leid, aber wir unterstützen es derzeit nicht.'
        line_bot_api.reply_message(
            event.reply_token,
            TextSendMessage(text=msg)
        )

#Reaktion, wenn der Wert zurückkommt
@handler.add(PostbackEvent)
def on_postback(event):
    reply_token = event.reply_token
    user_id = event.source.user_id

    # postback_msg :Methodenname als Zeichenfolge
    postback_msg = event.postback.data
    # situji_sindan :Klassenobjekt
    situji_sindan = button_event.SitujiSindan()
    #Erstellen Sie ein Methodenobjekt aus dem Klassenobjekt und den Methodennamen aus der Zeichenfolge
    question = getattr(situji_sindan, postback_msg)
    #Wirf die nächste Frage
    line_bot_api.reply_message(
        event.reply_token,
        question()
    )

if __name__ == "__main__":
    app.run(debug=True)

conf.json Wenn Sie sich diese Datei ansehen, wird sie getrennt, damit Sie sehen können, welche Einstellung Sie verwenden. Derzeit habe ich nur die Zeilen-API festgelegt, möchte aber in Zukunft die DB-Einstellungen einbeziehen. Hier wird das in der Vorbereitung erhaltene Kanal-Geheimkanal-Zugriffstoken verwendet.

{
"CHANNEL_SECRET": "[Kanalgeheimnis]",
"CHANNEL_ACCESS_TOKEN": "[Kanalzugriffstoken]"
}

Procfile Einstellungsdatei wie Prozesstyp. Es scheint, dass Gunicorn (WSGI-Server) erforderlich ist, um den Webserver und das Flask-Framework zu verbinden. Die Schreibweise ist wie folgt und die letzte --log-Datei - wird nur beschrieben, wenn Sie ein Protokoll ausgeben möchten. [process type]: [command] [api_name] : app --log-file -

web: gunicorn app:app --log-file -

requirements.txt Schreiben Sie die verwendete Bibliothek und Version.

Flask==1.1.2
gunicorn==20.0.4
line-bot-sdk==1.16.0

runtime.txt Schreiben Sie die von Ihnen verwendete Python-Version.

python-3.8.1

template/button_event.py Dieses Mal habe ich viele Schaltflächenereignisse erstellt und versucht, es zu einem separaten Modul zu machen.

from linebot.models import (
    PostbackEvent, TextSendMessage, TemplateSendMessage,
    ButtonsTemplate, PostbackTemplateAction
)

class SitujiSindan:
    def question_a(self):
        button_template = TemplateSendMessage(
            alt_text="Butler-Diagnose",
            template=ButtonsTemplate(
                title="Frage 1",
                text="Wenn Sie in eine Prise geraten",
                actions=[
                  PostbackTemplateAction(
                    label='Helfen Sie mit Ihrem Gehirn',
                    data='question_b'
                  ),
                  PostbackTemplateAction(
                    label='Dehne deinen Körper und hilf dir',
                    data='question_c'
                  )
                ]
            )
        )
        return button_template

    def question_b(self):
        button_template = TemplateSendMessage(
            alt_text="Butler-Diagnose",
            template=ButtonsTemplate(
                title="Frage 2",
                text="Wenn Sie etwas hartes tun ...",
                actions=[
                  PostbackTemplateAction(
                    label='Ich möchte, dass du mir sanft folgst',
                    data='answer_d'
                  ),
                  PostbackTemplateAction(
                    label='Ich möchte, dass du mich richtig schaltest',
                    data='answer_e'
                  )
                ]
            )
        )
        return button_template

    def question_c(self):
        button_template = TemplateSendMessage(
            alt_text="Butler-Diagnose",
            template=ButtonsTemplate(
                title="Frage 2",
                text="Welches ist der Typ?",
                actions=[
                  PostbackTemplateAction(
                    label='Unfreundlich',
                    data='answer_f'
                  ),
                  PostbackTemplateAction(
                    label='Freundlich',
                    data='answer_g'
                  )
                ]
            )
        )
        return button_template

    def answer_d(self):
        msg = 'Das Diagnoseergebnis ist "Orthodoxer Butler". Wie auch immer, ich gebe mein Bestes für die junge Dame'
        return TextSendMessage(text=msg)

    def answer_e(self):
        msg = 'Das Diagnoseergebnis lautet "Älterer Bruder Diakon". Ich liebe sie und kümmere mich immer um sie.'
        return TextSendMessage(text=msg)

    def answer_f(self):
        msg = 'Das Diagnoseergebnis ist "Butler". Es ist ein wenig unfreundlich, aber ich gebe mein Bestes, um die junge Dame zu beschützen. Die Gewohnheit ist "weil es nur ein Butler ist."'
        return TextSendMessage(text=msg)

    def answer_g(self):
        msg = 'Das Diagnoseergebnis ist "jüngerer Bruder Butler". Ich liebe die junge Dame und behandle sie wie einen jüngeren Bruder. Normalerweise verlasse ich mich nicht darauf, aber ich werde mein Bestes tun, um es zur Not zu schützen.'
        return TextSendMessage(text=msg)

(4) Vor Ort testen.

$ python app.py
 * Serving Flask app "app" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: on
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 897-298-226

Klicken Sie auf die folgende URL mit Chrom usw., und wenn das Wort "Test OK" angezeigt wird, ist es OK. http://127.0.0.1:5000/

(5) Bereitstellen

Ich habe festgelegt, dass es automatisch bereitgestellt wird, wenn ich es auf Git übertrage, also drücke ich es. Inszenierung.

$ git add .

Überprüfen Sie den Staging-Status.

$ git status
On branch master
Your branch is up to date with 'origin/master'.

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	new file:   Procfile
	new file:   app.py
	new file:   conf.json
	new file:   requirements.txt
	new file:   runtime.txt
	new file:   template/button_event.py

Commit & Push.

$ git commit -m 'first push'
[master 04a377d] first push
 6 files changed, 198 insertions(+)
 create mode 100644 Procfile
 create mode 100644 app.py
 create mode 100644 conf.json
 create mode 100644 requirements.txt
 create mode 100644 runtime.txt
 create mode 100644 template/button_event.py
$ git push origin master
Enumerating objects: 10, done.
Counting objects: 100% (10/10), done.
Delta compression using up to 4 threads
Compressing objects: 100% (6/6), done.
Writing objects: 100% (9/9), 2.80 KiB | 1.40 MiB/s, done.
Total 9 (delta 0), reused 0 (delta 0), pack-reused 0
To github.com:maihamada/situji-bot.git
   fc7af07..04a377d  master -> master

(6) Richten Sie LINE-Entwickler ein

Webhock einrichten. (In den Messaging-API-Einstellungen) スクリーンショット 2020-05-09 19.52.12.png

Ordnen Sie die Antworteinstellungen nach Ihren Wünschen an. スクリーンショット 2020-05-09 19.53.28.png

Damit ist die Erstellung von LINE BOT abgeschlossen.

Impressionen

Es war einfacher zu implementieren als ich erwartet hatte. In Zukunft möchte ich das Antwortmuster durch Zeichenketten erhöhen und den Ton des Butlers anhand des Ergebnisses dieser Diagnose ändern.

Recommended Posts

Ich habe versucht, einen Linebot zu erstellen (Implementierung)
Ich habe versucht, einen Linebot zu erstellen (Vorbereitung)
Ich möchte eine Art von Implementierung erstellen, die angeschlossen werden kann
Ich habe versucht, eine Quip-API zu erstellen
Ich habe versucht, automatisch einen Bericht mit der Markov-Kette zu erstellen
Ich habe versucht, einen Bot für die Ankündigung eines Wiire-Ereignisses zu erstellen
Ich habe versucht, der CPython-Implementierung ein Post-Inkrement hinzuzufügen
Ich habe eine Web-API erstellt
Ich habe versucht, eine Serverumgebung zu erstellen, die unter Windows 10 ausgeführt wird
Ich habe versucht, einen einfachen Kredit-Score mit logistischer Regression zu erstellen.
Ich habe versucht, mit Python eine Liste von Primzahlen zu erstellen
Ich habe versucht, Bulls and Cows mit einem Shell-Programm zu erstellen
Ich habe versucht zu debuggen.
Ich habe versucht, eine Super-Resolution-Methode / ESPCN zu erstellen
Ich möchte einfach ein Rauschmodell erstellen
Ich habe versucht, eine Super-Resolution-Methode / SRCNN build zu erstellen
Ich möchte mit Python ein Fenster erstellen
Ich habe versucht, eine zufällige Zeichenfolge zu generieren
Ich habe versucht, eine Super-Resolution-Methode / SRCNN build zu erstellen
Ich habe versucht, eine Super-Resolution-Methode / SRCNN build zu erstellen
Ich habe ein ○ ✕ Spiel mit TensorFlow gemacht
Ich habe versucht, ein Programm zu erstellen, das Hexadezimalzahlen mit Python in Dezimalzahlen konvertiert
Ich habe versucht, ein Plug-In mit HULFT IoT Edge Streaming [Entwicklung] (2/3) zu erstellen.
Ich habe versucht, ein Plug-In mit HULFT IoT Edge Streaming [Ausführung] (3/3) zu erstellen.
[Outlook] Ich habe versucht, mit Python automatisch eine tägliche Berichtsmail zu erstellen
Ich habe versucht, ein Plug-In mit HULFT IoT Edge Streaming [Setup] (1/3) zu erstellen.
Ich habe ein Beispiel für den Zugriff auf Salesforce mit Python und Bottle erstellt
Ich habe versucht, einen "verdammt großen Literaturkonverter" zu machen.
Ich habe versucht, PredNet zu lernen
Ich habe versucht, eine Klasse zu erstellen, mit der Json in Python problemlos serialisiert werden kann
Ich habe versucht, SVM zu organisieren.
Ich habe versucht, einen Pseudo-Pachislot in Python zu implementieren
Als ich versuchte, mit Python eine virtuelle Umgebung zu erstellen, funktionierte dies nicht
Ich habe versucht, PCANet zu implementieren
Ich habe versucht, mit Selenium + Python einfach ein vollautomatisches Anwesenheitssystem zu erstellen
[Azure] Ich habe versucht, eine virtuelle Linux-Maschine mit Azure von Microsoft Learn zu erstellen
[Go + Gin] Ich habe versucht, eine Docker-Umgebung zu erstellen
Ich habe versucht, Linux wieder einzuführen
Ich möchte manuell eine Legende mit matplotlib erstellen
Ich habe versucht, Pylint vorzustellen
Ich habe versucht, mit Raspeye + Tact Switch eine Schaltfläche für Slack zu erstellen
Ich habe versucht, SparseMatrix zusammenzufassen
jupyter ich habe es berührt
Ich habe versucht, StarGAN (1) zu implementieren.
Ich habe versucht, ein Konfigurationsdiagramm mit Diagrammen zu zeichnen
Ich habe versucht, ein Modell mit dem Beispiel von Amazon SageMaker Autopilot zu erstellen
Ich habe versucht, mit Open AI Gym eine verbesserte Lernumgebung für Othello zu schaffen
[Python] Ich habe versucht, automatisch einen täglichen Bericht über YWT mit Outlook-Mail zu erstellen
Ich habe versucht, eine Klasse für die Suche nach Dateien mit der Glob-Methode von Python in VBA zu erstellen
Ich habe versucht, einen Pandas-Datenrahmen zu erstellen, indem ich mit Python Informationen zum Lebensmittelrückruf abgekratzt habe
Ich habe versucht, mit Quantx eine Linie mit gleitendem Durchschnitt des Volumens zu implementieren
Ich habe versucht, das grundlegende Modell des wiederkehrenden neuronalen Netzwerks zu implementieren
Ich habe versucht, API list.csv mit Python aus swagger.yaml zu erstellen
Ich habe versucht, einen eindimensionalen Zellautomaten in Python zu implementieren
[Markov-Kette] Ich habe versucht, die Zitate in Python einzulesen.
Ich habe ein Tool erstellt, um eine Wortwolke aus Wikipedia zu erstellen