如何使用 file.upload 和 requests 将文件上传到 slack

新手上路,请多包涵

我一直在搜索很多,但我没有找到我正在寻找的答案。

我正在尝试使用 python 请求将文件从 /tmp 上传到 slack,但我一直收到 {"ok":false,"error":"no_file_data"} 返回。

 file={'file':('/tmp/myfile.pdf', open('/tmp/myfile.pdf', 'rb'), 'pdf')}
payload={
        "filename":"myfile.pdf",
        "token":token,
        "channels":['#random'],
        "media":file
        }

r=requests.post("https://slack.com/api/files.upload", params=payload)

主要是尝试遵循 此处 发布的建议

原文由 arshbot 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 827
2 个回答

写这篇文章,可能会为您节省我浪费的所有时间。 我确实尝试创建一个新文件并将其上传到 Slack,但实际上没有创建文件(只是拥有它的内容)。由于 Slack API 的各种非点错误,我浪费了几个小时才发现,我从一开始就有很好的代码,只是错过了频道中的一个机器人。

此代码还可用于打开现有文件、获取其内容、修改并将其上传到 Slack。

代码:

 from io import StringIO # this library will allow us to
# get a csv content, without actually creating a file.

sio = StringIO()
df.to_csv(sio) # save dataframe to CSV
csv_content = sio.getvalue()
filename = 'some_data.csv'

token=os.environ.get("SLACK_BOT_TOKEN")
url = "https://slack.com/api/files.upload"
request_data = {
    'channels': 'C123456', # somehow required if you want to share the file
# it will still be uploaded to the Slack servers and you will get the link back
    'content': csv_content, # required
    'filename': filename, # required
    'filetype': 'csv', # helpful :)
    'initial_comment': comment, # optional
    'text': 'File uploaded', # optional
    'title': filename, # optional
    #'token': token, # Don't bother - it won't work. Send a header instead (example below).
}
headers = {
    'Authorization': f"Bearer {token}",
}
response = requests.post(
    url, data=request_data, headers=headers
)

OFFTOPIC - 关于文档

我对 Slack 的 file.upload 文档有过最糟糕的体验(可能是今年)。我认为这可能对您将来有用。

在文档中不起作用的事情:

  1. token不能是 post 请求的参数它必须是 header 。这是实际 Slack 员工在 github 错误报告之一中所说的。
  2. channel_not_found - 我确实提供了一个现有的、正确的频道 ID 并收到了这条消息。由于安全原因(混淆),这在某种程度上是可以的,但是为什么会出现此错误消息: not_in_channel - Authenticated user is not in the channel. 将机器人添加到频道后一切正常。
  3. 缺少使用 content 参数的示例(这就是我与您分享我的代码的原因。
  4. 不同的编码会导致有关表单数据的不同错误,并且文档中没有任何信息有助于理解可能出了什么问题,哪种上传类型需要哪种编码。

主要问题是他们没有对其 API 进行版本控制、更改它并且不更新文档,因此文档中的许多陈述都是错误的/过时的。

原文由 Mr.TK 发布,翻译遵循 CC BY-SA 4.0 许可协议

通过 http 发送文件比发送其他数据需要更多的额外工作。您必须设置内容类型并获取文件等等,因此您不能只将其包含在请求中的 payload 参数中。

您必须将文件信息提供给 .post 方法的 files 参数,以便它可以将所有文件传输信息添加到请求中。

 my_file = {
  'file' : ('/tmp/myfile.pdf', open('/tmp/myfile.pdf', 'rb'), 'pdf')
}

payload={
  "filename":"myfile.pdf",
  "token":token,
  "channels":['#random'],
}

r = requests.post("https://slack.com/api/files.upload", params=payload, files=my_file)

原文由 Caleb Lewis 发布,翻译遵循 CC BY-SA 3.0 许可协议

推荐问题