电报防广告机器人 telegram antispam bot 相关功能 查询群组内的全部成员 对比ChannelParticipantsBanned与ChannelParticipantBanned

上一篇中, 我们通过查询群组中最近的1000条发言, 得到活跃群成员的id列表.

如果我想对这个群里的成员特别厚道, 只要是目前在群里的, 我都不希望有可能被机器人打扰.
那么我需要得到群组内的全部成员.

用GPT开发.
不要忘了, 我们刚刚做过的查询群最近消息的项目. 为了方便自己阅读和学习, 把上个项目的全部代码复制粘贴, 再加上下面的要求. 发给GPT.
查询一个telegram群组中的全部成员
输出格式为 yaml
telegram账号的userid:
 uesrname: telegram账号的username
 full_name: telegram账号的full name
6611601789:
  username: skypatch
  full_name: 蛙 女

这个群组可能是公开群组, 也可能是不公开群组
经过一些简单的调试. 代码正常运行了. 但是获得的用户包括了 exceptions 里的用户. 这不是我们想要的, 我们想要的用户列表应该还把这部分用户排除.

这一步折腾了比较久, GPT返回的结果有问题. 
我同时使用 claude, gemini, chatgpt.
再结合 Telethon 的官方文档. 终于搞定了.

上传到 Github

运行效果
正在获取群组成员列表: FuckGFW-Newbie 翻墙新手村
跳过Exceptions列表中的用户 ID: 816194782
跳过Exceptions列表中的用户 ID: 6521155977
...略

--- 群组成员列表 ---
6617181826:
  username: atefatman
  full_name: 子 肥
7919966027:
  username: crazypeace_anti_bot_bot
  full_name: CZ_antibot_bot
...略

✅ 共获取 1216 名成员
📄 已保存到文件: members_1517821953.yaml

========

后记

在 Telethon 中, ChannelParticipantBanned 与 ChannelParticipantsBanned 都有效的"东西".
可以import之后 使用
from telethon.tl.types import ChannelParticipantBanned, ChannelParticipantsBanned

ChannelParticipantsBanned 

是一个 filter, 用于 client.iter_participants() 函数的参数
见官方文档
当 ChannelParticipantsBanned 作为 filter, 调用 client.iter_participants() 函数的结果 是 返回这样的用户:
群组的 Permissions 里面的 Exceptions

ChannelParticipantBanned 

是 user 的一个"属性"participant 的一个可能的取值, 用于判断该用户是否在这个列表里面:
群组的 Permissions 里面的 Exceptions (见上图)
用法是这样的:
isinstance(user.participant, ChannelParticipantBanned)


需要注意的是

这两个"东西"都叫 *****Banned. 但实际上, Exceptions的意思是, 优先于群组默认权限设置的一个设定.
比如, 我的群组里面, 默认用户权限是不让发 贴纸的. 但是, 可以在 Exceptions 里面设置某个用户可以发送贴纸. 你觉得这叫作"Banned"吗?

评论

The Hot3 in Last 7 Days

极简一键脚本 自定义端口NaiveProxy与Caddy V2前置的VLESS/Vmess V2Ray共存 可开CDN

酒馆SillyTavern 玩英文角色卡 也能以中文输出 设置世界书Lorebooks