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

Python Telegram Bot的run_daily函数失效问题求助

Telegram Bot run_daily 函数失效排查方案

核心问题拆解

  • run_repeating 运行正常,但 run_daily 完全不触发消息发送,忽略时间参数
  • 仅收到 days 参数格式警告,无时间相关报错
  • 尝试设置本地时区未解决问题

针对性解决步骤

1. 修正 days 参数格式

警告提示 days 参数应为整数序列(比如 [0,1,2,3,4,5,6] 代表每周七天),而非单独整数。把代码里的 days=1 改成 days=(1,) 或者 days=[1],先消除警告,避免参数解析异常。

2. 严格遵循 UTC 时间格式要求

run_daily 要求时间参数是 datetime.time 类型的 UTC 时间,不能直接传字符串。正确写法示例:

from datetime import time

# 设置UTC时间14:30:00触发
job_queue.run_daily(send_message, time=time(hour=14, minute=30, second=0), days=(0,1,2,3,4,5,6))

注意:若要用本地时间,必须显式指定时区对象,不能仅修改时间数值。

3. 正确配置时区(关键)

如果要使用本地时区,需用 pytz 或 zoneinfo(Python 3.9+)创建时区对象并绑定到时间参数:

from datetime import time
import pytz

# 设置东八区(北京时间)的14:30触发
beijing_tz = pytz.timezone('Asia/Shanghai')
local_time = time(hour=14, minute=30, tzinfo=beijing_tz)
job_queue.run_daily(send_message, time=local_time, days=(0,1,2,3,4,5,6))

旧版本 python-telegram-bot 可能不支持直接带时区的 time 对象,需先将本地时间转成 UTC 时间再传入:

from datetime import datetime, time
import pytz

beijing_tz = pytz.timezone('Asia/Shanghai')
local_dt = beijing_tz.localize(datetime(2024,1,1,14,30))
utc_time = local_dt.utctimetuple()
job_queue.run_daily(send_message, time=time(utc_time.tm_hour, utc_time.tm_min), days=(0,1,2,3,4,5,6))

4. 验证 Job Queue 初始化

确保 JobQueue 已正确绑定到 Application 或 Updater(根据 python-telegram-bot 版本):

# python-telegram-bot v13.x
updater = Updater(token="YOUR_TOKEN")
job_queue = updater.job_queue

# python-telegram-bot v20.x
application = Application.builder().token("YOUR_TOKEN").build()
job_queue = application.job_queue

初始化错误会导致定时任务无法被调度。

5. 开启调试日志排查

添加日志输出,查看任务是否被正确调度:

import logging
logging.basicConfig(level=logging.INFO)

运行后查看日志中任务注册、触发的相关记录,可定位是任务未注册还是时间计算错误导致未触发。


内容的提问来源于stack exchange,提问作者d37t4

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 04:32:41