Posted at

特定の日付以降、活動がない Slack channel を一括でアーカイブする

More than 1 year has passed since last update.

Slackを使った業務コミュニケーションを続けていると、活動が止まってしまったチャンネルがだんだん溜まってきてしまいます。そういうチャンネルはなるべくアーカイブして、アクティブなチャンネルだけ残したい、と思ったんですが、手軽な方法が見つけられませんでした。

そこで、Slack APIと jq を組み合わせて、特定の日付以降、活動がない Slack channel を一括でアーカイブするスクリプトを作ったので公開します。誰かの役に立てば幸いです。


用意するもの


  • Mac

  • shell

  • jq

  • Slackの管理者権限

  • Slackのレガシーなトークン


    • レガシーじゃない方がよさそうですが、簡単にできるやり方を選択しちゃいました




スクリプト

APIをつかい、チャンネルの一覧を取得して、特定の日付以降に発言がないチャンネルをアーカイブする、という単純なものです。レスポンスのフィルタには jq を使ってうまいことやってます。

# 以下二つの変数を設定して実行

TOKEN_SLACK=xoxp-**********
TARGET_DATE=2018-**-**

# アーカイブされていないチャンネルのID一覧を取得し繰り返し処理
for ch in $(curl -s "https://slack.com/api/channels.list?token=$TOKEN_SLACK" | jq -r '.channels[] | select(.is_archived == false) | .id')
do

# TARGET_DATE以降のメンバーとbotの発言数を取得
count=$(curl -s "https://slack.com/api/channels.history?token=$TOKEN_SLACK&channel=$ch&count=100&oldest=$(date -j -f '%Y-%m-%d' $TARGET_DATE '+%s')" |
jq -r '.messages | map(select(.subtype == null or .subtype == "bot_message")) | length')

# 発言数が0ならアーカイブ
if [ $count -eq 0 ]; then

# アーカイブするチャンネルの情報を標準出力に表示して
curl -s "https://slack.com/api/channels.info?token=$TOKEN_SLACK&channel=$ch"|jq -r '.channel | [.id, .name] | @csv'
sleep 1

# アーカイブする
curl -s "https://slack.com/api/channels.archive" -X POST -F "token=$TOKEN_SLACK" -F "channel=$ch"
fi
sleep 1

done