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
相关产品推荐
相关产品推荐

