【问题标题】:How to retrieve Slack messages via API identified by permalink?如何通过永久链接标识的 API 检索 Slack 消息?
【发布时间】:2023-03-10 00:45:02
【问题描述】:

我正在尝试检索 Slack 提醒列表,使用 Slack API 的 reminders.list 方法可以正常工作。但是,使用 SlackBot 设置的提醒(即通过让 Slackbot 提醒我一条消息)将该消息的相应永久链接返回为 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
        },

我自然不想显示固定链接,而是想显示我想要提醒的消息。但是,我在 Slack API 文档中找不到有关如何检索由永久链接标识的消息的任何提示。链接大概是chat.getPermalink生成的,但是好像没有明显的chat.getMessageByPermalink左右。

我尝试将路径元素解释为channel 和时间戳,但时间戳(从上面的示例转换而来:1583441290.000300)似乎并不真正匹配。至少,当将 latest 传递给 conversations.historylimiting 传递给 1 时,我不会得到我期望检索的消息。

【问题讨论】:

    标签: slack-api


    【解决方案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 组件的方法可能不是最优雅的解决方案,但它证明了这个概念:-)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-12
      • 2014-11-17
      • 1970-01-01
      • 2015-05-03
      • 1970-01-01
      • 2012-12-14
      • 1970-01-01
      相关资源
      最近更新 更多