J'ai essayé de créer LINE-bot avec Python + Flask + ngrok + LINE Messaging API

introduction

Comme le titre l'indique, j'ai créé un bot LINE avec une simple fonction de minuterie à l'aide de l'API de messagerie Python + Flask + ngrok + LINE. Il peut être créé en peu de temps, donc si vous êtes intéressé, n'hésitez pas à l'essayer.

environnement

procédure

① Développeurs LINE - Créer des chaînes

-Connectez-vous avec votre compte LINE, etc. sur LINE Developers

② Construction d'un environnement virtuel

Cette fois, nous utiliserons venv pour construire un environnement virtuel avec le nom lineVenv dans le répertoire Workspace.

% mkdir Workspace
% cd Workspace
% python3 -m venv lineVenv

Après avoir exécuté la commande suivante, s'il y a une notation (lineVenv) au début de la ligne du terminal, cela réussit.

% . lineVenv/bin/active

Ensuite, utilisez «pip» pour installer «Flask» et «LINE Messaging API SDK for Python». Les packages requis peuvent être installés avec la commande suivante.

% pip3 install flask
% pip3 install line-bot-sdk

Ceci termine la construction de l'environnement virtuel.

③ Implémentation du programme de bot

Au fait, un programme de bot avec une fonction de minuterie tout en faisant référence à README.rst dans GitHub de l'API de messagerie LINE pour SDK installée plus tôt. Sera mis en œuvre. Créez ʻapp.py` dans le répertoire précédent et écrivez comme suit.

app.py


from flask import Flask, request, abort

from linebot import (
    LineBotApi, WebhookHandler
)
from linebot.exceptions import (
    InvalidSignatureError
)
from linebot.models import (
    MessageEvent, TextMessage, TextSendMessage,
)

from time import time
from datetime import timedelta

app = Flask(__name__)

line_bot_api = LineBotApi('YOUR_CHANNEL_ACCESS_TOKEN')  #Jeton d'accès au canal
handler = WebhookHandler('YOUR_CHANNEL_SECRET')  #Secret de chaîne

@app.route("/callback", methods=['POST'])
def callback():
    # get X-Line-Signature header value
    signature = request.headers['X-Line-Signature']

    # get request body as text
    body = request.get_data(as_text=True)
    app.logger.info("Request body: " + body)

    # handle webhook body
    try:
        handler.handle(body, signature)
    except InvalidSignatureError:
        print("Invalid signature. Please check your channel access token/channel secret.")
        abort(400)

    return 'OK'

user = {}
@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
    id = event.source.user_id   #Obtention d'un ID utilisateur LINE
    if event.message.text == "start":

        if not id in user:  #Pour les nouveaux utilisateurs
            user[id] = {}
            user[id]["total"] = 0

        user[id]["start"] = time()  #obtenir l'heure à laquelle le démarrage est exécuté

        totalTimeStr = timedelta(seconds = user[id]["total"])  #s -> h:m:s

        reply_message = f"Start Timer\n\nTotal: {totalTimeStr}"

    elif event.message.text == "stop":
        end = time()  #end Obtenir le temps d'exécution
        dif = int(end - user[id]["start"])  #Obtenez le temps écoulé
        user[id]["total"] += dif  #Mettre à jour le temps total

        timeStr = timedelta(seconds = dif)
        totalTimeStr = timedelta(seconds = user[id]["total"])

        reply_message = f"Stop Timer\n\nTime: {timeStr}s\nTotal: {totalTimeStr}"

    elif event.message.text == "reset":
        user[id]["total"] = 0 #Réinitialiser le temps total à 0

        totalTimeStr = timedelta(seconds = user[id]["total"])

        reply_message = f"Reset Timer\n\nTotal: {totalTimeStr}"

    else:
        reply_message = "Please send \"start\" or \"stop\"or \"reset\""  #Réponse à 3 mots non spécifiés

    line_bot_api.reply_message(
        event.reply_token,
        TextSendMessage(text=reply_message))


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

Il semble que c'est fait, mais il y a deux autres changements à ce qui suit:

line_bot_api = LineBotApi('YOUR_CHANNEL_ACCESS_TOKEN')  #Jeton d'accès au canal
handler = WebhookHandler('YOUR_CHANNEL_SECRET')  #Secret de chaîne

Ce dont vous avez besoin ici, c'est le jeton d'accès au canal et le secret de canal que vous avez noté dans ①. Copiez et collez respectivement dans «YOUR_CHANNEL_ACCESS_TOKEN» et «YOUR_CHANNEL_SECRET».

⑤ Exécution

Maintenant, passons à l'exécution. Si vous exécutez flask run dans l'environnement virtuel, vous verrez ce qui suit.

% flask run
* 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:5000/ (Press CTRL+C to quit)

Il existe une adresse «http: //127.0.0.1: 5000», mais comme il s'agit d'un hôte local, il n'est pas accessible depuis l'extérieur du LAN. (En d'autres termes, il n'est pas accessible depuis le serveur LINE et le webhook ne peut pas être utilisé) Il existe un moyen de le déployer, mais lorsque je cherchais une autre méthode, un outil appelé ngrok me semblait utile.

Comment utiliser ngrok https://qiita.com/hirokisoccer/items/7033c1bb9c85bf6789bd

Alors, ouvrez un terminal différent du terminal exécutant flask run et installez-le avec la commande suivante.

% brew install ngrok

Vous pouvez également télécharger le fichier exécutable à partir du site Web officiel de ngrok.

Une fois l'installation terminée, exécutez ngrok http 5000 et vous verrez ce qui suit:

% ngrok http 5000

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

Vous pouvez maintenant accéder à http: //127.0.0.1: 5000 via l'URL publique https: // xxxxxxxxxxxx.ngrok.io.

⑥ Développeurs LINE - Paramètres de Webhook ・ Paramètres de réponse

Maintenant que nous avons l'URL du webhook, nous sommes de retour chez LINE Developers. Modifiez les deux points suivants dans Paramètres de l'API de messagerie -> Paramètres du Webhook.

Les deux points suivants de la fonction de compte officiel LINE seront modifiés.

--Autoriser la participation à un chat en groupe / à plusieurs personnes: non valide

C'est la fin de toutes les étapes.

tester

Ajoutez des amis LINE parmi les suivants et envoyez la demande spécifiée dans le programme. Paramètres de l'API de messagerie -> Code QR / ID de base du bot

Here est un bot qui reproduit le contenu de cet article. (Déployé) Vous pouvez le référer si vous le souhaitez.

prime

Heroku (version gratuite) n'était pas adapté pour déployer le bot LINE créé cette fois. Dans Heroku, le numéro de port public n'est pas fixe, de sorte que le processus de création de plusieurs requêtes et de leur regroupement n'est pas stable. PythonAnywhere fonctionnait bien, à condition qu'il soit gratuit et stable.

Site de référence

LINE Developers - Documents - Messaging API LINE Messaging API SDK for Python Comment utiliser ngrok

Recommended Posts

J'ai essayé de créer LINE-bot avec Python + Flask + ngrok + LINE Messaging API
J'ai créé Chatbot en utilisant l'API LINE Messaging et Python
J'ai créé Chatbot en utilisant l'API LINE Messaging et Python (2) ~ Server ~
Made Mattermost Bot avec Python (+ Flask)
J'ai fait un blackjack avec du python!
J'ai fait un blackjack avec Python.
J'ai créé wordcloud avec Python.
J'ai essayé de faire LINE BOT avec Python et Heroku
[LINE Messaging API] Créer un BOT de retour de perroquet avec Python
Bases de SNS Python faites avec Flask
J'ai fait un Line-bot avec Python!
J'ai créé une application de livre simple avec python + Flask ~ Introduction ~
J'ai fait une loterie avec Python.
J'ai créé un démon avec Python
Création d'un BOT «Présentation non officielle du produit remis à neuf par Apple» avec l'API de messagerie LINE (v2) + API Gateway + lambda (python)
J'ai créé un formulaire de tweet Nyanko avec Python, Flask et Heroku
[LINE Messaging API] Créez un BOT qui se connecte à quelqu'un avec Python
J'ai essayé linebot avec flacon (anaconda) + heroku
Client API Slack simple réalisé avec Python
J'ai fait un compteur de caractères avec Python
[Python] Créez rapidement une API avec Flask
J'ai fait une carte hexadécimale avec Python
API de reconnaissance faciale sans serveur conçue avec Python
J'ai fait un jeu rogue-like avec Python
J'ai fait un simple blackjack avec Python
J'ai créé un fichier de configuration avec Python
J'ai fait un simulateur de neurones avec Python
Comment créer un bot LINE à intelligence artificielle avec l'API de messagerie Flask + LINE
J'ai fait une prévision météo de type bot avec Python.
J'ai créé une application graphique avec Python + PyQt5
J'ai fait mon chien "Monaka Bot" avec Line Bot
J'ai essayé de créer un bloqueur de filles pourries sur Twitter avec Python ①
Procédure de création d'un LineBot réalisé avec Python
[Python] J'ai créé un téléchargeur Youtube avec Tkinter.
LINE BOT avec Python + AWS Lambda + API Gateway
J'ai créé un Bot LINE avec Serverless Framework!
J'ai fait un jeu de cueillette avec Python
Création du wrapper d'API Qiita Python "qiipy"
Système d'aide à la décision pour les personnes âgées réalisé avec LINE Messaging API + Serverless Framework
Programmation avec Python Flask
[AWS] J'ai créé un BOT de rappel avec LINE WORKS
J'ai créé un bot de livre de compte de ménage avec LINE Bot
J'ai fait un jeu d'éclairage de sapin de Noël avec Python
[API LINE Messaging] Créez un menu riche avec Python
J'ai créé une application de notification de nouvelles en ligne avec Python
J'ai créé un environnement Python3 sur Ubuntu avec direnv.
J'ai essayé de frapper l'API avec le client python d'echonest
Divers mémorandums lors de l'utilisation du sdk de l'API de messagerie LINE avec Python (2.7.9) + Google App Engine
J'ai essayé fp-growth avec python
Utiliser l'API Trello avec python
Quand j'ai rendu CaboCha disponible en python3, je suis resté bloqué (Windows 10)
Utiliser l'API Twitter avec Python
J'ai créé un package pour filtrer les séries chronologiques avec python
API avec Flask + uWSGI + Nginx
J'ai essayé la gestion du suivi avec l'API Twitter et Python (facile)
API Web avec Python + Falcon