strelka_dogのブログ

徒然なるままに心に移り行くよしなしごとをそこはかとなく書き尽くるブログ

Slackでチャンネルを追い出されても戻ってくるスクリプトを組んだ話

いろはにはツンデレな友達がいて彼のことを褒めるとすぐに恥ずかしがってサークルのslackのとあるチャンネルから追い出そうとしてきます。

なので今回はSlackでチャンネルを追い出されても戻ってくるスクリプトを組んでみました。

環境

Slackのevent APIを使って実装しようと考えたのでRailsでサーバー立てようとしたけどPOST受け取って決まった動作するだけならGASで十分じゃんということに気付き今回の環境はGASに決定!

コード

function doPost(e){
  var params = JSON.parse(e.postData.getDataAsString());
  if (params.event.type=="member_left_channel" && params.event.channel==チャンネルID(Cからはじまるやつ) && params.event.user==ユーザーID(Uからはじまるやつ)){
    var sendData = {
      'channel': チャンネルID(Cからはじまるやつ),
      'token':トークン(xoxpからはじまるやつ)
    };
    var options = {
      "method": "post",
      "payload": sendData
    };

    UrlFetchApp.fetch("https://slack.com/api/conversations.join", options);
  }
  return ContentService.createTextOutput(params.challenge);
}

アプリの登録とかURLの登録とかの方法まで書くのは面倒なのでこちらでも参考にしてみてください
www.pnkts.net

最初監視するイベントをchannnel_leftにしてたんだけどどうやらこれは自分でチャンネルから出た時に通知が飛ぶみたいで他人に追い出された時は反応しなかったのでこのmember_left_channnelを使った。

ちなみにmember_left_channnelで届くJSONはこんな感じ

{

    token:トークン
    team_id:チームID
    api_app_id:APIアプリID
    event:{
        type:member_left_channel
        user:出て行ったユーザーのID
        channel:出て行ったチャンネルのID
        channel_type:C
        team:チームID
        event_ts:タイムスタンプ
    }
    type:event_callback
    event_id:イベントID
    event_time:時間
    authorizations:[
        0:{
            enterprise_id:null
            team_id:チームID
            user_id:BotのユーザーIDかな調べてないから分からんけど
            is_bot:true
            is_enterprise_install:false
        }
    ]
    is_ext_shared_channel:false
    event_context:1-member_left_channel-チームID-チャンネルID

}

詰まったところ

大きく3つの部分で詰まった

  • まず送られてくるjsonの形式を勘違いしてて最初上手く動かなかった。GASってdoPostの関数内でconsoleに書き出した時後でその出力を確認する方法ってないのかな
  • 次に使用すべきAPIを間違えてた。雑に英語のAPIのページ内でleftとかで調べてたら出てきたchannnel_leftを最初に使ったんだけど、さっきも言ったようにchannnel_leftのイベント監視では人に追い出された時に発火しないので今回目的としている「Slackでチャンネルを追い出されても戻ってくるスクリプト」には使えなかった。member_left_channnelを使おう
  • さらにチャンネルに参加するAPIも間違えてた。Slackの英語で書かれたAPIのページを見ながらconversations.inviteが使えるのかなと思って書いたが上手くいかなかった。エラーを見るとどうやら自分のアカウントを自分でinviteするのは出来ないらしい。自分がチャンネルに参加するのはconversations.joinを使わないとダメだということが分かった。


ネタプログラムとしてはまぁまぁ面白いのが出来た気がする。いろはは集中力が続かないので一晩で出来るプログラムしか書けないんだよね

今後もいいネタが思いついたら作っていこうと思う。