【问题标题】:Posting files to a chat through Slack API通过 Slack API 将文件发布到聊天中
【发布时间】:2017-08-06 10:47:27
【问题描述】:

我正在尝试使用 Python 的库 slackclient 通过 Slack API 传递视频。

我经常使用slack.api_call('chat.postMessage'...),我熟悉'files.upload',但是当我执行时

slack = SlackClient(TOKEN)
slack.api_call('files.upload', file=open('video.mp4', 'rb')...)

文件已上传到给定频道,但不会作为消息发布。

我想要实现的是创建一条消息,我可以将其作为私人消息发送或发送到类似这样的频道

如果可能的话,可能会在上面添加一些文字。

我浏览了文档中的Attachment 部分,但找不到与文件相关的任何内容。 如果有办法不以二进制格式提供文件,而是作为链接也可以(只要它以嵌入式方式显示)。

【问题讨论】:

    标签: python slack-api


    【解决方案1】:

    这个示例脚本怎么样?它使用io.BytesIO(f.read()) 作为文件。为了使用它,files:write:user 必须包含在范围中。关于文本,您可以使用initial_comment 将其导入。在我的环境中,attachments 不能用于files.upload。 API文档是https://api.slack.com/methods/files.upload

    脚本:

    with open('./sample.mp4', 'rb') as f:
        slack.api_call(
            "files.upload",
            channels='#sample',
            filename='sample.mp4',
            title='sampletitle',
            initial_comment='sampletext',
            file=io.BytesIO(f.read())
        )
    

    结果:

    如果我误解了你的问题,我很抱歉。

    【讨论】:

    • 我明天试试这段代码,看看发生了什么。也许这与我没有使用自己的令牌有关,而是作为机器人上传(使用 as_user)。我尝试在发布此内容之前进行 files.upload 调用,结果将文件上传到频道,但没有显示任何消息(我只能在文件的侧面菜单中看到它,但在聊天中看不到)。也许您添加到调用中的参数之一可以完成这项工作,我明天会报告
    • 不,这不起作用,导致相同的结果是视频被上传到频道(我可以在文件菜单上看到它)但它没有显示在聊天窗口中跨度>
    • @bluesummers 在我的环境中,这很好用。我使用了我创建的频道和从我的帐户中检索到的访问令牌。可以问一下你的环境吗?从你的问题我无法知道。我很抱歉我的英语不好。
    • 我正在使用旧令牌,完全使用了您发布的代码,并且它没有在聊天中显示这种消息 - 链接到旧令牌 -> api.slack.com/custom-integrations/legacy-tokens
    • 这是完整的代码ibb.co/hwH5hF - 结果是文件被上传到频道文件,但没有显示为消息
    【解决方案2】:

    我遇到了这个问题,因为我遇到了同样的问题 - 我的文件会上传,我会收到回复,但文件不会发布到我发送的频道。事实证明,阅读 Slack API 文档对我来说是一项糟糕的工作。我曾多次使用chat.postMessage 并包含一个“通道”参数。这是那个 API:https://api.slack.com/methods/chat.postMessage

    files.upload 方法需要在“通道”参数中使用逗号分隔的通道列表。请参阅https://api.slack.com/methods/files.upload 一旦我从“频道”更改为“频道”并且确保将其作为列表传递,我成功地将图像发布到我想要的频道。

    那么对于原始问题,在您使用的代码的链接中 (https://ibb.co/hwH5hF) 尝试将 channel='bla'更改为 channels=['bla']

    【讨论】:

      【解决方案3】:

      这对我有用:

      import slack
      
      client = slack.WebClient(token='xoxb-XXX')
      
      with open('/path/to/attachment.jpeg', 'rb') as att:
          r = client.api_call("files.upload", files={
              'file': att,
          }, data={
              'channels': '#my_channel',
              'filename': 'downloaded_filename.jpeg',
              'title': 'Attachment\'s title',
              'initial_comment': 'Attachment\'s description',
          })
          assert r.status_code == 200
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-10-21
        • 1970-01-01
        • 1970-01-01
        • 2022-01-12
        • 1970-01-01
        • 1970-01-01
        • 2013-11-04
        • 1970-01-01
        相关资源
        最近更新 更多