yukuro’s blog

ぽえむ日記

Slackは見ないけどLineは見る人向けSlack App(Event API使用)を作った

概要

  • 「Slackは見ないけど、Lineは見る」という謎の論理を持った人のためにSlackでメッセージを飛ばしたらLineで通知が入るようにした
  • サクッと作れると思ったら、Outgoing Webhookはlegacyとか言われたのでEvent APIを使って作った

前置き

手順

  1. GAS(Google App Script)の設定

  2. Slack Appを作る

    1. Slack API: Applications | Slack からCreate New Appして設定する
      • App Nameには適当な名前を、Development Slack WorkspaceにはSlackで通知させたいワークスペースを選ぶ
    2. Install Appする
      f:id:kuroblo039:20190426185715p:plain
      • 許可云々が出てくるので自分の主義に見合ったら許可
    3. Event Subscriptionsでいろいろ設定
      f:id:kuroblo039:20190426185934p:plain
      • Request URLには控えておいたGASのURLを入力
      • 入力してVerifiedになったら、Subscribe to Workspace Eventsでmessage.channelsを選択する
  3. GASのコードを書き換える

    • 先ほどのAPIの認証が終わったら以下のコードに書き換える
function doPost(e) {
   var params = JSON.parse(e.postData.getDataAsString());
   logging(params);
   
   var api_app_id = PropertiesService.getScriptProperties().getProperty('API_APP_ID');
   var received_app_id = params.api_app_id;

   //APPIDが一致しているか
   if(received_app_id != api_app_id)
   {return;}

   //各種情報
   var postype = params.event.type;
   var postext = params.event.text;
   logging(postext.slice(0,5));
   if(postype == 'message' && postext.slice(0,5) == '@line'){
     var msg = "LINEにも通知したい投稿がSlack上に投稿されました。\n各自「必ず」確認してください。\n内容 : "+ postext;
     send(msg);
   }
}

function send(message)
{
  //lineのほうのトークン
  var token = PropertiesService.getScriptProperties().getProperty('LINE_ACCESS_TOKEN');

  var op =
      {
        "method" : "post",
        "payload": "message=" + message,
        "headers":{"Authorization" : "Bearer " + token}
      };
UrlFetchApp.fetch("https://notify-api.line.me/api/notify",op);
}

//GAS当てにrequestが飛ぶと、スプレッドシートに飛んできたjsonが保存される
function logging(str) {
  var id = PropertiesService.getScriptProperties().getProperty('SPREADSHEET_ID'), 
      sheet = SpreadsheetApp.openById(id).getActiveSheet(),
      ts    = new Date().toLocaleString('japanese', {timeZone: 'Asia/Osaka'});
  sheet.appendRow([ts, str]);
}


* SPREADSHEET_IDは作成したスプレッドシートのURLの後にくっついてるもの(https://docs.google.com/spreadsheets/d/XXXXX のXXXXX)
* API_APP_IDはSlack API設定ページのBasic Informationにある
* LINE_ACCESS_TOKENに関しては後述

  1. Line Notifyを設定する
    1. Line Notify にLineのアカウントでログインしてマイページに進む
    2. Tokenを取得する
      f:id:kuroblo039:20190426193752p:plain
    3. 出てきたTokenを先ほどのGASのプロパティに設定する

動かしてみる

  • Slack上の任意のチャンネルで「@line」をつけてメッセージを送ると、Line Notifyから何かしらのメッセージが来ているはずです
    f:id:kuroblo039:20190426200027p:plain

トラブルシューティング(動かないときは)

  • Google Drive上に置いてあるスプレッドシートでログを確認し、Slackからjsonが送られているか、jsonをparseできているか等を確認する
  • GAS上で上記の function send(message) のみを動かしてLine Notifyから通知が来るか確認する
    • 通知が来ると [ トークン名 ] undefined の形で表示される

思ったこと

  • 以外に簡単にできる(Line Notifyが使えない頃は通知のためだけにチャットボットを作っていたので)
  • これでSlackを見ないという可能性は排除できたので、それでも見ないなら、その団体に興味がないということかもしれない