python-telegram-bot 20+异步版启动时Job Queue为None问题求助
解决python-telegram-bot 20+异步版本添加每日任务的问题
你遇到的application.job_queue为None的问题,核心原因是调用build()后,Application的JobQueue还未完成初始化。v20+版本完全基于异步架构,任务注册流程需要遵循异步上下文规范,确保JobQueue初始化后再操作。
正确代码示例
import asyncio from datetime import time from telegram.ext import Application, PicklePersistence, ContextTypes async def task_function(context: ContextTypes.DEFAULT_TYPE): # 替换为你的任务逻辑,比如发送通知消息 await context.bot.send_message(chat_id="目标聊天ID", text="每日定时任务已执行") async def main(): token = "你的Bot Token" persistence = PicklePersistence(filepath="pickle_persistence") # 构建Application实例 application = Application.builder().token(token).persistence(persistence).build() # 此时JobQueue已完成初始化,可直接调用添加任务 job_queue = application.job_queue job_queue.run_daily(task_function, time=time(hour=3, minute=0)) # 启动Bot的轮询服务 await application.run_polling() if __name__ == "__main__": asyncio.run(main())
关键注意事项
- 所有操作必须在异步函数中执行:v20+彻底移除了同步API,不能像旧版本那样在同步代码中直接操作JobQueue。
- JobQueue初始化时机:
application.build()仅创建基础实例,JobQueue会在run_polling()自动调用的初始化流程中完成实例化,此时application.job_queue才会有效。 - 任务函数必须是异步的:旧版本的同步任务函数需要改为异步形式,否则会触发运行时错误。
装饰器写法(可选)
也可以用装饰器直接注册任务,需确保装饰器在Application构建后使用:
async def main(): token = "你的Bot Token" persistence = PicklePersistence(filepath="pickle_persistence") application = Application.builder().token(token).persistence(persistence).build() job_queue = application.job_queue @job_queue.run_daily(time=time(hour=3, minute=0)) async def daily_task(context: ContextTypes.DEFAULT_TYPE): await context.bot.send_message(chat_id="目标聊天ID", text="每日定时任务已执行") await application.run_polling()
内容的提问来源于stack exchange,提问作者A B
相关产品推荐
相关产品推荐

