[PYTHON] Créer un LINE BOT

J'ai fait un simple retour de perroquet avec LINEBOT avec Heroku, Flask et line-bot-sdk. Cela a pris deux jours complets et de nombreux points sont restés bloqués, alors partagez-le avec des notes.

· Mac ・ Python

(1) Maintenance de l'environnement, structure des répertoires

Créez un répertoire test_linebot sur votre bureau. Créez un environnement virtuel dans le répertoire et démarrez-le.

python3 -m venv .
source bin/activate

La structure finale du répertoire est la suivante

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

(2) Installez le cadre requis

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

(3) Créez 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__)

#Le jeton d'accès des développeurs LINE et le secret de canal sont définis dans la variable d'environnement heroku
#Code à obtenir
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 pour vérifier si le déploiement sur heroku a réussi
@app.route("/")
def hello_world():
    return "hello world!"


#Spécifiez une URL pour le webhook LINE Developers afin que le webhook envoie un événement à l'URL
@app.route("/callback", methods=['POST'])
def callback():
    #Obtenez la valeur pour la vérification de la signature à partir de l'en-tête de la demande
    signature = request.headers['X-Line-Signature']

    #Obtenir le corps de la demande
    body = request.get_data(as_text=True)
    app.logger.info("Request body: " + body)

    #Validez la signature et appelez la fonction définie dans le handle s'il n'y a pas de problème
    try:
        handler.handle(body, signature)
    except InvalidSignatureError:
        abort(400)
    return 'OK'


#Ci-dessous décrit comment gérer l'événement envoyé depuis le webhook
@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
    line_bot_api.reply_message(
        event.reply_token,
        TextSendMessage(text=event.message.text))

#Réglage du numéro de port
if __name__ == "__main__":
    port = int(os.getenv("PORT", 5000))
    app.run(host="0.0.0.0", port=port)

* Explication supplémentaire du code ci-dessus

try:〜 Une description du webhook. Un webhook est un processus qui envoie un événement à un serveur qui traite l'événement lorsqu'un événement (envoi d'un message, ajout d'un ami, etc.) se produit (une URL doit être spécifiée dans le webhook LINE Developers pour l'envoyer au serveur).

@handler.add(MessageEvent, message=TextMessage) Entrez le type d'événement dans le premier argument (cette fois, je veux répondre lorsqu'un message est envoyé, j'ai donc choisi MessageEvent) Dans le deuxième argument, je veux entrer le type de message (cette fois je veux retourner du texte) Par conséquent, message = TextMessage).

def handle_message(event): La fonction de traitement d'événements handle_message est appelée et la valeur du deuxième argument de reply_message est renvoyée sous forme de réponse LINE. Pour le renvoyer sous forme de message de ligne, utilisez la fonction reply_message de lineb_bot_api. Le premier argument event.reply_token, qui est reply_message, contient reply_token. Ceci peut être obtenu à partir de l'objet webhook et identifie à quel événement répondre. Désigne le jeton de réponse pour un événement. Dans le deuxième argument, placez une fonction appelée TextSendMessage pour la réponse définie dans linebot.models, et cette fonction place le message à renvoyer dans l'argument. De plus, event.message.text stocke le message envoyé depuis LINE. Par exemple, si "Bonjour" est envoyé, event.message.text = "Bonjour" est stocké. Si TextSendMessage (text = 'Good morning')), toutes les réponses renverront "Good morning". En passant, le contenu de l'événement est le suivant.

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

port = int(os.getenv("PORT", 5000)) Heroku semble attribuer des numéros de port de manière dynamique, utilisez donc os.getenv pour effectuer les opérations suivantes: os.getenv ("PORT", 5000) tente d'acquérir la variable d'environnement'PORT ', et si elle peut être acquise, la valeur acquise est retournée, et si elle ne peut pas être acquise: 5000 est retournée. 5000 est conçu pour travailler dans un environnement local.

#Réglage du numéro de port
if __name__ == "__main__":
    port = int(os.getenv("PORT", 5000))
    app.run(host="0.0.0.0", port=port)

(4) Inscrivez-vous auprès des développeurs LINE

Accédez à LINE Developers, et après l'enregistrement, créez un "fournisseur" qui représente le fournisseur de services. Créez un nouveau canal au sein du fournisseur. Sélectionnez Message API comme type de canal.

(5) Définir les variables d'environnement Heroku

Connectez-vous à Heroku et créez une application. Cette fois, je l'ai nommé testlinebot0319.

heroku login
heroku create testlinebot0319

Initialiser

git init

Liez l'application de heroku avec git,

heroku git:remote -a testlinebot0319

Définissez la "chaîne de jeton d'accès" et la "chaîne secrète de canal" des développeurs Line dans les variables d'environnement heroku. Par exemple, heroku config: set YOUR_CHANNEL_ACCESS_TOKEN = "Chaîne de caractères du jeton d'accès au canal" -a (nom de l'application).

heroku config:set YOUR_CHANNEL_ACCESS_TOKEN="Chaîne de jeton d'accès au canal" -a testlinebot0319
heroku config:set YOUR_CHANNEL_SECRET="Chaîne secrète de canal" -a testlinebot0319

Vérifiez si la variable d'environnement est correctement définie sur heroku.

heroku config

(6) Préparez les autres fichiers nécessaires

Créez Procfile, runtime.txt, requirements.txt.

Créez runtime.txt après avoir vérifié votre propre version de python.

.txt:runtime.txt



python-3.8.0

Procfile décrit ce qui suit.

Prockfile


web: python main.py

Décrivez requirements.txt en saisissant ce qui suit dans le terminal.

pip freeze > requirements.txt

(7) Déployer sur Heroku

Initialisez à nouveau git, associez-le, ajoutez-le et validez-le avec le nom the-first. Poussez enfin vers Heroku.

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

heroku ouvert,

heroku open

Succès si ce qui suit apparaît dans le navigateur.

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

(8) Paramètres du Webhook de LINE Developers

Définissez le nom de votre application Heroku dans le champ LINE Developers Webhook comme indiqué ci-dessous. Nom de l'application sur Heroku = testlinebot0319 スクリーンショット 2020-03-19 22.34.25.png

À ce stade, activez l'utilisation de Webhook. Avec cela, si vous lisez le code QR ci-dessus de LINE Developers et que vous vous inscrivez comme ami, la demande de retour de perroquet est terminée. Si LINE BOT ne fonctionne pas, par exemple ne pas retourner le perroquet, je peux allumer et éteindre le Webhook à plusieurs reprises (dans mon cas, cela a fonctionné).

Site référencé

Faisons un LINE BOT qui peut être recherché sur Wikipedia en une heure! LINE BOT avec Python + Flask + Heroku [Python débutant! -Retour perroquet avec LINE Bot-]

Recommended Posts

Créer un LINE BOT
Créer un LINE BOT (chat)
[Python] Créez votre propre bot LINE
LINE BOT si ~ trébuché
Créer un bot LINE WORKS avec Amazon Lex
Faire un bot d'analyse morphologique de manière lâche avec LINE + Flask
Créer un robot LINE de retour de perroquet avec AWS Cloud9
[Pour jouer] Essayez de faire de Yuma un robot LINE (Python)
[Super facile] Faisons un LINE BOT avec Python.
Faisons un robot Discord.
Création du LINE BOT Parrot Return
Confirmation de sécurité du bot LINE [Explication]
Créez un bot LINE avec GoogleAppEngine / py. Version nue simple
Créons un bot LINE en utilisant divers services [ngrok edition]
Segfo python en une ligne
Créez un bot LINE avec Python + heroku
Créer un segfo Perl en une seule ligne
Comment créer un bot slack
[LINE bot] Je suis un ranger! Partie 2
Créer un bot LINE avec Django
Comment créer un bot LINE à intelligence artificielle avec l'API de messagerie Flask + LINE
Les débutants en Python ont décidé de créer un bot LINE avec Flask (commentaire approximatif de Flask)
J'ai essayé de créer un LINE BOT "Sakurai-san" avec API Gateway + Lambda
Rendez-le visible en coupant la ligne coupée par journalctrl
Afficher le temps d'attente de Disney avec le bot LINE
Création d'un bot LINE ~ Création, déploiement et lancement ~
[Python] [LINE Bot] Créer un robot LINE de retour de perroquet
Surveillez les mises à jour des pages Web avec LINE BOT
Faisons un bot Twitter avec Python!