Telethon重复运行出现旧消息ID警告,是否需调整实现?
Telegram脚本每小时运行出现旧消息警告的问题处理
我正在开发一个Python脚本,需要每小时读取Telegram群组中的最后一条消息以调用特定函数。首次运行脚本时无报错,但后续每小时运行时会出现如下警告:
WARNING:telethon.network.mtprotostate:Server sent a very old message with ID XXXXXXXXXX, ignoring (see FAQ for details)
WARNING:telethon.network.mtprotosender:Security error while unpacking a received message: Too many messages had to be ignored consecutively
WARNING:telethon.network.mtprotostate:Server sent a very old message with ID XXXXXXXXXXX, ignoring (see FAQ for details)
请问我应该将这些消息视为正常警告忽略,还是需要调整实现方式?
补充说明
- 运行脚本前会清除
session_name.session文件 - 已尝试在Ubuntu和Windows 10系统运行,排查系统时间问题
当前代码实现
客户端初始化及调用代码
self.loop = asyncio.get_event_loop() self.loop.run_until_complete(init_telegram())
last_msg = self.loop.run_until_complete(retrieveMessage())
Telegram核心代码
from telethon import TelegramClient import asyncio import os from dotenv import load_dotenv load_dotenv() # ---- CONFIG ---- API_ID = os.getenv("API_ID") API_HASH = os.getenv("API_HASH") PHONE_NUMBER = os.getenv("PHONE") GROUP_NAME = os.getenv("GROUP_NAME") telegram_client = TelegramClient('session_name', API_ID, API_HASH) async def init_telegram(): await telegram_client.start(PHONE_NUMBER) print("[INFO] Telegram client started and connected.") async def retrieveMessage(): try: group = await telegram_client.get_entity(GROUP_NAME) messages = await telegram_client.get_messages(group, limit=1) if messages: return messages[0].text return None except Exception as e: print(f"Error retrieving message: {e}") return None
问题分析与解决方案
这些警告不是正常情况,必须调整实现方式,核心问题出在每次运行都删除session文件并重新初始化客户端的操作上:
- 每次删除session文件后,客户端会重建全新会话,Telegram服务器会发送该账号历史会话的缓存消息,客户端判定为"非常旧的消息"并触发警告。
- 频繁创建新会话会触发服务器安全检测逻辑,进而出现"Too many messages had to be ignored consecutively"这类安全警告。
具体调整方案
- 保留session文件,禁止每次运行删除:session文件用于维持客户端与服务器的会话状态,复用已有会话可避免服务器发送旧缓存消息。
- 改为长期维持客户端连接:无需每小时重新初始化客户端,启动一次连接后用定时任务循环执行消息读取逻辑即可。
调整后的示例代码
async def main(): await init_telegram() while True: last_msg = await retrieveMessage() # 调用你的特定函数 print(f"最新消息内容: {last_msg}") await asyncio.sleep(3600) # 每小时执行一次 if __name__ == "__main__": asyncio.run(main())
这种方式既消除了警告,也提升了脚本运行效率。
内容的提问来源于stack exchange,提问作者kronos_58
相关产品推荐
相关产品推荐

