3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Google Apps ScriptでSlackのメッセージを削除する

Last updated at Posted at 2022-02-19

はじめに

定期実行されるバッチがSlackチャンネルにその実行結果を通知する処理を行っていたため、
年単位で見ると結構な量のメッセージが溜まっていた。

Slack無料版ではメッセージを過去10000件?までしか表示できないみたいなので、無駄なメッセージは削除したかった。

一番手っ取り早いのはチャンネルを削除→再作成すれば早いが、WEBHookのURLをいろいろな場所で使っていたためチャンネルの削除は避けたかった。

そのため今回はGAS(Google Apps Script)からSlack APIを実行して、特定のチャンネルに存在するメッセージをすべて削除する方法をとった。

事前準備

SlackAPIでメッセージを削除するには「トークン」と「チャンネルID」が必要となる。

「チャンネルID」はSlackチャンネル名をクリックすると開くモーダルの一番下に書いてある。

「トークン」はSlackAPIから発行する必要がある。

SlackAPIへアクセスし、「Create new App」をクリック。
「From scratch」を選択し「App Name」を適当に入力。
「Pick a workspace to develop your app in:」には設定するSlackワークスペースを選択する。

Appが作成できたら「Permissions」で権限設定を行う。

名称未設定.png
image.png
channels:read:チャンネルを取得
channels:history:チャンネル内の削除対象となる投稿を取得
chat:write:投稿を削除
あたりの権限を付与する。

「OAuth Tokens for Your Workspace」の「Install to Workspace」からワークスペースへインストールする。
名称未設定2.png

完了すると「トークン」が得られる。
名称未設定3.png

コード

GASで新規にプロジェクトを作成し下記コードを記載する。

function del_slack_posts() {
  var token =
    "xoxp-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"; // トークン
  var channel_id = "XXXXXXXXX"; // チャンネルID

  // チャンネル内からタイムスタンプの一覧を取得
  var payload = {
    token: token,
    channel: channel_id,
    limit: 1000,
  };

  var options = {
    method: "post",
    payload: payload,
  };

  var url = "https://slack.com/api/conversations.history";

  var response = UrlFetchApp.fetch(url, options);
  var json = response.getContentText();
  var data = JSON.parse(json);
  console.log(data.messages.length);
  // 繰り返し削除
  for (var i = 0; i < data.messages.length; i++) {
    var urldelete = "https://slack.com/api/chat.delete";
    var payload = {
      token: token,
      channel: channel_id,
      ts: data.messages[i]["ts"],
    };

    var options = {
      method: "post",
      payload: payload,
    };
    var response = UrlFetchApp.fetch(urldelete, options);
  }
}

APIの実行制限について

上記を実行するとSlackのメッセージは削除されるが、何件か削除した後エラーとなった。
名称未設定4.png

これはSlackAPIの実行回数の上限値「Rate Limits」が決まっており、その回数に達したためエラーになった模様。
今回使っているchat.deleteはTier 3なので1分間に50回が上限になっている。

今回は上限エラーになってもお構い無しで、1分間隔で定期実行することにした:innocent:

定期実行するには「トリガー」のタブから新規トリガー追加すればできる。

おわりに

上記を仕掛けてまる1日放置したところ、チャンネルのすべてのメッセージが削除された。
ただし、スレッドは削除されないようで、これを削除するには
上記コードのdata.messages[i]["ts"] の部分を data.messages[i]["latest_reply"]にする必要がある模様。
※今回はあえて残した。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?