如何使用Telethon查询Telegram频道的成员加入情况
Telethon 查询频道成员的实现方法
前置权限说明
- 所有接口的调用都受Telegram服务端权限约束:没有频道管理权限的账号,最多只能拉取公开频道的前200个可见成员,无法获取完整列表,这是平台规则限制,SDK层面无法绕过。
- 很多人找不到你说的对应方法,本质是把两类同属频道管理范畴的能力搞混了:一类是拉取当前频道的所有现存成员列表,另一类是拉取频道操作日志里的成员加入/退出动态,也就是你提到的“channel actions”对应的能力,两类能力对应完全不同的接口,没有统一的隐藏访问入口。
拉取全量现存成员的实现
这个是最常用的需求,核心调用的是GetParticipantsRequest接口,没有隐藏入口,按标准流程写即可:
- 先完成Telethon客户端的授权初始化,确保本地会话对目标账号有效
- 获取目标频道的实体对象:
entity = await client.get_entity('目标频道的用户名/公开链接/内部ID') - 分页拉取所有成员,因为单次请求最多返回200条结果,必须循环翻页才能拿全:
from telethon.tl.functions.channels import GetParticipantsRequest from telethon.tl.types import ChannelParticipantsSearch offset = 0 batch_limit = 200 all_members = [] while True: # 空的搜索过滤条件代表匹配所有类型的成员,不做关键词筛选 batch = await client(GetParticipantsRequest( channel=entity, filter=ChannelParticipantsSearch(''), offset=offset, limit=batch_limit, hash=0 )) if not batch.users: break all_members.extend(batch.users) offset += len(batch.users)
拉取频道操作日志里的成员动态(对应channel actions能力)
如果你的需求是查谁什么时候加入频道、谁被移出频道这类流水记录,需要调用频道专属的操作日志接口,这个接口仅频道管理员有权限调用:
from telethon.tl.functions.channels import GetRecentActionsRequest # 从最新的记录开始拉取,max_id设为0代表触发服务端从最旧的操作记录开始遍历 action_records = await client(GetRecentActionsRequest( channel=entity, max_id=0 )) # 返回的records列表里会包含所有成员加入、退出、权限变更的全量操作流水
常见踩坑提示
- 不要直接用Telethon封装的
client.get_participants()便捷方法拉取万人大频道,这个方法默认的分页参数经常会导致结果拉不全,手动按上面的循环逻辑实现更稳定。 - 如果调用接口返回权限错误,先检查当前登录账号是不是目标频道的管理员,普通成员身份是拿不到操作日志和完整成员列表的。
内容的提问来源于stack exchange,提问作者barzu rustami
相关产品推荐
相关产品推荐

