Je plierai beaucoup l'explication. Pardon. Peut-être que le code est également sale. Pardon. -
Si vous utilisez LINE Bot à des fins professionnelles, qui est probablement utilisé par presque tout le monde au Japon (?), Vous avez besoin d'une fonction habitée, non? (Peut-être) Par conséquent, nous allons construire un système de réservation qui peut être géré aussi facilement que possible! Faire! !! !!
LINEBOT: Système de réservation
Le type de code qui a été créé est plus facile à comprendre si vous regardez la vraie chose! L'opératrice est connectée à moi (rires) Les fonctions habitées sont possibles en liant la base de données et PUSH Message! !! Avec la version gratuite, vous ne pouvez traiter que 1000 cas par mois, donc si vous l'utilisez réellement pour les affaires, vous devriez l'utiliser avec un plan d'éclairage payant.
Typique
pip install Flask
pip install line-bot-sdk
pip install flask_sqlalchemy
pip install Pillow
・
・
Autres
C'est comme ça. Il peut y avoir des pauses, mais je suis impatient de diviser les actions en parties minimales et de les gérer d'une manière facile à comprendre.
├── projects
├── static
└── contents
├── FollowAction.py
├── ImageAction.py
├── PostBackAction.py
└── TextAction.py
└── server.py
└── Settings.py
└── config.ini
『server.py』 Ici, je joue le rôle de mise en place d'un serveur, mais je conçois également la base de données ici. Il vaut mieux le diviser, Cette fois, ça va.
server.py
# coding:utf-8
from flask import Flask, request, abort
from flask_sqlalchemy import SQLAlchemy
from linebot import (
LineBotApi, WebhookHandler
)
from linebot.exceptions import (
InvalidSignatureError
)
from linebot.models import (
MessageEvent, TextMessage, TextSendMessage, PostbackEvent, ButtonsTemplate, PostbackTemplateAction, TemplateSendMessage, FollowEvent
, LocationSendMessage, LocationMessage, ImagemapSendMessage, MessageTemplateAction, ConfirmTemplate, DatetimePickerAction, DatetimePickerTemplateAction
, ImageMessage, ImageSendMessage, FlexSendMessage, BoxComponent, TextComponent, BubbleContainer, ButtonComponent,MessageAction
, CarouselContainer, URIAction, ImageComponent, PostbackAction, CameraAction, CameraRollAction, QuickReplyButton, QuickReply
)
import re
from PIL import Image
from io import BytesIO
import configparser
#Chaque module d'action
from contents import FollowAction, ImageAction, TextAction, PostBackAction
app = Flask(__name__)
""" ------------------------Lire le fichier de paramètres---------------------------"""
#Lire le fichier de paramètres
cfg = configparser.ConfigParser()
cfg.read('config.ini')
#SQLALCHEMY
url = cfg["SQL"]["URL"]
app.config['SQLALCHEMY_DATABASE_URI'] = url
db = SQLAlchemy(app)
#Paramètres LINE
chansec = cfg["LINE"]["SECRET"]
acctoken = cfg["LINE"]["TOKEN"]
line_bot_api = LineBotApi(acctoken)
handler = WebhookHandler(chansec)
superuser_securekey = cfg["SUPERUSER"]["SECUREKEY"]
superuser_securepwd = cfg["SUPERUSER"]["SECUREPASS"]
#1 est valide s'il faut activer le retour du perroquet
Parrot_return = False
#URL du serveur comme domaine
base_url = cfg["SERVER"]["URL"]
"""--------------------------------------------------------------------------------------------"""
"""--------------------------------Définition de la base de données----------------------------"""
class lineuser(db.Model):#Base de données pour les utilisateurs généraux
__tablename__ = "lineuser"
__table_args__ = {'mysql_collate': 'utf8_general_ci'}
user_id = db.Column(db.String(80), primary_key=True)
username = db.Column(db.String(255))
tel = db.Column(db.String(255))
plan = db.Column(db.String(255))
usermessage = db.Column(db.String(255))
step = db.Column(db.Integer)
status = db.Column(db.String(255))
retention = db.Column(db.String(255))
requested_at = db.Column(db.String(255))
def __init__(self, user_id, username, tel, plan, usermessage, step, status, retention, requested_at):
self.user_id = user_id
self.username = username
self.tel = tel
self.plan = plan
self.usermessage = usermessage
self.step = step
self.retention = retention
self.status = status
self.requested_at = requested_at
def __repr__(self):
return '<lineuser %r>' % self.user_id
class administrator(db.Model):#Base de données administrateur
__tablename__ = "administrator"
__table_args__ = {'mysql_collate': 'utf8_general_ci'}
admin_id = db.Column(db.String(80), primary_key=True)
admin_name = db.Column(db.String(255))
password = db.Column(db.String(255))
adminstatus = db.Column(db.String(255))
to_user = db.Column(db.String(255))
page_options = db.Column(db.Integer)
def __init__(self, admin_id, admin_name, password, adminstatus, to_user, page_options):
self.admin_id = admin_id
self.admin_name = admin_name
self.password = password
self.adminstatus = adminstatus
self.to_user = to_user
self.page_options = page_options
def __repr__(self):
return '<administrator %r>' % self.admin_id
"""---------------------------------------------------------------------------------------------------"""
"""--------------------------------Traitement de l'API de messagerie----------------------------"""
#Où recevoir les demandes de LINE
@app.route("/callback", methods=['POST'])
def callback():
signature = request.headers['X-Line-Signature']
body = request.get_data(as_text=True)
app.logger.info("Request body: " + body)
try:
handler.handle(body, signature)
except InvalidSignatureError:
abort(400)
return 'OK'
#Si vous êtes suivi
@handler.add(FollowEvent)
def on_follow(event):
FollowAction.Start(line_bot_api, event, db, lineuser, administrator)
#Si un message arrive
@handler.add(MessageEvent, message=TextMessage)
def on_message(event):
TextAction.Start(line_bot_api, event, db, lineuser, administrator, Parrot_return)
#Si vous appuyez sur un bouton
@handler.add(PostbackEvent)
def on_postback(event):
PostBackAction.Start(line_bot_api, event, db, lineuser, administrator)
#Lorsque l'image est envoyée
@handler.add(MessageEvent, message=ImageMessage)
def Image_message(event):
ImageAction.Start(line_bot_api, event, db, lineuser, administrator)
"""----------------------------------------------------------------------------------------------------"""
if __name__ == "__main__":
app.run(port=????)#Spécifiez votre numéro de port préféré
import configparser
cfg = configparser.ConfigParser()
cfg['DEFAULT'] = {
'debug': True
}
cfg['LINE'] = {
'SECRET': "Clé secrète LINE ici"
, 'TOKEN': "Jeton d'accès ici"
}
cfg["SQL"] = {
"URL": "Décrivez l'URI de la base de données utilisée dans SQL ALCHEMY ici"
}
cfg["SUPERUSER"] = {
"SECUREKEY": "CLÉ à l'usage de l'administrateur"
, "SECUREPASS": "PASS pour une utilisation administrateur"
}
cfg["SERVER"] = {
"URL": "URL du serveur"
}
with open('config.ini', 'w') as config_file:
cfg.write(config_file)
faire
>>python Settings.py
>>python
from server import db
db.create_all()
exit()
『TextAction.py』 C'est le processus lorsque le code suivant, l'entrée TEXT est reçu de LINE.
TextAction.py
from linebot import (
LineBotApi, WebhookHandler
)
from linebot.exceptions import (
InvalidSignatureError
)
from linebot.models import (
MessageEvent, TextMessage, TextSendMessage, PostbackEvent, ButtonsTemplate, PostbackTemplateAction, TemplateSendMessage, FollowEvent
, LocationSendMessage, LocationMessage, ImagemapSendMessage, MessageTemplateAction, ConfirmTemplate, DatetimePickerAction, DatetimePickerTemplateAction
, ImageMessage, ImageSendMessage, FlexSendMessage, BoxComponent, TextComponent, BubbleContainer, ButtonComponent,MessageAction
, CarouselContainer, URIAction, ImageComponent, PostbackAction, CameraAction, CameraRollAction, QuickReplyButton, QuickReply
)
import re
import configparser
""" ------------------------Lire le fichier de paramètres---------------------------"""
#Lire le fichier de paramètres
cfg = configparser.ConfigParser()
cfg.read('config.ini')
superuser_securekey = cfg["SUPERUSER"]["SECUREKEY"]
superuser_securepwd = cfg["SUPERUSER"]["SECUREPASS"]
"""-----------------------------------------------------------------------------------------"""
def Start(line_bot_api, event, db, lineuser, administrator, Parrot_return):
txt = event.message.text
user_id = event.source.user_id
reply_token = event.reply_token
if Parrot_return == 1:
line_bot_api.reply_message(reply_token, TextSendMessage(text=txt))
else:
if db.session.query(administrator).filter(administrator.admin_id == user_id).count() == True and txt == "Utilisation de l'administrateur":
user = db.session.query(lineuser).filter_by(user_id=user_id).first()
if user.status == "end":
line_bot_api.push_message(to=user_id, messages=TextSendMessage(text="Commencez à l'utiliser en tant qu'administrateur."))
user.status = "admin"
db.session.add(user)
db.session.commit()
else:
line_bot_api.reply_message(reply_token, TextSendMessage(text="Veuillez patienter jusqu'à la fin de l'utilisation normale!"))
if not db.session.query(lineuser).filter(lineuser.user_id == user_id).count():
reg = lineuser(user_id, None, None, None, None, 0, None, None, None)
db.session.add(reg)
db.session.commit()
user = db.session.query(lineuser).filter_by(user_id=user_id).first()
if txt == superuser_securekey and user.status == "end":
if not db.session.query(administrator).filter(administrator.admin_id == user_id).count():
user.status = "preadmin"
db.session.add(user)
db.session.commit()
line_bot_api.push_message(to=user_id,
messages=TextSendMessage(text="Un pas de plus! Veuillez me dire votre mot de passe.")) #Une étape avant l'enregistrement de l'administrateur
else:
line_bot_api.push_message(to=user_id,
messages=TextSendMessage(text="Vous disposez déjà des privilèges d'administrateur.")) #Je suis déjà inscrit en tant qu'administrateur
#############Vérification de l'état et confirmation de la correction##########
status = user.status
if status == None:
user.status = "name"
db.session.add(user)
db.session.commit()
line_bot_api.reply_message(reply_token, TextSendMessage(text="S'il vous plait, dites moi votre nom!"))
elif status == "name":
yestxt = "Oui"
notxt = "Non"
bubble = BubbleContainer(
body=BoxComponent(
layout='horizontal', margin="xs",
contents=[
TextComponent("『%Est-ce que ça va avec "s"?" % txt, size='md', wrap=True, type="text", margin="xs", )]),
footer=BoxComponent(
layout="horizontal", spacing="sm",
contents=[ButtonComponent(style="link", height="sm",
action=PostbackAction(label=yestxt,
data="name@@@0@@@" + txt,
display_text=yestxt)),
ButtonComponent(style="link", height="sm",
action=PostbackAction(label=notxt, data="no@@@0",
display_text=notxt))], flex=0))
image_confirm_to_message = FlexSendMessage(alt_text="Confirmer le message", contents=bubble)
line_bot_api.reply_message(reply_token, image_confirm_to_message)
elif status == "tel":
yestxt = "Oui"
notxt = "Non"
bubble = BubbleContainer(
body=BoxComponent(
layout='horizontal', margin="xs",
contents=[
TextComponent("Le numéro de téléphone est "%est-ce que ça va?" % txt, size='md', wrap=True, type="text", margin="xs", )]),
footer=BoxComponent(
layout="horizontal", spacing="sm",
contents=[ButtonComponent(style="link", height="sm",
action=PostbackAction(label=yestxt,
data="tel@@@1@@@" + txt,
display_text=yestxt)),
ButtonComponent(style="link", height="sm",
action=PostbackAction(label=notxt, data="no@@@1",
display_text=notxt))], flex=0))
image_confirm_to_message = FlexSendMessage(alt_text="Confirmer le message", contents=bubble)
line_bot_api.reply_message(reply_token, image_confirm_to_message)
elif status == "plan":
plan_ls = ["Un plan", "Plan B", "Plan C", "Plan OR"]
if txt in plan_ls:
yestxt = "Oui"
notxt = "Non"
bubble = BubbleContainer(
body=BoxComponent(
layout='horizontal', margin="xs",
contents=[
TextComponent("Le plan que vous voulez est "%est-ce que ça va?" % txt, size='md', wrap=True, type="text", margin="xs", )]),
footer=BoxComponent(
layout="horizontal", spacing="sm",
contents=[ButtonComponent(style="link", height="sm",
action=PostbackAction(label=yestxt,
data="plan@@@2@@@" + txt,
display_text=yestxt)),
ButtonComponent(style="link", height="sm",
action=PostbackAction(label=notxt, data="no@@@2",
display_text=notxt))], flex=0))
image_confirm_to_message = FlexSendMessage(alt_text="Confirmer le message", contents=bubble)
line_bot_api.reply_message(reply_token, image_confirm_to_message)
elif status == "message":
yestxt = "Oui"
notxt = "Non"
bubble = BubbleContainer(
body=BoxComponent(
layout='horizontal', margin="xs",
contents=[
TextComponent("Le message final est "%est-ce que ça va?" % txt, size='md', wrap=True, type="text", margin="xs", )]),
footer=BoxComponent(
layout="horizontal", spacing="sm",
contents=[ButtonComponent(style="link", height="sm",
action=PostbackAction(label=yestxt,
data="message@@@3@@@" + txt,
display_text=yestxt)),
ButtonComponent(style="link", height="sm",
action=PostbackAction(label=notxt, data="no@@@3",
display_text=notxt))], flex=0))
image_confirm_to_message = FlexSendMessage(alt_text="Confirmer le message", contents=bubble)
line_bot_api.reply_message(reply_token, image_confirm_to_message)
elif status == "end":
if txt == "Lien":
yestxt = "Oui"
notxt = "Non"
bubble = BubbleContainer(
body=BoxComponent(
layout='horizontal', margin="xs",
contents=[
TextComponent("Souhaitez-vous demander la connexion à l'opérateur?", size='md', wrap=True, type="text", margin="xs", )]),
footer=BoxComponent(
layout="horizontal", spacing="sm",
contents=[ButtonComponent(style="link", height="sm",
action=PostbackAction(label=yestxt,
data="end@@@4@@@" + txt,
display_text=yestxt)),
ButtonComponent(style="link", height="sm",
action=PostbackAction(label=notxt, data="no@@@1",
display_text=notxt))], flex=0))
image_confirm_to_message = FlexSendMessage(alt_text="Vérification", contents=bubble)
line_bot_api.reply_message(reply_token, image_confirm_to_message)
else:
line_bot_api.reply_message(reply_token, TextSendMessage(text="Pour demander une connexion à l'opérateur, entrez "Connecter"."))
elif status == "preadmin" and txt != superuser_securekey:
if txt == cfg["SUPERUSER"]["SECUREPASS"]:
add_admin = administrator(user_id, None, 0, None, None, None)
db.session.add(add_admin)
db.session.commit()
user.status = "end"
db.session.add(user)
db.session.commit()
line_bot_api.reply_message(reply_token, TextSendMessage(text="Je vous ai accordé en tant qu'administrateur. Veuillez saisir "Utiliser en tant qu'administrateur"."))
else:
user.status = "end"
db.session.add(user)
db.session.commit()
line_bot_api.reply_message(reply_token, TextSendMessage(text="Veuillez entrer à nouveau depuis le début."))
elif status == "response":
text = txt + " --from %s"%user.username
line_bot_api.push_message(to=user.retention, messages=TextSendMessage(text=text))
elif status == "admin":
admin = db.session.query(administrator).filter_by(admin_id=user_id).first()
#Entrez le nom de l'administrateur
if admin.admin_name == None and admin.adminstatus != "admin_name":
admin.adminstatus = "admin_name"
db.session.add(user)
db.session.commit()
line_bot_api.push_message(to=user_id, messages=TextSendMessage(text="Veuillez saisir le nom de l'administrateur."))
#Confirmation de la saisie du nom de l'administrateur
elif admin.adminstatus == "admin_name":
qtxt = "Administrateur: "%Êtes-vous sûr que vous aimez "s"?" % txt
yestxt = "Oui"
notxt = "Non"
bubble = BubbleContainer(
body=BoxComponent(
layout='horizontal',
margin="xs",
contents=[TextComponent(text=qtxt, size='md', wrap=True, type="text", margin="xs", )]),
footer=BoxComponent(
layout="horizontal",
spacing="sm",
contents=[ButtonComponent(style="link", height="sm",
action=PostbackAction(label=yestxt,
data="admin_name@@@1@@@" + txt,
display_text=yestxt)),
ButtonComponent(style="link", height="sm",
action=PostbackAction(label=notxt, data="no@@@1@@@no",
display_text=notxt))], flex=0))
message = FlexSendMessage(alt_text="Veuillez saisir le nom de l'administrateur.", contents=bubble)
line_bot_api.push_message(to=user_id, messages=message)
elif txt == "Déconnecter":
if admin.to_user != None:
line_bot_api.push_message(to=admin.to_user, messages=TextSendMessage(text="La connexion avec l'opérateur est terminée."))
line_bot_api.reply_message(reply_token, TextSendMessage(text="La connexion habitée a été déconnectée."))
to_user = db.session.query(lineuser).filter_by(user_id=admin.to_user).first()
to_user.retention = None
to_user.status = "end"
db.session.add(to_user)
db.session.commit()
admin.to_user = None
db.session.add(user)
db.session.commit()
#Recevoir une entrée pour "utilisation normale"
elif txt == "Utilisation normale":
if admin.to_user != None:
line_bot_api.reply_message(reply_token,
TextSendMessage(text="Le soutien habité est en cours. Assurez-vous de passer en «utilisation normale» après avoir désactivé le support habité avec «déconnecter»."))
else:
line_bot_api.reply_message(reply_token, TextSendMessage(text="Je suis passé à une utilisation normale. Pour le support habité, veuillez saisir «utilisation administrateur»."))
user.status = "end"
db.session.add(user)
db.session.commit()
to_user = db.session.query(lineuser).filter_by(user_id=user_id).first()
to_user.retention = None
to_user.status = "end"
db.session.add(to_user)
db.session.commit()
admin.to_user = None
db.session.add(user)
db.session.commit()
else:
if admin.to_user != None:
line_bot_api.push_message(to=admin.to_user, messages=TextSendMessage(text=txt))
line_bot_api.reply_message(reply_token, TextSendMessage(text="%J'ai envoyé un message avec s."%txt))
else:
line_bot_api.reply_message(reply_token, TextSendMessage(text="Pas connecté à personne."))
Désolé pour l'article très grossier. Je vais continuer encore et encore.
『PostBackAction.py』 Lorsque vous recevez une entrée de bouton ou une telle entrée spéciale C'est un mécanisme à traiter.
PostBackAction.py
Learn more or give us feedback
from linebot import (
LineBotApi, WebhookHandler
)
from linebot.exceptions import (
InvalidSignatureError
)
from linebot.models import (
MessageEvent, TextMessage, TextSendMessage, PostbackEvent, ButtonsTemplate, PostbackTemplateAction, TemplateSendMessage, FollowEvent
, LocationSendMessage, LocationMessage, ImagemapSendMessage, MessageTemplateAction, ConfirmTemplate, DatetimePickerAction, DatetimePickerTemplateAction
, ImageMessage, ImageSendMessage, FlexSendMessage, BoxComponent, TextComponent, BubbleContainer, ButtonComponent,MessageAction
, CarouselContainer, URIAction, ImageComponent, PostbackAction, CameraAction, CameraRollAction, QuickReplyButton, QuickReply, FillerComponent,IconComponent
)
#from .ExtraCreateMessage import admin_sight_client_list
import configparser
""" ------------------------Lire le fichier de paramètres---------------------------"""
#Lire le fichier de paramètres
cfg = configparser.ConfigParser()
cfg.read('config.ini')
base_url = cfg["SERVER"]["URL"]
def create_image_container(title_name, url):
container = BubbleContainer(
body=BoxComponent(layout="vertical", spacing="sm", margin="sm", contents=[
BoxComponent(layout="vertical", contents=[
ImageComponent(url=url, size="full", aspect_mode="cover", aspect_ratio="1:1", gravity="top"),
BoxComponent(layout="vertical", contents=[
BoxComponent(layout="vertical", contents=[
TextComponent(text=title_name, size="xl", color="#ffffff", weight="bold")
]),
BoxComponent(layout="vertical", contents=[
FillerComponent(),
BoxComponent(layout="baseline", spacing="sm",contents=[
FillerComponent(),
TextComponent(text="Faites ce plan", offset_top="-2px", color="#ffffff",flex=0, action=MessageAction(text=title_name)),
FillerComponent(),
]),
FillerComponent(),
], border_width="1px", border_color="#ffffff", corner_radius="4px",
height="40px", spacing="sm", margin="xxl"),
], position="absolute", offset_bottom="0px", offset_start="0px", offset_end="0px",
background_color="#03303Acc", padding_all="20px", padding_top="18px"),
], padding_all="0px"),
],padding_all="0px")
)
return container
def Start(line_bot_api, event, db, lineuser, administrator):
user_id = event.source.user_id
reply_token = event.reply_token
postback_msg = event.postback.data
msg = postback_msg.split("@@@") # @@@Changer pour
user = db.session.query(lineuser).filter_by(user_id=user_id).first()
step = user.step
if len(msg) == 2:
post_msg = msg[0] #Oui ou non
post_num = int(msg[1]) #Numéro de question
elif len(msg) == 3:
post_msg = msg[0]
post_num = int(msg[1])
data = msg[2]
if post_msg == "admin_name":
if post_num == 1:
ad_name = data
admin = db.session.query(administrator).filter_by(admin_id=user_id).first()
admin.admin_name = data
admin.adminstatus = None
db.session.add(admin)
db.session.commit()
line_bot_api.reply_message(reply_token, TextSendMessage(text="%Merci de vous être inscrit en tant qu'administrateur, M. s!"%ad_name))
elif step == post_num:
if post_msg == "name":
user.username = data
user.status = "tel"
user.step = step + 1
db.session.add(user)
db.session.commit()
line_bot_api.reply_message(reply_token, TextSendMessage(text="%Merci Mme."
"Entrez ensuite votre numéro de téléphone!"
"* Ceci est à des fins de démonstration, veuillez donc ne pas entrer votre vrai numéro de téléphone! !!" % data))
elif post_msg == "tel":
user.tel = data
user.step = step + 1
user.status = "plan"
db.session.add(user)
db.session.commit()
line_bot_api.reply_message(reply_token, TextSendMessage(
text="%Merci Mme. Veuillez sélectionner le plan que vous souhaitez utiliser ensuite." % user.username))
plan_ls = ["Un plan", "Plan B", "Plan C", "Plan OR"]
url_ls = ["A.png ", "B.png ", "C.png ", "GOLD.png "]
bubble_container = []
for (p, url) in zip(plan_ls, url_ls):
url_ = base_url + "static/" + url
container = create_image_container(p, url_)
bubble_container.append(container)
bubble2 = CarouselContainer(contents=bubble_container)
select_messa = FlexSendMessage(alt_text="Veuillez sélectionner un plan.", contents=bubble2)
line_bot_api.push_message(to=user_id, messages=select_messa)
elif post_msg == "plan":
user.plan = data
user.step = step + 1
user.status = "message"
db.session.add(user)
db.session.commit()
line_bot_api.reply_message(reply_token, TextSendMessage(
text="%Merci Mme. Si vous avez un message à la fin, veuillez le saisir! Si aucun, entrez "aucun"." % user.username))
elif post_msg == "message":
user.usermessage = data
user.step = step + 1
user.status = "end"
db.session.add(user)
db.session.commit()
line_bot_api.reply_message(reply_token, TextSendMessage(
text="%Merci Mme. Ceci termine l'application! * Si vous souhaitez vous connecter à l'opérateur tel quel, entrez «Connect»." % user.username))
### --------Traitement habité---------- ####
elif post_msg == "end":
line_bot_api.reply_message(reply_token, TextSendMessage(
text="opérateur(Producteur)Je fais une demande de connexion à. S'il te plaît attend un moment."))
yestxt = "Lien"
id_ls = db.session.query(administrator.admin_id).all()
for id_ in id_ls:
try:
txt = "%Une demande de connexion d'opérateur a été reçue de M. s. Veuillez cliquer sur le bouton «Connecter» pour agir." %user.username
bubble = BubbleContainer(
body=BoxComponent(
layout='horizontal',
margin="xs",
contents=[TextComponent(txt, size='md', wrap=True, type="text", margin="xs", )]),
footer=BoxComponent(
layout="horizontal",
spacing="sm",
contents=[ButtonComponent(style="link", height="sm",
action=PostbackTemplateAction(label=yestxt,
data="demand@@@4@@@" + user_id,
display_text=yestxt))], flex=0))
admin_access_message = FlexSendMessage(alt_text="Une application de correspondance est arrivée.", contents=bubble)
line_bot_api.push_message(to=id_[0], messages=admin_access_message)
except:
pass
elif post_msg == "demand":
to_user_id = data
to_user = db.session.query(lineuser).filter_by(user_id=to_user_id).first()
to_user.retention = user_id
to_user.status = "response"
db.session.add(to_user)
db.session.commit()
admin = db.session.query(administrator).filter_by(admin_id=user_id).first()
admin.to_user = to_user_id
db.session.add(admin)
db.session.commit()
adminuser = db.session.query(lineuser).filter_by(user_id=user_id).first()
adminuser.status = "admin"
db.session.add(adminuser)
db.session.commit()
adminname = admin.admin_name
line_bot_api.push_message(to=to_user_id, messages=TextSendMessage(text="De l'opérateur%Connecté avec s"%adminname))
line_bot_api.reply_message(reply_token, TextSendMessage(text="%Lié à l'art."%to_user.username))
###----------------------------------------------------------####
else:
line_bot_api.reply_message(reply_token, TextSendMessage(text="Encore une fois merci."))
else:
if user.status == "end":
line_bot_api.reply_message(reply_token, TextSendMessage(text="Je l'ai annulé."))
else:
line_bot_api.reply_message(reply_token, TextSendMessage(text="Ce n'est pas à jour!"))
『ImageAction.py』 Un code qui réagit lorsqu'une image est envoyée.
ImageAction.py
from linebot import (
LineBotApi, WebhookHandler
)
from linebot.exceptions import (
InvalidSignatureError
)
from linebot.models import (
MessageEvent, TextMessage, TextSendMessage, PostbackEvent, ButtonsTemplate, PostbackTemplateAction, TemplateSendMessage, FollowEvent
, LocationSendMessage, LocationMessage, ImagemapSendMessage, MessageTemplateAction, ConfirmTemplate, DatetimePickerAction, DatetimePickerTemplateAction
, ImageMessage, ImageSendMessage, FlexSendMessage, BoxComponent, TextComponent, BubbleContainer, ButtonComponent,MessageAction
, CarouselContainer, URIAction, ImageComponent, PostbackAction, CameraAction, CameraRollAction, QuickReplyButton, QuickReply, FillerComponent,IconComponent
)
#from .ExtraCreateMessage import admin_sight_client_list
import configparser
""" ------------------------Lire le fichier de paramètres---------------------------"""
#Lire le fichier de paramètres
cfg = configparser.ConfigParser()
cfg.read('config.ini')
base_url = cfg["SERVER"]["URL"]
def create_image_container(title_name, url):
container = BubbleContainer(
body=BoxComponent(layout="vertical", spacing="sm", margin="sm", contents=[
BoxComponent(layout="vertical", contents=[
ImageComponent(url=url, size="full", aspect_mode="cover", aspect_ratio="1:1", gravity="top"),
BoxComponent(layout="vertical", contents=[
BoxComponent(layout="vertical", contents=[
TextComponent(text=title_name, size="xl", color="#ffffff", weight="bold")
]),
BoxComponent(layout="vertical", contents=[
FillerComponent(),
BoxComponent(layout="baseline", spacing="sm",contents=[
FillerComponent(),
TextComponent(text="Faites ce plan", offset_top="-2px", color="#ffffff",flex=0, action=MessageAction(text=title_name)),
FillerComponent(),
]),
FillerComponent(),
], border_width="1px", border_color="#ffffff", corner_radius="4px",
height="40px", spacing="sm", margin="xxl"),
], position="absolute", offset_bottom="0px", offset_start="0px", offset_end="0px",
background_color="#03303Acc", padding_all="20px", padding_top="18px"),
], padding_all="0px"),
],padding_all="0px")
)
return container
def Start(line_bot_api, event, db, lineuser, administrator):
user_id = event.source.user_id
reply_token = event.reply_token
postback_msg = event.postback.data
msg = postback_msg.split("@@@") # @@@Changer pour
user = db.session.query(lineuser).filter_by(user_id=user_id).first()
step = user.step
if len(msg) == 2:
post_msg = msg[0] #Oui ou non
post_num = int(msg[1]) #Numéro de question
elif len(msg) == 3:
post_msg = msg[0]
post_num = int(msg[1])
data = msg[2]
if post_msg == "admin_client_list_next":
admin = db.session.query(administrator).filter_by(admin_id=user_id).first()
page_options = admin.page_options
admin.page_options = page_options + 1
db.session.add(admin)
db.session.commit()
#admin_sight_client_list(user_id)
elif post_msg == "admin_client_list_prev":
admin = db.session.query(administrator).filter_by(admin_id=user_id).first()
page_options = admin.page_options
if page_options > 0:
admin.page_options = page_options - 1
db.session.add(admin)
db.session.commit()
#admin_sight_client_list(user_id)
else:
pass
#admin_sight_client_list(user_id)
elif post_msg == "admin_name":
if post_num == 1:
ad_name = data
admin = db.session.query(administrator).filter_by(admin_id=user_id).first()
admin.admin_name = data
admin.adminstatus = None
db.session.add(admin)
db.session.commit()
line_bot_api.reply_message(reply_token, TextSendMessage(text="%Merci de vous être inscrit en tant qu'administrateur, M. s!"%ad_name))
elif step == post_num:
if post_msg == "name":
user.username = data
user.status = "tel"
user.step = step + 1
db.session.add(user)
db.session.commit()
line_bot_api.reply_message(reply_token, TextSendMessage(text="%Merci Mme."
"Entrez ensuite votre numéro de téléphone!"
"* Ceci est à des fins de démonstration, veuillez donc ne pas entrer votre vrai numéro de téléphone! !!" % data))
elif post_msg == "tel":
user.tel = data
user.step = step + 1
user.status = "plan"
db.session.add(user)
db.session.commit()
line_bot_api.reply_message(reply_token, TextSendMessage(
text="%Merci Mme. Veuillez sélectionner le plan que vous souhaitez utiliser ensuite." % user.username))
plan_ls = ["Un plan", "Plan B", "Plan C", "Plan OR"]
url_ls = ["A.png ", "B.png ", "C.png ", "GOLD.png "]
bubble_container = []
for (p, url) in zip(plan_ls, url_ls):
url_ = base_url + "static/" + url
container = create_image_container(p, url_)
bubble_container.append(container)
bubble2 = CarouselContainer(contents=bubble_container)
select_messa = FlexSendMessage(alt_text="Veuillez sélectionner un plan.", contents=bubble2)
line_bot_api.push_message(to=user_id, messages=select_messa)
elif post_msg == "plan":
user.plan = data
user.step = step + 1
user.status = "message"
db.session.add(user)
db.session.commit()
line_bot_api.reply_message(reply_token, TextSendMessage(
text="%Merci Mme. Si vous avez un message à la fin, veuillez le saisir! Si aucun, entrez "aucun"." % user.username))
elif post_msg == "message":
user.usermessage = data
user.step = step + 1
user.status = "end"
db.session.add(user)
db.session.commit()
line_bot_api.reply_message(reply_token, TextSendMessage(
text="%Merci Mme. Ceci termine l'application! * Si vous souhaitez vous connecter à l'opérateur tel quel, entrez «Connect»." % user.username))
### --------Traitement habité---------- ####
elif post_msg == "end":
line_bot_api.reply_message(reply_token, TextSendMessage(
text="opérateur(Producteur)Je fais une demande de connexion à. S'il te plaît attend un moment."))
yestxt = "Lien"
id_ls = db.session.query(administrator.admin_id).all()
for id_ in id_ls:
try:
txt = "%Une demande de connexion d'opérateur a été reçue de M. s. Veuillez cliquer sur le bouton «Connecter» pour agir." %user.username
bubble = BubbleContainer(
body=BoxComponent(
layout='horizontal',
margin="xs",
contents=[TextComponent(txt, size='md', wrap=True, type="text", margin="xs", )]),
footer=BoxComponent(
layout="horizontal",
spacing="sm",
contents=[ButtonComponent(style="link", height="sm",
action=PostbackTemplateAction(label=yestxt,
data="demand@@@4@@@" + user_id,
display_text=yestxt))], flex=0))
admin_access_message = FlexSendMessage(alt_text="Une application de correspondance est arrivée.", contents=bubble)
line_bot_api.push_message(to=id_[0], messages=admin_access_message)
except:
pass
elif post_msg == "demand":
to_user_id = data
to_user = db.session.query(lineuser).filter_by(user_id=to_user_id).first()
to_user.retention = user_id
to_user.status = "response"
db.session.add(to_user)
db.session.commit()
admin = db.session.query(administrator).filter_by(admin_id=user_id).first()
admin.to_user = to_user_id
db.session.add(admin)
db.session.commit()
adminuser = db.session.query(lineuser).filter_by(user_id=user_id).first()
adminuser.status = "admin"
db.session.add(adminuser)
db.session.commit()
adminname = admin.admin_name
line_bot_api.push_message(to=to_user_id, messages=TextSendMessage(text="De l'opérateur%Connecté avec s"%adminname))
line_bot_api.reply_message(reply_token, TextSendMessage(text="%Lié à l'art."%to_user.username))
###----------------------------------------------------------####
else:
line_bot_api.reply_message(reply_token, TextSendMessage(text="Encore une fois merci."))
else:
if user.status == "end":
line_bot_api.reply_message(reply_token, TextSendMessage(text="Je l'ai annulé."))
else:
line_bot_api.reply_message(reply_token, TextSendMessage(text="Ce n'est pas à jour!"))
longue! !! !! Mais le prochain et le dernier!
『FollowAction.py』 Pourquoi n'avez-vous pas dessiné l'action de suivi en premier ... Eh bien, c'est du code qui ne s'exécute que la première fois, et peu importe qu'il soit là ou non.
FollowAction.py
from linebot import (
LineBotApi, WebhookHandler
)
from linebot.exceptions import (
InvalidSignatureError
)
from linebot.models import (
MessageEvent, TextMessage, TextSendMessage, PostbackEvent, ButtonsTemplate, PostbackTemplateAction, TemplateSendMessage, FollowEvent
, LocationSendMessage, LocationMessage, ImagemapSendMessage, MessageTemplateAction, ConfirmTemplate, DatetimePickerAction, DatetimePickerTemplateAction
, ImageMessage, ImageSendMessage, FlexSendMessage, BoxComponent, TextComponent, BubbleContainer, ButtonComponent,MessageAction
, CarouselContainer, URIAction, ImageComponent, PostbackAction, CameraAction, CameraRollAction, QuickReplyButton, QuickReply
)
def Start(line_bot_api, event, db, lineuser, adminstrator):
reply_token = event.reply_token
line_bot_api.reply_message(reply_token, TextSendMessage(text="Merci de me suivre! C'est un système de réservation avec une fonction habitée!"))
user_id = event.source.user_id
#Enregistrez les informations utilisateur.
if not db.session.query(lineuser).filter(lineuser.user_id == user_id).count():
reg = lineuser(user_id, None, None, None, None, 0, None, None, None)
db.session.add(reg)
db.session.commit()
Je vous remercie pour votre travail acharné. J'ai aussi un fort sentiment d'écrire mes propres notes, alors j'ai pensé que ce serait utile pour quelqu'un.
Je pense qu'il y a des processus inefficaces, mais c'est un test, donc il n'y a pas de problème! J'ai pensé, je l'ai fait à une vitesse explosive. Python est le meilleur! !! !!
Recommended Posts