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

Python Telegram Bot API如何向context.job_queue.run_once传递参数

问题原因

你当前写法的两个核心错误:

  1. python-telegram-bot v13.x的job队列回调函数只能接收1个CallbackContext类型的参数,你定义的callback_search_msgs(context, keys)多了第二个参数,框架调用时会触发参数数量不匹配报错。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 00:15:06