예제 #1
0
파일: app.py 프로젝트: Fugu-Lin/LineBotPy
def handle_image_message(event):
    print(event)
    # 從event裡面取得用戶id
    user_id = event.source.user_id
    # 想辦法抓出圖片網址裡的action
    message_json = json.loads(str(event.message))
    message_url = str(message_json['contentProvider']['originalContentUrl'])
    message_url_args = message_url.split('?')[1].split('&')
    args_dic = {}
    for x in message_url_args:
        args_dic[x.split("=")[0]] = x.split("=")[1]
    # 從event裡面取得reply_token
    reply_token = event.reply_token
    # 從資料庫取得送出postback的用戶資料
    query = User.query.filter_by(id=user_id).first()
    args_dic['name'] = query.user_name_custom
    args_dic['phone_number'] = query.phone_number
    args_dic['userid'] = user_id
    if args_dic['action'] == 'booking':
        # 老師說的對,先不要用UUID先用日期檔老師一下
        # 等之後再修回來
        # # 用uuid創一個訂單編號
        # booking_id = uuid.uuid4().hex
        booking_id = str(datetime.today().strftime('%Y%m%d%H%M%S'))

        # 存入字典
        args_dic['id'] = booking_id
        date_string = args_dic['date'] + " " + args_dic['time'] + ":01"
        date_time = datetime.strptime(date_string, '%Y-%m-%d %H:%M:%S')
        booking = Booking(id=booking_id,
                          book_time=date_time,
                          is_confirm=0,
                          user_id=user_id,
                          people_num=args_dic['number'])
        db_session.add(booking)
        db_session.commit()
        line_bot_api_server.push_message('U47eb075cc6756bf9075f79c91a9925a0',
                                         AllMessage.confirmMessage(args_dic))
        line_bot_api_server.push_message('Uf172bde17bf332ad7060a417db99f1c2',
                                         AllMessage.confirmMessage(args_dic)),
        line_bot_api_server.push_message('U3f7562b0d0e0ffc22f3b82fa90af5a27',
                                         AllMessage.confirmMessage(args_dic))
        print(args_dic)
        return

    if args_dic['action'] == 'order':
        line_bot_api.reply_message(reply_token, TextSendMessage(text="好的," + args_dic["table"] + "是嗎?\n以下是我們的菜單!"))
        line_bot_api.push_message(user_id, Products.list_all())
예제 #2
0
파일: app.py 프로젝트: Fugu-Lin/LineBotPy
def follow_message(event):
    # 建立用戶資料
    get_or_create_user(event.source.user_id)
    # 傳送歡迎訊息
    line_bot_api.reply_message(
        event.reply_token,
        AllMessage.welcome_message()
    )
    # 設置預設richmenu
    line_bot_api.link_rich_menu_to_user(event.source.user_id, richmenu_list.RichMenu_ID.richmenu_01)
예제 #3
0
파일: app.py 프로젝트: Fugu-Lin/LineBotPy
def handler_postback(event):
    # 把postback裡面的資料轉成字典
    data = dict(parse_qsl(event.postback.data))
    # 再取出action裡面的值
    action = data.get('action')
    # 從event裡面取得用戶id
    user_id = event.source.user_id
    # 從event裡面取得reply_token
    reply_token = event.reply_token
    # 建立一個購物車物件
    cart = Cart(user_id=user_id)
    # 從資料庫取得送出postback的用戶資料
    query = User.query.filter_by(id=user_id).first()
    print(event.postback.data)
    # 點擊加入會員
    if event.postback.data in ['join_us', '加入會員']:
        # 資料庫該使用者狀態改為註冊中
        # Updata data
        print('註冊中')
        query.is_signup = True
        db_session.commit()
        line_bot_api.link_rich_menu_to_user(user_id, richmenu_list.RichMenu_ID.richmenu_02)
        line_bot_api.push_message(user_id, AllMessage.sign_cellphone())
    # 點擊取消輸入之類的
    elif event.postback.data in ['exit']:
        query.is_signup = False
        query.edit_user_name = False
        query.edit_home_address = False
        query.edit_company_address = False
        db_session.commit()
        if not query.is_member:
            line_bot_api.link_rich_menu_to_user(user_id, richmenu_list.RichMenu_ID.richmenu_01)
        line_bot_api.push_message(user_id, TextSendMessage(text='好的,歡迎您再來找我聊聊天喔!'))
    # 點擊會員中心
    elif event.postback.data in ['會員中心']:
        line_bot_api.reply_message(reply_token, TextSendMessage(text='這是專屬於你的會員中心', sender=Sender(
            name='會員中心管理員結衣',
            icon_url='https://i.imgur.com/S7SHmup.png'
        )))
        line_bot_api.push_message(user_id, AllMessage.member_center(query))
    # 觸發點餐相關事件
    elif event.postback.data in ['當日外帶', 'add', '點餐']:
        # 先跳出選擇內用外帶
        line_bot_api.reply_message(reply_token, TemplateSendMessage(alt_text="請問您要內用還是外帶呢?",
                                                                    sender=Sender(
                                                                        name='服務員結衣',
                                                                        icon_url='https://i.imgur.com/S7SHmup.png'
                                                                    ),
                                                                    template=ConfirmTemplate(
                                                                        text="請問您要內用還是外帶呢?",
                                                                        actions=[
                                                                            PostbackAction(
                                                                                label="內用",
                                                                                text="內用",
                                                                                data="here"
                                                                            ),
                                                                            PostbackAction(
                                                                                label="外帶",
                                                                                text="外帶",
                                                                                data="out"
                                                                            )
                                                                        ]
                                                                    )))
    # 外帶事件
    elif event.postback.data in ['out']:
        line_bot_api.reply_message(reply_token, Products.list_all())
    # 內用事件
    elif event.postback.data in ['here']:
        line_bot_api.reply_message(reply_token, TemplateSendMessage(alt_text="請掃描桌上的QRCODE",
                                                                    sender=Sender(
                                                                        name='服務員結衣',
                                                                        icon_url='https://i.imgur.com/S7SHmup.png'
                                                                    ),
                                                                    template=ButtonsTemplate(
                                                                        text='請掃描桌上的QRCode點餐',
                                                                        actions=[
                                                                            URIAction(
                                                                                type='uri',
                                                                                label='點我掃描',
                                                                                uri="https://liff.line.me/1654280234-Wabazm3B"
                                                                            )
                                                                        ]
                                                                    )))
    # 觸發確認訂單事件
    elif event.postback.data in ['待補', '確認訂單']:
        if cart.bucket():
            line_bot_api.reply_message(reply_token, cart.display())
        else:
            line_bot_api.reply_message(reply_token, TextSendMessage(text='你的購物車目前沒東西喔'))
    # 觸發清空購物車事件
    elif event.postback.data in ['Empty Cart']:
        cart.reset()
        line_bot_api.reply_message(reply_token, TextSendMessage(text="你的購物車已經被清空了"))
    # 如果action為check則執行結帳動作
    elif action == 'checkout':
        if not cart.bucket():
            line_bot_api.reply_message(reply_token,
                                       TextSendMessage(text='你的購物車是空的'))
            return 'OK'

        # 透過uuid來建立訂單id,它可以幫我們建立一個獨一無二的值
        order_id = uuid.uuid4().hex
        # 訂單總金額
        total = 0
        # 訂單內容物的陣列
        items = []

        for product_name, num in cart.bucket().items():
            product = db_session.query(Products).filter(Products.name.ilike(product_name)).first()

            print(product.id)
            item = Items(product_id=product.id,
                         product_name=product.name,
                         product_price=product.price,
                         order_id=order_id,
                         quantity=num)

            items.append(item)

            total += product.price * int(num)

        cart.reset()

        line_pay = LinePay()
        # 傳送這些資訊過去他會回我們一個json
        # 自己試試看把info印出來或是用postman看看裡面的結構
        info = line_pay.pay(product_name='OrderBot 點吧',
                            amount=total,
                            order_id=order_id,
                            product_image_url=Config.STORE_IMAGE_URL)

        # 從info裡面擷取付款連結跟transactionid
        pay_web_url = info['paymentUrl']['web']
        transaction_id = info['transactionId']

        # 產生訂單
        order = Orders(id=order_id,
                       transaction_id=transaction_id,
                       is_pay=False,
                       amount=total,
                       user_id=user_id)

        db_session.add(order)

        for item in items:
            db_session.add(item)

        db_session.commit()

        message = TemplateSendMessage(
            alt_text='差一點點就完成訂購囉~',
            template=ButtonsTemplate(
                text='差一點點就完成訂購囉~',
                actions=[
                    URIAction(label='Pay NT${}'.format(order.amount),
                              uri='{liff_url}?redirect_url={url}'.format(
                                  liff_url=Config.LIFF_URL,
                                  url=pay_web_url))
                ]))
        line_bot_api.reply_message(reply_token, message)

    # 訂單管理
    elif event.postback.data in ['訂單管理']:
        line_bot_api.reply_message(reply_token, Booking.list_all_user(user_id))

    # 取消訂單
    elif '取消訂位' in event.postback.data:
        line_bot_api.reply_message(reply_token, TextSendMessage(text="您的訂單已取消",
                                                                sender=Sender(
                                                                    name='會員中心管理員結衣',
                                                                    icon_url='https://i.imgur.com/S7SHmup.png'
                                                                )))
        book_id = str(event.postback.data)[4:]
        db_session.query(Booking).filter_by(id=book_id).first().is_confirm = -2
        db_session.commit()

    return 'OK'
예제 #4
0
파일: app.py 프로젝트: Fugu-Lin/LineBotPy
def handle_message(event):
    # 從event裡面取得用戶id
    user_id = event.source.user_id
    # 從event裡面取得reply_token
    reply_token = event.reply_token
    # 從資料庫取得送出postback的用戶資料
    query = User.query.filter_by(id=user_id).first()
    # 從event裡面取得用戶傳來的訊息
    message_text = str(event.message.text).lower()
    # 建立一個購物車物件
    cart = Cart(user_id=user_id)

    # 綁webhook
    if reply_token == '00000000000000000000000000000000':
        return 'ok'

    # 如果正在註冊中
    if query.is_signup:
        if check_cellphone(event.message.text):
            line_bot_api.push_message(user_id, TextSendMessage('恭喜註冊成功!'))
            line_bot_api.link_rich_menu_to_user(user_id, richmenu_list.RichMenu_ID.richmenu_04)
            query.is_member = True
            query.is_signup = False
            query.phone_number = event.message.text
            db_session.commit()
            return
        else:
            line_bot_api.push_message(user_id, AllMessage.error_cellphone_format())

    if query.is_member:

        if query.edit_user_name:
            print('編輯使用者中')
            query.user_name_custom = message_text
            query.edit_user_name = False
            db_session.commit()
            line_bot_api.push_message(user_id, TextSendMessage(text='設定完成'))
            return
        elif query.edit_home_address:
            print('編輯住家中')
            query.home_address = message_text
            query.edit_home_address = False
            db_session.commit()
            line_bot_api.push_message(user_id, TextSendMessage(text='設定完成'))
            return
        elif query.edit_company_address:
            print('編輯公司中')
            query.company_address = message_text
            query.edit_company_address = False
            db_session.commit()
            line_bot_api.push_message(user_id, TextSendMessage(text='設定完成'))
            return

        # 編輯使用者名稱
        if message_text == '編輯使用者名稱':
            query.edit_user_name = True
            query.edit_home_address = False
            query.edit_company_address = False
            db_session.commit()
            line_bot_api.reply_message(event.reply_token, AllMessage.edit_user_name())
            return
        # 編輯住家
        elif message_text == '編輯住家':
            query.edit_user_name = False
            query.edit_home_address = True
            query.edit_company_address = False
            db_session.commit()
            line_bot_api.reply_message(event.reply_token, AllMessage.edit_home_address())
            return
        # 編輯公司
        elif message_text == '編輯公司':
            query.edit_user_name = False
            query.edit_home_address = False
            query.edit_company_address = True
            db_session.commit()
            line_bot_api.reply_message(event.reply_token, AllMessage.edit_company_address())
            return

        # 購物車相關
        if "數量為:" in message_text:
            product_name = message_text.split(',')[0]
            num_item = message_text.rsplit(':')[1]

            product = db_session.query(Products).filter(Products.name.ilike(product_name)).first()

            if product:

                cart.add(product=product_name, num=num_item)

                confirm_template = ConfirmTemplate(
                    text='{},數量為:{}?'.format(product_name, num_item),
                    actions=[
                        PostbackAction(label='繼續選購', text='繼續選購', data='當日外帶'),
                        PostbackAction(label='確認訂單', text='確認訂單', data='確認訂單')
                    ])

                line_bot_api.reply_message(reply_token,
                                           TemplateSendMessage(alt_text='還需要加購嗎?', template=confirm_template))

            else:
                line_bot_api.reply_message(reply_token, TextSendMessage(text="抱歉,我們沒有賣{}".format(product_name)))

        # 功能列表
        if message_text == "功能列表":
            line_bot_api.reply_message(reply_token, AllMessage.Menu_client(user_id))
            return

        # 變成管理員的通關密碼
        if message_text in ["霹靂卡霹靂拉拉波波莉娜貝貝魯多", "AI戰神"]:
            query.is_manager = True
            line_bot_api.reply_message(reply_token, TextSendMessage(text="恭喜你成為管理員了"))
            return
예제 #5
0
파일: app.py 프로젝트: Fugu-Lin/LineBotPy
def handler_postback_server(event):
    # 把postback裡面的資料轉成字典
    data = dict(parse_qsl(event.postback.data))
    # 再取出action裡面的值
    action = data.get('action')
    # 從event裡面取得用戶id
    user_id = event.source.user_id
    # 從event裡面取得reply_token
    reply_token = event.reply_token
    # 從資料庫取得送出postback的用戶資料
    query = User.query.filter_by(id=user_id).first()
    if event.postback.data in ['功能列表']:
        line_bot_api_server.reply_message(reply_token, messages=AllMessage.Menu())
        return

    # 如果接收訂單
    if 'yes' in event.postback.data:
        order_data = str(event.postback.data).split(" ")
        booking_info = Booking.query.filter_by(id=order_data[6]).first()
        print(booking_info.id)
        # 如果訂單已經被處理過了
        if booking_info.is_confirm != 0:
            line_bot_api_server.reply_message(reply_token, TextSendMessage(text="這張單子已經處理過了ㄛ!"))
            return
        # 給老闆一點回饋
        line_bot_api_server.reply_message(reply_token, TextSendMessage(text="成功接受訂單"))

        # 建立參數字典
        args_dic = {}
        args_dic['name'] = order_data[1]
        args_dic['date'] = order_data[2]
        args_dic['time'] = order_data[3]
        args_dic['num_people'] = order_data[4]
        args_dic['phone_number'] = query.phone_number
        args_dic['id'] = booking_info.id
        user_id = order_data[5]

        print(args_dic)

        # 把訂單確認狀態改成1(接單)
        booking_info.is_confirm = 1
        db_session.commit()

        print(event.postback.data)
        line_bot_api.push_message(user_id, AllMessage.Order_Message(args_dic))
        return

    # 如果拒絕訂單
    if 'no' in event.postback.data:
        # 先把參數拆開
        order_data = str(event.postback.data).split(" ")
        booking_info = Booking.query.filter_by(id=order_data[6]).first()

        # 如果訂單已經被處理過了
        if booking_info.is_confirm != 0:
            line_bot_api_server.reply_message(reply_token, TextSendMessage(text="這張單子已經處理過了ㄛ!"))
            return
        # 給老闆一點回饋
        line_bot_api_server.reply_message(reply_token, TextSendMessage(text="已拒絕訂單"))

        # 把訂單確認狀態改成-1(拒絕)
        booking_info.is_confirm = -1
        db_session.commit()

        user_id = str(event.postback.data).split(" ")[5]
        line_bot_api.push_message(user_id, TextSendMessage(text="店家拒絕此次訂位!\n麻煩請於上方選時間處選其它時刻,感謝您~"))
        return

    if event.postback.data in ['訂單管理']:
        print('訂單管理')
        line_bot_api_server.reply_message(reply_token, messages=Booking.list_all_manager())
        return