我正在尝试构建一个 Slack 应用程序,当使用命令发送消息时,会显示一条带有两个按钮“确认”和“取消”的临时消息。如果用户单击“确认”,则应发送该消息,如果单击“取消”,则应将其删除。
我已经编写了端点来处理事件,并将其添加到交互性下。我在端点中收到有效负载,但这里有两个问题:
payload = request.form["payload"]
payload = json.loads(payload)
if payload['type'] == 'interactive_message':
action = payload['actions'][0]['name']
if action == 'confirm':
client.chat_postMessage(channel="#channelname", text="confirm worked")
@app.route('/slack/authorize/', methods=['POST'])
def get_auth_token():
payload = request.form["payload"]
payload = json.loads(payload)
code = payload["code"]
result = client.oauth_v2_access(CLIENT_ID, SIGNING_SECRET, code, "URL/slack/authorize/")
return jsonify(result), 200
我还阅读了文档,我需要在 3 秒内发送确认响应。你能帮我把所有这些部分连接起来吗?预先感谢您。
访问原始消息:对于每条交互式消息,您必须包含一个独特的标识符(例如时间戳或消息 ID),以便在处理按钮单击时能够访问原始消息。当您发送交互式消息时,该标识符需要包含在有效负载中。稍后,当用户按下按钮时,Slack 会在有效负载中添加此标识符。如有必要,您可以使用此标识来取回原始消息。
发送消息:您需要访问令牌才能从 Slack 应用程序发送消息。获取此令牌的正确方法是OAuth2.0。您可能不需要使用 oauth.access 函数来传递消息,因为您提供的代码中的 client.chat_postMessage 方法当前似乎正在执行此操作。在客户端实例中,确认您使用的令牌具有发布消息所需的范围。
确认响应:收到 Slack 的交互事件后,您必须在 3 秒内发送确认响应。此响应需要 200 状态代码和空正文。这是向 Slack 确认您已收到该事件并正在处理该事件。这对于可能触发面向用户的操作(例如单击按钮)的情况尤其重要。
from flask import Flask, request, jsonify
from slack_sdk import WebClient
import json
app = Flask(__name__)
# Initialize Slack client with your bot token
client = WebClient(token="your_token")
@app.route('/slack/events', methods=['POST'])
def get_auth_token():
payload = json.loads(request.form.get('payload'))
if payload['type'] == 'interactive_message':
action = payload['actions'][0]['name']
response_url = payload['response_url'] # Use this URL to send additional messages
if action == 'confirm':
original_message = payload['original_message']['text']
# Send the original message using response_url
client.chat_postMessage(channel=payload['channel']['id'], text=original_message)
elif action == 'cancel':
# Delete the original message using response_url
delete_response = {"text": "Message deleted.", "replace_original": True}
client.chat_postMessage(channel=payload['channel']['id'], text=delete_response)
# Send acknowledgment response
return '', 200
if __name__ == '__main__':
app.run()
确保按钮的 action_id 值与您在代码中检查的值相匹配。