用户如何将图像上传到 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" 属性作为消息事件的一部分。
为了提供上下文,我有一个允许用户创建广告的 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" 属性作为消息事件的一部分。