日々常々

ふつうのプログラマがあたりまえにしたいこと。

ATND APIをGroovyで叩いてみる

イベント開催支援ツールであるところのATND(アテンド)にはAPIがありまして、これはごくごくシンプルなあれで御座います。使おうと思ったら、誰でも使う事ができます。例えば以下のアドレスにアクセスすると、「google」を含むイベント10件をXMLで取得できます。
http://api.atnd.org/events/?keyword=google

XMLが見えたならば、既にATND APIをブラウザで叩いたと言う事になります。しかしこれをJavaから叩こうと思うと、HTTP通信のあれとかそれとかしないといけないです。便利なライブラリもありますけど、探したり使ったりするのは面倒です。面倒だからGroovyで。

new URL('http://api.atnd.org/events/?keyword=google').text

これだけ。これで結果がStringで返ってきてしまうのがGroovyです。

実践

APIリファレンスをみてみると、色々パラメータが設定できるみたいです。検索条件はもちろん、レスポンス形式も選べます。とりあえずこんな感じで検索しましょうか。

  • 「2011年7月」のイベント
  • キーワードで「java
  • レスポンス形式は「JSON
  • 最大の「100件」取得

これを取得するためのアドレスはこうなります。

http://api.atnd.org/events?ym=201107&keyword=java&format=json&count=100

JSONをどうやって読み込むか。ちょっと悩みかけたんですが、GroovyはJSONをネイティブサポートしてたりします。なのでそれで。で、取得した結果を日付順にソートして日付とタイトルを出力することにします。さらっと書きます。

import groovy.json.*

def jsonText = new URL('http://api.atnd.org/events/?ym=201107&keyword=java&format=json&count=100').text
def res = new JsonSlurper().parseText(jsonText)
res.events.sort {it.started_at}.each {
    println "${it.started_at[0..9]} ${it.title}"
}

……動かしてみました?動かないんですよねー。なんか「java.lang.StackOverflowError」とか言われたりしました。量が多いからダメなのかと思って、削っても改善しなくて。何でかなーと色々みてると、どうも概要に「\\」とかがあるとエラーになる模様。何か設定とかあるのかもしれませんが、概要は今回要らないのでテキストの段階で消しちゃいます。変換も早くなるよきっと。

できあがり

乱暴ですね。

import groovy.json.*

def jsonText = new URL('http://api.atnd.org/events/?ym=201107&keyword=java&format=json&count=100').text
def res = new JsonSlurper().parseText(jsonText.replaceAll('"description":".+?",',''))
res.events.sort {it.started_at}.each {
    println "${it.started_at[0..9]} ${it.title}"
}

実行結果。結構ありますねー。

2011-07-01 Javaコミュニティ@九州 セミナー
2011-07-02 音楽で食うためのアライアンスランチ
2011-07-02 若手IT勉強会#28( Secrets of the JavaScript Ninja 読書会 )
2011-07-03 Titanium mobileで作るスマートフォンアプリ講座(iii)
2011-07-04 WEBサービス開発者のはじめてのTitanium勉強会
2011-07-07 Java SE 7 リリース記念特別イベント懇親会 LT 募集
2011-07-07 Java SE 7 リリース記念特別イベント2次会
2011-07-09 サテライト #TDDBC 佐賀
2011-07-09 TDD Boot Camp in Tokyo #tddbc
2011-07-09 札幌 Java Conference 2011
2011-07-09 Qt名古屋勉強会 7/9
2011-07-09 省エネITを考える(第3回)
2011-07-09 札幌 Java Conference 2011 懇親会
2011-07-10 「日本Androidの会」茨城支部キックオフ
2011-07-15 Titanium Mobileを使ってアプリを作ろう
2011-07-16 関ジャバカンファレンス2011
2011-07-22 Advanced Tech Night No.2 「ジャバラーが知っておくべき最近の開発言語のこと」
2011-07-23 kanazawa.js v1.5 - Hello Titanium Mobile! -
2011-07-24 Titanium mobileで作るスマートフォンアプリ講座(iv)
2011-07-26 NFCハッカソン2011
2011-07-31 Sapporo.js-2011.07.31

1行でも書けるよ!

new groovy.json.JsonSlurper().parseText(new URL('http://api.atnd.org/events/?ym=201107&keyword=java&format=json&count=100').text.replaceAll('"description":".+?",','')).events.sort{it.started_at}.each{println "${it.started_at[0..9]} ${it.title}"}

実用性皆無だけど。