Python开发Slack Bot提交Dialog时出现连接报错的问题咨询
报错产生核心原因
- 缺少Dialog提交请求的处理逻辑。当前代码仅实现了Dialog唤起的能力,Slack在用户点击Dialog的提交按钮后,会将表单提交事件以独立POST请求发送到预先配置的交互回调地址,现有代码未对该类请求做识别和合规响应,直接触发连接异常提示。
- 接口响应不符合Slack交互规范。Slack对所有交互类回调接口有明确约束:需在3秒内返回200状态码,超时、状态码非200、响应格式错误都会弹出同款连接报错。
- 服务网络不通。本地调试阶段如果没有配置公网可访问的内网穿透地址,Slack的官方服务器无法正常请求到你的本地服务接口,会判定为连接失败。
- 未通过请求安全校验。未实现Slack请求签名校验逻辑时,Slack会将对应请求判定为非法回调,直接拦截并返回连接错误提示。
修复方案
- 在现有Flask路由中增加Dialog提交事件的识别规则,通过请求体的
type字段区分「Dialog唤起请求」和「Dialog表单提交请求」 - 针对Dialog提交请求完成对应业务处理,处理后及时返回200状态码,避免超时
- 调试阶段确认服务具备公网可访问性,Slack应用后台配置的交互回调地址与代码注册的路由路径完全匹配
- 为所有Slack交互请求增加签名校验逻辑,符合Slack的安全访问要求
修复后参考代码
from flask import request, make_response import json @app.route("/test", methods=["POST"]) def message_actions(): data = request.form request_type = data.get("type") # 处理Dialog表单提交请求 if request_type == "dialog_submission": submission = json.loads(data.get("submission")) selected_drink = submission.get("meal_preferences") submit_user_id = json.loads(data.get("user"))["id"] # 执行核心业务逻辑:向用户发送订单确认消息 client.chat_postMessage( channel=submit_user_id, text=f"已收到你的{selected_drink}咖啡订单" ) # 按Slack规范返回200响应 return make_response("", 200) # 原有Dialog唤起逻辑 user_id = data.get("user_id") client.api_call( api_method="dialog.open", json={ "trigger_id": data.get("trigger_id"), "dialog": { "title": "Request a coffee", "submit_label": "Submit", "callback_id": user_id + "coffee_order_form", "elements": [ { "label": "Coffee Type", "type": "select", "name": "meal_preferences", "placeholder": "Select a drink", "options": [ {"label": "Cappuccino", "value": "cappuccino"}, {"label": "Latte", "value": "latte"}, {"label": "Pour Over", "value": "pour_over"}, {"label": "Cold Brew", "value": "cold_brew"} ] } ] } } ) return make_response("", 200)
注意:如果Dialog提交后的业务逻辑耗时较长(如数据库查询、第三方接口调用),需要先返回200响应给Slack,再通过异步任务处理后续流程,避免请求超时触发报错。
内容的提问来源于stack exchange,提问作者Nicolas Gandolfo
相关产品推荐
相关产品推荐

