You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Slack中查看谁通过表情反应投票?求相关Bot代码示例

在Slack查看表情投票用户及Bot开发示例

咱们先解决第一个问题:手动查看表情投票的用户,其实很简单:

  • 打开目标Slack消息,把鼠标悬停在你想查看的表情反应上,会弹出一个小面板,里面直接列出所有添加这个表情的用户。
  • 如果用户太多面板显示不全,点击面板底部的「查看全部」,就能看到完整的用户列表了。

接下来是你关心的Bot开发部分,我用目前Slack官方推荐的slack-sdk(原slackclient已升级)给你写两个实用的代码示例,先说说准备工作:

  1. 去Slack开发者平台创建一个Bot应用,给它添加这些权限:reactions:read(读取表情反应)、chat:write(发送消息),如果要实时监听还需要events:read和socket_mode:connections。然后把Bot安装到你的工作区,拿到Bot Token(格式是xoxb-xxxxxx)。
  2. 安装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 永川 圭介

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:15:40