Slack のフリープランでは閲覧・検索できるメッセージの上限数が 10,000 件となっており、それを超えると 10,000 件以上前のメッセージは閲覧・検索することができません。
なので、 RSS の通知先チャンネルなど古いメッセージは削除してしまってもよい場合に、 Slack の API を使って該当するメッセージを一括で削除するのが目的です。

やりたいこと

  • 特定のチャンネルで、ポストされてから一週間以上経過するメッセージを削除する
  • AWS Lambda で定期的に削除処理を実行する
  • Runtime は Python 3系

処理の流れ

  1. Slack API で、チャンネルを指定してメッセージを取得する
  2. メッセージのタイムスタンプを見て、一週間以上経過しているメッセージを Slack API で削除する

以上です。
Slack の API を利用するためには、 token が必要なので、 Legacy tokens から生成・取得します。xoxp-1111... みたいやなつです。

使用するのは、チャンネル内のメッセージを取得する channels.history と、メッセージを削除する chat.delete です。

それぞれの API は必須パラメータも少なく、使い方はとてもシンプルです。

channels.history の必須パラメータ

  • token: Slack API の token です。
  • channel: メッセージを取得したいチャンネルの チャンネル ID です。チャンネル名ではありません。

chat.delete method

  • token: Slack API の token です
  • channel: 削除したいメッセージがポストされているチャンネルの チャンネル ID です。チャンネル名ではありません。
  • ts : 削除したいメッセージのタイムスタンプです。 channels.history の取得結果に含まれているのでそのまま使います。

チャンネル ID の調べ方

各 API で使用するチャンネル ID は、デスクトップ版の Slack アプリから確認します。
左のチャンネルリストから チャンネル ID を調べたいチャンネル名を右クリックして、 copy link を選択します。(日本語化していると日本語になってます)
コピーされたリンクは下記のようになっているので、最後のパス部分にあたる英数字がチャンネル ID になります。

https://example.slack.com/messages/AAA123CCC

ソース

ソースは下記の通りで、 Gist に置いてます。

スクリプト内では削除対象を一週間以上前としていますが、 TERM の値を変更すれば任意の期間を指定できます。

AWS Lambda で実行する

Gist の readme にも書いてますが、 Lambda で実行する場合は イベントとして次のような JSON を渡します。

{
  "target_ch_ids": [
    "CHANNEL_1",
    "CHANNEL_2",
    "CHANNEL_3"
  ]
}

CloudWatch Event で定期実行する場合も、入力の設定で上のような JSON テキストを指定します。

comments powered by Disqus