[Python] Eine Geschichte über das Erstellen eines LINE-Bots mit einer praktischen bemannten Funktion ohne Verwendung von Salesforce [Messaging-API]

zunaechst

Ich werde die Erklärung viel falten. Es tut uns leid. Vielleicht ist der Code auch schmutzig. Es tut uns leid. - -

Wenn Sie LINE Bot für geschäftliche Zwecke verwenden, was wahrscheinlich von fast jedem in Japan verwendet wird (?), Benötigen Sie eine bemannte Funktion, oder? (Vielleicht) Deshalb werden wir ein Reservierungssystem aufbauen, das so einfach wie möglich besetzt werden kann! Machen! !! !!

Tor

image.png

Fazit: Dies ist das Produkt.

LINEBOT: Reservierungssystem image.png

Welche Art von Code tatsächlich erstellt wurde, ist leichter zu verstehen, wenn Sie sich die Realität ansehen! Der Operator ist mit mir verbunden (lacht) Bemannte Funktionen sind durch Verknüpfung von Datenbank und PUSH Message möglich! !! Mit der kostenlosen Version können Sie nur bis zu 1000 Fälle pro Monat bearbeiten. Wenn Sie sie also tatsächlich für geschäftliche Zwecke verwenden, sollten Sie sie mit einem kostenpflichtigen Lichtplan verwenden.

Notwendige Installation etc.

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

Andere

Verzeichnisaufbau

Es ist so. Es mag einige Pausen geben, aber ich bin bestrebt, die Aktionen in minimale Teile zu unterteilen und sie auf leicht verständliche Weise zu verwalten.

├── projects
    ├── static
   └── contents
         ├── FollowAction.py
         ├── ImageAction.py
         ├── PostBackAction.py
         └── TextAction.py

   └── server.py
   └── Settings.py
   └── config.ini

『server.py』 Hier spiele ich die Rolle des Einrichtens eines Servers, aber hier entwerfe ich auch die Datenbank. Es ist besser, es zu teilen, Diesmal ist es okay.

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

#Jedes Aktionsmodul
from contents import FollowAction, ImageAction, TextAction, PostBackAction

app = Flask(__name__)

""" ------------------------Einstellungsdatei lesen---------------------------"""
#Einstellungsdatei lesen
cfg = configparser.ConfigParser()
cfg.read('config.ini')

#SQLALCHEMY
url = cfg["SQL"]["URL"]
app.config['SQLALCHEMY_DATABASE_URI'] = url
db = SQLAlchemy(app)

#LINE-Einstellungen
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 ist gültig, ob die Papageienrückgabe aktiviert werden soll
Parrot_return = False

#Server-URL als Domain
base_url = cfg["SERVER"]["URL"]
"""--------------------------------------------------------------------------------------------"""


"""--------------------------------Datenbankdefinition----------------------------"""
class lineuser(db.Model):#Datenbank für allgemeine Benutzer
    __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):#Administrator-Datenbank
    __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

"""---------------------------------------------------------------------------------------------------"""



"""--------------------------------Messaging-API-Verarbeitung----------------------------"""
#Wo kann ich Anfragen von LINE erhalten?
@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'

#Wenn Sie verfolgt werden
@handler.add(FollowEvent)
def on_follow(event):
    FollowAction.Start(line_bot_api, event, db, lineuser, administrator)

#Wenn eine Nachricht kommt
@handler.add(MessageEvent, message=TextMessage)
def on_message(event):
    TextAction.Start(line_bot_api, event, db, lineuser, administrator, Parrot_return)

#Wenn Sie eine Taste drücken
@handler.add(PostbackEvent)
def on_postback(event):
    PostBackAction.Start(line_bot_api, event, db, lineuser, administrator)

#Wenn das Bild gesendet wird
@handler.add(MessageEvent, message=ImageMessage)
def Image_message(event):
    ImageAction.Start(line_bot_api, event, db, lineuser, administrator)


"""----------------------------------------------------------------------------------------------------"""



if __name__ == "__main__":
    app.run(port=????)#Geben Sie Ihre bevorzugte Portnummer an

Einstellungsdatei "Settings.py" und config.ini

import configparser

cfg = configparser.ConfigParser()
cfg['DEFAULT'] = {
    'debug': True
}

cfg['LINE'] = {
    'SECRET': "LINE geheimer Schlüssel hier"
    , 'TOKEN': "Zugriffstoken hier"
}

cfg["SQL"] = {
    "URL": "Beschreiben Sie hier den URI der in SQL ALCHEMY verwendeten Datenbank"
}
cfg["SUPERUSER"] = {
    "SECUREKEY": "SCHLÜSSEL für den Administrator"
    , "SECUREPASS": "PASS für Administratoren"
}
cfg["SERVER"] = {
    "URL": "Server-URL"
}
with open('config.ini', 'w') as config_file:
    cfg.write(config_file)

Erstellen Sie eine DB-Tabelle

machen

>>python Settings.py
>>python
from server import db
db.create_all()
exit()

『TextAction.py』 Dies ist der Vorgang, wenn die folgende TEXT-Code-Eingabe von LINE empfangen wird.

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


""" ------------------------Einstellungsdatei lesen---------------------------"""
#Einstellungsdatei lesen
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 == "Administrator verwenden":
            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="Verwenden Sie es als Administrator."))
                user.status = "admin"
                db.session.add(user)
                db.session.commit()
            else:
                line_bot_api.reply_message(reply_token, TextSendMessage(text="Bitte warten Sie, bis Sie den normalen Gebrauch abgeschlossen haben!"))

        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="Noch ein Schritt! Bitte teilen Sie mir Ihr Passwort mit."))  #Ein Schritt vor der Administratorregistrierung
            else:
                line_bot_api.push_message(to=user_id,
                                          messages=TextSendMessage(text="Sie haben bereits Administratorrechte."))  #Ich bin bereits als Administrator registriert

        #############Statusprüfung und Korrekturbestätigung##########
        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="Verrate mir bitte deinen Namen!"))

        elif status == "name":
            yestxt = "Ja"
            notxt = "Nein"
            bubble = BubbleContainer(
                body=BoxComponent(
                    layout='horizontal', margin="xs",
                    contents=[
                        TextComponent("『%Ist es okay mit "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="Nachricht bestätigen", contents=bubble)
            line_bot_api.reply_message(reply_token, image_confirm_to_message)

        elif status == "tel":
            yestxt = "Ja"
            notxt = "Nein"
            bubble = BubbleContainer(
                body=BoxComponent(
                    layout='horizontal', margin="xs",
                    contents=[
                        TextComponent("Die Telefonnummer ist "%s ”ist alles in Ordnung?" % 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="Nachricht bestätigen", contents=bubble)
            line_bot_api.reply_message(reply_token, image_confirm_to_message)

        elif status == "plan":
            plan_ls = ["Ein Plan", "B Plan", "C Plan", "GOLD Plan"]
            if txt in plan_ls:
                yestxt = "Ja"
                notxt = "Nein"
                bubble = BubbleContainer(
                    body=BoxComponent(
                        layout='horizontal', margin="xs",
                        contents=[
                            TextComponent("Der Plan, den Sie wollen, ist "%s ”ist alles in Ordnung?" % 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="Nachricht bestätigen", contents=bubble)
                line_bot_api.reply_message(reply_token, image_confirm_to_message)

        elif status == "message":
            yestxt = "Ja"
            notxt = "Nein"
            bubble = BubbleContainer(
                body=BoxComponent(
                    layout='horizontal', margin="xs",
                    contents=[
                        TextComponent("Die letzte Nachricht lautet "%s ”ist alles in Ordnung?" % 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="Nachricht bestätigen", contents=bubble)
            line_bot_api.reply_message(reply_token, image_confirm_to_message)

        elif status == "end":
            if txt == "Verbindung":
                yestxt = "Ja"
                notxt = "Nein"
                bubble = BubbleContainer(
                    body=BoxComponent(
                        layout='horizontal', margin="xs",
                        contents=[
                            TextComponent("Möchten Sie eine Verbindung zum Betreiber beantragen?", 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="Bestätigung", contents=bubble)
                line_bot_api.reply_message(reply_token, image_confirm_to_message)
            else:
                line_bot_api.reply_message(reply_token, TextSendMessage(text="Um eine Verbindung zum Betreiber herzustellen, geben Sie "Verbinden" ein."))

        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="Ich habe Sie als Administrator gewährt. Bitte geben Sie "Als Administrator verwenden" ein."))
            else:
                user.status = "end"
                db.session.add(user)
                db.session.commit()
                line_bot_api.reply_message(reply_token, TextSendMessage(text="Bitte geben Sie von Anfang an erneut ein."))

        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()
            #Geben Sie den Administratornamen ein
            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="Bitte geben Sie den Namen des Administrators ein."))

            #Bestätigung der Eingabe des Administratornamens
            elif admin.adminstatus == "admin_name":
                qtxt = "Administrator: "%Bist du sicher, dass du "s" magst?" % txt
                yestxt = "Ja"
                notxt = "Nein"
                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="Bitte geben Sie den Administratornamen ein.", contents=bubble)
                line_bot_api.push_message(to=user_id, messages=message)

            elif txt == "Trennen":
                if admin.to_user != None:
                    line_bot_api.push_message(to=admin.to_user, messages=TextSendMessage(text="Die Verbindung zum Bediener wurde beendet."))
                    line_bot_api.reply_message(reply_token, TextSendMessage(text="Die bemannte Verbindung wurde getrennt."))

                    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()

            #Empfang für "normalen Gebrauch" erhalten
            elif txt == "Normaler Gebrauch":
                if admin.to_user != None:
                    line_bot_api.reply_message(reply_token,
                                               TextSendMessage(text="Bemannte Unterstützung ist im Gange. Stellen Sie sicher, dass Sie auf "Normalbetrieb" umschalten, nachdem Sie die bemannte Unterstützung mit "Trennen" ausgeschaltet haben."))
                else:
                    line_bot_api.reply_message(reply_token, TextSendMessage(text="Ich wechselte zum normalen Gebrauch. Für bemannten Support geben Sie bitte "Administratorgebrauch" ein."))
                    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="%Ich habe eine Nachricht mit s gesendet."%txt))
                else:
                    line_bot_api.reply_message(reply_token, TextSendMessage(text="Mit niemandem verbunden."))

Entschuldigung für den sehr groben Artikel. Ich werde weiter und weiter gehen.

『PostBackAction.py』 Wenn Sie eine Tasteneingabe oder eine solche spezielle Eingabe erhalten Es ist ein Mechanismus zu verarbeiten.

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

""" ------------------------Einstellungsdatei lesen---------------------------"""
#Einstellungsdatei lesen
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="Mach diesen 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("@@@")  # @@@Ändern
    user = db.session.query(lineuser).filter_by(user_id=user_id).first()
    step = user.step

    if len(msg) == 2:
        post_msg = msg[0]  #Ja oder Nein
        post_num = int(msg[1])  #Fragennummer

    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="%Vielen Dank, dass Sie sich als Administrator registriert haben, Mr. 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="%Vielen Dank, Herr s."
                                                                         "Dann geben Sie Ihre Telefonnummer ein!"
                                                                         "* Dies dient zu Demonstrationszwecken. Bitte geben Sie nicht Ihre echte Telefonnummer ein! !!" % 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="%Vielen Dank, Herr s. Bitte wählen Sie den Plan aus, den Sie als nächstes verwenden möchten." % user.username))
            plan_ls = ["Ein Plan", "B Plan", "C Plan", "GOLD Plan"]
            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="Bitte wählen Sie einen 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="%Vielen Dank, Herr s. Wenn Sie am Ende eine Nachricht haben, geben Sie diese bitte ein! Wenn keine, geben Sie "Keine" ein." % 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="%Vielen Dank, Herr s. Damit ist die Bewerbung abgeschlossen! * Wenn Sie eine Verbindung zum Operator herstellen möchten, geben Sie "Verbinden" ein." % user.username))

        ###  --------Bemannte Verarbeitung----------    ####
        elif post_msg == "end":
            line_bot_api.reply_message(reply_token, TextSendMessage(
                text="Operator(Produzent)Ich beantrage eine Verbindung zu. Bitte warte eine Weile."))
            yestxt = "Verbindung"
            id_ls = db.session.query(administrator.admin_id).all()
            for id_ in id_ls:
                try:
                    txt = "%Ein Betreiberanschlussantrag wurde von Herrn s erhalten. Bitte klicken Sie auf die Schaltfläche "Verbinden", um Maßnahmen zu ergreifen." %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="Ein Korrespondenzantrag ist eingegangen.", 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="Vom Betreiber%Verbunden mit s"%adminname))
            line_bot_api.reply_message(reply_token, TextSendMessage(text="%Verbunden mit s."%to_user.username))

        ###----------------------------------------------------------####
        else:
            line_bot_api.reply_message(reply_token, TextSendMessage(text="Nochmals vielen Dank."))
    else:
        if user.status == "end":
            line_bot_api.reply_message(reply_token, TextSendMessage(text="Ich habe es abgesagt."))
        else:
            line_bot_api.reply_message(reply_token, TextSendMessage(text="Es ist nicht aktuell!"))

『ImageAction.py』 Ein Code, der reagiert, wenn ein Bild gesendet wird.

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

""" ------------------------Einstellungsdatei lesen---------------------------"""
#Einstellungsdatei lesen
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="Mach diesen 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("@@@")  # @@@Ändern
    user = db.session.query(lineuser).filter_by(user_id=user_id).first()
    step = user.step

    if len(msg) == 2:
        post_msg = msg[0]  #Ja oder Nein
        post_num = int(msg[1])  #Fragennummer

    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="%Vielen Dank, dass Sie sich als Administrator registriert haben, Mr. 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="%Vielen Dank, Herr s."
                                                                         "Dann geben Sie Ihre Telefonnummer ein!"
                                                                         "* Dies dient zu Demonstrationszwecken. Bitte geben Sie nicht Ihre echte Telefonnummer ein! !!" % 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="%Vielen Dank, Herr s. Bitte wählen Sie den Plan aus, den Sie als nächstes verwenden möchten." % user.username))
            plan_ls = ["Ein Plan", "B Plan", "C Plan", "GOLD Plan"]
            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="Bitte wählen Sie einen 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="%Vielen Dank, Herr s. Wenn Sie am Ende eine Nachricht haben, geben Sie diese bitte ein! Wenn keine, geben Sie "keine" ein." % 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="%Vielen Dank, Herr s. Damit ist die Bewerbung abgeschlossen! * Wenn Sie eine Verbindung zum Operator herstellen möchten, geben Sie "Verbinden" ein." % user.username))

        ###  --------Bemannte Verarbeitung----------    ####
        elif post_msg == "end":
            line_bot_api.reply_message(reply_token, TextSendMessage(
                text="Operator(Produzent)Ich beantrage eine Verbindung zu. Bitte warte eine Weile."))
            yestxt = "Verbindung"
            id_ls = db.session.query(administrator.admin_id).all()
            for id_ in id_ls:
                try:
                    txt = "%Ein Betreiberanschlussantrag wurde von Herrn s erhalten. Bitte klicken Sie auf die Schaltfläche "Verbinden", um Maßnahmen zu ergreifen." %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="Ein Korrespondenzantrag ist eingegangen.", 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="Vom Betreiber%Verbunden mit s"%adminname))
            line_bot_api.reply_message(reply_token, TextSendMessage(text="%Verbunden mit s."%to_user.username))

        ###----------------------------------------------------------####
        else:
            line_bot_api.reply_message(reply_token, TextSendMessage(text="Nochmals vielen Dank."))
    else:
        if user.status == "end":
            line_bot_api.reply_message(reply_token, TextSendMessage(text="Ich habe es abgesagt."))
        else:
            line_bot_api.reply_message(reply_token, TextSendMessage(text="Es ist nicht aktuell!"))

lange! !! !! Aber als nächstes und letztes!

『FollowAction.py』 Warum hast du nicht zuerst die folgende Aktion gezeichnet ... Nun, es ist Code, der nur beim ersten Mal ausgeführt wird, und es spielt keine Rolle, ob er vorhanden ist oder nicht.

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="Danke dafür, dass du mir folgst! Es ist ein Reservierungssystem mit einer bemannten Funktion!"))
    user_id = event.source.user_id
    #Benutzerinformationen registrieren.
    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()

Danke für deine harte Arbeit

Danke für deine harte Arbeit. Ich habe auch ein starkes Gespür dafür, meine eigenen Notizen zu schreiben, deshalb dachte ich, es wäre für jemanden hilfreich.

Ich denke, es gibt einige ineffiziente Prozesse, aber es ist ein Test, also gibt es kein Problem! Ich dachte, ich habe es mit explosiver Geschwindigkeit geschafft. Python ist das Beste! !! !!

Recommended Posts

[Python] Eine Geschichte über das Erstellen eines LINE-Bots mit einer praktischen bemannten Funktion ohne Verwendung von Salesforce [Messaging-API]
[LINE Messaging API] Erstellen Sie einen BOT, der eine Verbindung zu jemandem mit Python herstellt
Die Geschichte, wie man mit Python einen 100-Yen-Frühstücks-Bot für die Universität macht
[LINE Messaging API] Erstellen Sie einen Papageienrückgabe-BOT mit Python
Eine Geschichte über einen Amateur, der mit Python (Kivy) einen Blockbruch macht ②
Eine Geschichte über einen Amateur, der mit Python (Kivy) einen Blockbruch macht ①
Ich habe Chatbot mit LINE Messaging API und Python erstellt
Eine Geschichte über das Hinzufügen einer REST-API zu einem mit Python erstellten Daemon
Ich habe Chatbot mit der LINE Messaging API und Python (2) ~ Server ~ erstellt
Erstellen Sie mit Minette für Python einen LINE BOT
LINE BOT mit Python + AWS Lambda + API Gateway
Eine Geschichte über das Ausführen von Python auf PHP auf Heroku
Eine Geschichte über einen Python-Anfänger, der versucht, Google-Suchergebnisse mithilfe der API abzurufen
Verschiedene Memoranden bei Verwendung von SDK der LINE Messaging API mit Python (2.7.9) + Google App Engine
[LINE Messaging API] Erstellen Sie mit Python ein umfangreiches Menü
[Frage] Über die API-Konvertierung von Chat-Bot mit Python
Eine Geschichte über das Ausprobieren eines (Golang +) Python-Monorepo mit Bazel
Registrieren Sie Tickets mit der Redmine-API mithilfe von Python-Anforderungen
[Python] Verwenden der Linien-API [1. Erstellung des Beauty-Bots]
Ich habe versucht, LINE BOT mit Python und Heroku zu machen
Lassen Sie Python in einer Zeile segfo, ohne ctypes zu verwenden
[Super einfach] Machen wir einen LINE BOT mit Python.
[Python / GAS] Eine Geschichte über das Erstellen einer persönlichen Web-API, mit der Sie alles darüber lesen können, wie man ein Romanautor im vertikalen Schreiben wird und es dann zu einem LINE-Bot macht.
"Inoffizielle Apple Refurbished Product Introduction" BOT mit LINE Messaging API (v2) + API Gateway + Lambda (Python)
Maschinelles Lernen Eine Geschichte über Menschen, die mit GBDT in GBDT in Python nicht vertraut sind
Ein Hinweis zum Aufrufen der Facebook-API mit dem Python SDK
Erstellen Sie einen Mastodon-Bot mit einer Funktion, die automatisch mit Python antwortet
Ich habe versucht, LINE-Bot mit Python + Flask + ngrok + LINE Messaging API zu erstellen
Führen Sie den in Python (Flask) implementierten LINE Bot "ohne Verwendung von Heroku" aus.
Eine Geschichte über das zufällige Erstellen eines kurzen Songs mit Sudachi Py
Die Geschichte, wie man mit discord.py einen Fragenkasten-Bot erstellt
Eine Geschichte über einen Python-Anfänger, der mit dem No-Modul'http.server 'feststeckt.