Python 如何使用flask在slack应用程序中运行对话框? 我正在创建一个与Stuk集成的ToDo应用程序。我需要使用slack的dialog.open属性

Python 如何使用flask在slack应用程序中运行对话框? 我正在创建一个与Stuk集成的ToDo应用程序。我需要使用slack的dialog.open属性,python,flask,slack,Python,Flask,Slack,我已经完成了SlackAPI教程,但最终无法理解对话框如何与外部系统集成。我在slack中创建了在slash命令之后运行的代码。它应该打开对话框并向用户显示,但它并没有。我打印了一些代码,看看里面发生了什么-看起来整个代码都正常工作,服务器返回200 @app.route('/helpdesk', methods=['POST']) def helpdesk(): print(request.form) api_url = 'https://slack.com/api/dial

我已经完成了SlackAPI教程,但最终无法理解对话框如何与外部系统集成。我在slack中创建了在slash命令之后运行的代码。它应该打开对话框并向用户显示,但它并没有。我打印了一些代码,看看里面发生了什么-看起来整个代码都正常工作,服务器返回200

@app.route('/helpdesk', methods=['POST'])
def helpdesk():
    print(request.form)

    api_url = 'https://slack.com/api/dialog.open'

    user_id = request.form['user_id']
    trigger_id = request.form['trigger_id']

    dialog = {
    "token": "J1llSAeQAxNyw8yc37xuEsad",
    "trigger_id": trigger_id,
    "dialog": {
        "callback_id": "ryde-46e2b0",
        "title": "Request a Ride",
        "submit_label": "Request",
        "notify_on_cancel": True,
        "state": "Limo",
        "elements": [
            {
                "type": "text",
                "label": "Pickup Location",
                "name": "loc_origin"
            },
            {
                "type": "text",
                "label": "Dropoff Location",
                "name": "loc_destination"
            }
        ]
    }
    }

    print(dialog)
    requests.post(api_url, data=dialog)

    return make_response()
我希望在slack中编写slash命令后可以看到对话框窗口。 我在印刷品中看到:

ImmutableMultiDict([('token', 'J1llSAeQAxNyw8yc37xuEsad'), ('team_id', 'TKWQ5QP7Y'), ('team_domain', 'team-learningslack'), ('channel_id', 'CKH7RSZPC'), ('channel_name', 'slackflask'), ('user_id', 'UKN9KU7JM'), ('user_name', 'konrad.marzec1991'), ('command', '/musi'), ('text', ''), ('response_url', 'https://hooks.slack.com/commands/TKWQ5QP7Y/664885241506/ABjpMYmTWrnXpSBoGMpaJtOV'), ('trigger_id', '669947662833.676821839270.6c4bddd1418d3d4f2c8626f7c9accdf7')])

{'token': 'J1llSAeQAxNyw8yc37xuEsad', 'trigger_id': '669947662833.676821839270.6c4bddd1418d3d4f2c8626f7c9accdf7', 'dialog': {'callback_id': 'ryde-46e2b0', 'title': 'Request a Ride', 'submit_label': 'Request', 'notify_on_cancel': True, 'state': 'Limo', 'elements': [{'type': 'text', 'label': 'Pickup Location', 'name': 'loc_origin'}, {'type': 'text', 'label': 'Dropoff Location', 'name': 'loc_destination'}]}}
127.0.0.1 - - [26/Jun/2019 00:15:35] "POST /helpdesk HTTP/1.1" 200 -

您的代码中有两个问题:

import os
import requests
from flask import Flask, json, request

app = Flask(__name__) #create the Flask app

@app.route('/helpdesk', methods=['POST'])
def helpdesk():

    api_url = 'https://slack.com/api/dialog.open'

    trigger_id = request.form.get('trigger_id')

    dialog = {
        "callback_id": "ryde-46e2b0",
        "title": "Request a Ride",
        "submit_label": "Request",
        "notify_on_cancel": True,
        "state": "Limo",
        "elements": [
            {
                "type": "text",
                "label": "Pickup Location",
                "name": "loc_origin"
            },
            {
                "type": "text",
                "label": "Dropoff Location",
                "name": "loc_destination"
            }
        ]
    }

    api_data = {
        "token": os.environ['SLACK_TOKEN'],
        "trigger_id": trigger_id,
        "dialog": json.dumps(dialog)
    }

    res = requests.post(api_url, data=api_data)
    print(res.content)

    return make_response()

if __name__ == '__main__':
    app.run(debug=True, port=8000) #run app in debug mode on port 8000
  • 您需要在调用中使用访问令牌,而不是验证令牌 转到
    对话框。打开
  • 您需要将对话框定义作为JSON而不是表单数组发送
我做了这些额外的改变 -添加了使用定义为环境变量的松弛令牌的代码 -使用get()方法从请求访问中的表单参数 -添加代码以显示来自
对话框的API响应。打开

以下是您的代码的更正版本:

import os
import requests
from flask import Flask, json, request

app = Flask(__name__) #create the Flask app

@app.route('/helpdesk', methods=['POST'])
def helpdesk():

    api_url = 'https://slack.com/api/dialog.open'

    trigger_id = request.form.get('trigger_id')

    dialog = {
        "callback_id": "ryde-46e2b0",
        "title": "Request a Ride",
        "submit_label": "Request",
        "notify_on_cancel": True,
        "state": "Limo",
        "elements": [
            {
                "type": "text",
                "label": "Pickup Location",
                "name": "loc_origin"
            },
            {
                "type": "text",
                "label": "Dropoff Location",
                "name": "loc_destination"
            }
        ]
    }

    api_data = {
        "token": os.environ['SLACK_TOKEN'],
        "trigger_id": trigger_id,
        "dialog": json.dumps(dialog)
    }

    res = requests.post(api_url, data=api_data)
    print(res.content)

    return make_response()

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

我想你可能用错了代币。
token
中的字符串看起来像验证令牌,而不是访问令牌。您需要像
xoxb xxx
xoxp xxx
这样的令牌,一般来说:请不要在堆栈溢出或github或任何其他公共站点上共享令牌。这是一个巨大的安全风险。Python的一个好方法是将它放在一个环境变量中,然后像
token=os.environ['SLACK\u token']
嗨,谢谢你的回答,是的,我已经卸载了这个应用,因为我注意到我发布了token。已使用oauth令牌和bot令牌进行检查,但它不起作用…要真正了解发生了什么,您需要检查来自API的回复。Slack始终返回HTTP 200,也返回API错误。要查看完整的回复,请执行类似于
res=requests.post(…)
的操作,然后
print(res.content)
检查此项,我有错误,但如果我仔细查看,我认为我将所有内容都放在了我的代码
b'{“ok”:false,“error”:“validation\u errors”,“response\u metadata”:{“messages”:[“[error]字段
title`是必需的”,“[error]字段
callback\u id
是必需的“,“[ERROR]字段
元素
是必需的”,“[ERROR]字段
元素
必须至少包含一个元素”]},`我的意思是所有这些内容都已发布。谢谢!!!它开始工作了,至少在我用斜杠命令输入后看到的对话框挣扎了两天之后。还有一个问题-若用户单击对话框中的提交按钮,它将从交互组件重定向URL?是的。从技术上讲,Slack不会重定向,而是在用户单击submit后向该端点发送请求。很乐意提供帮助。如果你再次陷入困境,请随时在这里提出更多问题。请不要忘记投票,并将这个答案标记为解决方案再次感谢!看来除非我在声誉上得了15分,否则我无法对你的答案投赞成票。我只能打勾接受,不用担心。如果你喜欢的话,你可以等你达到15岁以后再做。