【问题标题】:Cannot post images to Slack channel via web hooks utilizing Python requests无法使用 Python 请求通过 Web 挂钩将图像发布到 Slack 频道
【发布时间】:2016-07-17 12:34:58
【问题描述】:

我正在尝试使用网络挂钩将图像发布到 Slack 频道。这个基本设置允许我将文本发布到频道,但我无法发布图像。这是我的代码:

def posting():
    import requests
    import json

    url = 'https://webhook'
    image = {'media': open('trial.jpg', 'rb')}
    r = requests.post(url, files=image)
    r.json

当我发布文本时,频道中会出现一个网络钩子机器人并发布它。我需要一些进一步的身份验证才能发布吗?还是 Slack 有自己的上传 API 并希望我通过它?还是机器人无权发布图像的东西?

我在这里查看了其他一些问题,但他们似乎没有使用网络挂钩或机器人,所以我不确定我的问题是否涉及这些问题。

【问题讨论】:

  • 我不确定您是如何决定使用该有效负载的,但也许阅读api.slack.com/incoming-webhooks 以获得预期的输入? (我认为您想发送带有 attachments 元素的 JSON。)
  • 我查看了 slack API,似乎对于附件,他们总是期待一个 URL。我宁愿简单地从目录上传文件。 requests 库使这似乎成为可能,但是我对编码的习惯还不够,无法知道我何时将头撞在墙上以遵循我的原始计划,而不是仅仅更改我的设置以使用前面的文档我的。那是那个时代之一吗?
  • 我想是的。我很确定(根据文档)“传入的 webhook”没有任何允许上传文件的选项,因此您需要将文件放在其他位置并通过 URL 附加。

标签: python python-requests bots webhooks slack-api


【解决方案1】:

您可以通过 Slack API 使用他们的 files.upload 方法执行此操作:https://api.slack.com/methods/files.upload

您需要一个 API 身份验证令牌才能正常工作。您可以设置测试令牌或按照说明注册您的程序以获得长期令牌:https://api.slack.com/web#basics

此外,“媒体”似乎不是用于文件上传的正确 json 密钥:
http://docs.python-requests.org/en/master/user/quickstart/#post-a-multipart-encoded-file

这是一个使用请求将图像发送到频道的示例。如果您希望图像转到特定用户,请使用“@username”。我已经包含了内容类型和标题,但没有它们也应该可以工作。 这将打印来自 Slack 的响应。

import requests

def post_image(filename, token, channels):
    f = {'file': (filename, open(filename, 'rb'), 'image/png', {'Expires':'0'})}
    response = requests.post(url='https://slack.com/api/files.upload', data=
       {'token': token, 'channels': channels, 'media': f}, 
       headers={'Accept': 'application/json'}, files=f)
    return response.text

print post_image(filename='path/to/file.png', token='xxxxx-xxxxxxxxx-xxxx',
    channels ='#general')

【讨论】:

    猜你喜欢
    • 2021-11-08
    • 2018-06-07
    • 1970-01-01
    • 2020-03-20
    • 2016-09-21
    • 2022-01-12
    • 2018-04-20
    • 2017-09-02
    • 2018-06-26
    相关资源
    最近更新 更多