どうも。Androidアプリ開発担当のYuukiです。
今年も夏休みが終わってしまいました‥。(絶望)
最近「仲曽良ハミ」さんの『しなのんちのいくる』というWeb漫画にハマっていて、毎日ノスタルジックな気持ちになっています。(あの頃に戻りたい‥)
▼前回の記事はコチラ
『ダイエット始めました』
■本日のテーマは?
今回のテーマは「Slackのプライベートチャンネルをバックアップする方法」についてです。
2022年9月1日から、Slackの仕様が変わるとのことで、残された時間はあと僅か‥。
フリープランだと、過去90日間のメッセージやファイル等にしかアクセスできなくなるようです。(これは困った‥!)
■なぜ困るのか‥?
私の記憶力はニワトリ以下(自称)なので、数ヶ月前の作業内容など覚えていられるはずがなく、、
「あの案件はいつ頃対応して、どんなやり取りをしていたかな?」と振り返る際は、Slackの履歴だけが頼りだったりします。
それが過去90日間のメッセージまでしか遡れなくなってしまうということは、3ヶ月以上前の記憶を失ってしまう状態になるということです。(ほぼ記憶喪失)
(何とかして過去のメッセージ履歴を残しておきたい‥!!!)
しかし、Slack公式のエクスポート機能では、プライベートチャンネルはエクスポートできないとのこと‥。(!?)
そこで、今日は「Slackのプライベートチャンネルをバックアップするための暫定対応」について記載していきたいと思います。
■手順について
早速やっていきましょう。大まかな手順は下記のとおりです。
①「Slack App」を作成する
②「Slack App」のスコープを設定する
③トークンを取得する
④プライベートチャンネルのIDを取得する
⑤「Googleスプレッドシート」を準備する
⑥スクリプトを編集する
⑦スクリプトを実行する
▼今回はコチラの記事を参考にさせていただいております!
『Slack の特定のチャンネルのメッセージ一覧をスプレッドシートにエクスポートするツールを作ってみた』
■①「Slack App」を作成する
まずは「slack api」の 【Your Apps】 にアクセスして「Create New App>From scratch」をクリック。
「App Name」には、任意のアプリ名を入力してください。(例:DataExport 等)
「Development Slack Workspace」は、任意のワークスペースを選択します。
(※ブラウザ上でSlackにログインしておく必要がありそうです!)
■②「Slack App」のスコープを設定する
次に、サイドメニューにある「OAuth & Permissions」のページにアクセスします。
ページ中段に「Scopes」という項目があるので、下記のスコープを追加してください。
●Bot Token Scopes
・channels:history, groups:history, im:history, mpim:history
●User Token Scopes
・channels:history, groups:history, im:history, mpim:history
■③トークンを取得する
次に、同ページ上部の「OAuth Tokens for Your Workspace」の「Install to Workspace」をクリックします。
「User OAuth Token」と「Bot User OAuth Token」をそれぞれメモしておきましょう。
(※この情報は自分以外の誰かに渡したり漏洩しないように注意すること!)
■④プライベートチャンネルのIDを取得する
チャンネルIDは、Slackを開いて「チャンネル」を右クリックし、「チャンネル詳細を表示する」を選択すると最下部に表示されているので、こちらもメモしておきましょう。
■⑤「Googleスプレッドシート」を準備する
参考記事 の作者である @tanabee さんが作成してくださった 【README(※要確認!)】 の通り、【Google スプレッドシート】 にアクセスし、「ファイル>コピーを作成」でファイルを任意の場所にコピーします。
■⑥スクリプトを編集する
スプレッドシートのメニュー「拡張機能>Apps Script」を選択します。
「Apps Script」のコードエディタが開くので、以下のプログラムに書き換えてください。
[2022/08/29 追記]
※尚、ブログの仕様上、プログラム内のダブルクォーテーションが「 “ 」になっているかと思いますが、そのままではエラーになってしまうため、適宜「半角のダブルクォーテーション」に変換してください‥!
var channelID = “XXXXXXXXXXX”;
function main() {
var fetchUrl = ‘https://slack.com/api/conversations.history?channel=’ + channelID + ‘&limit=1000′;
const options = {
“headers”: { ‘Authorization': ‘Bearer ‘ + OAuthAccessToken }
}
var res = UrlFetchApp.fetch(fetchUrl,options);
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?channel=’ + channelID + ‘&ts=’ + v.thread_ts;
const options = {
“headers”: { ‘Authorization': ‘Bearer ‘ + OAuthAccessToken }
}
var reply = UrlFetchApp.fetch(fetchUrl,options);
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());
}
ちなみに、「OAuthAccessToken」には、③でメモしたトークン(「Bot Token Scopes」の値)を指定し、「channelID」には、④でメモしたチャンネルIDを指定してください。
var OAuthAccessToken = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
var channelID = "XXXXXXXXXXX";
■⑦スクリプトを実行する
「実行」をクリックすると、アクセス権限を求められるので、それぞれ許可します。
「これで完成!」と思いきや、再度「実行」をクリックしてみると「TypeError: undefined のメソッド「forEach」を呼び出せません。」というエラーが表示されてしまいます。
これは、以下のように、Slackにて「チャンネル自体にアプリを追加する」という操作をすることで解決できるかと思います。
上記の設定をした後、改めて「実行」をクリックすると、実行ログに「実行完了」というログが出力され、スプレッドシートにSlackのメッセージ履歴が保存されていることが確認できます。
ここまでの作業で、バックアップ完了です!!!(やったー)
■まとめ
これで90日以上前のSlackのメッセージ履歴もスプレッドシート上で確認できるようになりました!
今回はメッセージだけなので、アップロードしていたファイル等については、別途対策を取る必要があるかと思いますが、ひとまず最悪の事態(メッセージ履歴を振り返ることができなくなる状態)は回避できるのではないかと思います!
Slackをフリープランで利用している方は多くいらっしゃると思いますので、私と同じようなお悩みを抱えている方は、是非ともお試しください!
Slackの有料プランを利用できれば何も心配する必要がないのですが、結構な額のランニングコストが掛かってしまうので、現実はなかなか厳しいですね‥。(今回のように、工夫しながら乗り越えて行きましょう!笑)