Node.js × GeekTool で ももクロ天気予報アプリ 作りました。

f:id:yosuke_furukawa:20120722231444p:plain

最近コードの匂いがしないエントリばかり書いていたので、危うさを感じ、作ってみました。
#といっても全然書いてないんですが。

Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)

Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)


また、最近上の本を読んで一度Restfulなアプリケーションを作ってみようと思ったことにも起因しています。
この本の感想は次のエントリに書きます。

とりあえず、ももクロ天気予報アプリ、名付けてmomoclo-weatherを紹介します。

紹介


momoclo-weatherはその日の天気に合わせてももクロちゃんの表情が変わるだけのアプリです。

晴れ:笑顔
曇:むくれ顔
雨:泣き顔

な感じです。2012年7月22日、現在、東京は雨なので、東京なら泣き顔が出ます。

momoclo-weatherの中身は expressとnode-yqlだけです。
クライアントはGeekToolで実行するので、天気予報をYQLから取得して、ExpressでJSONだけを返す、という事を実行しています。

GeekToolを入れていない人にもなんとなく、感覚をわかってもらうためにWeb用のアクセスも用意してます。
momoclo-weather

使い方


GeekToolを入れてください。
GeekToolのシェルに以下のように入れます。

curl --silent "http://momoclo-weather.herokuapp.com/weather.json?member=XXXXX&location=YYYYYY" | grep -E 'momocloimage' | sed -e 's/"momocloimage"://' -e 's/"//' -e 's/"//' | xargs curl --silent -o /tmp/weather_momoclo.png

memberのXXXXXにはmember名を入れます。
kanako, ayaka, reni, shiori, momokaのいずれかを入れてください。

locationのYYYYYにはweatherIDを入れます。
weatherIDはここで検索すれば分かります。
東京ならJAXX0085
横浜ならJAXX0099
という感じです。

例:東京でれにちゃん推しの場合:

curl --silent "http://momoclo-weather.herokuapp.com/weather.json?member=reni&location=JAXX0085" | grep -E 'momocloimage' | sed -e 's/"momocloimage"://' -e 's/"//' -e 's/"//' | xargs curl --silent -o /tmp/weather_momoclo.png

例:横浜でかなこ推しの場合:

curl --silent "http://momoclo-weather.herokuapp.com/weather.json?member=kanako&location=JAXX0099" | grep -E 'momocloimage' | sed -e 's/"momocloimage"://' -e 's/"//' -e 's/"//' | xargs curl --silent -o /tmp/weather_momoclo.png

後はweather_momoclo.pngをGeekToolのimageで出せばOKです。

もしも明日の天気予報をして欲しい場合はURLに&day=tomorrow を入れれば明日の顔が取得できます。

curl --silent "http://momoclo-weather.herokuapp.com/weather.json?member=kanako&location=JAXX0099&day=tomorrow" | grep -E 'momocloimage' | sed -e 's/"momocloimage"://' -e 's/"//' -e 's/"//' | xargs curl --silent -o /tmp/weather_momoclo.png

あとは、JSONから返ってくる値を色々加工すれば、色んな事ができます。冒頭にあった吹き出しで喋らせるような感じにもできます。

天気模様、Sunnyとか、Cloudyとかを出力する場合:

curl --silent "http://momoclo-weather.herokuapp.com/weather.json?member=shiori&location=JAXX0085" | perl -pe 's/,/,\n/g' | grep -E 'text' | sed -e 's/"text"://' -e 's/"//' -e 's/",//'

気温を出力する場合:

curl --silent "http://momoclo-weather.herokuapp.com/weather.json?member=ayaka&location=JAXX0085" | perl -pe 's/,/,\n/g' | grep -E 'temp' | sed -e 's/"temp"://' -e 's/"//' -e 's/",/C/'

と、こんな感じで出来ます。

コード紹介


実際に頑張っているのはYQLです。
YQLはYahooが作ったWebサービスで、SQLライクなQueryを食わせればYahooサービスの結果を取得できます。
やろうと思えばFlickrから画像取得とかも出来るっぽい。

さて、Node.jsにもYQLにアクセスするためのライブラリがあり、node-yqlです。
installの仕方等、詳しいことは以下のURLを見てください。
derek/node-yql · GitHub

コレを使って天気を取得するコードが以下の通り

//Tokyo : JAXX0085
//Yokohama : JAXX0099
//単位はCelcius固定。Fahrenheitがいいって人がいたら、'unit':'f'。
YQLWeather.prototype.executeQuery = function(area, callback) {
    yql.exec("SELECT * FROM weather.forecast WHERE location=@area AND u=@unit", function(response) {
        var validated_res = validate(area, response);
        callback(validated_res);
    }, {'area':area, 'unit':'c'});
};

多分、weather.forecast以外のテーブルも色々あるので、触ってみるのも面白そうです。
GitHub
yosuke-furukawa/momoclo-weather · GitHub