从 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()
我需要一个能够接收和保存从 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()