鉄道遅延情報の取得先の変更
毎朝、その日の予定や天気予報などをGoogle Homeにしゃべらせている。
通勤に使う鉄道の運行遅延情報もしゃべらせているのだが、ここ数日(2020/06/25以降)、なぜかしゃべらなくなってしまった。
原因は、以下の「鉄道遅延情報のjson」のAPIが止まってしまったから。
提供元のサイトには何のアナウンスもないが、元々善意で運営されていたものであり、「予告なく中断することがあります」との記載もあることから、まあ、仕方がない。
今までありがとうございました。
もしかしたら、しばらく待っていれば復活するのかもしれないが、いい機会なので、止まってしまったAPIのネタ元である「Tetdudo.com(鉄道コム)」の「運行情報サイト更新状況」のページのフィード(Atom1.0形式)
から遅延情報を取得するよう、変更することにした。
以下にGAS(Google Apps Script)の該当の関数を示す。
修正前
function trainDelay() { var url = "https://tetsudo.rti-giken.jp/free/delay.json"; var response = UrlFetchApp.fetch(url); var json = JSON.parse(response.getContentText()); var text = ""; for (var i in json) { if (json[i].name === "水郡線" || json[i].name === "七尾線" || json[i].name === "瀬戸大橋線") { text += json[i].name + "、"; } } if (!text) { text = "鉄道の運行遅延情報はありません。"; } else { text += "が遅延しています。"; } return text; }
修正後
function trainDelay() { var url = 'http://api.tetsudo.com/traffic/atom.xml'; var response = UrlFetchApp.fetch(url); var xml = XmlService.parse(response.getContentText()); var ns = XmlService.getNamespace('', 'http://www.w3.org/2005/Atom'); var items = xml.getRootElement().getChildren('entry', ns); var check = ['水郡線', '七尾線', '瀬戸大橋線']; var text = ""; for(var i in items) { title = items[i].getChild('title', ns).getText(); for (var j in check) { reg = new RegExp(check[j]); if (title.match(reg)) { text += check[j] + "、"; } } } if (!text) { text = "鉄道の運行遅延情報はありません。"; } else { text += "が遅延しています。"; } return text; }
悩んだのは、なぜかXMLがうまくパースできなかったこと。ググってみつけたこちらのページの記載から、いちいち名前空間を指定する必要があることを知る。めんどくせえ。