yposiのブログ

Web開発日記

slack - 特定チャネルのメッセージを一括で削除するスクリプト

退職のタイミングでtimes_xxxを消したくなりまして表題のスクリプトを作成しましたので共有致します。 なおコードはrubyで記述致しました。 faradayが入っていれば動く想定です。 動けばいいレベルでのコードになりますので参考程度で利用ください。

使い方

  1. gem install faraday
  2. CHANNEL_IDとSLACK_API_TOKENに値を設定する
    取得・設定方法については下記に記載。
  3. 実行コマンド:
ruby remove_messages_in_chanel.rb

CHANNEL_IDの取得方法

  1. チャネルを右クリック -> コピー -> リンクをコピーから取得できます。
  2. https://xxx.slack.com/archives/xxx のxxx箇所

Slack Appの登録

  1. Slack App で任意の名前のAppを作る
    この時点でtokenは発行される
  2. Permissions -> User Token Scopeで channels:history / channels:read / chat:write を追加
  3. Install App を押す

参考にしたページ

https://api.slack.com/methods

注意

スクリプトは100件しか処理できないようにしているので何度か繰り返し実行する

コード

require "faraday"

CHANNEL_ID = "" # TODO: 値を入れる
SLACK_API_TOKEN = "" # TODO: 値を入れる
LIMIT = 100

# メインプログラム
def run
  json = get_messages

  json[:messages].each.with_index(1) do |message, i|
    puts "message: #{message[:text]}"
    puts "ts: #{message[:ts]}"
    get_replies(message[:ts])

    if message[:text] == "This message was deleted."
      "すでに削除済"
      next
    else
      delete_message(message[:ts])
    end
  end
end

# 指定したチャネルのメッセージを取得
def get_messages
  req = Faraday.new(
    url: 'https://slack.com/api/conversations.history',
    headers: { 'Authorization' => "Bearer "+SLACK_API_TOKEN },
    params: { 'channel' => CHANNEL_ID, 'limit' => LIMIT, 'include_all_metadata' => true }
  )
  res = req.get
  json = JSON.parse(res.body, symbolize_names: true)
end

# メッセージを削除する
def delete_message(ts)
  req = Faraday.new(
    url: 'https://slack.com/api/chat.delete',
    headers: { 'Authorization' => "Bearer "+SLACK_API_TOKEN },
    params: { 'channel' => CHANNEL_ID, 'ts' => ts }
  )
  res = req.post
  if res.status == 200
    puts "削除 OK"
  else
    puts "削除 NG"
  end
end

# スレッド内のメッセージを削除する
def get_replies(ts)
  req = Faraday.new(
    url: 'https://slack.com/api/conversations.replies',
    headers: { 'Authorization' => "Bearer "+SLACK_API_TOKEN },
    params: { 'channel' => CHANNEL_ID, 'ts' => ts }
  )
  res = req.get
  json = JSON.parse(res.body, symbolize_names: true)
  json[:messages].each.with_index(1) do |message, i|
    puts "message: #{message[:text]}"
    puts "ts: #{message[:ts]}"
    delete_message(message[:ts])
  end
end

# 実行
run

以上になります。