Я занимаюсь разработкой простого приложения 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