Slackのチャンネルをリスト化するやつ

# はじめに

みなさんはSlackを利用していますか？
Slackって気づいたらめちゃくちゃチャンネルが乱立しているんですよね。。。
チャンネルの整理をしようと思っても、Slackは契約プランによって[Slackが用意しているチャンネル管理ツール](https://slack.com/intl/ja-jp/help/articles/360047512554-%E3%83%81%E3%83%A3%E3%83%B3%E3%83%8D%E3%83%AB%E7%AE%A1%E7%90%86%E3%83%84%E3%83%BC%E3%83%AB%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B)が使えない場合があります（というかビジネスプランとEnterprise Grid プランでないと使えない。。。）

ということで、自分が所属しているチャンネルのみという条件にはなりますが、チャンネル一覧を出力できるツールをNode.jsで作ってみました。

:::note warn
注意
プライベートチャンネルは自分が所属しているもののみ取得できます。
自分が入っていないプライベートチャンネルは取得できませんの注意してください。
:::

それでは以下より、手順を説明します。

# Slackアプリを作成

https://api.slack.com/apps

上記のApp管理画面より「Create an App」で新規アプリを作成する。

![スクリーンショット 2024-06-14 17.35.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/934471/2efe48ae-8f23-b9d7-3dae-ce7b2bf99c41.png)

「From an app manifest」を選ぶ。

![スクリーンショット 2024-06-14 17.39.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/934471/2d577d44-b16b-50e0-dcc3-539ac201c3b6.png)

追加するワークスペースを選択する。

![スクリーンショット 2024-06-14 17.40.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/934471/49d21a55-ddc0-56eb-0840-052e88f2af86.png)

必要に応じて`name`（アプリ名）を変更する。（後でも変更できます）
今回は`Demo App`のまま進みます。

![スクリーンショット 2024-06-14 17.41.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/934471/b1e26c1a-8524-1d4d-3cbf-a922d10e9316.png)

確認。問題なければ「Create」をクリックしてAppを作成します。

![スクリーンショット 2024-06-14 17.43.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/934471/ee827148-5190-cbfc-812a-5c902bee5609.png)


# アプリ権限の付与

「Permissions」をクリックして権限設定ページを表示。

![スクリーンショット 2024-06-14 17.45.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/934471/19d88504-8dfc-7d1c-4d88-587f8ed56452.png)

ページを下にスクロールして、Scopesメニューを表示。
User Token Scopesの欄で、「Add an OAuth Scope」を追加する。追加する権限は以下の3つ。
`users:read` `channels:read` `groups:read`

![スクリーンショット 2024-06-14 17.49.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/934471/5f07ed21-b167-3525-4bb6-76efd1703ff7.png)

同ページの上の方へ戻り、「Install to Workspace」をクリックしてアプリをワークスペースに追加する。

![スクリーンショット 2024-06-14 17.53.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/934471/31dfc871-ff82-4b18-830b-6d5440d93b52.png)

確認画面が表示されるので問題なければ「許可する」をクリック。

![スクリーンショット 2024-06-14 17.54.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/934471/99f8f5b6-15c1-d903-0d98-d68af56be2d5.png)

アプリがワークスペースに追加されると、`User OAuth Token`が表示されるのでコピーする。

:::note warn
注意
User OAuth Tokenは外部に漏れないように管理してください。
:::

![スクリーンショット 2024-06-14 17.55.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/934471/0d29e656-c3f0-1e87-d982-b2a8c7853394.png)

# Node.jsアプリの作成

「.env」を作成して先ほどコピーしたUser OAuth Tokenを設定する

```jsx
SLACK_USER_OAUTH_TOKEN=
```

以下の「index.js」を作成する

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

require("dotenv").config();

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

async function getMembers() {
  const result = await client.users.list({ limit: 1000 });
  const members = new Map();
  result.members.forEach(member => {
    members.set(member.id, { name: member.real_name || member.name });
  });
  return members;
}

async function getChannels() {
  const result = await client.conversations.list({
    exclude_archived: "true",
    types: "public_channel,private_channel",
    limit: 1000
  });

  return result.channels;
}

async function generateCsvReport() {
  const members = await getMembers();
  const channels = await getChannels();

  const data = channels.map(channel => {
    const creator = members.get(channel.creator);
    return {
      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 Parser({ fields, header: true });
  const csv = parser.parse(data);

  fs.writeFileSync("./channels.csv", csv, "UTF-8");
}

generateCsvReport().catch(console.error);

```

モジュールのインストール

```bash
npm install @slack/web-api dayjs json2csv dotenv
```

実行

```bash
node index.js
```

index.jsを実行した場所に `channels.csv` ができます。

以上です。


:::note warn
この記事は個人の見解であり所属する組織を代表しません。
:::