Python开发的Slack机器人发送@提及消息无法触发用户提醒如何解决?
问题成因
该问题是Slack API的规则限制导致的:
- 你手动在Slack聊天框输入
@username时,Slack前端会自动将这段文本转换为内部的ID引用格式,发送给后台后会触发提醒逻辑 - 机器人通过API直接发送纯文本
@username时,Slack后台不会做上述转换,只会将其识别为普通字符串,因此不会触发用户的@通知 - 若Slack机器人没有正确配置相关权限,也会导致@功能失效
解决方法
要实现正常的@提醒,你需要使用Slack API规定的ID引用格式替换纯文本用户名,具体步骤如下:
步骤1:获取目标对象的ID
Slack中每个用户、用户组都有唯一的固定ID,你需要先调用对应接口拿到ID:
- 单个用户ID格式为
UXXXXXXXX,可以调用client.users_list()接口遍历所有用户,匹配用户名后拿到对应ID - 用户组ID格式为
SXXXXXXXX,可以调用client.usergroups_list()接口遍历所有用户组,匹配组handle后拿到对应ID
步骤2:构造符合规范的@语法
拿到ID后按照以下规则拼接消息内容:
- @单个用户:使用
<@用户ID>格式替换原来的@用户名 - @用户组:使用
<!subteam^用户组ID>格式替换原来的@用户组名 - @频道全体在线成员:直接使用
<!here> - @频道所有成员:直接使用
<!channel>
步骤3:修改后的代码示例
@单个用户示例
from slack_sdk import WebClient client = WebClient(token=slack_token) target_username = "demo_user" target_user_id = None # 遍历获取对应用户ID for user in client.users_list()["members"]: if not user["deleted"] and user["name"] == target_username: target_user_id = user["id"] break if target_user_id: slack_message = f"Hello <@{target_user_id}>" client.chat_postMessage( channel=channel_ID, text=slack_message )
@用户组示例
from slack_sdk import WebClient client = WebClient(token=slack_token) target_group_handle = "demo_group" target_group_id = None # 遍历获取对应用户组ID for group in client.usergroups_list()["usergroups"]: if group["handle"] == target_group_handle: target_group_id = group["id"] break if target_group_id: slack_message = f"Hello <!subteam^{target_group_id}>" client.chat_postMessage( channel=channel_ID, text=slack_message )
注意事项
- 确保机器人已经被邀请到目标发送频道,否则无法正常发送消息和触发提醒
- 确认机器人已在Slack应用管理页面的「OAuth & Permissions」中添加了
chat:write、users:read、usergroups:read权限,修改权限后需要重新安装应用到工作区并更新使用的token
内容的提问来源于stack exchange,提问作者arc_lupus
相关产品推荐
相关产品推荐

