为了提供上下文,我有一个Slack机器人,允许用户创建广告,我可以使用对话框来获取列表标题,描述和价格。寻找的是一种允许用户也添加图像的方法。
file.upload似乎允许该机器人上载文件,但我想要的是能够允许用户在本地选择文件并上载它们,然后该机器人将能够捕获该文件并做出相应的响应。
这是我到目前为止所拥有的
@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种解决方法可以满足此要求:
[不是直接将图像上传到Slack,用户仅提供Internet上托管的图像的URL(例如,上传到imgur.com
)。可以在对话框中使用简单的plain-text input field来查询图像URL。
[如果您可以期望您的用户精通技术,可以处理图像URL并上传到imgur.com
(或其他图像托管者),我认为这种方法很好用。
您将用户重定向到您的具有文件选择器的应用程序的外部网页。该文件选择器允许将图像从用户本地计算机上传到您的应用。
此方法也很好。但是,用户需要切换到浏览器(然后再次回到Slack),这样它可能会稍微破坏输入流。实施例如您需要以安全的方式维护Slack和您的网页之间的上下文,这可能是一个挑战。
用户将图像手册上传到Slack,例如在应用程式频道中您的应用检测到每个图像上传,并询问它们将图像附加到应用的哪个项目。
这种方法可以让您留在Slack生态系统中,但是可能会使用户感到困惑,并且确保用户上传的内容与您的项目之间的正确链接可能是一个挑战。
P.S .:我对我的一个Slack应用程序(Rafflebot)具有相同的要求,并采用了方法A。