Telegram披萨点餐机器人重启后菜单不显示的循环问题求助
问题诊断与解决方案
核心问题分析
重启机器人后触发/menu仅收到提示,说明读取数据库的request列表为空,或菜单消息发送过程中出现未捕获的异常导致循环提前终止。
排查与修复步骤
1. 确认数据库查询结果是否为空
重启机器人后,数据库连接或查询逻辑可能未正确初始化,导致request是空列表,while循环直接跳过。
- 在while循环前添加检查逻辑,快速定位问题:
# 先判断菜单数据是否存在 if not request: await bot.send_message(message.from_user.id, "当前暂无披萨菜单,请稍后再试!", reply_markup=markups.menu) return - 检查机器人启动时的数据库初始化代码,确保重启后能重新执行查询并填充
request数据。
2. 修复Markdown格式错误导致的消息发送失败
你的代码使用parse_mode='markdown',如果菜品描述(description)包含*、_、[]等Markdown特殊字符,会导致消息解析失败被Telegram丢弃,后续菜单也无法发送。
- 改用
MarkdownV2并转义特殊字符:
发送消息时使用转义后的内容:# 定义转义函数处理所有MarkdownV2特殊字符 def escape_markdown_v2(text): special_chars = '_*[]()~`>#+-=|{}.!' for char in special_chars: text = text.replace(char, f'\\{char}') return text escaped_name = escape_markdown_v2(name) escaped_desc = escape_markdown_v2(description) escaped_price = escape_markdown_v2(price)await bot.send_message( message.from_user.id, f"{escaped_name}\n\n{escaped_desc}\n[查看图片]({photo})\n\nPRICE: {escaped_price} $", parse_mode='MarkdownV2' )
3. 添加异常捕获,避免单个菜品发送失败终止流程
在发送消息的代码块中添加异常捕获,防止某一道菜发送失败导致整个菜单无法展示:
i = 0 while i < len(request): name = request[i][0] description = request[i][1] price = request[i][2] photo = request[i][3] # 转义特殊字符(代码同上) try: await bot.send_message( message.from_user.id, f"{escaped_name}\n\n{escaped_desc}\n[查看图片]({photo})\n\nPRICE: {escaped_price} $", parse_mode='MarkdownV2' ) except Exception as e: print(f"发送菜品 {name} 出错: {str(e)}") await bot.send_message(message.from_user.id, f"加载菜品「{name}」失败,请稍后再试。") i += 1
完整修改后的代码示例
async def handle_menu_command(message, bot, markups): # 假设request是从数据库查询得到的菜单列表,确保重启后该函数能正确返回数据 request = get_menu_from_database() if not request: await bot.send_message(message.from_user.id, "当前暂无披萨菜单,请稍后再试!", reply_markup=markups.menu) return i = 0 while i < len(request): name = request[i][0] description = request[i][1] price = request[i][2] photo = request[i][3] # 转义MarkdownV2特殊字符 def escape_markdown_v2(text): special_chars = '_*[]()~`>#+-=|{}.!' for char in special_chars: text = text.replace(char, f'\\{char}') return text escaped_name = escape_markdown_v2(name) escaped_desc = escape_markdown_v2(description) escaped_price = escape_markdown_v2(price) try: await bot.send_message( message.from_user.id, f"{escaped_name}\n\n{escaped_desc}\n[查看图片]({photo})\n\nPRICE: {escaped_price} $", parse_mode='MarkdownV2' ) except Exception as e: print(f"发送菜品 {name} 出错: {str(e)}") await bot.send_message(message.from_user.id, f"加载菜品「{name}」失败,请稍后再试。") i += 1 await bot.send_message(message.from_user.id, 'Choose pizza!', reply_markup=markups.menu)
内容的提问来源于stack exchange,提问作者maria_hoffman
相关产品推荐
相关产品推荐

