从 Slack 机器人访问 Slack 文件

Access Slack files from a slack bot

我需要一个能够接收和保存从 slack 聊天室发送的文件的 slack 机器人。

问题是:slack 发送的不是文件内容,而是指向文件的 link 数组。其中大部分,包括下载 link 都是私有的,无法通过机器人访问。它确实发送了一个 public link,但是 link 指向文件预览,它没有文件本身 (here's an example)。

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

您可以在执行 CURL 请求时通过在 HTTP header 中提供访问令牌来访问您的机器人的私有 URL。

您的令牌需要具有范围 files.read 才能获得访问权限。

格式为:

Authorization: Bearer A_VALID_TOKEN

用您的松弛访问令牌替换 A_VALID_TOKEN。

我刚刚用一个简单的 PHP 脚本对其进行了测试,以通过其 "url_private" 检索文件并且它运行良好。

来源:Slack API documententation / file object / Authentication

使用 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})

对于那些想要使用 Bash 和 cURL 来完成此任务的人来说,这里有一个有用的功能!它会将文件下载到当前目录,并使用唯一标识该文件的文件名,即使该文件与您的文件列表中的其他文件同名。

function slack_download {
  URL="";
  TOKEN=""
  FILENAME=`echo "$URL" | sed -r 's/.*\/(T.+)\/([^\/]+)$/-/'`; 
  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

已使用 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()