Slack Block复选框勾选仅本人可见 如何实现频道全员可见
核心原因
Slack交互组件的默认机制决定了这个现象:通过Incoming Webhook发送的带交互元素(复选框、按钮等)的消息,用户触发操作后的状态变更仅在操作人本地视图生效,不会同步给频道其他用户,也不会修改服务端存储的原始消息内容。
实现全频道可见选中状态的方案
要让所有频道用户看到一致的复选框选中效果,必须在用户触发交互后主动更新服务端存储的原消息,具体流程:
- 替换单纯的Webhook发消息逻辑,使用持有
chat:write权限的Slack Bot身份发送消息,发送成功后从接口返回值中拿到消息的唯一标识ts和对应频道IDchannel,这两个参数是后续更新消息的必填项 - 为应用配置交互请求地址:用户点击复选框时,Slack会向该地址推送交互事件payload,其中包含当前勾选的选项值、原消息的
ts、channel信息 - 收到交互推送后先返回200状态码避免Slack判定请求超时,随后调用消息更新接口,传入带上对应选中状态(给checkboxes组件配置
initial_options匹配用户勾选的值)的新blocks结构,更新完成后的消息会同步展示给频道内所有用户,所有人看到的选中状态完全一致。
当前代码的修正点
你现有代码里存在一个会导致请求异常的问题:用sys.getsizeof(slack_data)计算Content-Length是错误的,这个方法拿到的是Python对象在内存中的占用大小,不是JSON序列化后字符串的实际字节长度,正确写法如下:
payload = json.dumps(slack_data) byte_length = str(len(payload.encode('utf-8'))) headers = {'Content-Type': "application/json", 'Content-Length': byte_length} response = requests.post(wh_url, data=payload, headers=headers)
另外你当前把复选框放在input类型块中,这类块更适合表单提交场景,如果要做消息内即时交互的选项,建议直接把checkboxes组件放在section块的accessory字段下,交互响应逻辑会更顺畅。
注意:普通Incoming Webhook不支持更新已发送的消息,必须使用对应权限的Bot Token才能调用消息更新接口。
内容的提问来源于stack exchange,提问作者Vittorio
相关产品推荐
相关产品推荐

