今日Slackにおいては豊富なAPIが用意されている気がします
それらを組み合わせることによりいろいろなことが出来るきがします
今回は
- conversations.list (チャンネル一覧の取得)
- conversations.members (指定したチャンネルにおけるメンバー一覧の取得)
- conversations.leave (指定したチャンネルから離れる)
を使いtitleにあるような基本的なことを行うscriptを以下に書いてみます
#!/bin/bashexport TOKEN=hogehoge
export TARGETS=(
fugafuga
piyopiyo
)
targetSearchCMD(){
toOption(){echo"${TARGETS[@]}" | xargs -n1-d' '-I{}printf" -e {}"}echo grep-q$(toOption)}
getChannels(){while true
do
local channelsJSON=$(curl -s"https://slack.com/api/conversations.list?token=${TOKEN}&types=public_channel%2Cprivate_channel&pretty=1&cursor=${NEXT}" | tee test.log | jq '{"next":(.response_metadata.next_cursor),"channels"}|.channels|=map(select(.is_member and (.is_archived | not) and (.is_general | not))|{id})')echo$channelsJSON | jq '.channels[].id'-rlocal NEXT=$(echo$channelsJSON | jq .next -r)if["$NEXT"==""];then
break
fi
done}
getMembers(){local-rchannelID=$1while true
do
local channelsJSON=$(curl -s"https://slack.com/api/conversations.members?token=${TOKEN}&channel=${channelID}&pretty=1&cursor=${NEXT}")echo$channelsJSON | jq '.members[]'-rlocal NEXT=$(echo$channelsJSON | jq '.response_metadata.next_cursor'-r)if["$NEXT"==""];then
break
fi
done}export-f getMembers
leaveChannel(){
curl -s"https://slack.com/api/conversations.leave?token=${TOKEN}&channel=${1}&pretty=1"}export-f leaveChannel
main(){timeout 300 bash -c getChannels | xargs -I{}-P5 bash -c"timeout 30 bash -c 'getMembers {}' | $(targetSearchCMD)&& leaveChannel {}"}
main
基本的な流れとしては
- チャンネル一覧を取得
- そのchannelID単位でサブシェルを起動
- サブシェル内でメンバー一覧を取得
- grepコマンドの返り値で存在を確認
- 存在していたらチャンネルをleave
となります
conversations.list
conversations.listはchannel一覧を取得するためのapiです
ただ一回のリクエストで全部取得できるわけではないです
次のlistを取得したい場合は response の .response_metadata.next_cursor
をクエリパラメタのcursorに指定して上げる必要があります
リクエスト時、このcursorが空の場合挙動としては最初のlistを返すっぽいです
また .response_metadata.next_cursor
が空文字の場合、最後のlistであることを表すっぽいです
今回のscriptでは getChannels()
内でcursorを見てloopを回すことにより全てのchannelIDを見ることにしています
また標準出力で吐くchannelIDに関してはleave出来るものを jq の select(.is_member and (.is_archived | not) and (.is_general | not)
で取得します
conversations.members
conversations.membersはクエリパラメタchannel
のvalueをもとにそのchannelのメンバー一覧を取得します
こちらのapiもconversations.listと同様に一回のリクエストで全てのメンバーのIDが手に入るわけではないです
なので一覧が必要な場合 .response_metadata.next_cursor
でloopさせなければなりません
今回は getMembers()
でメンバーのID一覧を標準出力に吐かせるために使います
サブシェルで動かすので export -f
します
conversations.leave
conversations.leaveはクエリパラメタで渡したチャンネルをleaveすることが出来ます。
ただし、以下の場合はleave出来ない模様です
- is_generalがtrue
- is_archivedがtrue
こちらも export -f
をしておきます
最後に
レート制限に気を付けたほうがいい気もします