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
具体修改方案
- 先升级PTB到最新稳定版本
pip install python-telegram-bot --upgrade
- 替换为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
相关产品推荐
相关产品推荐

