![見出し画像](https://assets.st-note.com/production/uploads/images/84839481/rectangle_large_type_2_bf6abee2d50bc7d8f1b169fd90be6d16.png?width=1200)
SlackのDMチャネルバックアップ
はじめに
Slackのフリープランユーザは2022年9月1日より、過去90日分のデータ以外は消去される旨の規約改変があります。
そこで、Slackのバックアップ等について、色んな方が書いていますが私の利用方法で対応した内容を列挙しつつ、アプリ開発したという経緯
Slackバックアップ方法
Slack標準バックアップ
これは、その名の通りSlackが提供しているバックアップ機能になります。全てがJSON形式になります。(ユーザ、チャネル等)
非常に検索や閲覧が難しいので、独自アプリで対応している方もいますが、確実性は非常に高いのでおすすめです。
但し、最大の欠点はユーザ同士のダイレクトチャネルはバックアップ対象外であるという点。
これを対応するために、今回開発を行いました。
ヤマタケ氏開発のツール
Slack標準バックアップを置き換える形で開発されているようです。
このツール、方法は明記されているものの、肝心なGoogleスプレッドマクロはメールを送信してから、アプリを貰う形のようです。
そのため、Slack API部分の設定まではできるものの、肝心のアプリ部分はオープンになっていないという意味です。
Slack標準バックアップ形式の閲覧方法
thayakawa氏が読みにくいSlack標準バックアップ形式をSlack風に閲覧できるツールを開発されておりオープンソースで公開されています。
但し、Windows(VC専用)アプリなので移植するのは少々時間が掛かりそうですね。
これ、使った感じは非常によく出来ています。
そのため、Slack標準バックアップを使うことで通常のチャネルは大丈夫と判断しました。
Slack DMのバックアップ
Yoshitaka KOITABASHI氏がSlack APIの使い方サンプルを公開されています。
この記事ではSlack アプリ側の設定とサンプルソースのみです。つまり、私もこの設定を利用し、Python部分をもう少し改修してちゃんと全件取得したという意味です。
上記リンク中、Tokenの取得方法部分を設定します。
アプリの作成
Qiitaの記事通り、下記リンクでアプリを作成します。
Permisionを指定する。
SlackアプリのPermissionを設定しますが、内容はQiita通りです。
Tokenを発行する。
OAuthトークンを生成します。内容はQiita通りです。
slack_getChannel
Python実行環境を用意しましょう。
Google Colab
もしなければ、Google Colabを用意します。Google Colabの場合、ダウンロードしたSlackデータが消えないように、自分のGoogle Driveに保管します。
Chrome → Google Drive → Google Colaboratory
その後、下記コマンドを入れて実行すれば、自分のGoogle Driveのルート直下にカレントディレクトリを移動します。
# Googleドライブのフォルダの準備
from google.colab import drive
drive.mount('/content/drive')
%cd /content/drive/'My Drive'/
トークンの設定
ソース中のtoken部分の内容をUser OAuth Tokenの値の書き換えます。
token = "xxxx-xxxxxxxxxxx-xxxxxxxxxxx-xxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
slack_getChannel実行
python3 slack_getChannel.py --out out.json --channel A1234B56
--channel: バックアップしたいチャンネルIDを指定します。チャンネルIDは各Slackのチャンネルの右側最上部のアイコンの右隣に下向きボタンがあります。この中の最下部にチャンネルIDが表示されています。
--out: 出力するファイル名(拡張子は固定で.jsonが自動的に付与されます)
実行後の確認内容について
"client_msg_id"タグが1メッセージの括りになっていると思われます。
ファイル中には、各メッセージの中に"blocks"タグがあり、同じテキストが入っているかと思います。恐らくはスレッド化した際の内容が入るのだろうと勝手に推測はしていますが、検証していません。
時間は"ts"タグの値になります。下記例でts値を入れて実行することで変換することが可能です。
import datetime
tzinfo=datetime.timezone(datetime.timedelta(hours=9))
ts = datetime.datetime.fromtimestamp(1552455404.000800, tz=tzinfo)