気象庁のサイトから地震情報を取得してメール通知する
この記事でやること
気象庁のサイトから地震情報を取得して、
緊急地震速報(震度5弱以上)レベルの場合はメール通知するプログラミングを行います。
Google Apps Scriptで作ります。
この記事を書くに至った経緯
先日、Googleフォームを用いて安否確認システムを作りました。
地震が発生した際に、メールを自動送信する仕組みを作りたくてプログラムを書くことにしました。
情報の取得元について
はじめに、情報の取得元について紹介しようと思います。
「気象庁防災情報XMLフォーマット形式電文の公開(PULL型)」のAtomフィード > 地震火山 を押下すると地震情報のxmlを確認することができます。
今回は30分ごとに地震情報を取得しようと思うので「高頻度フィード」のxmlを使用します。
地震火山情報の一覧を確認することができます。
「揺れ」というキーワードで検索すると地震情報がヒットします。
linkタグのurlを開きます。
詳細情報が表示され、Itemタグに震度と地域が表示されています。
ReportDateTimeには時刻が表示されています。
この一連の作業をプログラムで行い、内容をメール通知する仕組みを作ります。
プログラム手順
①Googleスプレッドシートにアクセス
スプレッドシートに以下の通り書いてください。
プログラムで使うのはセル「C:2」だけです。日時は過去であればなんでもOKです。
・B:2 ⇒ 前回スクリプト実行時間
・B:4 ⇒ 30分ごとに実行するよう設定して利用する
・C:2 ⇒ 2018-09-09 14:54:45
②スクリプト エディタを開く
③プログラムを書く
ファイル名は何でもいいのですが「緊急地震速報」にしました。
プログラムは以下参照。
24行目まで:1つめのxmlのデータが多いので、セル「C:2」に書いてある、前回スクリプト実行時刻以降のデータのみ探索を行います。
29行目まで:現在時刻を、セル「C:2」に上書きします。
39行目:1つ目のxmlの内、震度3以上の場合は2つめのxmlを探索します。(震度3以上の場合は「震度速報」という表記になる)
58行目:「地震発生時刻 > 前回スクリプト実行時刻」かつ「震度が5~9」の場合は、メール送信対象の情報。
70行目:メール送信対象があった場合は、通知を行う。
71行目:宛先「address@gmail.com」を書き換えてご利用ください。(通知先のメールアドレス)
72行目:件名「安否確認」を書き換えてご利用ください。
73行目:本文「https://www.google.co.jp/」を書き換えてご利用ください。(安否確認のGoogleフォームへのリンクを書いてください。詳細はこちら)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 |
/** * 気象庁が公開している地震情報(高頻度フィード)を取得し、震度5~9の場合は安否確認メールを送る * http://xml.kishou.go.jp/xmlpull.html */ function getEarthQuake() { var atom = XmlService.getNamespace('http://www.w3.org/2005/Atom'); var feedUrl = 'http://www.data.jma.go.jp/developer/xml/feed/eqvol.xml'; var feedRes = UrlFetchApp.fetch(feedUrl).getContentText(); var feedDoc = XmlService.parse(feedRes); var feedXml = feedDoc.getRootElement(); var feedLocs = getElementsByTagName(feedXml, 'entry'); // xmlに含まれるentry要素を配列で取得する var sendFlg = false; //メール送信フラグ //前回スクリプト実行時刻の保持(スプレッドシートから取得) var sheet = SpreadsheetApp.getActiveSheet(); if(sheet.getRange(2, 3).getValue() == ''){ //空の場合は現在時刻を設定 sheet.getRange(2, 2).setValue('前回スクリプト実行時刻'); var preDate = Utilities.formatDate(new Date(),"JST","yyyy-MM-dd HH:mm:ss"); }else{ var preDate = Utilities.formatDate(sheet.getRange(2, 3).getValue(),"JST","yyyy-MM-dd HH:mm:ss"); Logger.log("前回スクリプト実行時刻:" + preDate); } //スクリプト実行時刻の更新(スプレッドシートを更新) var now = Utilities.formatDate(new Date(),"JST","yyyy-MM-dd HH:mm:ss"); sheet.getRange(2, 3).setValue(now); Logger.log("スクリプト実行時刻 :" + now); //気象庁のxmlデータ(feed)より、entry要素を繰り返し探索 var quakeInfo = ""; //地震情報 feedLocs.forEach(function(value, i) { var titleText = value.getChild('title', atom).getText(); //title var linkText = value.getChild('link', atom).getAttribute('href').getValue(); //link //titleが震度速報の場合(震度3以上) if('震度速報' == titleText){ //気象庁のxmlデータ(data)の情報を取得 var dataUrl = linkText; var dataRes = UrlFetchApp.fetch(dataUrl).getContentText(); var dataDoc = XmlService.parse(dataRes); var dataXml = dataDoc.getRootElement(); var dataLocs = getElementsByTagName(dataXml, 'Item'); // xmlに含まれるItem要素を配列で取得する var dataReportDateTime = getElementsByTagName(dataXml, 'TargetDateTime')[0].getValue(); // 地震発生時刻 dataReportDateTime = dataReportDateTime.replace('T', ' '); dataReportDateTime = dataReportDateTime.replace('+09:00', ''); //気象庁のxmlデータ(data)より、Item要素を繰り返し探索 dataLocs.forEach(function(value, i) { //Item要素の文字列を取得(震度と地域) var strItem = value.getValue(); //「地震発生時刻 > 前回スクリプト実行時刻」かつ「震度が5~9」の場合 if(dataReportDateTime > preDate && strItem.match(/震度[5-9]/)){ sendFlg = true; //送信フラグをtrue quakeInfo = quakeInfo + strItem; //地震情報 Logger.log("地震発生時刻 :" + dataReportDateTime); Logger.log(strItem); //Item要素 } }); } }); //送信フラグがtrueの場合 if(sendFlg == true){ var sendToAddress ="address@gmail.com"; var mailTitle = '安否確認'; var mailMessage = '【安否確認】\n'+ '震度5弱以上の強い揺れを検知しました。\n'+ '安否確認のため、今の状況を入力してください。\n'+ 'https://www.google.co.jp/\n\n'+ '【地震情報】\n'+ quakeInfo; MailApp.sendEmail(sendToAddress,mailTitle,mailMessage); Logger.log("送信完了"); }else{ Logger.log("送信なし"); } } /** * @param {string} element 検索要素 * @param {string} tagName タグ * @return {string} data 要素 */ function getElementsByTagName(element, tagName) { var data = [], descendants = element.getDescendants(); for(var i in descendants) { var elem = descendants[i].asElement(); if ( elem != null && elem.getName() == tagName) data.push(elem); } return data; } |
④トリガーを設定
最後に30分ごとにプログラムを起動するための設定を行います
編集 > 現在のプロジェクトのトリガー
「トリガーを追加」より、各項目を選択して、保存。
以上で設定完了です!
30分ごとにプログラムが実行され、条件に合致すればメール通知が行われます。
震度5弱以上の地震は頻発しないので、動作確認したい場合は、59行目の条件を「震度[3-9]」にしたり、コメントアウトしてみてください。
ちなみに、ログの確認方法はスクリプトエディタより「表示 > ログ」です。
最後まで読んで頂きありがとうございました^^
この投稿へのトラックバック
トラックバックはありません。
- トラックバック URL
この投稿へのコメント
ありがとうございます。
大変有益な情報でした。
参考にさせていただきました。
「気象庁防災情報XMLフォーマット形式電文の公開(PULL型)」のサイトが移動してました。
移動先は下記のようです。
http://xml.kishou.go.jp/xmlpull.html
xmlの保存先に変更はないようなのでスクリプトはそのままで動きました。
ご連絡頂きありがとうございます!
リンクを更新致しました。