如何使用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
相关产品推荐
相关产品推荐

