用户如何将图像上传到 Slack 应用程序?

How can users upload images to a Slack app?

为了提供上下文,我有一个允许用户创建广告的 Slack 机器人,我可以使用对话框来获取列表标题、描述和价格。我正在寻找的是一种允许用户也添加图像的方法。

file.upload 似乎允许机器人上传文件,但我想要的是能够允许用户 select 本地文件并上传它们,然后机器人将能够抓住这一点并做出相应的回应。

这是我目前所拥有的

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

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

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

    dialog = {
        "callback_id": "marketplace",
        "title": "Create a new listing",
        "submit_label": "Create",
        "notify_on_cancel": True,
        "state": "Item",
        "elements": [
            {
                "type": "text",
                "label": "Listing Title",
                "name": "listing_title"
            },
            {
                "type": "text",
                "label": "Listing description",
                "name": "listing_description"
            },
            {
                "type": "text",
                "label": "Listing Price",
                "name": "listing_price"
            }
        ]
    }


    api_data = {
        "token": oauth_token,
        "trigger_id": trigger_id,
        "dialog": json.dumps(dialog)
    }

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

    return make_response()

@app.route('/message_actions', methods=['POST'])
def message_actions():
    user_id = request.form['user']['id']

    submission = request.form['submission']
    title = submission['listing_title']
    description = submission['listing_description']
    price = submission['listing_price']

    # Add the listing to the database

    return make_response()

没有直接的方法,因为 Slack API(当前)不提供文件选择器。

但是,这里有 3 个解决方法可以满足此要求:

A - 图片 URLs

用户不直接将图片上传到 Slack,而是只提供 URL 托管在互联网上的图片(例如上传到 imgur.com)。图像 URL 可以在您的对话框中使用简单的 plain-text input field 查询。

如果您期望您的用户精通技术,能够处理图像 URL 并上传到 imgur.com(或其他图像托管商),我认为该方法非常有效。

B - 外部网页

您将用户重定向到您的应用程序的外部网页,该网页具有文件选择器。该文件选择器允许将图像从用户本地计算机上传到您的应用程序。

这种方法也很有效。然而,用户需要切换到浏览器(并再次返回 Slack),因此它可能会稍微中断输入流。实施起来也需要付出更多的努力,例如您需要以安全的方式维护 Slack 和您的网页之间的上下文,这可能是一个挑战。

C - 手动上传到 Slack

用户将图片手动上传到 Slack,例如在应用程序频道中。您的应用会检测每张上传的图片,并询问他们将其附加到您应用的哪个项目。

这种方法允许您留在 Slack 生态系统中,但可能会让用户感到困惑,并且确保用户上传和您的项目之间的正确链接可能是一个挑战。

P.S.: 我对我的一个 Slack 应用程序 (Rafflebot) 有相同的要求,并采用了方法 A。

您没有显示您是如何调用 /new(使用触发器 ID)的。然而——虽然对话和新模式似乎没有文件选择器——但 slack 应用程序确实有。所以我所做的是通过向我的应用程序发送一条消息来开始我的流程——该消息可以附加文件。因此,例如,我的应用程序看起来消息 'new report' - 用户在发送之前可以附加图像 - 我的应用程序将同时获取消息并获取 "files" 属性作为消息事件的一部分。