如何通过Telegram机器人实现聊天中@全体成员功能?
Telegram机器人实现@全体成员功能的可行方案
Telegram Bot API 本身确实没有提供主动拉取任意群全量成员的公开接口,要实现@all 全员提醒,可以根据自己的群场景选下面两种合规方案:
方案1:使用原生全员提及能力(零维护成本,优先推荐)
Telegram 超级群、频道本身就给管理员开放了原生@all 能力,机器人作为群管理员时可以直接调用,不需要维护任何成员列表:- 先把机器人添加为目标群的管理员,确认群设置里没有关闭「管理员可@全体成员」的开关
- 调用发消息接口时,给
@all文本绑定mention_all类型的消息实体,就能触发和人工管理员发@all完全一致的全员推送
示例代码(基于python-telegram-bot v20+):
from telegram import MessageEntity await context.bot.send_message( chat_id=目标群ID, text="@all 请所有成员查看本次通知", # 注意offset是@all在文本里的起始位置,length是@all的字符长度 entities=[MessageEntity(type=MessageEntity.MENTION_ALL, offset=0, length=4)] )这个方案的限制是仅支持超级群/频道,每个群每天的原生@all有官方次数上限(常规是5次/天)。
方案2:自行维护群成员列表(无次数限制,支持所有群类型)
如果你用的是普通小群,或者需要不受次数限制发全员提醒,可以通过监听事件的方式自己攒全量成员列表,不需要调用拉取全量成员的接口:- 机器人入群后,先开启
chat_member更新权限,监听三类事件维护本地成员库:- 收到
new_chat_members事件时,把新入群的用户ID、显示名存入对应群的成员表 - 收到
left_chat_member事件时,把退群/被移除的用户从成员表删除 - 收到普通消息、
chat_member权限变动事件时,同步更新对应用户的最新显示名、用户名信息
- 收到
- 冷启动补全:机器人刚被拉进群时,只能拿到拉它入群的用户信息,拿不到入群前的存量老成员。可以先调用
get_chat_administrators拉取所有管理员存入列表,再引导群成员发任意消息,从消息对象里拿到用户信息补全列表,活跃群一般1-2天就能补全所有存量成员。 - 发全员提醒时,用Telegram支持的隐形提及格式拼接文本,不需要用户设置用户名也能收到提醒:
[用户显示名](tg://user?id=用户ID),解析模式选MarkdownV2即可。
示例代码:
notify_content = "📢 全员通知:明天下午3点开线上会\n" for user in member_list: # 转义特殊字符避免格式错乱 show_name = user.full_name.replace("[", "").replace("]", "").replace("(", "").replace(")", "") notify_content += f"[{show_name}](tg://user?id={user.user_id}) " await context.bot.send_message( chat_id=目标群ID, text=notify_content, parse_mode="MarkdownV2" )这个方案没有使用次数限制,所有群类型都支持,缺点是需要自己维护存储,刚入群时没法立刻覆盖所有存量成员。
- 机器人入群后,先开启
注意:不要使用非官方的用户端MTProto接口爬取群成员列表,这个行为违反Telegram服务条款,会导致账号、机器人被永久封禁。单条消息里的提及用户不要超过100个,超过后Telegram会截断后续提及,不会触发提醒。不要高频发送全员通知,被用户批量举报后机器人会被限制发消息权限。
内容的提问来源于stack exchange,提问作者idriverx
相关产品推荐
相关产品推荐

