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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 13:02:34