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

Slack Bolt Python如何向action监听器传递block_actions外的额外数据

Slack Bolt Python 监听器传递自定义参数实现方案

有多种成熟方案可以实现向Bolt监听器传递自定义参数,最常用的两种实现方式如下:

方案1:使用按钮value字段存储序列化参数(最简便,适合小体积参数)

Slack按钮的value字段支持传入任意字符串,你可以将需要传递的自定义参数序列化为JSON字符串存入该字段,监听器触发后从payload中取出反序列化即可得到原始参数。

代码修改示例

post_data 部分

import json
import os
from slack_sdk import WebClient

def post_data(user_id, email_id):
    client = WebClient(token=os.environ.get("SLACK_BOT_TOKEN"))
    result = client.chat_postMessage(
        channel=user_id,
        blocks=[
            {
                "type": "actions",
                "elements": [
                    {
                        "type": "button",
                        "text": {
                            "type": "plain_text",
                            "emoji": True,
                            "text": "Change time period"
                        },
                        "style": "primary",
                        # 序列化自定义参数到value字段
                        "value": json.dumps({
                            "base_value": "time_period",
                            "email_id": email_id
                        }),
                        "action_id": "change_time_period"
                    }
                ]
            }
        ]
    )

监听器部分

@app.action("change_time_period")
def handle_change_time_period(ack, body, logger):
    ack()
    # 取出按钮value并反序列化得到自定义参数
    action_value = json.loads(body["actions"][0]["value"])
    email_id = action_value["email_id"]
    # 后续逻辑可直接使用获取到的email_id
    logger.info(f"获取到的自定义参数email_id: {email_id}")

方案2:使用消息metadata字段存储参数(适合参数多、体积大的场景)

如果需要传递的参数超过了value字段2000字符的长度限制,可以使用Slack API提供的消息元数据字段存储自定义参数,交互事件触发时元数据会自动包含在payload中。

代码修改示例

post_data 部分

def post_data(user_id, email_id):
    client = WebClient(token=os.environ.get("SLACK_BOT_TOKEN"))
    result = client.chat_postMessage(
        channel=user_id,
        # 定义消息元数据,可存储任意结构的自定义参数
        metadata={
            "event_type": "time_period_config",
            "event_payload": {
                "email_id": email_id,
                # 可继续添加其他自定义参数
            }
        },
        blocks=[
            {
                "type": "actions",
                "elements": [
                    {
                        "type": "button",
                        "text": {
                            "type": "plain_text",
                            "emoji": True,
                            "text": "Change time period"
                        },
                        "style": "primary",
                        "value": "time_period",
                        "action_id": "change_time_period"
                    }
                ]
            }
        ]
    )

监听器部分

@app.action("change_time_period")
def handle_change_time_period(ack, body, logger):
    ack()
    # 从payload中取出消息元数据
    metadata = body["message"]["metadata"]
    email_id = metadata["event_payload"]["email_id"]
    # 后续逻辑可直接使用获取到的email_id
    logger.info(f"获取到的自定义参数email_id: {email_id}")

注意事项

  • 方案1的value字段最大长度为2000字符,超出会被截断,仅适合传递少量参数
  • 序列化JSON时如果包含特殊字符,需使用标准JSON序列化方式避免解析异常

内容的提问来源于stack exchange,提问作者R_M_R

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 06:27:03