在Slack中将图像上传并附加到来自机器人的私人消息中

时间:2018-06-26 14:41:11

标签: slack slack-api

我有一个节点服务正在使用WebClient中的@slack/client

我正在使用机器人的访问令牌通过web.files.upload API方法上传图像。然后,我想将上载的图片作为私人消息(即以D开头的频道)的附件发送给用户。我希望此图像仅限于该团队中的Slack用户访问(就像您共享文档或其他文件时一样)。

我尝试使用files.upload函数的响应来执行此操作,但是似乎没有res.file的任何属性为我提供了可供Slack团队的所有成员访问的URL:

conversationId = 'Dxxxxxxxx'; // ID of private channel between bot and user

web.chat
  .postMessage({
    channel: conversationId,
    text: 'Hello there',
    attachments: [
      {
        fallback: 'Required plain-text summary of the attachment.',
        color: '#36a64f',
        title: 'Slack API Documentation',
        title_link: 'https://api.slack.com/',
        text: 'Optional text that appears within the attachment',
        image_url: res.file.permalink_public,
        ts: 123456789
      }
    ]
  });

the docs中,听起来好像该文件是机器人专有的,直到发送到公共频道为止。

我考虑的另一种方法是将文件上传到用户和漫游器之间的私人消息通道,但是这给了我以下错误:

{ Error: An API error occurred: invalid_channel
  code: 'slackclient_platform_error',
  data:
  { ok: false,
    error: 'invalid_channel',
    channel: '["Dxxxxxxxx"]',
    scopes: [ 'identify', 'bot:basic' ],
    acceptedScopes: [ 'files:write:user', 'post' ] } }

有没有办法实现我的追求?

2 个答案:

答案 0 :(得分:1)

要在邮件附件中使用图像URL,图像必须具有公共URL,否则它将不起作用。上载的文件具有访问限制,默认情况下不公开(例如,您需要提供身份验证以及URL)。

如果要在附件中使用该图像,则需要首先获取一个公共URL。但是,仅在“公共频道”中共享它是不够的。您需要使用API​​方法files.sharedPublicUrl将文件公开。

或者,您可以使用外部图像服务来上传图像文件并获取公共网址,例如imgur具有用于上传和共享图像文件的API。

答案 1 :(得分:1)

我的错误是由于误读the docs导致的-files.upload API期望通道属性使用逗号分隔的字符串,并且我正在传递数组。

更正此错误后,我可以成功上传文件并与用户私下共享(以'D'开头的频道ID)和在公共渠道(以'C'开头的频道ID)与用户共享文件。

复制图像URL并将其粘贴到浏览器中后,我进入了登录页面,因此默认情况下,按我希望的那样,它们对Slack团队是私有的。