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

如何使用Python Telethon实时下载上千个Telegram群组消息?

Telegram超1000个群组消息采集失败解决方案

问题根源

你遇到的是Telegram官方的API硬限制:单个Telegram客户端默认最多只能接收约1000个会话的实时消息推送,超过这个数量的会话不会触发服务器的事件推送,所以你的代码监听少量群组正常,超过1000就收不到任何消息,和网络、代码逻辑本身没有关系。

原实现的问题

你使用的events.NewMessage事件监听属于被动接收推送的模式,天生受上述1000会话的上限约束,无法通过优化代码突破这个限制。

更高效的实现方案

  • 方案1:多客户端分摊监听
    将chatlist拆分为多个不超过900个群组的子集(预留100个的冗余空间避免触发上限),每个子集对应一个独立的TelegramClient实例,使用不同的会话文件命名(比如test_1、test_2),通过asyncio.gather同时运行多个客户端的事件循环。注意单个Telegram账号最多同时登录3-5个客户端即可,数量过多容易触发账号风控。
  • 方案2:主动增量拉取(更适合超大数量群组场景)
    放弃被动事件监听模式,改为定时遍历所有群组拉取最新消息,对比上一次拉取的最大消息ID筛选增量消息,该方案完全不受1000会话的限制,稳定性更高。参考实现代码如下:
from telethon import TelegramClient
import asyncio
from collections import defaultdict

# 替换为自己的api信息
api_id = 123456
api_hash = "your_api_hash"
chatlist = [] # 你的群组列表
# 存储每个群组上一次拉取的最大消息ID,用于增量筛选
last_msg_id_map = defaultdict(int)

async def pull_single_chat(client, chat_id):
    global last_msg_id_map
    try:
        # 单次最多拉取20条最新消息,可按需调整
        latest_msgs = await client.get_messages(chat_id, limit=20)
        if not latest_msgs:
            return
        # 筛选出上次拉取之后的新消息
        new_msgs = [msg for msg in latest_msgs if msg.id > last_msg_id_map[chat_id]]
        if new_msgs:
            # 更新当前群组的最大消息ID
            last_msg_id_map[chat_id] = max(msg.id for msg in new_msgs)
            for msg in new_msgs:
                # 此处替换为你的消息存储/处理逻辑
                print(msg.message)
    except Exception as e:
        print(f"群组{chat_id}拉取失败: {str(e)}")

async def main():
    client = TelegramClient('pull_session', api_id, api_hash)
    await client.start()
    # 初始化所有群组的最新消息ID,避免启动时拉取历史消息
    for chat in chatlist:
        latest = await client.get_messages(chat, limit=1)
        if latest:
            last_msg_id_map[chat] = latest[0].id
    # 每10秒全量拉取一次,可根据实时性需求调整间隔
    while True:
        pull_tasks = [pull_single_chat(client, chat) for chat in chatlist]
        await asyncio.gather(*pull_tasks)
        await asyncio.sleep(10)

if __name__ == "__main__":
    asyncio.run(main())
  • 额外优化建议
    如果群组数量超过5000个,建议使用多个Telegram账号分摊拉取请求,严格控制单账号每秒请求数不超过30次,避免触发API限流和账号封禁。处理消息时尽量使用批量写入存储的逻辑,减少单条IO操作的耗时。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 23:24:03