[PYTHON] Créons un bot LINE en utilisant divers services [ngrok edition]

Aperçu

Il s'agit d'une série d'essais pour créer un backend pour LINEbot à l'aide de divers services. Le premier utilise ngrok. De plus, pour cet article uniquement, la procédure telle que l'inscription auprès des développeurs LINE sera incluse dans la description en guise d'introduction.

Veuillez vous référer à ce qui suit pour construire en utilisant d'autres services.

--Premier: ngrok * Cet article --Deuxième: Heroku

supposition

--J'ai un compte LINE --Python est prêt à fonctionner localement

Vue d'ensemble

linebot_1-webhook.png

Préparation des développeurs LINE

Il s'agit de la procédure de capture à partir d'octobre 2020. Veuillez noter qu'il peut y avoir des changements dans le futur.

S'identifier

Pour utiliser l'API de messagerie, créez d'abord un compte avec LINE Developers. Tout d'abord, accédez à ici et appuyez sur le bouton de connexion en haut à droite. Sur l'écran suivant, appuyez sur "Connexion avec un compte LINE". Ensuite, l'écran suivant s'affiche: Connectez-vous soit en saisissant l'adresse e-mail et le mot de passe enregistrés dans LINE, soit en scannant le code QR. En cas de succès, vous serez redirigé vers l'écran d'accueil de la console. ログイン

Création de chaîne

Il y a une section appelée «Fournisseurs» sur l'écran d'accueil, cliquez donc sur le bouton «Créer» à côté et entrez un nom arbitraire dans le champ «Nom du fournisseur».

L'écran passera à l'écran d'accueil du fournisseur, cliquez donc sur le bloc "Créer un canal API de messagerie".

Provider

L'écran passera à l'écran de saisie des informations, entrez donc ce qui suit (seuls les éléments minimum requis sont répertoriés).

Émission d'un secret de canal et d'un jeton d'accès au canal

Puisqu'il sera utilisé dans le back-end, il sera émis à ce stade. De plus, veuillez garder ces deux valeurs soigneusement afin qu'elles ne soient pas connues des autres.

La chaîne dans la partie «Secret de canal» de l'onglet «Paramètres de base». Ceci est publié lors de la création du canal.

Secret

La chaîne de la partie «Jeton d'accès au canal» en bas de l'onglet «API de messagerie». Ce n'est pas publié par défaut, donc générons-le en appuyant sur le bouton "Problème".

Token

Inscrivez-vous comme ami

Il y a un code QR dans l'onglet API de messagerie, alors scannez-le avec l'application LINE et inscrivez-vous comme ami.

Construire un serveur backend

Code source

Copiez le code de line-bot-sdk-python et enregistrez-le localement sous ʻapp.py` .. Ensuite, définissez les informations secrètes comme suit.

--Remplacez la partie (L16) où YOUR_CHANNEL_SECRET est écrit avec la chaîne de caractères obtenue par Channel secret. --Remplacez la partie (L15) où YOUR_CHANNEL_ACCESS_TOKEN est écrit par la chaîne de caractères obtenue par Channel access token.

app.py


#Exemple
line_bot_api = LineBotApi('YXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXZGG==') #C'est la plus longue chaîne
handler = WebhookHandler('fxxxxxxxxxxxxxxxxxxxxx')

Installation de la bibliothèque

Le code source utilise une bibliothèque, vous devez donc installer la bibliothèque. Exécutez la commande suivante dans le terminal:

Terminal


pip install Flask line-bot-sdk

installation de ngrok

ngrok est un service qui vous permet d'accéder à des processus démarrés localement de l'extérieur via Internet. Par-dessus tout, le point de préparation d'un point de terminaison public sur https est très important. (L'URL du Webhook doit être https)

Pour MacOS, nous vous recommandons d'installer avec le premier Homebrew. Sinon, installez-le avec la deuxième commande.

Pour MacOS

Terminal


brew cask install ngrok

Dans d'autres cas

Terminal


wget https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-amd64.zip
unzip ngrok-stable-linux-amd64.zip
mv ngrok /usr/local/bin/ngrok

Confirmation d'installation

Assurez-vous qu'il est correctement installé. Si vous exécutez la commande ngrok et que le message suivant s'affiche, il n'y a pas de problème. Entrez Ctrl + C pour arrêter.

Terminal


ngrok http 80

Résultat d'exécution

Terminal


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://a9e65703bdfa.ngrok.io -> http://localhost:80                                                                                                                                  
Forwarding                    https://a9e65703bdfa.ngrok.io -> http://localhost:80                                                                                                                                 
                                                                                                                                                                                                                   
Connections                   ttl     opn     rt1     rt5     p50     p90                                                                                                                                          
                              0       0       0.00    0.00    0.00    0.00 

Renvoyer le perroquet

Maintenant, démarrons le serveur et voyons où le message est renvoyé.

Démarrer le serveur principal

Exécutez la commande suivante dans le terminal. Si le nom du fichier Python n'est pas ʻapp.py, vous devez définir le nom du fichier dans la variable d'environnement FLASK_APP`.

Terminal


flask run --reload --port 8080

#Si ce qui suit s'affiche, l'état de démarrage
* 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:8080/ (Press CTRL+C to quit)

La figure ci-dessous montre l'état actuel.

linebot_1-local.png

Divulgation externe du serveur

Démarrez un autre terminal et exécutez la commande suivante. Copiez ensuite l'URL sur la ligne qui dit «Transfert» qui commence par «https».

Terminal


ngrok http 8080

Forwarding    http://e5e58099a87e.ngrok.io -> http://localhost:8080                     
Forwarding    https://e5e58099a87e.ngrok.io -> http://localhost:8080 #ici

La figure ci-dessous montre l'état actuel.

linebot_1-ngrok.png

Paramètres d'URL du webhook

À ce stade, vous reviendrez à l'écran des développeurs LINE. Dans la partie URL Webhook de l'onglet API de messagerie, entrez" ** l'URL que vous avez copiée précédemment ** + / callback".

Webhook

Passez également à l'écran de réglage de la réponse à partir du bouton Modifier dans l'image ci-dessus et réglez comme suit.

--Message de réponse: OFF

Désormais, lorsque vous envoyez un message à LINE, la demande sera envoyée au serveur localement exécuté via le point de terminaison ngrok.

linebot_1-webhook.png

envoyer un message

Envoyons en fait un message avec le Bot enregistré comme ami. Si vous recevez le même message, vous réussissez! !!

point important

Puisque ngrok émet un point de terminaison différent à chaque fois qu'il est démarré, si vous le redémarrez après l'avoir quitté, vous devez également modifier l'URL du Webhook de LINE Developers.

Intensifier

J'ai omis l'explication du code source, mais le code source sdk ne renvoie qu'un perroquet d'un message texte. Les deux exemples suivants de modification du comportement en tant qu'intensification sont décrits comme des problèmes, veuillez donc les essayer si vous le souhaitez.

1. Répondez toujours "Merci pour votre message!"

<détails>

Réponse </ summary>

La valeur spécifiée par text de la fonction handle_message sera le contenu de la réponse. Dans la source d'origine, ʻevent.message.text a été défini, et comme ce ʻevent.message.text est le contenu du message que nous avons envoyé, il a été renvoyé comme un perroquet. En d'autres termes, réglez simplement "text" sur "Merci pour votre message!".

app.py


def handle_message(event):
    line_bot_api.reply_message(
        event.reply_token,
-        TextSendMessage(text=event.message.text))
+        TextSendMessage(text='Merci pour le message!'))

2. Lorsque vous envoyez un tampon, assurez-vous de répondre "C'est un joli tampon"

<détails>

Réponse </ summary>

La raison pour laquelle seuls les messages texte sont traités est que le décorateur de @ handler.add (MessageEvent, message = TextMessage) indique au WebhookHandler que "Lorsqu'un événement de message de type TextMessage arrive, la fonction handle_message est traitée. C'est parce que nous le faisons. Vous pouvez ajouter une fonction pour gérer les événements de type tampon (StickerMessage) de la même manière.

app.py


+ @handler.add(MessageEvent, message=StickerMessage)
+ def handle_sticker_message(event):
+     line_bot_api.reply_message(
+         event.reply_token,
+         TextSendMessage(text='C'est un joli timbre'))

Voir Spécifications de l'API pour voir quels autres types d'événements et types de messages sont disponibles.

en conclusion

Je pense que c'est très bien que vous puissiez facilement vérifier le fonctionnement localement. Cependant, c'est un désordre de devoir le démarrer localement tout le temps, ou de réinitialiser l'URL du Webhook à chaque fois qu'il démarre. Ce type de mentalité peut être résolu en démarrant le serveur à l'aide du service cloud, je voudrais donc y revenir la prochaine fois.

Recommended Posts