You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 11:20:28