Vorbereitung: https://qiita.com/maihamada/items/2c4d5b4f6ae82db45970 Nachdem die Vorbereitungen abgeschlossen sind, werden wir sie tatsächlich umsetzen.
Wenn die Eingabe "Diakonendiagnose" empfangen wird, führen Sie "Diakonendiagnose" durch. Die Frage ist der folgende Ablauf. Das fertige Bild sieht so aus.
Abhängig von der Reaktion des Schaltflächenereignisses kann das Schaltflächenereignis zurückgegeben werden, das Nachrichtenereignis kann zurückgegeben werden und so weiter.
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
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)
$ 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/
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
Webhock einrichten. (In den Messaging-API-Einstellungen)
Ordnen Sie die Antworteinstellungen nach Ihren Wünschen an.
Damit ist die Erstellung von LINE BOT abgeschlossen.
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