[PYTHON] Créer un bot LINE avec Django

introduction

J'ai résumé l'article sur l'utilisation de LINE Bot avec Django car il semblait être un peu recherché, voire même s'il était ancien.

Pour le moment, je vais créer un Bot Umu-return qui répondra au texte envoyé en guise d'introduction à LINE Bot.

L'article ici utilise le SDK, mais je suis un débutant en Python et je ne peux même pas faire de requêtes HTTP avec Python, donc je le ferai moi-même pour la formation. J'aimerais le faire.

Je suis un débutant Django avec moins d'une semaine d'histoire Django. De plus, comme le langage que j'utilise habituellement est Elixir fonctionnel, l'implémentation peut ne pas être orientée objet.

Si vous avez des conseils sur ce qui ne va pas ou ce que vous devez améliorer, veuillez laisser un commentaire.

Bien que ce soit mon article précédent, je me référerai aux articles suivants dans leur ensemble. Utilisation de l'API de messagerie LINE avec Elixir / Phoenix

S'inscrire auprès du développeur LINE / Enregistrer la chaîne

↓ Inscrivez-vous d'ici https://developers.line.biz/ja/

Bien qu'elle diffère de la situation actuelle de différentes manières, nous enregistrerons la chaîne en se référant à l'article suivant https://qiita.com/nkjm/items/38808bbc97d6927837cd

Création de projet

Créez un projet comme vous le souhaitez.

$ django-admin startproject qiita_linebot
$ cd qiita_linebot/
$ python manage.py startapp qiita_linebot_ai

Créer urls.py

qiita_linebot_ai/urls.py


from django.urls import path

from . import views

urlpatterns = [
    path('', views.index, name='callback'),
]

Réfléchissez dans qiita_linebot / urls.py.

qiita_linebot/urls.py


from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    path('qiita_linebot_ai/', include('qiita_linebot_ai.urls')),  #add
    path('admin/', admin.site.urls),
]

Créer une classe LineMessage

Je ne suis pas doué pour la réflexion orientée objet parce que j'utilise généralement uniquement Elixir, mais je pense qu'il est préférable d'encapsuler (?) Dans un tel cas, créez une classe LineMessage et créez-y une méthode de réponse. Faire.

Envoyez une requête HTTP à l'API de messagerie LINE en vous référant à l'article suivant Urllib.request est suffisant pour le client HTTP Python

line_message.py


from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt

import urllib.request
import json


REPLY_ENDPOINT_URL = "https://api.line.me/v2/bot/message/reply"

ACCESSTOKEN = 'Votre jeton d'accès'   #Paramètres de l'API de messagerie|>Obtenir le jeton d'accès à partir du jeton d'accès au canal
HEADER = {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer ' + ACCESSTOKEN
}

class LineMessage():
    def __init__(self, messages):
        self.messages = messages

    def reply(self, reply_token):
        body = {
            'replyToken': reply_token,
            'messages': self.messages
        }
        print(body)
        req = urllib.request.Request(REPLY_ENDPOINT_URL, json.dumps(body).encode(), HEADER)
        try:
            with urllib.request.urlopen(req) as res:
                body = res.read()
        except urllib.error.HTTPError as err:
            print(err)
        except urllib.error.URLError as err:
            print(err.reason)

Ici, le message passé à la méthode response prend le format suivant.

{
 type: "text",
 text: "hogehoge" #Cette fois, le message reçu est renvoyé tel quel
}

Regarde ça "Vous n'avez qu'à prendre le message à envoyer (" hogehoge "dans ce qui précède) comme argument." Comme vous pouvez le penser, l'API de messagerie LINE prend également en charge l'envoi de plusieurs messages en même temps. De plus, «type» existe en plus du texte.

J'ai pensé à diviser davantage la classe, mais cette fois je vais l'implémenter de cette façon pour le moment.

Créer message_creater

util/message.creater.py


def create_single_text_message(message):
    test_message = [
                {
                    'type': 'text',
                    'text': message
                }
            ]
    return test_message

Créez un module message_creater pour l'argument message utilisé dans LineMessage.reply.

Modifier vue

view.py


from django.shortcuts import render
from django.http import HttpResponse
import json
from django.views.decorators.csrf import csrf_exempt

from utils import message_creater
from qiita_linebot_ai.line_message import LineMessage

@csrf_exempt
def index(request):
    if request.method == 'POST':
        request = json.loads(request.body.decode('utf-8'))
        events = request['events']
        for event in events:
            message = event['message']
            reply_token = event['replyToken']
            line_message = LineMessage(message_creater.create_single_text_message(message['text']))
            line_message.reply(reply_token)
        return HttpResponse("ok")

Ceci termine la mise en œuvre.

Tester avec ngrok

Paramètres ngrok

Je vais vraiment l'essayer. Puisque localhost ne peut pas être spécifié dans l'URL du Webhook, ngrok est utilisé.

Veuillez installer ngrok en vous référant à l'article suivant. ngrok est trop pratique

Une fois installé

$ ngrok http 8000

Puis

スクリーンショット 2020-01-08 16.23.00.png

Vous pouvez le démarrer comme ça. Veuillez remplacer l'URL ngrok qui apparaît après cela par la vôtre, le cas échéant.

Paramètres d'URL du webhook

Paramètres de l'API de messagerie|>Paramètres du webhook|>WebhookURL De Entrez https: // ecdb2a20.ngrok.io / qiita_linebot_ai /.

Modification de ALLOWED_HOSTS

Ajoutez ngrok à ALLOWED_HOSTS comme suit.

settings.py


ALLOWED_HOSTS = ["ecdb2a20.ngrok.io"]

tester

Vous êtes prêt à partir!

Si vous démarrez le serveur et obtenez le message suivant, vous avez réussi!

スクリーンショット 2020-01-08 16.30.28.png

Recommended Posts

Créer un bot LINE avec Django
Jusqu'à ce que Django retourne quelque chose avec un robot de ligne!
Créer un planning Django
Créer un bot slack
Créer un LINE BOT avec Minette pour Python
Comment créer une API Rest dans Django
Jusqu'à ce que vous créiez une nouvelle application dans Django
Créer un dictionnaire en Python
Créer une page d'accueil avec django
Créer un LINE BOT (chat)
Créer un écran de connexion Django
Créer un bot de collecte de données en Python à l'aide de Selenium
[API LINE Messaging] Créez un menu riche avec Python
Créer un lecteur CSV avec Flask
Créer un conteneur DI avec Python
Étapes pour créer un projet Django
Créez une application d'apprentissage automatique avec ABEJA Platform + LINE Bot
Créer un fichier binaire en Python
[LINE bot] Je suis un ranger! Partie 2
Créer une chaîne aléatoire en Python
Créer un téléchargeur de fichiers avec Django
[Python / Django] Créer une API Web qui répond au format JSON
[LINE Messaging API] Créez un BOT qui se connecte à quelqu'un avec Python
Installer Django dans l'environnement virtuel pipenv
Créer un bot pour retweeter les informations sur le virus corona
Créez un modèle pour votre planning Django
Créer une application GUI simple en Python
Création d'un bot LINE ~ Création, déploiement et lancement ~
Spécifiez dynamiquement le jeu de requêtes ModelChoiceField dans Django
Créer une application Python-GUI dans Docker (PySimpleGUI)
[GPS] Créer un fichier kml avec Python
Créez un bot qui stimule les tendances Twitter
Implémenter un modèle utilisateur personnalisé dans Django
Flask-Créer un service Web avec SQLAlchemy + PostgreSQL
Modèle dans Django
[Peut être fait en 10 minutes] Créez rapidement un site Web local avec Django
J'ai fait un robot de remplacement de tampon avec une ligne
Créez un environnement de test Vim + Python en 1 minute
Créer un fichier GIF en utilisant Pillow en Python
Créer un fichier qui peut être exécuté dans le langage de script
Je veux créer une fenêtre avec Python
Créer un graphique de distribution normale standard en Python
Comment créer un fichier JSON en Python
Créer un environnement virtuel avec conda avec Python
Activez Django https en quelques lignes
Créez un environnement Django avec Vagrant en 5 minutes
Créez un tableau de bord pour les appareils réseau avec Django!
Créez un jeu Janken en une seule ligne (python)
J'ai créé un Bot LINE avec Serverless Framework!
Créer une bibliothèque de mutations de séquences protéiques avec des pandas
Étapes pour créer un bot Twitter avec Python
Créer un modèle d'investissement dynamique simple en Python
Créer une nouvelle page en confluence avec Python
Comment créer une boîte de saisie Kivy 1 ligne
Créer un objet datetime à partir d'une chaîne en Python (Python 3.3)
Créez une application Hello World avec un seul fichier avec django
Créer un package contenant des commandes globales en Python
Insérer une date sans interruption dans CotEditor
Créer un bot LINE WORKS avec Amazon Lex