从slack bot访问Slack文件

时间:2016-03-22 01:36:48

标签: ruby slack-api slack

我需要一个能够接收和保存来自懒散聊天室的文件的松散机器人。

问题是:松弛不发送文件内容,而是指向文件的链接数组。其中大多数,包括下载链接都是私有的,无法通过bot访问。它确实发送了一个公共链接,但该链接指向文件预览,该文件预览没有文件本身(here's an example)。

所以问题是:如何通过bot访问上传的文件?

4 个答案:

答案 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()