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

Telethon开发的Python Telegram Bot定时停止异常求助

Telegram机器人无法准时16:15停止运行的排查方案
  • 检查时间判断精度
    很多延迟停止的问题出在时间判断没精确到秒。如果你的代码只对比小时和分钟,比如用%H:%M格式判断是否到16:15,再加上轮询间隔的话,最多会延迟整个轮询周期才触发停止。建议直接用datetime对象对比,或者精确到秒的字符串,比如datetime.datetime.now().time() >= datetime.time(16,15,0),确保一到16:15:00就能触发判断。

  • 核对工作日判断逻辑
    确认周五的排除逻辑没出错。Python里datetime.weekday()返回0=周一,4=周五,5=周六,6=周日;isoweekday()则是1=周一,5=周五,6=周六,7=周日。别搞混索引,比如要排除周五,得判断weekday == 4(用weekday()的话),同时确保周六到周四的时间判断范围正确,别把工作日搞反导致时间逻辑混乱。

  • 调整轮询间隔
    如果用循环轮询检查时间,比如while True里加time.sleep(60),那最多可能延迟60秒才检测到时间到点。把轮询间隔缩小到10秒以内,能大幅降低延迟;或者直接用定时任务库(比如APScheduler),设置每天16:15触发停止动作,精度更高。

  • 确认停止动作的有效性
    就算时间判断对了,停止动作没执行到位也白搭。比如Telethon里用client.run_until_disconnected()启动的话,调用client.disconnect()应该能终止监听,但如果代码里还有其他阻塞线程,可能导致无法及时停止。要确保停止逻辑能彻底中断机器人的消息处理循环。

  • 排查时区问题
    检查代码用的时区是否和预期一致。如果服务器是UTC时区,你按北京时间设置的工作时间,就得做时区转换。用pytz或者Python 3.9+的zoneinfo把时间转成目标时区后再判断,避免因为时区差导致时间判断错误。

示例修正代码

import datetime
import asyncio
from telethon import TelegramClient

# 初始化客户端(替换为你的API ID、哈希等配置)
client = TelegramClient('session_name', api_id, api_hash)

def check_working_status():
    # 用北京时间判断
    tz = datetime.timezone(datetime.timedelta(hours=8))
    now = datetime.datetime.now(tz)
    weekday = now.weekday()
    
    # 周五全天停用
    if weekday == 4:
        return False
    # 检查是否在10:00-16:15之间
    start = datetime.time(10, 0, 0)
    end = datetime.time(16, 15, 0)
    return start <= now.time() <= end

async def main():
    await client.start()
    while True:
        if check_working_status():
            # 执行消息处理逻辑
            print("机器人运行中...")
        else:
            print("到达停止时间,断开连接")
            await client.disconnect()
            break
        await asyncio.sleep(10)  # 10秒轮询一次

if __name__ == '__main__':
    asyncio.run(main())

内容的提问来源于stack exchange,提问作者Dragan Marković

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 22:09:50