Slackのチャンネル一覧を取得するスクリプトを書いた

こんにちは、CTOの山岡(@hiro_yもしくは@hiroy.kotori.style)です。

イノベーター・ジャパンではコミュニケーションのツールとしてSlackを利用しています。今回、たくさんあるチャンネルの整理を図ろうという話が出てきたのですが、現在契約しているProプランだとSlackが用意しているチャンネル管理ツールを利用できません。

要件としてはとりあえずチャンネルの一覧を出力できればよいだけなので、さくっとNode.js(バージョンは18系を想定)でチャンネル一覧のCSVファイルを出力するコードを書いて解決しました。

実行には.envという名前のファイルでSLACK_USER_OAUTH_TOKENの値を設定する必要があります。値はSlackでアプリを作成、User Token Scopesでchannels:readusers:readgroups:readを許可、生成された「User OAuth Token」をコピーして利用します。

const { WebClient } = require("@slack/web-api");
const dayjs = require("dayjs");
const fs = require("node:fs");
const Json2csvParser = require("json2csv").Parser;

require("dotenv").config();

const client = new WebClient(process.env.SLACK_USER_OAUTH_TOKEN);

async function getMembers() {
  // see: https://api.slack.com/methods/users.list
  const result = await client.users.list({
    limit: 1000,
  });
  const members = new Map();
  for (const member of result.members) {
    members.set(member.id, { name: member.name });
  }
  return members;
}

(async () => {
  const members = await getMembers();

  // see: https://api.slack.com/methods/conversations.list
  const result = await client.conversations.list({
    exclude_archived: true,
    types: "public_channel,private_channel",
    limit: 1000,
  });

  const data = [];
  for (const channel of result.channels) {
    const creator = members.get(channel.creator);
    data.push({
      name: channel.name,
      purpose: channel.purpose?.value,
      connected: channel.is_ext_shared ? "○" : "",
      private: channel.is_private ? "○" : "",
      creator: creator?.name || "",
      created: dayjs.unix(channel.created).format("YYYY-MM-DD"),
    });
  }

  const fields = ["name", "purpose", "connected", "private", "creator", "created"];
  const parser = new Json2csvParser({ fields, header: true });
  const csv = parser.parse(data);
  const output = fs.createWriteStream("./slack-channels.csv", { encoding: "UTF-8" });
  output.write(csv);
})();

実行するとslack-channels.csvという名前でSlackのチャンネル一覧が記載されたCSVファイルが生成されます(このまま実行すると、publicなチャンネルだけでなくprivateなチャンネルも含んだ一覧となります。取得件数は必要に応じて要調整)。

見てわかるとおり、データを取得・整形しているだけです。Node.jsの場合npmの豊富なライブラリを利用できるのでとても助かります。ちょっとしたツールを作るときに便利なので、自分の場合こういうときはNode.jsを使うことが多いです。

コードを書くことで簡単に問題を解決できると気持ちいいですね。気軽にこういう小さなツールも作っていきたいものです。