slack の過去ログを google sheet に書き出すツールです。 無料版の slack では古いメッセージは順次閲覧不能になりますが、このツールでログを取っておけば、 google sheet 上で閲覧、検索が出来ます。 (既に閲覧不能になったログをこのツールで引き出すことは出来ません)
- google drive に保存するのでDB等不要
- 過去ログのアクセス権を絞れるので非公開 slack でも便利
- github actions で実行可能、サーバー不要
- 公開リポジトリでセットアップ可能、トークン等の非公開情報は repository secrets に設定
デフォルトでは、実行日時の2か月前からの1か月分、すべての公開チャンネルを1ファイルにします。
例: 10月x日に実行すると、 8/1 ~ 8/31 分のログを取得
1か月空けてあるのは、「スレッド返信はその発言元の時刻でしか取得できない」という、本システムの制限のためです。 例えば、 9/30 の投稿に対し、10/2 にスレッド返信がついたとします。 この返信は、9月のログを生成する際に取得されますが、10月のログには含まれません。 10/1 に9月分を取得してしまうと、 10/2 のスレッドはどこにも記録されずに失われてしまうことになります。
github actions の制限により、60日間活動のなかったリポジトリは scheduled workflow が停止してしまいます。 事前にメールで通知が来るので、メール内の指示に従って制限を解除してください。 https://github.community/t/no-notification-workflow-disabled-after-60-days/182169/5
github のアカウントを有償のプランにするか、 self hosted runner を登録することで継続実行できるようです。 https://docs.github.com/ja/actions/hosting-your-own-runners/managing-self-hosted-runners/about-self-hosted-runners
https://api.slack.com/apps から適当なアプリを作成し、 OAuth & Permissions で以下の scope を付与し、 xoxb から始まる bot token を生成します。
- channels:history
- channels:read
- users:read
- channels:join
後述する autoJoin: false
を指定する場合は、 channels:join は不要となります。
この場合、新規作成されたチャンネルへは手動で bot を招待しない限りログ取得対象となりません。
https://cloud.google.com/iam/docs/creating-managing-service-account-keys 手順に従ってサービスアカウントを作成 (role 等何も付与せず作成してOK) し、 JSON キーをダウンロードする。 JSON のうち、以下の2つのみを使用します。
- client_email
- private_key
書き込み先の適当なフォルダを作成し、先ほど作成した Service Account の client_email のアドレスを書き込み権限つきでフォルダに共有招待する (招待メールは送信しない) フォルダのURLパスの末尾要素が folder id となります。
ex: https://drive.google.com/drive/folders/1y-Q3khgg3sU7ApWf5AxmWqbngb4Li8tx?hogehoge
folder id は 1y-Q3khgg3sU7ApWf5AxmWqbngb4Li8tx
適当な github repository (public repo 使用可) に、以下の workflow を追加
# .github/workflows/slack-backup.yml
name: slack-backup
on:
schedule:
- cron: '11 0 1 * *' # 毎月1日 日本時間9時11分に実行。 0:00 は混み合いがちなので適当にばらす
jobs:
main:
runs-on: ubuntu-latest
steps:
- uses: kuboon/gsheet-slack-logger@main
with:
timezone: 'Asia/Tokyo'
slackToken: ${{ secrets.SLACK_TOKEN }}
googleClientEmail: [email protected] # 作成したサービスアカウントの email
googlePrivateKey: ${{ secrets.GOOGLE_PRIVATE_KEY }}
folderId: 1p0ZSVps76fWoLpfnE9y5tYHkCK18yVeW
以下の2つは yml に書くと危険なので secrets を登録する
- SLACK_TOKEN
- GOOGLE_PRIVATE_KEY
GOOGLE_PRIVATE_KEY はダウンロードした json の private_key の値だが、 \n を改行にあらかじめ置換してから github に登録する。
以下のように year, month を指定すると、指定の年月のログを取得します。
with:
year: 2020
month: 3
省略時は、現在日時の2か月前となります。
デフォルトは true です。公開チャンネルには自動的に参加してログを取得します。 false にした場合、作成した slack app が既に参加しているチャンネルのみが取得対象となります。 新規チャンネルには手動で bot を参加させない限りログが取られませんのでご注意ください。
with:
autoJoin: false
autoJoin: true の場合、 bot を kick しても次の実行時に自動的に join してしまいます。 skipChannels に channel id を列挙することで、これらのチャンネルをログ取得の対象外とすることができます。