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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 06:23:12