edo1z blog

プログラミングなどに関するブログです

Slackのgeneralチャンネルのメッセージを全削除するスクリプトを作ったけど削除できなかった

下記のようなコードを作って実行してみたけど、削除できなかった。理由は権限不足だった。 解決策をちょっと調べたけど分からなかったのであきらめた。

const {webClient, WebClient} = require('@slack/web-api');
require('dotenv').config();

const token = process.env.SLACK_TOKEN
const web = new WebClient(token);
const channelName = 'general';
const timeInterval = 1000;

const main = async () => {
  const channelId = await getChannelId();
  deleteMessages(channelId);
}

const getChannelId = async () => {
  const result = await web.conversations.list();
  const channel = result.channels.find(channel => channel.name === channelName);
  return channel.id;
}

const getMessages = async channelId => {
  const result = await web.conversations.history({channel: channelId});
  return result.messages;
}

const deleteMessages = async (channelId) => {
  const messages = await getMessages(channelId);
  console.log('messages length:', messages.length);
  if (messages.length <= 0) return;
  await _delete(channelId, messages);
  setTimeout(function(){deleteMessages(channelId)}, timeInterval);
}

const _delete = async (channelId, messages) => {
  const message = messages.pop();
  if (!message) return false;
  await web.chat.delete({channel: channelId, ts: message.ts});
  setTimeout(function(){_delete(channelId, messages)}, timeInterval);
}

main();

下記は、Slack APIのchat.deleteのドキュメントです。

chat.delete method | Slack

日本語訳すると、下記が書いてあった。

一般的なユーザートークンと共に使用すると、そのユーザーが投稿したメッセージのみが削除される場合があります。 管理ユーザーのユーザートークンと共に使用すると、ワークスペースに投稿されたほとんどのメッセージが削除される可能性があります。 ボットユーザーのトークンと共に使用すると、そのボットユーザーが投稿したメッセージのみが削除される場合があります。

最初はボットユーザ使ってたからダメだったのだと思って、管理ユーザでやってみたつもりだったのですが、今度はmissing scope的なメッセージ出てきたよく分からないからやめた。今度調べるかも。