Slackは見ないけどLineは見る人向けSlack App(Event API使用)を作った
概要
- 「Slackは見ないけど、Lineは見る」という謎の論理を持った人のためにSlackでメッセージを飛ばしたらLineで通知が入るようにした
- サクッと作れると思ったら、Outgoing Webhookはlegacyとか言われたのでEvent APIを使って作った
前置き
- 大まかな流れは以下のサイトを参考にさせていただきました。
- しかしながら、いざ作ろうとOutgoing Webhooksのページに行ったら次のような但し書きが...
- 「Outgoing Webhooksは廃止されるかもしれないので、Slack App作ってやってね!(意訳)」
- というわけで、Outgoing Webhooksは使わずにEvent APIを使ってやってみた
手順
GAS(Google App Script)の設定
- 今回はSlackからGASにメッセージの内容を飛ばして、GASからLineに通知させる
- Outgoing WebhooksではSlack側でtrigger phaseを設定していたが、Event APIにはそんな機能は無いそうなので、GAS側でメッセージの内容によってLineに送る/送らないを決めさせる
- 自分のGoogle DriveにGoogle App Scriptを作成、同時にデバッグ用のスプレッドシートも作成しておく
- Slack Event API認証用のコードを書く
- コードは次のサイトを参考にさせていただきました。
- ウェブアプリケーションとして公開する
- 後で使うので現在のウェブアプリケーションのURLを控えておく
- ハマりポイント:プロジェクトバージョンを必ずNewにする
Slack Appを作る
- Slack API: Applications | Slack からCreate New Appして設定する
- App Nameには適当な名前を、Development Slack WorkspaceにはSlackで通知させたいワークスペースを選ぶ
- Install Appする
- 許可云々が出てくるので自分の主義に見合ったら許可
- Event Subscriptionsでいろいろ設定
- Request URLには控えておいたGASのURLを入力
- 入力してVerifiedになったら、Subscribe to Workspace Eventsでmessage.channelsを選択する
- Slack API: Applications | Slack からCreate New Appして設定する
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に関しては後述
- Line Notifyを設定する
- Line Notify にLineのアカウントでログインしてマイページに進む
- Tokenを取得する
- 出てきたTokenを先ほどのGASのプロパティに設定する
動かしてみる
- Slack上の任意のチャンネルで「@line」をつけてメッセージを送ると、Line Notifyから何かしらのメッセージが来ているはずです
トラブルシューティング(動かないときは)
- Google Drive上に置いてあるスプレッドシートでログを確認し、Slackからjsonが送られているか、jsonをparseできているか等を確認する
- GAS上で上記の
function send(message)
のみを動かしてLine Notifyから通知が来るか確認する- 通知が来ると
[ トークン名 ] undefined
の形で表示される
- 通知が来ると
思ったこと
- 以外に簡単にできる(Line Notifyが使えない頃は通知のためだけにチャットボットを作っていたので)
- これでSlackを見ないという可能性は排除できたので、それでも見ないなら、その団体に興味がないということかもしれない