スポンサーリンク

【ほぼコピペでOK】地震情報をChatworkやその他ビジネスチャットツールで自動共有!

GAS
スポンサーリンク

はじめに

この記事では、Google Apps Scriptを利用して、ほとんどコピペだけで地震情報を指定したChatworkルームに自動共有する方法を紹介します。このスクリプトはChatworkに最適化されていますが、少しの調整で他のビジネスチャットツールやLINEなどにも適用可能です。

スクリプトの概要

このスクリプトは、地震情報APIから取得したデータを基に、震度3以上の地震情報をChatworkに自動投稿します。
これにより、チームや組織で素早く情報を共有し、対応を促進することが可能になります。
ただし、APIの仕様で
・1分間に60回までしかAPIを叩けない
ということや、実装の容易さを重視して、
・1分ごとにAPIを叩いて、地震があったかチェック=リアルタイム性が低め
であることにご留意ください
APIの仕様についてはこちらを参考にしました

こんな感じです

コピペ手順

最初のコピペ

var chatworkApiKey = PropertiesService.getScriptProperties().getProperty('Chatwork_API');

//↑カスタムプロパティ。カスタムプロパティってなぁに?って方は次の行のコードを使ってもらうとよいです
var chatworkApiKey = "ここにChatworkのAPIキーを挿入";
// 上の2つのコードは不要な方を削除してください

var chatworkApiEndpoint = 'https://api.chatwork.com/v2/rooms/';
var chatworkRoomId = '00000000'; // ChatworkのルームIDを設定
// 地震情報APIの設定
var earthquakeApiEndpoint = 'https://api.p2pquake.net/v2/jma/quake';
var minScale = 30; // 震度3以上。これを40/50と書き換えることで、別の震度をチェック可能です

2つ目のコピペ(ひとつひとつの関数の説明は、当記事最下部に置いときます)

function sendRecentSignificantEarthquakeInfo() {
  var lastQuakeId = PropertiesService.getScriptProperties().getProperty('lastQuakeId') || '';
  var earthquakes = fetchRecentEarthquakeData(); // 地震情報を取得

  // 取得した地震情報を時間順に並び替え(もしAPIが既に時間順で返しているなら不要)
  earthquakes.sort(function(a, b) { return new Date(b.time) - new Date(a.time); });

  for (var i = 0; i < earthquakes.length; i++) {
    var quake = earthquakes[i];
    if (quake.id === lastQuakeId) {
      break;  // 最新の処理済み地震に達したらループを抜ける
    }
    if (quake.earthquake.maxScale >= minScale && quake.earthquake.hypocenter.depth >= 0) { // 深さが0以上
      var message = formatMessage(quake); // メッセージを整形
      sendMessage(chatworkRoomId, message);  // Chatworkにメッセージを送信
      Utilities.sleep(2000)
    }
  }

  // 最新の地震情報のIDをlastQuakeIdとして保存
  if (earthquakes.length > 0) {
    var latestQuakeId = earthquakes[0].id;
    PropertiesService.getScriptProperties().setProperty('lastQuakeId', latestQuakeId);
  }
}

// 地震情報からメッセージを整形する関数
function formatMessage(earthquake) {
  var quakeInfo = earthquake.earthquake;
  var hypocenter = quakeInfo.hypocenter;
  return "【地震情報】\n" +
    "場所: " + hypocenter.name + "\n" +
    "マグニチュード: " + hypocenter.magnitude + "\n" +
    "震度: " + scaleToJapanese(quakeInfo.maxScale) + "\n" +
    "深さ: " + hypocenter.depth + "km\n" +
    "時間: " + earthquake.time;
}

// 震度を日本の震度表記に変換する関数
function scaleToJapanese(scale) {
  var scales = {
    10: "震度1",
    20: "震度2",
    30: "震度3",
    40: "震度4",
    45: "震度5弱",
    50: "震度5強",
    55: "震度6弱",
    60: "震度6強",
    70: "震度7"
  };
  return scales[scale] || scale;  // 該当する震度がなければそのままの値を返す
}

// 地震情報を取得する関数
function fetchRecentEarthquakeData() {
  var response = UrlFetchApp.fetch(earthquakeApiEndpoint + '?limit=10');
  var data = JSON.parse(response.getContentText());
  return data;  // APIから取得した地震情報の配列
}

3つ目のコピペ(これがChatworkへ送信するための部分)

Chatwork以外の何か(例えばSlackやLINEのオープンチャットとか)に送信したい場合は、
このコードをいじるか、別途作成しましょう

作成した場合、
sendRecentSignificantEarthquakeInfo関数に含まれている
sendMessage(chatworkRoomId, message); // Chatworkにメッセージを送信
に適当に差し替えてもらえばOKです

function sendMessage(roomId, message) {
  var url = chatworkApiEndpoint + roomId + '/messages';

  var payload = {
    'body': message
  };

  var options = {
    'method': 'post',
    'headers': {'X-ChatWorkToken': chatworkApiKey},
    'payload': payload
  };

  try {
    // メッセージの送信を試みます
    UrlFetchApp.fetch(url, options);
  } catch (e) {
    // エラーが発生した場合は、エラーメッセージを同じルームに送信します
    var errorMessage = 'エラー発生: ' + e.toString();
    payload.body = errorMessage;
    UrlFetchApp.fetch(url, options);  // エラーメッセージを送信
  }
}

仕上げのトリガー設定

sendRecentSignificantEarthquakeInfo関数を以下のような感じでトリガー設定しましょう

各関数の説明

  1. 《sendRecentSignificantEarthquakeInfo》関数: この関数は、最新の地震情報を取得し、Chatworkにメッセージとして送信します。地震の規模が指定された震度以上である場合のみ、情報が送信されます。また、この関数は最後に処理した地震のIDを記録し、同じ情報の重複送信を避けます。
  2. 《formatMessage》関数: 地震情報をわかりやすいメッセージフォーマットに整形します。地震の場所、マグニチュード、震度、深さ、時間を含むメッセージを作成します。
  3. 《scaleToJapanese》関数: 数字で表される震度を日本の震度表記に変換します。
  4. 《fetchRecentEarthquakeData》関数: APIから最近の地震情報を取得します。
  5. 《sendMessage》関数: 指定されたChatworkルームにメッセージを送信します。APIキーをヘッダーに含め、POSTリクエストを送ります。

コメント

タイトルとURLをコピーしました