You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Python SlackClient获取Slack API附件动作结果及用户回复

How to Receive Slack Attachment Actions & Capture User Replies with Python SlackClient

Great question! When working with Slack's interactive attachments (like buttons), the process has two core parts: sending the initial message with actionable elements, and setting up a webhook endpoint to listen for and handle the user's interaction. Here's a step-by-step breakdown with practical code examples:

Prerequisites

First, install the required packages and set up your Slack app:

pip install slackclient flask

You'll need a Slack app with the chat:write scope enabled, plus a public URL (use ngrok for local testing) to receive Slack's action callbacks.


Step 1: Send the Interactive Button Message

Your existing snippet is a solid foundation for creating the attachment. Let's wrap it into a reusable function to send the message to a channel:

import json
from slackclient import SlackClient

# Initialize SlackClient with your bot token
sc = SlackClient("YOUR_BOT_TOKEN")

def send_lunch_action_message(channel):
    # Build the interactive attachment
    intro_attachment = json.dumps([
        {
            "text": "Choose an action",
            "fallback": "You are unable to choose an option",
            "callback_id": "lunch_intro",
            "color": "#3AA3E3",
            "attachment_type": "default",
            "actions": [
                {
                    "name": "enroll",
                    "text": "Enroll",
                    "type": "button",
                    "value": "enroll"
                },
                {
                    "name": "leave",
                    "text": "Leave",
                    "type": "button",
                    "value": "leave"
                }
            ]
        }
    ])
    
    # Send the message via Slack API
    result = sc.api_call(
        "chat.postMessage",
        channel=channel,
        text="Choose an action",  # Fallback for clients that don't support attachments
        attachments=intro_attachment
    )
    
    if result.get("ok"):
        print(f"Action message sent to {channel} successfully")
    else:
        print(f"Error sending message: {result.get('error')}")

# Example: Send to a channel or user ID
send_lunch_action_message("#lunch-club")

Step 2: Set Up a Webhook to Receive User Actions

When a user clicks a button, Slack sends a POST request to your specified endpoint. We'll use Flask to create this listener:

from flask import Flask, request, jsonify

app = Flask(__name__)

@app.route("/slack/actions", methods=["POST"])
def handle_slack_actions():
    # Parse Slack's incoming payload (sent as form data)
    payload = json.loads(request.form.get("payload"))
    
    # Extract key details from the payload
    callback_id = payload.get("callback_id")
    user_id = payload["user"]["id"]
    user_name = payload["user"]["name"]
    selected_action = payload["actions"][0]["value"]
    original_msg_ts = payload["message_ts"]
    channel_id = payload["channel"]["id"]
    
    # Handle the user's selection
    if callback_id == "lunch_intro":
        if selected_action == "enroll":
            response_text = f"Thanks {user_name}! You're now enrolled in the lunch club."
        elif selected_action == "leave":
            response_text = f"Sorry to see you go {user_name}! You've been removed from the lunch club."
        else:
            response_text = "Oops, that action isn't recognized."
        
        # Option 1: Update the original message to confirm the action
        sc.api_call(
            "chat.update",
            channel=channel_id,
            ts=original_msg_ts,
            text=response_text,
            attachments=json.dumps([])  # Clear the buttons
        )
        
        # Option 2: Send a direct message to the user instead
        # sc.api_call(
        #     "chat.postMessage",
        #     channel=user_id,
        #     text=response_text
        # )
    
    # Return a 200 OK response to Slack (required to avoid timeouts)
    return jsonify({"text": response_text})

if __name__ == "__main__":
    # Use ngrok to expose your local server: ngrok http 5000
    app.run(port=5000, debug=True)

Key Notes for Production

  • Validate Requests: Always verify that incoming requests are from Slack using your app's signing secret (use the slack-sdk's SignatureVerifier for this).
  • Handle Timeouts: If your processing takes longer than 3 seconds, use the response_url from the payload to send a delayed response.
  • Unique Callback IDs: Use distinct callback_id values to differentiate between different interactive messages your bot sends.

内容的提问来源于stack exchange,提问作者Noobie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:49:51