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

Telegram中Await CallbackQueryHandler未被调用问题求助

问题核心原因

你遇到的无响应问题核心是混用了python-telegram-bot(PTB)不同版本的API逻辑:

  • v13及更早的PTB版本使用Updater+Dispatcher架构,原生不支持async/await定义的异步回调函数,就算加了run_async=True参数也无法正确执行异步回调
  • v20+版本PTB全面转向异步架构,废弃了原来的Updater写法,统一使用ApplicationBuilder构建异步bot实例

另外你的原始代码还有两处细节错误:

  • 直接调用bot.send_message没有正确获取bot实例
  • 错把update.chat_instance作为聊天ID参数,合法参数应该是对应会话的chat_id

具体修改方案
  1. 先升级PTB到最新稳定版本
pip install python-telegram-bot --upgrade
  1. 替换为v20+版本的正确异步写法,补全缺失的异步调用声明

修正后可运行的代码示例
from telegram import Update
from telegram.ext import ApplicationBuilder, CallbackQueryHandler, ContextTypes

# 保留你原有post_data异步函数的逻辑
async def post_data(data):
    # 你的原有请求逻辑
    return True

async def button(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    query = update.callback_query
    await query.answer() # 异步方法必须加await调用
    data = query.data
    print(data)
    if await post_data(data):
        # 通过context.bot调用发送消息方法,指定正确的会话ID
        await context.bot.send_message(chat_id=update.effective_chat.id, text='Done!')

async def main() -> None:
    application = ApplicationBuilder().token("替换为你的TELEGRAM_BOT_TOKEN").build()
    application.add_handler(CallbackQueryHandler(button))
    # 启动异步轮询
    await application.run_polling()

if __name__ == "__main__":
    import asyncio
    asyncio.run(main())

如果你坚持使用v13旧版本

需要把所有异步语法改为同步写法,异步的post_data可以用asyncio.run包裹执行:

import asyncio
from telegram.ext import Updater, CallbackQueryHandler

# 同步封装异步post_data
def post_data_sync(data):
    return asyncio.run(post_data(data))

def button(update, context) -> None:
    query = update.callback_query
    query.answer()
    data = query.data
    print(data)
    if post_data_sync(data):
        context.bot.send_message(chat_id=update.effective_chat.id, text='Done!')

def main() -> None:
    updater = Updater("替换为你的TELEGRAM_BOT_TOKEN")
    updater.dispatcher.add_handler(CallbackQueryHandler(button, run_async=True))
    updater.start_polling()
    updater.idle()

if __name__ == "__main__":
    main()

内容的提问来源于stack exchange,提问作者manfredi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 14:57:05