我需要一个能够接收和保存来自懒散聊天室的文件的松散机器人。
问题是:松弛不发送文件内容,而是指向文件的链接数组。其中大多数,包括下载链接都是私有的,无法通过bot访问。它确实发送了一个公共链接,但该链接指向文件预览,该文件预览没有文件本身(here's an example)。
所以问题是:如何通过bot访问上传的文件?
答案 0 :(得分:18)
当您执行CURL请求时,您可以通过在http标头中提供访问令牌来访问机器人的私人URL。这可以是使用OAuth收到的访问令牌,也可以是全局"测试令牌"。
格式为:
public function recalculateTotal($observer){
//var_dump($observer->getOrder()->getData());exit;
$orderModel = $observer->getOrder();
//echo "<pre>";print_r($orderModel->getData());echo "</pre>";exit;
$orderModel->setSurchargeAmount(10); // usually all totals has "amount" suffix
$orderModel->setBaseSurchargeAmount(10);
$orderModel->setGrandTotal($orderModel->getGrandTotal() + 10);
$orderModel->setBaseGrandTotal($orderModel->getBaseGrandTotal() + 10);
try {
$orderModel->save();
} catch (Exception $e) {
echo $e->getMessage();
}
echo "<pre>";print_r($orderModel->getData());echo "</pre>";exit;
}
用您的松弛访问令牌替换A_VALID_TOKEN。
我刚用一个简单的PHP脚本测试它,以便通过它的&#34; url_private&#34;来检索文件。而且效果很好。
来源:Slack API documententation / file object / Authentication
答案 1 :(得分:7)
使用Python requests库获取示例文件的示例:
import requests
url = 'https://slack-files.com/T0JU09BGC-F0UD6SJ21-a762ad74d3'
token = 'xoxp-8853424449-8820034832-8891394196-faf6f0'
requests.get(url, headers={'Authorization': 'Bearer %s' % token})
答案 2 :(得分:1)
对于那些希望通过Bash&amp; amp; cURL,这是一个有用的功能!它会将文件下载到当前目录,并使用唯一标识文件的文件名,即使该文件与文件列表中的其他文件具有相同的名称。
function slack_download {
URL="$1";
TOKEN="$2"
FILENAME=`echo "$URL" | sed -r 's/.*\/(T.+)\/([^\/]+)$/\1-\2/'`;
curl -o "$FILENAME" -H "Authorization: Bearer $TOKEN" "$URL";
}
# Usage:
# Downloads as ./TJOLLYDAY-FANGBEARD-NSFW_PIC.jpg
slack_download "https://files.slack.com/files-pri/TJOLLYDAY-FANGBEARD/NSFW_PIC.jpg" xoxp-12345678901-01234567890-123456789012-abcdef0123456789abcdef0123456789
答案 3 :(得分:0)
经过Python3测试-只需将SLACK_TOKEN替换为令牌即可。 下载并创建一个输出文件。
#!/usr/bin/env python3
# Usage: python3 download_files_from_slack.py <URL>
import sys
import re
import requests
url = " ".join(sys.argv[1:])
token = 'SLACK_TOKEN'
resp = requests.get(url, headers={'Authorization': 'Bearer %s' % token})
headers = resp.headers['content-disposition']
fname = re.findall("filename=(.*?);", headers)[0].strip("'").strip('"')
assert not os.path.exists(fname), print("File already exists. Please remove/rename and re-run")
out_file = open(fname, mode="wb+")
out_file.write(resp.content)
out_file.close()