Python Telegram Bot API如何向context.job_queue.run_once传递参数
问题原因
你当前写法的两个核心错误:
- python-telegram-bot v13.x的job队列回调函数只能接收1个
CallbackContext类型的参数,你定义的callback_search_msgs(context, keys)多了第二个参数,框架调用时会触发参数数量不匹配报错。 context.job_queue.run_once方法没有job_kwargs这个入参,你写的job_kwargs={'keys': context.args}完全不会生效。
正确实现方案
所有需要传递给回调的自定义参数,都打包成字典/对象传入run_once的context参数,回调函数内从context.job.context取值即可,修改后的完整代码如下:
from telegram.ext import Updater, CommandHandler def search_msgs(update, context): print('In TG, args', context.args) # 打包所有需要传递的参数 job_transfer_data = { "origin_context": context, # 你需要的原始context对象 "keys": context.args, "chat_id": update.effective_chat.id # 按需添加其他需要传递的参数 } context.job_queue.run_once(callback_search_msgs, 1, context=job_transfer_data) def callback_search_msgs(context): # 提取传递的参数 transfer_data = context.job.context keys = transfer_data["keys"] origin_context = transfer_data["origin_context"] chat_id = transfer_data["chat_id"] print('Args', keys) print('Chat ID ', chat_id) # 后续可以正常使用origin_context操作原始上下文内容 def main(): token = "替换为你的Bot Token" updater = Updater(token, use_context=True) dp = updater.dispatcher # use_context模式下无需额外传pass_job_queue、pass_user_data参数,框架自动处理 dp.add_handler(CommandHandler("search_msgs", search_msgs)) updater.start_polling() updater.idle() if __name__ == '__main__': main()
额外优化建议
如果不是必须用到完整的原始context对象,建议只传递你需要的零散参数(比如chat_id、user_data等),不要传递整个context对象,减少不必要的资源占用。
内容的提问来源于stack exchange,提问作者Vivek Singh
相关产品推荐
相关产品推荐

