🧷
SlackのプライベートチャンネルのExport
TL;DR
前者のリンクを参考に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()
を噛ませてるくらいのことです。
はい。
Discussion