作者: | 来源:互联网 | 2023-10-12 09:32
为了提供上下文,我有一个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"
},"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-图片网址
用户不是直接将图像上传到Slack,而是仅提供Internet上托管的图像的URL(例如,上传到imgur.com
)。可以在对话框中使用简单的plain-text input field来查询图像URL。
如果您可以期望用户精通技术,可以处理图像URL并上传到imgur.com
(或其他图像托管者),我认为这种方法很好用。
B-外部网页
您将用户重定向到您的具有文件选择器的应用程序的外部网页。该文件选择器允许将图像从用户本地计算机上传到您的应用。
这种方法也很好用。但是,用户需要切换到浏览器(然后再次回到Slack),这样它可能会稍微破坏输入流。实施例如您需要以安全的方式维护Slack和网页之间的上下文,这可能是一个挑战。
C-手动上传到Slack
用户将图片手动上传到Slack,例如在应用程式频道中您的应用会检测到每张图像上传,并询问它们将图像附加到应用的哪个项目。
这种方法使您可以留在Slack生态系统中,但可能会使用户感到困惑,并且要确保用户上传的内容与您的商品之间的正确链接可能是一个挑战。
P.S .:我对其中一个Slack应用(Rafflebot)有相同的要求,并采用了方法A。
,
您没有显示如何调用/ new(带有触发器ID)。但是,尽管对话和新模式似乎没有文件选择器,但Slack应用程序确实具有。所以我要做的是从向我的应用发送一条消息开始我的流程-该消息可以附加文件。因此,例如,我的应用程序看起来像消息“新报告”(即用户,在发送前可以附加图像),而我的应用程序既会收到消息,又会在消息事件中获得“文件”属性。