J'ai fait un Line-bot avec Python!

Questions trouvé

image.png

Objectif et fonction

Enregistrez votre magasin / établissement préféré avec votre nom préféré et créez un Line-bot qui peut obtenir des informations sur ce magasin / établissement.

image.png

Les choses nécessaires

Flux de développement

1 Inscrivez-vous auprès de LINE Developers et heroku (omis)

2 Faisons pour l'instant LINE-bot avec le exemple de code distribué par LINE.

app.py Exemple de code distribué par Line.



from flask import Flask, request, abort

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

app = Flask(__name__)

# line-accès depuis la page des développeurs_jeton et canal_Générez chaque secret et mettez-le dans une variable ici
#Si vous ne savez pas, consultez d'autres articles. Je vais l'omettre ici parce que beaucoup d'autres personnes l'ont écrit.
line_bot_api = LineBotApi('YOUR_CHANNEL_ACCESS_TOKEN')
handler = WebhookHandler('YOUR_CHANNEL_SECRET')


@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'

#L'événement contient de nombreuses informations utilisateur.
@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
    line_bot_api.reply_message(
        event.reply_token,
        TextSendMessage(text=event.message.text))

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

Préparez les deux suivants dans le même dossier.

requirements.txt (écrivez ce qui doit être installé sur le serveur d'heroku)

Assurez-vous d'installer gunicorn. (Il semble que ce soit une bibliothèque requise par le serveur heroku) L'utilisation d'un environnement virtuel de python appelé venv le rend encore plus propre, mais je ne l'ai pas fait parce que je ne pouvais pas le faire correctement comme décrit dans article récent.

argon2-cffi==20.1.0
asgiref==3.2.10
async-generator==1.10
attrs==20.2.0
backcall==0.2.0
bleach==3.1.5
certifi==2020.6.20
cffi==1.14.2
chardet==3.0.4
click==7.1.2
colorama==0.4.3
decorator==4.4.2
defusedxml==0.6.0
entrypoints==0.3
Flask==1.1.2
gunicorn==20.0.4
idna==2.10
itsdangerous==1.1.0
jedi==0.17.2
Jinja2==2.11.2
json5==0.9.5
jsonschema==3.2.0
line-bot-sdk==1.17.0
MarkupSafe==1.1.1
mistune==0.8.4
nbclient==0.5.0
nbconvert==6.0.2
nbformat==5.0.7
nest-asyncio==1.4.0
notebook==6.1.4
numpy==1.19.2
packaging==20.4
pandocfilters==1.4.2
parso==0.7.1
pickleshare==0.7.5
prometheus-client==0.8.0
prompt-toolkit==3.0.7
pycparser==2.20
Pygments==2.7.0
pyparsing==2.4.7
pyrsistent==0.17.3
python-dateutil==2.8.1
pytz==2020.1
pywinpty==0.5.7
pyzmq==19.0.2
requests==2.24.0
selenium==3.141.0
Send2Trash==1.5.0
six==1.15.0
sqlparse==0.3.1
terminado==0.8.3
testpath==0.4.4
tornado==6.0.4
urllib3==1.25.10
wcwidth==0.2.5
webencodings==0.5.1
Werkzeug==1.0.1

Procfile

web: gunicorn app:app --log-file -

Suivez les étapes ci-dessous pour déployer sur heroku!

heroku login
heroku git:clone -a [Mon nom d'application]
cd [Mon nom d'application]
* Si vous travaillez dans le répertoire courant, vous n'êtes pas obligé de le faire
git add . #J'ajoute un fichier
git commit -am "make it better" #Je mets à jour le fichier modifié
git push heroku master #Je pousse

Envoyons un message à la ligne pour le moment comme ça.

Les défis de la création du linebot que vous souhaitez créer cette fois

Utilisez Google Map Api pour obtenir des informations sur le magasin.

Solution: Rien en particulier. Regardez simplement la documentation de Google Map Api.

Enregistrez les informations utilisateur individuellement.

Solution: C'était assez ennuyeux. Au début, j'ai pensé que je devrais essayer d'utiliser la base de données, mais j'ai arrêté cette fois parce que le coût d'apprentissage semblait élevé. Ensuite, j'ai essayé d'enregistrer le dictionnaire dans un fichier pickle, mais pour une raison quelconque, cela n'a pas fonctionné. Les données binaires sont-elles inutiles? ?? La cause n'est pas claire. Enfin, j'ai décidé de sauvegarder le dictionnaire au format json. Cela fonctionnait, mais à chaque fois que je faisais un changement, les données disparaissaient. Je pensais envoyer un fichier json en entrant le mot de passe en ligne, mais cette fois je me suis arrêté.

Recevez un message de l'utilisateur et répondez en fonction du message.

Solution C'était encore une fois assez difficile. En plus des variables «enregistrer» et «supprimer», j'ai fait quatre réponses: «confirmer» les variables que j'ai créées et «confirmer» les informations sur les commerces et les installations. (Cela n'explique pas la solution, mais j'espère que vous pouvez voir le fichier python ci-dessous.)

Fichier créé (autre que requirements.txt, Procfile)

J'ai l'intention d'inclure autant de bibliothèques et de grammaires que possible pour mon étude.

app.py fichier principal.

import json

class create_reply_message(object):
    user_id = None
    user_dictionaries = None
    the_user_dictionary = None

    def __init__(self, user_id=None,*args, **kwargs):
        super().__init__(*args, **kwargs)
        self.user_id = user_id

        #Préparer un dictionnaire
        with open("users_info.json", 'r') as f:
            self.user_dictionaries = json.load(f)
            self.the_user_dictionary = self.user_dictionaries.setdefault(self.user_id, {})

    def legister_fav_shop_institution(self, shop_institute_actual_name, shop_institute_variable):
        user_dictionaries_copy = self.user_dictionaries.copy()
        the_user_dictionary_copy = user_dictionaries_copy[self.user_id]
        the_user_dictionary_copy[shop_institute_variable] = shop_institute_actual_name
        with open("users_info.json", 'w') as f:
            json.dump(user_dictionaries_copy, f)
        return 'Achèvement de l'inscription!'

    def confirm_what_legistered(self):
        if self.the_user_dictionary == {}:
            reply_msg = "Il n'y a pas encore de magasins / installations enregistrés ..."
            return reply_msg
        else:
            reply_msg = []
            for dict_key in self.the_user_dictionary:
                reply_msg.append(dict_key)
            reply_msg.insert(0, f'Les magasins et installations enregistrés sont ci-dessous{len(self.the_user_dictionary)}Un! !!')
            return "\Hmm ·".join(reply_msg)

    def delete_fav_shop_institution(self, shop_institute_variable):
        user_dictionaries_copy = self.user_dictionaries.copy()
        the_user_dictionary_copy = user_dictionaries_copy[self.user_id]
        del the_user_dictionary_copy[shop_institute_variable]
        with open("users_info.json", 'w') as f:
            json.dump(user_dictionaries_copy, f)
        return shop_institute_variable + 'Est supprimé!'

google_maps_client.py Une classe qui obtient simplement des informations de Google Map Api et les met en soi. Variable.


import requests
from urllib.parse import urlencode, urlparse, parse_qsl


class locate_fav_shop_institution(object):
    data_type="json"
    location_query = None
    api_key = None

    def __init__(self, api_key=None, shop_institution_name=None,
                 *args, **kwargs):
        super().__init__(*args, **kwargs)
        if api_key == None:
            raise Exception('API key is required')
        self.api_key = api_key
        self.location_query = shop_institution_name

        if self.location_query != None:
            self.place_id = self.extract_place_id()
        if self.place_id == '':
            raise Exception('Your fav shop/instition couldn\'t be located.')
        self.fav_shop_institution_info = self.extract_details()

    def extract_place_id(self):
        base_endpoint_places = f"https://maps.googleapis.com/maps/api/place/findplacefromtext/{self.data_type}"
        params = {
            "key": self.api_key,
            "input": self.location_query,
            "inputtype": "textquery",
             "fields": "place_id"
        }

        params_encoded = urlencode(params)
        places_endpoint = f"{base_endpoint_places}?{params_encoded}"

        r = requests.get(places_endpoint)
        if r.status_code not in range(200, 299):
            return ""
        return r.json()['candidates'][0]['place_id']

    def extract_details(self):
        detail_base_endpoint = f"https://maps.googleapis.com/maps/api/place/details/{self.data_type}"

        detail_params = {
            "place_id": f"{self.place_id}",
            "fields": "business_status,opening_hours,formatted_phone_number,website",
            "language": "ja",
            "key": self.api_key
        }
        detail_params_encoded = urlencode(detail_params)
        detail_url = f"{detail_base_endpoint}?{detail_params_encoded}"
        r = requests.get(detail_url)
        return r.json()['result']

how_to_reply.py Une classe qui vous permet de répondre aux messages reçus de l'autre partie.


import json

class create_reply_message(object):
    user_id = None
    user_dictionaries = None
    the_user_dictionary = None

    def __init__(self, user_id=None,*args, **kwargs):
        super().__init__(*args, **kwargs)
        self.user_id = user_id

        #Préparer un dictionnaire
        with open("users_info.json", 'r') as f:
            self.user_dictionaries = json.load(f)
            self.the_user_dictionary = self.user_dictionaries.setdefault(self.user_id, {})

    def legister_fav_shop_institution(self, shop_institute_actual_name, shop_institute_variable):
        user_dictionaries_copy = self.user_dictionaries.copy()
        the_user_dictionary_copy = user_dictionaries_copy[self.user_id]
        the_user_dictionary_copy[shop_institute_variable] = shop_institute_actual_name
        with open("users_info.json", 'w') as f:
            json.dump(user_dictionaries_copy, f)
        return 'Achèvement de l'inscription!'

    def confirm_what_legistered(self):
        if self.the_user_dictionary == {}:
            reply_msg = "Il n'y a pas encore de magasins / installations enregistrés ..."
            return reply_msg
        else:
            reply_msg = []
            for dict_key in self.the_user_dictionary:
                reply_msg.append(dict_key)
            reply_msg.insert(0, f'Les magasins et installations enregistrés sont ci-dessous{len(self.the_user_dictionary)}Un! !!')
            return "\Hmm ·".join(reply_msg)

    def delete_fav_shop_institution(self, shop_institute_variable):
        user_dictionaries_copy = self.user_dictionaries.copy()
        the_user_dictionary_copy = user_dictionaries_copy[self.user_id]
        del the_user_dictionary_copy[shop_institute_variable]
        with open("users_info.json", 'w') as f:
            json.dump(user_dictionaries_copy, f)
        return shop_institute_variable + 'Est supprimé!'

personal_informations.py Puisqu'il contient des informations personnelles, il ne sera pas publié. J'ai ajouté s au nom indénombrable appelé information.

confirm.txt Texte pour le modèle à envoyer lorsque les informations de la boutique / installation sont récupérées.

$J'ai vu le nom!
$businessStatus

L'horaire de cette semaine est ↓↓
$openingHours

Si quelque chose se produit, contactez le numéro de téléphone ci-dessous!
$phoneNumber

Au fait, la page d'accueil est ↓↓
$website

explanation.txt Texte du modèle pour décrire le bot.

$Merci d'avoir contacté le nom!

$Si vous voulez connaître les magasins / installations que ce nom a enregistrés jusqu'à présent
"Vérification"Envoyez s'il vous plaît!
(Exemple: confirmation)

$Lorsque vous souhaitez vérifier les informations des magasins et des installations que ce nom a enregistrés jusqu'à présent
"Vérification[Nom enregistré]"Envoyez s'il vous plaît!
(Exemple: bibliothèque de confirmation)

Lorsque vous souhaitez enregistrer de nouvelles informations sur le magasin / l'établissement
"enregistrement[Nom officiel du magasin / établissement] [Nom enregistré]"Envoyez s'il vous plaît!
(Exemple: Inscription: Bibliothèque attachée à l'Institut de technologie de Tokyo)

Au contraire, lorsque vous souhaitez supprimer les informations de la boutique / établissement
"Effacer[Nom enregistré]"Envoyez s'il vous plaît!
(Exemple: bibliothèque supprimée)

Ravi de vous rencontrer! !!

user_info.json Un fichier json qui stocke les informations utilisateur. Le fichier pickle ne fonctionnait pas, j'ai donc choisi json. Je voulais utiliser la base de données si possible.

{user_id: {"\u81ea\u8ee2\u8eca\u5c4b": "\u30b5\u30a4\u30af\u30eb\u30d9\u30fc\u30b9\u3042\u3055\u3072\u4e09\u9df9\u4e95\u53e3\u5e97", "\u3061\u305a\u3051": "\u6771\u4eac\u5de5\u696d\u5927\u5b66\u4ed8\u5c5e\u56f3\u66f8\u9928"}}

Ce n'est pas du tout expliqué, mais je l'ai terminé comme ça. Je suis un débutant, donc même s'il s'agit de Python, le code est devenu assez difficile à lire, mais si vous êtes intéressé, veuillez le lire.

En fait utiliser

Envoyez un message approprié

Envoyez un message approprié et renvoyez une description du bot de ligne. image.png

Envoyez le message "confirmation"

Vous pouvez vérifier les noms que vous avez enregistrés jusqu'à présent! image.png

Envoyez le message "Inscription [Nom officiel] [Nom que vous souhaitez enregistrer]"

Vous pouvez enregistrer à nouveau vos magasins et installations préférés. Assurez-vous que l'espace entre eux est pleine largeur! image.png

Envoyez le message "Supprimer [nom enregistré]"

Vous pouvez supprimer les magasins / installations enregistrés jusqu'à présent. image.png

Vérifiez à nouveau ici.

image.png

Envoyez le message "Confirmation [Boutique / installation enregistrée]"

Vous pouvez vérifier les heures d'ouverture, les numéros de téléphone et les pages Web pour voir si le magasin est ouvert. image.png

Tâche

Impressions

Il n'y a pas de fin à la liste des mauvaises choses, mais après tout, la fabrication est vraiment amusante! Étant donné que ma spécialité est le génie mécanique, je n'ai pas beaucoup d'occasions d'écrire de la programmation et je n'ai peut-être pas le temps d'étudier d'autres choses parce que je vais être assez occupé avec des cours liés au laboratoire, mais je peux trouver des idées et créer des choses. C'est la même chose à cet égard, et je suis sûr que ce sera bénéfique. Et surtout, c'est amusant, alors j'aimerais continuer la programmation.

finalement

C'est un line-bot fait par ↓. Il a été fait par un débutant, et il y a beaucoup d'erreurs (j'en connais quelques-unes, mais je ne l'ai pas corrigé, lol) J'ai rendu ça très difficile! Je vous serais reconnaissant si vous pouviez ajouter des amis. messageImage_1602075610648.jpg

Recommended Posts

J'ai fait un Line-bot avec Python!
J'ai fait un texte Python
J'ai effectué un processus de connexion / déconnexion en utilisant Python's Bottle.
J'ai fait une loterie avec Python.
J'ai créé un démon avec Python
J'ai créé un lecteur de flux rapide en utilisant feedparser en Python
J'ai créé Chatbot en utilisant l'API LINE Messaging et Python
J'ai fait un programme de gestion de la paie en Python!
J'ai fait un compteur de caractères avec Python
Débutant: j'ai créé un lanceur à l'aide d'un dictionnaire
J'ai fait une carte hexadécimale avec Python
Après avoir étudié Python3, j'ai créé un Slackbot
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
〇✕ J'ai fait un jeu
J'ai créé un chat-holdem de serveur de jeu de poker en utilisant websocket avec python
J'ai créé Chatbot en utilisant l'API LINE Messaging et Python (2) ~ Server ~
J'ai créé un fichier de dictionnaire python pour Neocomplete
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 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.
J'ai essayé de lire un fichier CSV en utilisant Python
J'ai créé un programme cryptographique César en Python.
J'ai fait un jeu de cueillette avec Python
Made Mattermost Bot avec Python (+ Flask)
Création du wrapper d'API Qiita Python "qiipy"
J'ai fait un blackjack avec du python!
J'ai fait un robot discord
J'ai fait un blackjack avec Python.
J'ai créé wordcloud avec Python.
J'ai fait un Twitter BOT avec GAE (python) (avec une référence)
J'ai fait un jeu d'éclairage de sapin de Noël avec Python
J'ai créé une application de notification de nouvelles en ligne avec Python
J'ai créé une VM qui exécute OpenCV pour Python
J'ai créé un module Python pour traduire les commentaires
J'ai créé un environnement Python3 sur Ubuntu avec direnv.
J'ai essayé de faire LINE BOT avec Python et Heroku
[Python] J'ai créé un classificateur pour les iris [Machine learning]
[Python] J'ai essayé d'exécuter un serveur local en utilisant flask
J'ai essayé de dessiner une pseudo figure fractale en utilisant Python
J'ai créé une bibliothèque python qui fait rouler le rang
J'ai créé un jeu d'introduction au festival scolaire avec Ren'py
J'ai essayé d'utiliser Python (3) au lieu d'un calculateur de fonctions
J'ai fait un script pour enregistrer la fenêtre active en utilisant win32gui de Python
J'ai fait un jeu de frappe simple avec tkinter de Python
J'ai créé un script de traduction basé sur CUI (2)
Créer une interface graphique python à l'aide de tkinter
J'ai fait un wikipedia gacha bot
J'ai créé un package pour filtrer les séries chronologiques avec python
Dessiner une courbe Silverstone en utilisant Python
[VSCode] J'ai créé un extrait d'utilisateur pour Python print f-string
J'ai créé ma propre bibliothèque Python
J'ai essayé de créer LINE-bot avec Python + Flask + ngrok + LINE Messaging API