[Python] Une histoire sur la création d'un bot LINE avec une fonction humaine pratique sans utiliser Salesforce [API de messagerie]

en premier

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! !! !!

objectif

image.png

Conclusion: c'est le produit.

LINEBOT: Système de réservation image.png

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.

Installation nécessaire, etc.

Typique
pip install Flask
pip install line-bot-sdk
pip install flask_sqlalchemy
pip install Pillow
・
・

Autres

Structure du répertoire

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é

Fichier de paramètres "Settings.py" et config.ini

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)

Créer une table DB

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é

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

[Python] Une histoire sur la création d'un bot LINE avec une fonction humaine pratique sans utiliser Salesforce [API de messagerie]
[LINE Messaging API] Créez un BOT qui se connecte à quelqu'un avec Python
L'histoire de la création d'un robot LINE pour le petit-déjeuner d'une université de 100 yens avec Python
[LINE Messaging API] Créer un BOT de retour de perroquet avec Python
Une histoire sur un amateur faisant une rupture de bloc avec python (kivy) ②
Une histoire sur un amateur faisant une rupture de bloc avec python (kivy) ①
J'ai créé Chatbot en utilisant l'API LINE Messaging et Python
Une histoire sur l'ajout d'une API REST à un démon créé avec Python
J'ai créé Chatbot en utilisant l'API LINE Messaging et Python (2) ~ Server ~
Créer un LINE BOT avec Minette pour Python
LINE BOT avec Python + AWS Lambda + API Gateway
Une histoire sur l'exécution de Python sur PHP sur Heroku
Une histoire sur un débutant Python essayant d'obtenir des résultats de recherche Google à l'aide de l'API
Divers mémorandums lors de l'utilisation du sdk de l'API de messagerie LINE avec Python (2.7.9) + Google App Engine
[API LINE Messaging] Créez un menu riche avec Python
[Question] À propos de la conversion API du chat bot à l'aide de Python
Une histoire d'essayer un monorepo (Golang +) Python avec Bazel
Enregistrez des tickets avec l'API de Redmine en utilisant des requêtes Python
[Python] Utilisation de l'API Line [1ère création de Beauty Bot]
J'ai essayé de faire LINE BOT avec Python et Heroku
Laissez Python segfo sur une ligne sans utiliser de ctypes
[Super facile] Faisons un LINE BOT avec Python.
[Python / GAS] Une histoire sur la création d'une API Web personnelle qui vous permet de tout savoir sur comment devenir un romancier en écriture verticale, puis en faire un bot LINE.
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)
Apprentissage automatique Une histoire sur des personnes qui ne sont pas familiarisées avec GBDT utilisant GBDT en Python
Une note sur l'utilisation de l'API Facebook avec le SDK Python
Créez un bot Mastodon avec une fonction pour répondre automatiquement avec Python
J'ai essayé de créer LINE-bot avec Python + Flask + ngrok + LINE Messaging API
Exécutez LINE Bot implémenté en Python (Flask) "sans utiliser Heroku"
Une histoire sur la création d'une courte chanson par hasard avec Sudachi Py
L'histoire de la création d'un bot de boîte à questions avec discord.py
Une histoire à propos d'un débutant en python coincé avec aucun module nommé'ttp.server '