Quantcast
Channel: Bashタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 2804

Slackで特定の人たちがいる場合channelをleaveするためのscriptを書いてみた

$
0
0

今日Slackにおいては豊富なAPIが用意されている気がします

それらを組み合わせることによりいろいろなことが出来るきがします

今回は

を使い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

基本的な流れとしては

  1. チャンネル一覧を取得
  2. そのchannelID単位でサブシェルを起動
  3. サブシェル内でメンバー一覧を取得
  4. grepコマンドの返り値で存在を確認
  5. 存在していたらチャンネルを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をしておきます

最後に

レート制限に気を付けたほうがいい気もします


Viewing all articles
Browse latest Browse all 2804

Trending Articles