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

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文件并重新初始化客户端的操作上:

  1. 每次删除session文件后,客户端会重建全新会话,Telegram服务器会发送该账号历史会话的缓存消息,客户端判定为"非常旧的消息"并触发警告。
  2. 频繁创建新会话会触发服务器安全检测逻辑,进而出现"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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 10:25:08