You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

作为管理员,如何用Telethon获取Telegram频道用户及解决用户名疑问?

解决Telethon获取Telegram频道用户列表的问题

我来帮你理清这个问题——首先得搞清楚到底该用什么来定位你的频道,然后修正代码里的问题。

一、你该用哪种频道标识符?

首先明确:不是你的个人用户名,而是频道本身的标识,分几种情况:

  • 如果频道有公开用户名(比如@MyPrivateChannel),可以直接用这个用户名;
  • 如果是没有公开用户名的私有频道,你可以用:
    • 频道的邀请链接哈希:比如邀请链接是t.me/joinchat/ABC123XYZ,那哈希就是ABC123XYZ
    • 频道的实体对象:可以通过客户端的对话列表先获取到频道实体;
    • 或者频道的ID+access_hash(需要先获取到实体才能拿到)。

二、完整可运行的代码示例

下面是针对私有/公开频道都适用的代码,我会标注关键步骤:

from telethon import TelegramClient
from telethon.tl.functions.channels import GetParticipantsRequest
from telethon.tl.types import ChannelParticipantsSearch

# 替换成你的API信息(从my.telegram.org获取)
API_ID = 123456
API_HASH = 'your_api_hash_here'
SESSION_NAME = 'my_session'

async def get_channel_members():
    async with TelegramClient(SESSION_NAME, API_ID, API_HASH) as client:
        # 方式1:如果频道有公开用户名,直接用@加用户名
        # channel_entity = await client.get_entity('@MyPrivateChannel')
        
        # 方式2:如果是私有频道,用邀请链接的哈希
        # channel_entity = await client.get_entity('ABC123XYZ')  # 替换成你邀请链接里的哈希
        
        # 方式3:从对话列表中找到频道(适合你已经加入的私有频道,最稳妥)
        channel_entity = None
        async for dialog in client.iter_dialogs():
            if dialog.name == "你的频道显示名称":  # 替换成你频道的实际名称
                channel_entity = dialog.entity
                break
        
        # 检查是否找到频道
        if not channel_entity:
            print("找不到指定的频道,请检查标识符或确认账号已加入频道")
            return
        
        # 分页获取成员(Telegram限制单次获取数量,所以循环拉取)
        offset = 0
        limit = 100
        all_members = []
        
        while True:
            participants = await client(GetParticipantsRequest(
                channel=channel_entity,
                filter=ChannelParticipantsSearch(''),  # 空字符串表示获取所有成员
                offset=offset,
                limit=limit,
                hash=0
            ))
            if not participants.users:
                break
            all_members.extend(participants.users)
            offset += limit
        
        # 打印成员信息
        print(f"频道成员总数:{len(all_members)}")
        for user in all_members:
            username = f"@{user.username}" if user.username else "无公开用户名"
            full_name = f"{user.first_name} {user.last_name}" if user.last_name else user.first_name
            print(f"ID:{user.id} | 姓名:{full_name} | 用户名:{username}")

if __name__ == '__main__':
    import asyncio
    asyncio.run(get_channel_members())

三、常见问题排查

  • 权限问题:你必须是频道的管理员,并且频道设置中允许管理员查看成员(私有频道默认开启,但如果被修改过要检查);
  • API信息错误:确保API_IDAPI_HASH是从my.telegram.org正确获取的,且和登录账号匹配;
  • 会话未登录:第一次运行代码会提示你登录Telegram账号(输入手机号和验证码),确保登录的账号是频道管理员;
  • 私有频道找不到:如果用邀请链接哈希无效,优先用对话列表的方式获取实体(方式3),前提是你的账号已经加入该频道。

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

火山引擎 最新活动