Интерактивный ответ не показан на Slack - PullRequest
1 голос
/ 24 июня 2019

Я занимаюсь разработкой простого приложения Slack с Python и Flask. Он должен ответить на команду слеш с сообщением, содержащим кнопку. И на это реагирует пользователь, нажимающий кнопку.

Проблема в том, что сообщение об ответе на интерактивный запрос сообщения не публикуется в канале Slack после нажатия кнопки.

Подробнее

После нажатия на кнопку я вижу запрос на моей консоли Python, например,

127.0.0.1 - - [24/Jun/2019 17:30:09] "POST /interactive HTTP/1.1" 200 -

И я вижу, что мое приложение отвечает на этот запрос на моей странице проверки ngrok:

HTTP/1.0 200 OK    
Content-Type: application/json    
Content-Length: 25    
Server: Werkzeug/0.14.1 Python/3.7.0    
Date: Mon, 24 Jun 2019 15:41:57 GMT

{
  "text": "Hi there"
}

Но ответное сообщение не будет отображаться в Slack. Кроме того, в Slack не отображается ошибка обслуживания, поэтому он показывает, что Slack получает ответ 200 OK.

Также, если я отправлю свой интерактивный ответ на response_url, он будет работать нормально. Просто попытка ответить прямо на HTTP-запрос не дает.

Интересно, что я использую точно такой же подход для ответа на команду косой черты и интерактивный запрос. Это работает для первого, но не для второго.

Настройка

Я запускаю мое приложение в режиме отладки на сервере разработки Python через порт 8000. Сервер подвергается Slack с помощью ngrok. ngrok сопоставил мой внешний URL-адрес с localhost:8000. Приложение запускается из кода Visual Studio.

URL-адреса запроса правильно настроены для соответствующих конечных точек для команды косой черты и интерактивного действия.

код

import requests
from flask import Flask, json

app = Flask(__name__) #create the Flask app

@app.route('/slash', methods=['POST'])
def slash_response():                
    """ endpoint for receiving all slash command requests from Slack """

    # blocks defintion from message builder
    # converting from JSON to array
    blocks = json.loads("""[
        {
            "type": "section",
            "text": {
                "type": "plain_text",
                "text": "Please select an option:",
                "emoji": true
            }
        },
        {
            "type": "actions",
            "elements": [
                {
                    "type": "button",
                    "text": {
                        "type": "plain_text",
                        "text": "Click me",
                        "emoji": true
                    },
                    "value": "button_1"
                }
            ]
        }
    ]""")

    # compose response message    
    response = {
        "blocks": blocks
    }

    ## convert response message into JSON and send back to Slack
    return json.jsonify(response)

@app.route('/interactive', methods=['POST'])
def interactive_response():                
    """ endpoint for receiving all interactivity requests from Slack """

    # compose response message    
    response = {
        "text": "Hi there"
    }

     ## convert response message into JSON and send back to Slack
    return json.jsonify(response)

if __name__ == '__main__':
    app.run(debug=True, port=8000) #run app in debug mode on port 8000

1 Ответ

0 голосов
/ 16 июля 2019

На странице Slack API я нашел раздел, который объясняет, что происходит с вашим интерактивным компонентом!

Все, что я собираюсь пройти, находится в Ответ на взаимодействие раздел, связанный здесь: https://api.slack.com/messaging/interactivity#ack

Существует два шага для ответа на взаимодействие:

  1. Ответ подтверждения - отправьте OK 200 обратно в резерв в течение 3 секунд после получения полезной нагрузки запроса. Текст, который вы отправляете вместе с этим ответом, не изменит содержание текущего слабого сообщения.
  2. Составной ответ - отправьте обновленное сообщение в Slack, используя POST-запрос и response_url, который они упаковывают в полезную нагрузку запроса.

код

Вот код, который я использовал для замены исходного сообщения кнопки текстом "Привет, Эрик!" запросы на импорт из колбы импортной колба, json, запрос

app = Flask(__name__) #create the Flask app

@app.route('/slash', methods=['POST'])
def slash_response():                
    """ endpoint for receiving all slash command requests from Slack """

    # blocks defintion from message builder
    # converting from JSON to array
    blocks = json.loads("""[
        {
            "type": "section",
            "text": {
                "type": "plain_text",
                "text": "Please select an option:",
                "emoji": true
            }
        },
        {
            "type": "actions",
            "elements": [
                {
                    "type": "button",
                    "text": {
                        "type": "plain_text",
                        "text": "Click me",
                        "emoji": true
                    },
                    "value": "button_1"
                }
            ]
        }
    ]""")

    # compose response message    
    response = {
        "blocks": blocks
    }

    ## convert response message into JSON and send back to Slack
    return json.jsonify(response)

@app.route('/interactive', methods=['POST'])
def interactive_response():                
    """ endpoint for receiving all interactivity requests from Slack """
    # compose response message   
    data = json.loads(request.form["payload"])
    response = {
        'text': 'Hi Erik!', 
        }

    requests.post(data['response_url'], json=response)
    return '' 


if __name__ == '__main__':
    app.run(debug=True, port=8000) #run app in debug mode on port 8000
...