作为管理员,如何用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_ID和API_HASH是从my.telegram.org正确获取的,且和登录账号匹配; - 会话未登录:第一次运行代码会提示你登录Telegram账号(输入手机号和验证码),确保登录的账号是频道管理员;
- 私有频道找不到:如果用邀请链接哈希无效,优先用对话列表的方式获取实体(方式3),前提是你的账号已经加入该频道。
内容的提问来源于stack exchange,提问作者SwimJim




