LoginSignup
4
1

KCCS APIデータ配信サービスの災害データPUSH配信機能をつかって震度情報をSlack通知する

Last updated at Posted at 2022-06-06

弊社がサービス提供しておりますKCCS APIデータ配信サービスでは、震度データなど災害データを取り扱っています。
災害データは、実績データをRESTで取得する機能と、Google Cloud Pub/Subを利用したPUSH配信機能があります。
今回は、PUSH配信された震度データを、GASを使ってslackへ連携する方法をご説明したいと思います。

Google Cloud Pub/Subについては、下記を参照ください。
震度データはサブスクリプションから抽出します。
抽出はpull方式とpush方式両方とも対応可能です。今回はpull方式で抽出してみたいと思います。

GASを使ったslack通知

それでは災害データとして、KCCS APIデータ配信サービスが取り扱っているデータの一つである、地震震度データを例にコードを書きます。

slackへの連携は「Incoming Webhook」を利用します。
https://slack.com/intl/ja-jp/help/articles/115005265063-Slack-%E3%81%A7%E3%81%AE-Incoming-Webhook-%E3%81%AE%E5%88%A9%E7%94%A8

GASのコード

コード全体は下記gitのURLに配置しています。

Cloud Pub/Sub APIを利用しています。

以下では、コードの一部をピックアップして記載していきます。

1. 変数定義

必要な変数5つは事前に定義しておきます。
サブスクリプションの認証に必要なサービスアカウントのキーファイルもアップロードしておきます。

const project = '<Google Cloud Project ID>';
const sub = '<Google Cloud subscription ID>'
const maxMessages = 3
const slackID = 'https://hooks.slack.com/services/<slack id>'
const key_file = '<jsonファイル名>'  // キーファイル(jsonファイル)をアップロード

function main() {
  // 認証確認
  var access = pubsubAccess()
  if (access) {
    // pullでmessage取得
    var ret = pull(sub);
    // retの値がnullでなければslack通知する
    if (ret) {
      // slack通知用メッセージ作成
      makeMessage(sub, ret)
    }
  }
}

2. サブスクリプションからpullする関数

サブスクリプションからpullする方法については、以下を参考にしてください。
Project IDおよびsubscription IDをつかってurlを作成、リクエストを送ります。
https://cloud.google.com/pubsub/docs/reference/rest/v1/projects.subscriptions/pull

function pull(sub) {
  var service = getService();
  
  var url = 'https://pubsub.googleapis.com/v1/projects/[PROJECT]/subscriptions/[SUB]:pull'
  .replace("[SUB]", sub)
  .replace("[PROJECT]", project);
    
  var body = {
    "returnImmediately": false,
    "maxMessages": maxMessages
  };

    var response = UrlFetchApp.fetch(url, {
    method: "POST",
    contentType: 'application/json',
    muteHttpExceptions: true,
    payload: JSON.stringify(body),
    headers: {
      Authorization: 'Bearer ' + service.getAccessToken()
    }
  });
 
  var result = JSON.parse(response.getContentText());

  return {
    result: result
  }    
} 

3. slackへメッセージを連携する関数

サブスクリプションから受信したメッセージをslackに送ります。
アイコンとタイトルもつけてみます。

function sendSlackMessage( title , iconEmoji , message ){

  // Slack通知
  var options =
  {
    "method" : "post",
    "contentType" : "application/json",
    "muteHttpExceptions": true,
    "payload" : JSON.stringify({
      "username" : title,
      "icon_emoji" : iconEmoji ,
      "text" : message
    })
  };

  try {
    var res = UrlFetchApp.fetch(slackID, options);
    Logger.log(res)
    return res
  } catch(e) {
    // 例外エラー処理
    Logger.log('Error:')
    Logger.log(e)
    return null
  }
}

実行されると、下記のようにデータが出力されました。
image.png

JSON形式そのままなので、わかりにくいですね。
整形して出すようにすれば、もっとわかりやすくなりそうです。

JSONデータ整形をし、slackに分かりやすく表示してみる

JSONデータの必要な部分だけ抽出し、整形してみます。

function replaceMessage(text) {

  var jsonObject = JSON.parse(text)
  var jsonReportDatetime = jsonObject.report_datetime //発表日時
  var jsonOriginTime = jsonObject.body.earthquake.origin_time //発生時刻
  var jsonHypocenterArea = jsonObject.body.earthquake.hypocenter.area.name //震央地名
  var jsonMagnitudeDescription =  jsonObject.body.earthquake.magnitude_description //震源地マグニチュード文字列
  var jsonMaxInt = jsonObject.body.intensity.observation.max_int //最大震度
  var jsonPref = jsonObject.body.intensity.observation.pref //エリアごとの震度情報

  jsonString = "発表日時:" + getStringFromDate(jsonReportDatetime) + "\n" 
             + "発生時刻:" + getStringFromDate(jsonOriginTime) + "\n"
             + "震央地名:" + jsonHypocenterArea + "\n" 
             + "震源地マグニチュード文字列:" + jsonMagnitudeDescription + "\n" 
             + "最大震度:" + jsonMaxInt + "\n" 
             + "各都道府県の最大震度は下記の通り:\n"
  var jsonArray=[]
  for(i=0;i<jsonPref.length;i++){
    jsonArray.push("     " + jsonPref[i]["name"]+ "の最大震度:" + jsonPref[i]["max_int"])
  }
  var jsonArrayString = jsonArray.join("\n");
  var jsonString = jsonString + jsonArrayString 
  return jsonString
}

分かりやすく情報を表示することができました。
image.png

4
1
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
4
1