Telethon开发的Python Telegram Bot定时停止异常求助
检查时间判断精度
很多延迟停止的问题出在时间判断没精确到秒。如果你的代码只对比小时和分钟,比如用%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ć

