SlackのプライベートチャンネルのExport

公開:2021/02/17
更新:2021/02/17
2 min読了の目安(約1800字TECH技術記事

TL;DR

https://qiita.com/ynaito/items/8f2f1de8426fe1dcf7c5
https://qiita.com/yomori/items/d9242129ebbae1f1c6ff
こことここの情報を参考にして、スレッド内のメッセージも含めてバックアップを取りました。
前者のリンクを参考にSlack Appの設定をして、スプレッドシートのスクリプトエディタに以下のコードをコピペして実行すれば完了です。
var OAuthAccessToken = "{OAuth Access Token}"; 
var channelID = "{チャンネルID}";

function main() {
  var fetchUrl = 'https://slack.com/api/conversations.history?token=' + OAuthAccessToken + '&channel=' + channelID + '&limit=1000';
  var res = UrlFetchApp.fetch(fetchUrl);
  res = JSON.parse(res);

  var messages = [];
  do {
    var newMessages = [];
    res.messages.forEach(function (v) {
      if('thread_ts' in v) {
        var fetchUrl = 'https://slack.com/api/conversations.replies?token=' + OAuthAccessToken + '&channel=' + channelID + '&ts=' + v.thread_ts;
        var reply = UrlFetchApp.fetch(fetchUrl);
        reply = JSON.parse(reply);
        newMessages = newMessages.concat(reply.messages.reverse());
      }
      else {
        newMessages.push(v);
      }
    });
    newMessages = newMessages.map(function (v) {
      return [
        v.client_msg_id,
        v.type,
        v.text,
        v.user,
        v.ts,
        v.reply_count || 0,
        v.reply_users_count || 0,
      ];
    });
    messages = messages.concat(newMessages);
  } while (res.has_more);

  SpreadsheetApp
    .getActiveSheet()
    .getRange('A2:G' + (messages.length+1))
    .setValues(messages.reverse());
}

背景

あるSlackチャンネルのメッセージのバックアップ(エクスポート)をしたい場面があったんですが、

  • そのチャンネルはプライベートチャンネルである
  • 弊社のSlackプランであるスタンダードプランではプライベートチャンネルのエクスポートができない
  • プライベートチャンネルはパブリックチャンネルに変更できない
    という事情で、Slackが用意してくれている方法ではバックアップが不可能でした。

やったこと

もう最初にほとんど全て書いてしまったんですが、ynaitoさんの記事を参考にしてメッセージを取得したところ、スレッドの中身が取得できなかったので、yomoriさんの記事を参考にしてその部分を追加しました。
もうほんとそれだけです。

何か僕がやったことがあるとしたら、conversations.historyは時系列降順でconversations.repliesは昇順で返ってくるので、全体を昇順にするためにreverse()を噛ませてるくらいのことです。

はい。