🐈

SlackのAPIを叩いて、チャンネルと所属ユーザをcsvで取得する

2022/02/07に公開

SlackのAPIでいい感じにデータが欲しい!

Slackのチャンネル数が増加し、これって必要?こっちにマージされてない?最近稼働してないよね?
みたいなこと知りたくなりますよね、私はなりませんなりました。

token発行してAPI叩くだけやろ〜〜って思っていたのですが、若干のハマりポイントがあったので記事にします。

成果物

https://github.com/uewtwo/crawling-slack-channels-with-users
若干チャンネル数足りていないので、何かの条件でチャンネルが漏れています。(修正未定)

環境

$ sw_vers
ProductName:    macOS
ProductVersion: 12.2
BuildVersion:   21D49
$ node -v
v16.13.2

ちなみに、初めて sw_vers コマンドを知りました。

$ man sw_vers
~~~
DESCRIPTION
     sw_vers prints macOS version information for the currently running operating system on the local machine.
~~~

へー

Slack事前準備

基本的には
https://api.slack.com/tutorials/tracks/scheduling-messages
こちらの、Slack apiに対してPOSTがしたいよ!のチュートリアル通りに準備を進めていきます。
違いは叩くAPIだけなので。
今回使うのは、

channels:read
groups:read
im:read
mpim:read
users:read

これらを作ったアプリの権限として追加し、workspace にインストールしトークンを取得します。
事前準備は以上です。

Node.js側

github にソースがあるのでだいたいそれだけなんですが、httpクライアントをSlackモジュールがすべて代替してくれていて、AWS SDKとかもそうなんですが諸々知らなくてもTOKEN突っ込んで後はメソッドコールするだけで良いので、まあとても楽です。本当に何も知らなくてもできる、便利。

例えばチャンネルリストを取得する関数は

const { WebClient } = require('@slack/web-api')
const web = new WebClient(TOKEN)

// Get channel list
async function getChannels() {
    const param = {
        exclude_archived: true,
        limit: GET_LIMIT,
    }

    const res = await web.conversations.list(param)
    // Need channel name
    let channels = []
    res.channels.forEach(c =>
        channels.push(
            {
                channel_name: c.name,
                channel_id: c.id
            }))

    return channels
}

パラメータとして

  • exclude_archived: true --アーカイブされたチャンネルを取り除くかどうか
  • limit: 10000 --取得上限数
    を設定して、後は web.conversations.list を叩きます。
    レスポンスのうち、今回欲しいのがチャンネル名とチャンネルIDなので、それらを連想配列にしてまとめます.
    同様のフローで、
  • チャンネルリストを取得する
  • ユーザIDと名前をマッピングするために、ユーザリストを取得する
  • チャンネル毎に所属ユーザを取得する
  • 所属ユーザのIDから名前を引っ張る
  • ユーザリストにない場合、(外部ユーザだったので)直接ユーザを取得する(と何故か取得できる)
    みたいな流れになります。

Discussion