ちぎっては投げるブログ

Programming, Android, RaspberryPi, Digital Devices, Kinkuma Hamster...

Slackの無料枠を最大限利用するために、特定チャンネルのメッセージを定期削除するようにした

この記事はSlack Advent Calendar 2017の17日目の記事です。

Slack Advent Calendar 2017 - Qiita

Botを作ると言ったな、あれは嘘だ

f:id:mczh:20171216225030p

Botの定義とは?という話もあるが、いわゆる話しかけるとそれに答えてくれるものをbotとするなら、今回の記事はbotではない。だが、自動でなにかしてくれるのは全部botと呼ぼうよ、と思えばbotを作ったと言えなくもない(詭弁)。  

古いメッセージを削除するbotを作る

Slackは無料での利用だと、最大1万メッセージまで利用できる。1万メッセージを超えると、古いものから閲覧検索が出来なくなる。(削除されるわけではないので、有料プランにするとまた見られるようになる)  

情報を貯めておくチャンネルと垂れ流すチャンネルがある

私のSlackの運用は、色々話をする雑談チャンネル系と、共有カレンダー等の情報を自動で流すお知らせチャンネル系と、保存しておきたい情報をメモしておく保存系チャンネルに分かれている。

  無料枠である1万メッセージを超えてしまうと、保存しておく必要のないチャンネルメッセージも、保存しておきたいチャンネルメッセージも区別せずに古い順に見えなくなっていく。  

そこで、雑談チャンネルや自動投稿チャンネルについて、一定期間より前の投稿を自動削除する仕組みを作ることで、保存しておきたいチャンネルのメッセージ寿命の延命を試みる。    

Slack Appを作成する

Slack API: Applications | Slack

Create New Appからアプリケーションを作り、トークンを取得する。  

特徴で「権限」を選択し、「スコープ」でそれっぽい権限を付与していく。 ここで、「それっぽい」がよくわからなかったので、適当に付与したが、実際には何が必要で何が不要だったのかの検証までは出来ていない。 おそらく、  

ユーザーのパブリックチャンネルにアクセスします
channels:history
ユーザーのパブリックチャンネルに関する情報にアクセス
channels:read
あなたのパブリックチャンネルを修正
channels:write

あたりが必須だと思う。  

Rubyスクリプトの作成

  削除は、以下のRubyスクリプトで行う。 Gemとして、slack-apiを使っているので、

gem install slack-api

が必要。  

require 'slack'
  Slack.configure do |config|
  config.token = "取得したトークン"
end
# name=>day
channel_names = {"チャンネル1" => 何日分を残すかの日数, "チャンネル2" => 以下略}
channel_backup_names = ["バックアップを書き出しておきたいチャンネル名"]
client = Slack::Client.new
channel_names.each{|channel_name, date|
  puts "#{channel_name},#{date}"
  File.open("/tmp/#{channel_name}.txt", "a") do |f| 
    channel = client.channels_list["channels"].find { |c| c["name"] == channel_name }
    begin
      history = client.channels_history(channel: channel['id'], latest: (Time.now - (60 * 60 * 24 * date)).to_i, count: 1000)['messages']
      history.each do |h|
        sleep 2
          if channel_backup_names.include?(channel_name)
            f.puts history.to_json
         end
         puts client.chat_delete(channel: channel['id'], ts: h['ts'])
       end
  end while !history.empty?
end
}

  必要なのはトークンと、チャンネル名と、そのチャンネルのメッセージを何日前まで残すかの情報である。

sleepを入れないとAPIアクセスしすぎでアクセス制限がかかるので、ちゃんとwaitしながら負荷をかけないように気を付けよう。

一応、/tmpの下にバックアップとして書き出している。/tmpの下なので放っておくと消えるので、とりあえず必要ならDropboxにアップロードしておくことにする。   

バックアップ周りは無駄なファイルオープンをしているので直したいが、この記事はアドベントカレンダーの締め切り前日に書いているのでひとまず後回しにする。  

Dropboxへのアップロードは以下を参考。   denpa-shinbun.com  

メッセージ数の変化

実行後にメッセージ総数が減るかを確認したが、減っていない。

調べたところ、最大48時間かかるとの記述を見つけたので後日確認したところ、ちゃんとメッセージが減っていることを確認した。

  このスクリプトをcronで動かすようにすれば、定期削除の完成である。

crontab -e

  ところで、privateチャンネルのメッセージは削除できなかった。権限の問題かと思い、いろいろ試してみたのだが、成功していない。