如何通过由permalink标识的API检索Slack消息?

我想检索Slack的提醒列表,使用Slack API的效果很好。reminders.list 方法。然而,使用SlackBot设置的提醒(即要求Slackbot提醒我一条消息)会返回该消息的各自的permalink,作为 text:

{
    "ok": true,
    "reminders": [
        {
            "id": "Rm012C299C1E",
            "creator": "UV09YANLX",
            "text": "https:\/\/team.slack.com\/archives\/DUNB811AM\/p1583441290000300",
            "user": "UV09YANLX",
            "recurring": false,
            "time": 1586789303,
            "complete_ts": 0
        },

与其显示permalink,我自然想显示我想被提醒的消息,但在Slack API文档中找不到任何关于如何检索由permalink识别的消息的提示。然而,我在Slack API文档中找不到任何关于如何检索由permalink标识的消息的提示。这个链接大概是由 chat.getPermalink但似乎没有明显的 chat.getMessageByPermalink 左右。

我试着将路径元素插入到 channel 和时间戳,但时间戳(由上面的例子转化而来。1583441290.000300)似乎并不真正匹配。至少当我把这个作为 latestconversations.historylimit摄取 1.

解决方案:

又摆弄了一阵子,这是我在JS中终于搞定的方法。

async function downloadSlackMsgByPermalink(permalink) {
  const pathElements = permalink.substring(8).split('/');
  const channel = pathElements[2];

  var url;
  if (permalink.includes('thread_ts')) {
    // Threaded message, use conversations.replies endpoint
    var ts = pathElements[3].substring(0, pathElements[3].indexOf('?'));
    ts = ts.substring(0, ts.length-6) + '.' + ts.substring(ts.length-6);

    var latest = pathElements[3].substring(pathElements[3].indexOf('thread_ts=')+10);
    if (latest.indexOf('&') != -1) latest = latest.substring(0, latest.indexOf('&'));

    url = `https://slack.com/api/conversations.replies?token=${encodeURIComponent(slackAccessToken)}&channel=${channel}&ts=${ts}&latest=${latest}&inclusive=true&limit=1`;
  } else {
    // Non-threaded message, use conversations.history endpoint
    var latest = pathElements[3].substring(1);
    if (latest.indexOf('?') != -1) latest = latest.substring(0, latest.indexOf('?'));
    latest = latest.substring(0, latest.length-6) + '.' + latest.substring(latest.length-6);
    url = `https://slack.com/api/conversations.history?token=${encodeURIComponent(slackAccessToken)}&channel=${channel}&latest=${latest}&inclusive=true&limit=1`;
  }
  const response = await fetch(url);
  const result = await response.json();
  if (result.ok === true) {
    return result.messages[0];
  }
}

虽然还没有经过最新的测试,但第一个结果看起来还不错。

  • 诀窍是… conversations.history 端点包括 inclusive=true 参数
  • 消息可能是线程化的–单独的端点。conversations.replies 需要获取这些
  • 正如Slack API文档中所说。tsthread_ts 看起来像时间戳,但它们不是。不过,使用它们有点像时间戳(即在后面剪掉一些字符并插入一个点),似乎很高兴。
  • 很自然的 slackAccessToken 需要事先设置

我知道在上面的代码中提取&转换URL组件的方法可能不是最优雅的解决方案,但它证明了这个概念:-)

给TA打赏
共{{data.count}}人
人已打赏
未分类

无法使用gitbash创建文件或目录。

2022-9-8 15:46:20

未分类

组装弹簧回流slf4j记录仪。

2022-9-8 15:46:22

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索