[day26] 从Line查询购物车(Rich Menu & Postback)

https://ithelp.ithome.com.tw/upload/images/20211008/20140853UMmL5YbkkF.png

由左到右,由上至下,分别是

  1. 早餐选单按钮
  2. 午餐选单按钮
  3. 饮料选单按钮
  4. 使用说明按钮
  5. 查询购物车内容按钮
  6. 查询订单按钮

时间越来越不够了0rz

建立Line Rich Menu

建立Rich Menu模板,取得Rich MenuID,上传图片至Line,将图片与RichMenu绑定,将该Rich Menu设定为预设

实作

tester.py

def doline(dbpm:DBPm, args):
    line_bot_api = LineBotApi(os.environ['LCAT'])
    if(args.target == 'rich_menu_create'):
        print("以预设值建立新的Rich Menu")
        r = init_default_rich_menu(line_bot_api=line_bot_api, yes=args.yes)
    elif(args.target == 'rich_menu_img_upload'):
        print("上传Rich Menu 图片")
        r = add_upload_rich_menu_img(line_bot_api=line_bot_api, yes=args.yes)
    elif(args.target == 'show_rich_menu_list'):
        print("显示Rich Menu列表")
        r = info_get_rich_menu_list(line_bot_api=line_bot_api)
    elif(args.target == 'get_default_rich_menu'):
        print("显示预设Rich Menu")
        r = info_get_default_rich_menu(line_bot_api=line_bot_api)
    elif(args.target == 'set_default_rich_menu'):
        print("设定预设的Rich Menu")
        r = add_set_default_rich_menu(line_bot_api = line_bot_api, yes=args.yes)
    elif(args.target == 'cancel_default_rich_menu'):
        print("取消预设的Rich Menu")
        r = del_cancel_default_rich_menu(line_bot_api=line_bot_api, yes=args.yes)
    elif(args.target == 'delete_rich_menu'):
        print("删除Rich Menu")
        r = del_delete_rich_menu(line_bot_api=line_bot_api, yes=args.yes)
    if(r):print("成功")
    else:print("失败")

def init_default_rich_menu(line_bot_api:LineBotApi, yes=False):
    if(not yes):yes = askyes()
    if(not yes):return False
    areas = [RichMenuArea(
                bounds=RichMenuBounds(x=0, y=0, width=512, height=512),
                action=URIAction(label='Go to line.me', uri='https://line.me')
            ),
            RichMenuArea(
                bounds=RichMenuBounds(x=512, y=0, width=512, height=512),
                action=URIAction(label='Go to line.me', uri='https://line.me')
            ),
            RichMenuArea(
                bounds=RichMenuBounds(x=1024, y=0, width=512, height=512),
                action=URIAction(label='Go to line.me', uri='https://line.me')
            ),
            RichMenuArea(
                bounds=RichMenuBounds(x=0, y=512, width=512, height=512),
                action=MessageAction(label="按下问号按钮", text="显示操作说明")
            ),
            RichMenuArea(
                bounds=RichMenuBounds(x=512, y=512, width=512, height=512),
                action=PostbackAction(
                    label="显示购物车内容",
                    data="action=ShowShoppingCartContents",
                    display_text="我的购物车内有什麽"
                )
            ),
            RichMenuArea(
                bounds=RichMenuBounds(x=1024, y=512, width=512, height=512),
                action=PostbackAction(
                    label="查询订单",
                    data="action=ShowOrderStatus",
                    display_text="查询订单"
                )            
            )
        ]
    richmenuid = linecc.Create_Rich_Menu(line_bot_api, 1536, 1024, "default_Rich_Menu", "主选单", areas)
    print(f"rich_menu_id :{richmenuid}")
    if(richmenuid):return True
    else:return False

def add_upload_rich_menu_img(line_bot_api:LineBotApi, fp:str="./template/rm_01.png", yes=False):
    richmenuid = input("RichMenuId:")
    if(not richmenuid):return False
    fp = input(f"Default({fp}) or Enter:") or fp
    isvalid = os.path.exists(fp)
    print(f"Try load rich menu image from {fp}.....{isvalid}")
    if(not isvalid):return False
    if(not yes):yes = askyes()
    if(not yes):return False
    return linecc.Upload_Rich_Menu(line_bot_api, fp, richmenuid)

def add_set_default_rich_menu(line_bot_api:LineBotApi, timeout=None, yes=False):
    rich_menu_id = input("Rich Menu ID:")
    if(not yes):yes = askyes()
    if(not yes):return False
    line_bot_api.set_default_rich_menu(rich_menu_id)
    return True

linecc.py

def Upload_Rich_Menu(line_bot_api:LineBotApi, file_path, rich_menu_id):
    extension = os.path.splitext(file_path)[1]
    if(extension == '.jpg' or extension == '.jpeg'):
        content_type = 'image/jpeg'
    elif(extension == '.png'):
        content_type = 'image/png'
    else:
        print(f"副档名不正确", extension)
        return False
    with open(file_path, 'rb') as f:
        line_bot_api.set_rich_menu_image(rich_menu_id, content_type, f)
    return True

def get_rich_menu_list(line_bot_api:LineBotApi, timeout=None):
    rich_menu_list = line_bot_api.get_rich_menu_list(timeout=timeout)
    return rich_menu_list

def Create_Rich_Menu(line_bot_api:LineBotApi, image_width:int, image_height:int, name:str, char_bar_text:str, richmenuarea):
    rich_menu_to_create = RichMenu(
        size=RichMenuSize(width=image_width, height=image_height),
        selected=False,
        name=name,
        chat_bar_text=char_bar_text,
        areas=richmenuarea
    )
    rich_menu_id = line_bot_api.create_rich_menu(rich_menu=rich_menu_to_create)
    return rich_menu_id

查询购物车Line串接

处理PostBack Evevnt,查询资料库,传送给使用者

实作

Server.py

@handler.add(PostbackEvent)
def handler_postback(event):
    prof = line_bot_api.get_profile(event.source.user_id)
    data = event.postback.data
    print(f"data:{data}")
    if(data == 'action=ShowShoppingCartContents'):
        cart_info, cart_amount = dbpm.QUY_Shopping_Cart_info_by_uid(event.source.user_id)
        app.logger.debug(f"{prof.display_name} 查询购物车, uid:{event.source.user_id}, {cart_info}")
        replay_text = '\n'.join(str(v) for v in cart_info) + f"\n总共:{cart_amount}元"
        line_bot_api.reply_message(
            event.reply_token,
            TextSendMessage(text=replay_text)
        )

dbpm.py

def QUY_Shopping_Cart_info_by_uid(self, uid):
    scid = self.INS_QUY_SC(uid)

    prodlist = []
    tot_price = 0

    shopping_list = self.QUY_Shopping_Cart_by_scid(scid)
    if(not shopping_list):
        return False
    for prod in shopping_list:
        product_name, product_price = self.QUY_Prod_Name_and_Price_by_pid(prod[0])
        prodlist.append(f"{product_name} * {prod[1]}")
        tot_price = tot_price + product_price * prod[1]

    return prodlist, tot_price

结果展示

https://ithelp.ithome.com.tw/upload/images/20211008/20140853AwedcvSIwp.png

加速赶工中,接下来还有从Line进行购物车内容物加减,查订单


<<:  Day25_ISO27K相关笔记~-2021/10/08

>>:  Day24 Vue 认识Porps(3)

@Day18 | C# WixToolset + WPF 帅到不行的安装包 [系统更新]

安装 到客户端後,总该做系统的更新部分拉! 在更新之前先来简单的替换语法 在google 功能时,总...

Day14 开发套件 - 范例程序码介绍03 iOS 端

最後来看Native 端(iOS): 补充:iOS 中的 .h 和.m 档 .h 为标头档,做为宣告...

Day 8 - 目前(传统)的机器学习三步骤(3)-训练

第三步 Training : 训练并验证,找出最佳结果 挑选[学习演算法] 什麽是演算法(Algor...

[30天 Vue学好学满 DAY30] 总结 & 完赛感言

最後一篇文,挤出了一些觉得在开发上容易踩的雷以及要注意的事情 要使用、渲染的变数除了传递进入元件的,...

Day11 Let's ODOO: Controller

Controller是对URL endpoint处理,我们这里以两支API来做范例: import ...