如何下载由slackbot创建的文件?

时间:2019-07-13 03:44:34

标签: python slack slack-api

我创建了一个机器人,该机器人从工作区中的用户收集信息。它将此信息存储在本地服务器上的csv文件中。如何下载上述文件?我从Stack Overflow那里得到了这段代码,试图与作者联系,但没有得到任何回应。

import requests
url = 'https://slack-files.com/T0JU09BGC-F0UD6SJ21-a762ad74d3'
token = 'xoxp-TOKEN'
requests.get(url, headers={'Authorization': 'Bearer %s' % token})

如何获取文件的URL和令牌?什么是代币?是机器人的OAuth令牌吗?

说我希望从slackbot创建的服务器上下载名为stats.csv的文件,但是我没有URL,我该如何下载?

1 个答案:

答案 0 :(得分:1)

我不建议将URL修补在一起以自己下载文件,因为Slack可能会更改它,然后您的代码中断。

相反,首先通过调用具有文件ID的API方法files.info来获取文件的当前URL。然后使用属性url_private作为下载URL。另外,您也可以调用files.list来获取所有具有ID及其URL的文件的列表。

为确保您可以访问文件,请最好使用文件创建者的令牌,例如您的slackbot。

我还包括了将下载的数据保存到文件中的代码以及一些基本的错误处理。注意,令牌被设置为环境变量名称SLACK_TOKEN除外。这比直接将其放入代码中要安全得多。

这是一个完整的示例:

import os
import requests

token = os.environ['SLACK_TOKEN']
file_id = "F12345678"

# call file info to get url
url = "https://slack.com/api/files.info"
r = requests.get(url, {"token": token, "file": file_id})
r.raise_for_status
response = r.json()
assert response["ok"]
file_name = response["file"]["name"]
file_url = response["file"]["url_private"]
print("Downloaded " + file_name)

# download file
r = requests.get(file_url, headers={'Authorization': 'Bearer %s' % token})
r.raise_for_status
file_data = r.content   # get binary content

# save file to disk
with open(file_name , 'w+b') as f:
  f.write(bytearray(file_data))
print("Saved " + file_name + " in current folder")