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.
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.
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.
Solution: Rien en particulier. Regardez simplement la documentation de Google Map Api.
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é.
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.)
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.
Envoyez un message approprié et renvoyez une description du bot de ligne.
Vous pouvez vérifier les noms que vous avez enregistrés jusqu'à présent!
Vous pouvez enregistrer à nouveau vos magasins et installations préférés. Assurez-vous que l'espace entre eux est pleine largeur!
Vous pouvez supprimer les magasins / installations enregistrés jusqu'à présent.
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.
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.
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.
Recommended Posts