🐈
SlackのAPIを叩いて、チャンネルと所属ユーザをcsvで取得する
SlackのAPIでいい感じにデータが欲しい!
Slackのチャンネル数が増加し、これって必要?こっちにマージされてない?最近稼働してないよね?
みたいなこと知りたくなりますよね、私はなりませんなりました。
token発行してAPI叩くだけやろ〜〜って思っていたのですが、若干のハマりポイントがあったので記事にします。
成果物
若干チャンネル数足りていないので、何かの条件でチャンネルが漏れています。(修正未定)
環境
$ 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事前準備
基本的には
違いは叩くAPIだけなので。
今回使うのは、
- conversations.list
https://api.slack.com/methods/conversations.list - conversations.members
https://api.slack.com/methods/conversations.members - users.list
https://api.slack.com/methods/users.list - users.info
https://api.slack.com/methods/users.info
になります、必要なUser Token Scopesは下記の通り。
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