如何通过Telethon获取Telegram频道全部成员?参数失效求助
问题:Telethon获取频道成员仅返回200个,
aggressive=True和limit参数失效 尝试用Telethon获取Telegram频道全部成员,但client.get_participants()和client.iter_participants()的aggressive=True及limit参数无法生效,仅能获取200个成员。现有代码如下:
from telethon import TelegramClient import pandas as pd import asyncio async def main(): api_id = 12345678 api_hash = 'xxx' phone = 'yyy' channel_href = 'zzz' client = TelegramClient('session_name', api_id, api_hash) client = await client.start() dialogs = await client.get_dialogs() channels = {d.entity.username: d.entity for d in dialogs if d.is_channel} my_channel = channel_href.split('/')[-1] channel = channels[my_channel] members_telethon_list = await client.get_participants(channel, aggressive=True, limit=5660) username_list = [member.username for member in members_telethon_list] first_name_list = [member.first_name for member in members_telethon_list] last_name_list = [member.last_name for member in members_telethon_list] phone_list = [member.phone for member in members_telethon_list] df = pd.DataFrame() df['username'] = username_list df['first_name'] = first_name_list df['last_name'] = last_name_list df['phone'] = phone_list df.to_csv('subscribers.csv', index=False) if __name__ == '__main__': loop = asyncio.get_event_loop() loop.run_until_complete(main())
注:已知get_event_loop()已过时,需同步解决该问题。
解决方案
1. 修复事件循环写法
将过时的asyncio.get_event_loop()替换为Python 3.7+推荐的asyncio.run(),直接运行异步函数:
if __name__ == '__main__': asyncio.run(main())
2. 改用iter_participants迭代获取全部成员
get_participants在处理大频道时易受API限制,改用iter_participants配合循环逐个收集成员,aggressive=True会自动处理API速率限制和重试逻辑:
# 替换原members_telethon_list = ... 这一行 members_telethon_list = [] async for member in client.iter_participants(channel, aggressive=True): members_telethon_list.append(member)
无需手动设置limit,不设置时会自动遍历所有成员;若设置则仅获取对应数量。
3. 优化频道获取方式
原代码通过get_dialogs遍历对话获取频道,若频道未在本地对话列表中会失败,改用client.get_entity()直接通过链接获取频道实体更可靠:
# 替换原channels字典和channel获取代码 channel = await client.get_entity(channel_href)
4. 确保Telethon版本为最新
过时版本可能存在参数兼容问题,执行升级命令:
pip install --upgrade telethon
完整修改后的代码
from telethon import TelegramClient import pandas as pd import asyncio async def main(): api_id = 12345678 api_hash = 'xxx' phone = 'yyy' channel_href = 'zzz' client = TelegramClient('session_name', api_id, api_hash) await client.start(phone) # 显式传入phone参数,确保登录流程正常 # 直接通过链接获取频道实体 channel = await client.get_entity(channel_href) # 迭代获取所有成员 members_telethon_list = [] async for member in client.iter_participants(channel, aggressive=True): members_telethon_list.append(member) # 整理数据 df = pd.DataFrame({ 'username': [m.username for m in members_telethon_list], 'first_name': [m.first_name for m in members_telethon_list], 'last_name': [m.last_name for m in members_telethon_list], 'phone': [m.phone for m in members_telethon_list] }) df.to_csv('subscribers.csv', index=False) if __name__ == '__main__': asyncio.run(main())
额外说明
- 若仍无法获取全部成员,需确认你拥有该频道的管理员权限,或该频道为公开频道(私有频道无权限无法获取成员)。
- Telegram API对成员获取有速率限制,
aggressive=True会自动处理重试,但请勿频繁执行此类操作,避免账号受限。
内容的提问来源于stack exchange,提问作者Daniil Nagikh
相关产品推荐
相关产品推荐

