如何在Slack中查看谁通过表情反应投票?求相关Bot代码示例
在Slack查看表情投票用户及Bot开发示例
咱们先解决第一个问题:手动查看表情投票的用户,其实很简单:
- 打开目标Slack消息,把鼠标悬停在你想查看的表情反应上,会弹出一个小面板,里面直接列出所有添加这个表情的用户。
- 如果用户太多面板显示不全,点击面板底部的「查看全部」,就能看到完整的用户列表了。
接下来是你关心的Bot开发部分,我用目前Slack官方推荐的slack-sdk(原slackclient已升级)给你写两个实用的代码示例,先说说准备工作:
- 去Slack开发者平台创建一个Bot应用,给它添加这些权限:
reactions:read(读取表情反应)、chat:write(发送消息),如果要实时监听还需要events:read和socket_mode:connections。然后把Bot安装到你的工作区,拿到Bot Token(格式是xoxb-xxxxxx)。 - 安装Python依赖:
pip install slack-sdk
示例1:主动查询指定消息的表情投票用户并发消息
这个脚本可以帮你主动获取某条消息的所有表情投票用户,还能给这些用户发私信:
from slack_sdk import WebClient from slack_sdk.errors import SlackApiError # 替换成你的Bot Token SLACK_BOT_TOKEN = "xoxb-your-bot-token-here" client = WebClient(token=SLACK_BOT_TOKEN) # 替换成目标频道ID和消息TS(消息时间戳,从消息复制链接里提取) CHANNEL_ID = "C1234567890" MESSAGE_TS = "1620000000.000000" try: # 获取消息的所有表情反应数据 response = client.reactions_get(channel=CHANNEL_ID, timestamp=MESSAGE_TS) # 遍历每个表情,提取投票用户 for reaction in response["message"]["reactions"]: emoji_name = reaction["name"] voter_ids = reaction["users"] print(f"表情 :{emoji_name}: 的投票用户ID列表: {voter_ids}") # 可选:获取用户的用户名(需要users:read权限) for user_id in voter_ids: user_info = client.users_info(user=user_id) username = user_info["user"]["name"] print(f" → 用户: {username} (ID: {user_id})") # 给每个投票用户发送私信 for user_id in voter_ids: try: client.chat_postMessage( channel=user_id, text=f"嗨!你给那条消息添加了表情 :{emoji_name}:,这是一条来自Bot的通知~" ) print(f"已成功给用户 {user_id} 发送消息") except SlackApiError as e: print(f"给用户 {user_id} 发消息失败: {e.response['error']}") except SlackApiError as e: print(f"获取表情反应失败: {e.response['error']}")
示例2:实时监听表情投票并自动发消息
如果需要用户一添加表情就触发Bot动作,用Socket Mode实时监听事件就行:
from slack_sdk import WebClient from slack_sdk.errors import SlackApiError from slack_sdk.socket_mode import SocketModeClient from slack_sdk.socket_mode.response import SocketModeResponse from slack_sdk.socket_mode.request import SocketModeRequest # 替换成你的Bot Token和App Token(开启Socket Mode后获取) SLACK_BOT_TOKEN = "xoxb-your-bot-token-here" SLACK_APP_TOKEN = "xapp-1-your-app-token-here" # 初始化客户端 web_client = WebClient(token=SLACK_BOT_TOKEN) socket_client = SocketModeClient(app_token=SLACK_APP_TOKEN, web_client=web_client) def handle_new_reaction(event): """处理用户添加表情的事件""" emoji = event["reaction"] user_id = event["user"] message_ts = event["item"]["ts"] channel_id = event["item"]["channel"] print(f"用户 {user_id} 在频道 {channel_id} 的消息 {message_ts} 上添加了表情 :{emoji}:") # 给用户发送确认消息 try: web_client.chat_postMessage( channel=user_id, text=f"收到你的表情投票啦!你选了 :{emoji}:,感谢参与~" ) except SlackApiError as e: print(f"发送消息失败: {e.response['error']}") # 监听事件API的回调 @socket_client.on("events_api") def handle_events(client: SocketModeClient, req: SocketModeRequest): if req.type == "event_callback": event = req.payload["event"] # 只处理表情添加事件 if event["type"] == "reaction_added": handle_new_reaction(event) # 必须发送确认响应,否则Slack会重复推送事件 client.send_socket_mode_response(SocketModeResponse(envelope_id=req.envelope_id)) # 启动监听 print("Bot已启动,开始监听表情投票事件...") socket_client.start()
一些注意事项
- 确保Bot有足够的权限,比如要获取用户名需要额外的
users:read权限;如果Bot要给陌生用户发私信,需要用户先@过Bot或者Bot主动发起过对话。 - 消息TS可以通过消息的「更多选项」→「复制链接」获取,链接最后一段的数字就是TS(比如
https://yourworkspace.slack.com/archives/C1234567890/p1620000000000000里的1620000000000000)。
内容的提问来源于stack exchange,提问作者Keisuke Nagakawa 永川 圭介
相关产品推荐
相关产品推荐

