使用 Slack API 和 Python Flask 处理交互式消息中的按钮单击事件

问题描述 投票:0回答:1

我正在尝试构建一个 Slack 应用程序,当使用命令发送消息时,会显示一条带有两个按钮“确认”和“取消”的临时消息。如果用户单击“确认”,则应发送该消息,如果单击“取消”,则应将其删除。

我已经编写了端点来处理事件,并将其添加到交互性下。我在端点中收到有效负载,但这里有两个问题:

  1. 由于这是一条临时消息,因此有效负载没有原始消息,并且不知道如何在单击“确认”按钮时发送它。我想发送原始消息来代替“确认有效”。
 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")
  1. 在事件处理程序中,当我使用 chat_postMessage 方法发送消息时,我看到错误“哦,不,出了点问题。请重试。”我知道我应该使用 OAuth2.0 获取访问令牌,以便通过调用 oauth.access 发送此消息。我写了这个端点,但我对如何使用它感到困惑?我应该在上面的 client.chat_postMessage 之前调用它吗?如果是,我应该作为请求的一部分发送什么代码?
@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 秒内发送确认响应。你能帮我把所有这些部分连接起来吗?预先感谢您。

python flask slack slack-api slack-commands
1个回答
0
投票

访问原始消息:对于每条交互式消息,您必须包含一个独特的标识符(例如时间戳或消息 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 值与您在代码中检查的值相匹配。

© www.soinside.com 2019 - 2024. All rights reserved.