Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Slack bot, register click on message button

I am trying to build a Slack bot in Python. I want my bot to send a message with interactive buttons on it, and then based on which the user clicks on, run a function in Python. I do not seem to find how to do this.

My code now look like this:

message = "message"
attachments = [{"text": "message",
                "attachment_type": "default",
                "actions": [
                    {
                        "name": "list",
                        "text": "message",
                        "type": "select",
                        "options": [
                        {
                            "name": "1",
                            "text": "1",
                            "type": "button",
                            "value": "1"
                        },
                        {
                            "name": "1",
                            "text": "1",
                            "type": "button",
                            "value": "2"
                        }
                    ]}]}]

sc.api_call("chat.postMessage",
             channel=channel,
             text=message,
             attachments=attachments)

So that gives me a message with two buttons. I, however, want to run a function based on the answer the user gives.

So say that if they click 1, function1() runs and when they click 2, function2() runs.

The Slack api documentation is quite confusing about how to do this, and the "listener" they provide rtm_read() does not pick on the user clicking on one of the buttons.

So if anyone could help me with this, it would be much appreciated.

like image 990
tcas Avatar asked Oct 06 '17 19:10

tcas


People also ask

How do I automate messages in Slack?

Schedule a messageClick the compose button or open the conversation where you'd like to send your message. Type your message in the message field. Click the arrow icon to the right of the paper plane icon. Choose a date and time from the list or select Custom time.

Can Slack bot send direct message to user?

Bot users can't post to a direct message conversation between two users using chat. postMessage . If your app was involved in the conversation, then it would be a multi-person direct message instead.

What is an interactive message?

Interactive messages are much like other messages, only they contain buttons, a variety of menus types, or they have some custom actions available. Rather than remaining mostly static, interactive messages evolve over time. Message buttons and menus may travel almost anywhere a message goes.


1 Answers

When you click a button in a slack conversation it's basically applying a callback. The callback is sent somewhere that you define in the App's setting, then THAT service decides what to do next with the information that's given.

  1. First you need to create a new Slack App.

  2. After it's created click on the App to go to its Basic Information page.

  3. From there, on the left side under Features find "Interactive Components".

  4. Register the two URLs that will receive the POST data from clicking on a button.

  5. Interpret the data and proceed :)

From the Slack documentation you can find their walkthrough here.

You're going to need a running web server, something simple in Flask will work just fine.

from flask import Flask, request

app = Flask('SlackReceiver')


@app.route('/slack/message', methods=['POST'])
def incoming_slack_message():
    req = request.get_json()
    # .. do something with the req ..
    return 'action successful'


@app.route('/slack/options', methods=['POST', 'OPTIONS'])
def incoming_slack_options():
    # .. idk ..
    return 'ok'


if __name__ == '__main__':
    app.run('0.0.0.0', 8088, debug=False)

...

Lastly, according to the docs you need to host this application on a web server with an HTTPS valid certificate configured. Setting up a server is beyond the scope of this question, the easiest way to get free (valid) HTTPS certs is with Let's Encrypt and certbot.

like image 78
blakev Avatar answered Oct 28 '22 11:10

blakev