LoginSignup
59
46

More than 5 years have passed since last update.

slackをいつまでも見ないメンバーのためにLINEで通知するbotをお手軽に作る

Last updated at Posted at 2017-10-10

概要

Slackを使ったチームの制作をしていたのですが、メンバーの数名がいつまでたってもSlackを見ない残念な人たちだったためLINEにあるグループに通知をするbotを作る事にしました。(Slackは見なくてもLine見ない奴はいねーだろって考えです)
かといってそんな残念な人たちのために労力かけるのもアホらしいのでGASとLINE Notifyを使ってお手軽に実装しました。

#必要なもの
・Google Apps Script(GAS)が書ける環境
・LINE Notify(LINEのアカウントが必要) https://notify-bot.line.me/ja/
・Outgoing WebHooks

#作るもの
今回はslack上のすべてのチャンネルで@lineというワードを検出した時にLINEグループに通知を送るというものを作ります。
仕組みとしては以下の通り

1 ユーザーが@lineが含まれる投稿をSlackで行う
キャプチャ.PNG

2 Slack側のOutgoing WebHooksがGASのアプリケーションのURLに対してPOSTする。

3 GAS側でLINENotifyのAPIをたたく

4 LINEに通知が来る
キャプチャ2.PNG

5 世界が平和になる

サーバーとかよくわかんないけどサクッと実装できました。

#制作

#####LINE Notify
https://notify-bot.line.me/ja/ にアクセスしログインする

マイページからトークン発行をクリック
キャプチャ3.PNG

トークン名はbotがLINEで発言するときに表示されるのでわかりやすいものをつけましょう
通知を送信するトークルーム(今回は開発のLINEグループ)を指定
キャプチャ4.PNG

発行するをクリックするとトークンが発行されるのでメモなどに控えておきます。
キャプチャ5.PNG

これでLINE Notifyの設定は完了です。
正常に設定が終わっているとトークンが発行されたタイミングでLINE Notifyから通知が来ます
キャプチャ6.PNG

#####GASでスクリプトを書く
続いてGoogle Apps Scriptでスクリプトを書いていきます。

code.gs
function doPost(e) {

   //各種情報を取得
   var chName = e.parameter.channel_name;
   var userName = e.parameter.user_name;
   var text = e.parameter.text;
   //@lineの部分はいらないから削除しとく
   text =text.substring(5);
  var msg = "LINEにも通知したい投稿がSlackで行われました。\n各自確認してください。\n発言のあったチャンネル"+chName+
    "\n発言者 "+userName+ "\n内容 : "+text;
  //送信
  send(msg);
}

function send(message)
{
  //lineトークン
  var token = "ここにLINENotifyで発行したトークンを入れる";
  
  var op =
      {
        "method" : "post",
        "payload": "message=" + message,
        "headers":{"Authorization" : "Bearer " + token}
      };
UrlFetchApp.fetch("https://notify-api.line.me/api/notify",op);
}

とりあえずこれでOKです。
doPostの引数のeにslackのOutgoing WebHooksから送られるPOSTの内容が入っています。
その情報を元にメッセージを作って自作のsend関数でLINEのAPIをたたいてます。

書き終わったらこのスクリプトを実行できるようにします。
GASのエディタのメニューにある公開からウェブアプリケーションとして導入をクリック。

プロジェクトバージョンは新規作成にして(スクリプトを更新する際も新規作成にする)、
アプリケーションにアクセスできるユーザーは全員(匿名ユーザーを含む)に設定
キャプチャ9.PNG

作成するとURLが出てくるのでこれも控えます。
キャプチャ10.PNG

#####Outgoing WebHooks
最後にSlack側と連携をしていきます。
https://チームURL/apps/manage
にアクセスし上のほうにあるSearch App DirectoryにOutgoing WebHooksと入力します
キャプチャ7.PNG
Add Configurationをクリック

キャプチャ8.PNG
Add Outgoning WebHooks integrationをクリック

キャプチャ11.PNG
設定をしていきます
Channelには発言を監視するチャンネルを設定します。
今回は全てのチャンネルを監視したいのでAnyを選択
Trigger World(s)にはLineに通知する投稿だと識別するためのキーワードを設定します
今回は@lineで設定
URL(s)には先ほど発行したGASのWebアプリケーションURLを入れます。
Tokenはこのあと使います。

設定が終わったら下のほうにあるSave Settingsをクリックして完了です。

#####コードを修正
このままだとGASのアプリケーションURLを知られてしまうと不正にアプリケーションが実行されてLINEに投稿される恐れがあるので
先ほどのOutgoing WebHooksの設定画面にあったトークンを使い、Slackチームからの実行以外は弾くようにスクリプトを修正していきます。

fixcode.gs
 function doPost(e) {
//追記ここから//////////////////////////////////////////////// 
 //投稿のトークン取得
  var t = e.parameter.token;
   
  //トークンが一致しているか
  if( t != "Outgoing WebHooksの設定画面にあったトークン")
  {return;}
//追記ここまで////////////////////////////////////////////////   


   //各種情報
   var chName = e.parameter.channel_name;
   var userName = e.parameter.user_name;
   var text = e.parameter.text;
   //@lineの部分はいらないから削除しとく
   text =text.substring(5);
  var msg = "LINEにも通知したい投稿がSlackで行われました。\n各自確認してください。\n発言のあったチャンネル"+chName+
    "\n発言者 "+userName+ "\n内容 : "+text;
  send(msg);
}

function send(message)
{
  //lineのほうのトークン
  var token = "ここにLINENotifyで発行したトークンを入れる";
  
  var op =
      {
        "method" : "post",
        "payload": "message=" + message,
        "headers":{"Authorization" : "Bearer " + token}
      };
UrlFetchApp.fetch("https://notify-api.line.me/api/notify",op);
}

修正したらまたGASのエディタのメニューにある公開からウェブアプリケーションとして導入をクリックし、アプリケーションを更新します
プロジェクトバージョンは新規作成にしないと反映されないので注意。

更新したら動作確認をしてみましょう。
LINEグループにLINE Notifyアカウントを追加すれば準備OK!

#完成
Slackで投稿すると
キャプチャ12.PNG
通知が来る!
キャプチャ13.PNG

楽しい!

とりあえず望んでいたことが簡単に実装できました(満足)
GAS便利。
果たしてこれでSlack見ない残念な人たちにも連絡が伝わるのか・・・

59
46
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
59
46