今回はTumblrのブログのタイトルを取得するプログラムを書いてみたいと思います。 前回とあまり変わらないんですが、今回はJSONの処理が入ります。
今更ですが、Tumblr APIのリンクを載せておきます。 特にレスポンスのJSONのサンプルが役に立ちます。
Tumblr API v2リファレンス和訳(原文:2011/08/07 19:11:23時点) - Walrus, Googling.
Scala(Dispatch)でTumblrのAPIを叩く(小手調べ編)
それではコードに移ります。
Scalasスクリプトで、Dispatchを使ってHTTP通信するというところは前回とほとんど同じなので、違う点だけ説明したいと思います。
val key = "zMy8BEqJ6lPfumkFurUKcz6BdrQtrUkzx1vwnFobeudkQTWv8F"
val query = Map("api_key" -> key)
val req = :/("api.tumblr.com") / "v2" / "blog" / "pab-tech.tumblr.com" / "info" <<? query
keyというのはOAuthのConsumer Keyのことです。
今回はOAuth認証はしません。
Keyを使うだけです。
なぜ認証しないのにKeyを要求されるのかというと、たぶんAPI使用回数制限みたいなことをやりたいんだと思います。
Consumer Keyはこちらから取得できます。 今回は僕のConsumer Keyを載せていますが、自分の環境で動かす場合は自分のKeyを取得して使ってください。
このKeyはURLの最後にクエリーとして付けます。
Dispatchでは <<? というメソッドを使ってURLにクエリーを足すことができます。
val handler = req ># ('response ! ('blog ? ('title ? str)))
この部分が今回のポイントでしょうね。 これはDispatchのJSONパーザーの機能を使っています。 この機能についてはDispatchの作者自身が解説したものを翻訳した記事があるので、そちらを見てもらったほうが早い気がします。
Scala と Json で tweed を織る | eed3si9n
ここでは今回使った機能だけを説明したいと思います。
まず、Handlerの作り方ですが、前回は >>> を使ってファイルの保存をしました。
これは単純に取ってきたデータをOutputStreamに流すという処理です。
># は取得したデータをJSONと見なし、それを変換する処理です。
今回は取得したJSONからタイトル文字列を抽出し、それを返しています。
'response ! ('blog ? ('title ? str))
この部分がJSONからタイトル文字列を抽出する処理です。
? とか ! とか何なんだよって僕も最初思ったんですが、
? はシンボルとJSON抽出子から新しいJSON抽出子を作る関数です。
! は ? と似ていますが、抽出子ではなく関数を作ります。
要するにJSONを分解する関数や抽出子を作る高階関数なんですね。
JSONの基本的なデータは決まってますよね。
数値とか文字列とかリストとかオブジェクト(他の言語で言うところの連想配列)とか。
その基本的なデータの抽出子はdispatch-json側で提供されています。
それらと ! や ? を使って複雑な抽出処理を作っていくわけです。
今回処理するJSONはこんな感じです。
{
"meta": {
"status": 200,
"msg": "OK"
},
"response": {
"blog": {
"title": "PAB@求職活動中",
(略)
}
}
}
取り出したいのは「PAB@求職活動中」という文字列です。 responseオブジェクトの中のblogオブジェクトの中のtitleオブジェクトの中の文字列、というわけです。 これをコードで表現すると、
'response ! ('blog ? ('title ? str))
となるわけです。
で、残りですが、
val title = http(handler)
println(title)
上でタイトル文字列の抽出が行われているので、 実行すると「PAB@求職活動中」という文字列が出力されているはずです。
今回はdispatch-jsonを紹介しました。ScalaのJSONライブラリというとlift-jsonが一番使われていると思いますが、 dispatchを使うならdispatch-jsonを使ってみてもいいんじゃないかと思います。
次回はいよいよブログに投稿するプログラムを作りたいです。