对PostBack Event中的字串进行处理,由於这个参数仅能放入字串,所以可以套用网页Query的方式进行参数传递
先替之前的Rich Menu加上功能,将上方选单的三个按钮,改成PostBackAction,data="action=ShowProductList?pcid={餐点类别ID}}"
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=PostbackAction(
label="显示购物车内容",
data="action=ShowProductList?pcid=16",
display_text="查询早餐"
)
),
RichMenuArea(
bounds=RichMenuBounds(x=512, y=0, width=512, height=512),
action=PostbackAction(
label="显示购物车内容",
data="action=ShowProductList?pcid=17",
display_text="查询午餐"
)
),
RichMenuArea(
bounds=RichMenuBounds(x=1024, y=0, width=512, height=512),
action=PostbackAction(
label="显示购物车内容",
data="action=ShowProductList?pcid=10",
display_text="查询饮料"
)
),
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
修改Server.py,以urllib.parse将data拆解为path与Value,如:
data:action=ShowProductList?pcid=16
data.path = action=ShowProductList, datavalue = {'pcid': ['16']}
记得加上找不到产品类别的意外处理
@handler.add(PostbackEvent)
def handler_postback(event):
prof = line_bot_api.get_profile(event.source.user_id)
data = event.postback.data
# app.logger.debug(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)
)
else:
from urllib.parse import urlparse, parse_qs
datapath = urlparse(data).path
datavalue = parse_qs(urlparse(data).query)
if(datapath == "action=ShowProductList"):
pcid = datavalue.get('pcid')[0] or None
if(not pcid):
app.logger.error(f"错误:找不到pcid:{pcid}")
line_bot_api.reply_message(
event.reply_token,
TextSendMessage(text=f"发生错误,请联络客服取得协助, 错误讯息:找不到pcid:{pcid}")
)
else:
replay_text = Handler.ShowProductListHandler(pcid) or "错误:action=ShowProductList Return None"
line_bot_api.reply_message(
event.reply_token,
TextSendMessage(text=replay_text)
)
从资料库中拉出product_name, product_decp, quantity, price, pid等栏位,并转成List
def QUY_Products_info_by_pcid(self, pcid):
cur = self.conn.cursor()
query = sql.SQL("SELECT product_name, product_decp, quantity, price, pid FROM {} WHERE categoryid = %s").format(sql.Identifier('products'))
cur.execute(query, (pcid,))
prods = cur.fetchall()
cur.close()
if(prods):
return list(map(list, prods))
return None
Sample:
prod_list:[['原味蛋饼', '手工饼皮,原味蛋饼', 9999, 30, 27], ['起司蛋饼', '手工饼皮,起司蛋饼', 9999, 40, 28], ['培根蛋饼', '手工饼皮,培根蛋饼', 9999, 40, 29], [' 培根蛋三明治', '台式培根蛋三明治', 9999, 40, 30], ['鲔鱼蛋三明治\n', '台式鲔鱼蛋三明治', 9999, 40, 31], ['卡拉鸡腿堡', '卡拉鸡腿堡,含荷包蛋', 9999, 60, 32]]
加上可读性
OrderHandlier.py
def ShowProductListHandler(pcid):
prod_list = dbpm.QUY_Products_info_by_pcid(pcid=pcid)
if(not prod_list):return None
info_list = []
for prod in prod_list:
info_list.append(f"【{prod[0]}】 餐点说明↓\n\n{prod[1]}\n\n库存:{prod[2]}\t售价:{prod[3]}\t订购代号:{prod[4]}\n")
return '\n'.join(str(v) for v in info_list)
Sample:
应该还要加个产品有效期限检查的,但今天有点急,明天做从Line进行放入购物车,购物车品项调整的功能,再看看还有没有要加上去
<<: [Python] 来自己建立一个Neural Network吧
【前言】 终於来到第一个大魔王了,突然感觉自己很像在打怪。等到开始打 Boss 才发现:「Reac...
前言 以TIMER为主要观察源,使用TIMER触发ADC,透过DMA结合,同时观察ADC中断副程序,...
昨天介绍了kafka的机制,今天将会透过strimzi的方式配置kafka cluster,同样的会...
10.6 Dijkstra’s SSSP 演算法 如果我们只在乎从某个点 s 出发到所有点的距离,而...
最近有打算写一个功能 FF14官网有新消息发布,bot就会把消息发送到discord主频上 但後来发...