Tumblr API v1(バージョン1)を使って、Tumblrブログの投稿をランダムに取得する方法を紹介します。
現在、Tumblr APIは v2(バージョン2)に移行しているのですが、新しい方の v2 を使ってランダム取得するのは難しい、というか私は v2 ではAPI単体ではトリッキーな方法をとらないとランダム取得が出来ません。でも古い方の v1 なら結構簡単に出来るのです。
想定される使い方は、自分のTumblrからランダムに一つ取得してきて表示してくれるブログパーツ、ランダムで取得した投稿を定期的にTwitterに流すTwitter Botなどが考えられますでしょうか。
注意事項
この方法は、廃止がアナウンスされて久しいTumblr API v1の /api/read を使った方法となります。そのためTumblrさんの気分によって、ある日スパーンッと利用不可能になる可能性がある点をご了解ください。
ただ、v1に昔はあった、/api/dashboard や /api/likes は使えなくなり、Tumblr API v1ドキュメントからも削除されているのに対し、/api/read だけ今だに正常に使える上にドキュメントにも使い方の記載が残っているため、当分使えるんじゃないかと勝手に期待しています。
/api/read とは
特定のTumblrブログから投稿を取得する事の出来るAPIです。認証は不要なので、自分以外ブログを指定しても取得出来ます。ですので後述のランダム取得もどのブログからでも取得出来ます。使い方は、http://(YOU).tumblr.com/api/read の(YOU)の部分に自分のIDを入れてアクセス。
リクエスト例:
http://nihongo.tumblr.com/api/read?num=50
上記URLをブラウザのアドレスバーに入れて遷移してみればデータがXMLで取得出来る事が確認出来るはずです。利用可能なオプションなどの詳細は情報はTumblr API v1ドキュメントをご参照ください。
ランダム取得の方法
/api/read はレスポンスにそのブログの総投稿数をレスポンスとして返してくれる素敵な性質があります。今回のやり方はその性質をうまく使うものとなっております。
-
総件数を取得する
ここでは総件数のみが必要なので num=0 として取得件数0件を指定。
リクエスト例:
レスポンス例:
```
<tumblr version="1.0">
<tumblelog name="nihongo" timezone="Europe/Amsterdam" title="Tumblr Nihongo">
<a href="http://www.tumblr.com">Tumblr</a>スタッフが送る公式ブログフィードです。
</tumblelog>
<posts start="0" total="716"/>
</tumblr>
total="716" の部分が総件数。
-
ランダムな開始位置を決める
総件数の範囲の中でランダムな開始位置を選択する。開始位置は0から始まるのでこの例だと 0~715 の間で選ぶ。 -
ランダムな投稿を取得する
先ほど決めたランダムな開始位置をstartパラメーターにセット、num=1 として取得件数1件を指定。
リクエスト例:
これでランダムな投稿が取得出来ますので、後は取得出来たレスポンスからご随意にどうぞ。なお、startの番号が若い方が新しい投稿です。
# Tumblr API v1 のJSONでのレスポンスについて
/api/read は、/api/read/json とすればレスポンスをXMLではなくJSONで取得が出来ます。
リクエスト例:
ただ、このJSONでの取得はまったくもってお薦め致しません。以下にJSONでのレスポンスの例を示します。見やすいように整形してあります。
var tumblr_api_read = {
"tumblelog":{
"title":"Tumblr Nihongo",
"description":"Tumblr<\/a>\u30b9\u30bf\u30c3\u30d5\u304c\u9001\u308b\u516c\u5f0f\u30d6\u30ed\u30b0\u30d5\u30a3\u30fc\u30c9\u3067\u3059\u3002",
"name":"nihongo",
"timezone":"Europe/Amsterdam",
"cname":false,
"feeds":[]
},
"posts-start":0,
"posts-total":716,
"posts-type":false,
"posts":[]
};
なるほど、tumblr_api_read という変数に値が格納された状態で返って来ますね。Tumblrさん、これは JSON ではなくJavascript にございます。content-type は「application/javascript」で返って来ますので本当はご存知なのかもしれませんが、これは Javascript です。もちろんこのままではパース出来ません。ですのでパースするには先頭の「var tumblr_api_read = 」と末尾の「;」を除去してあげる必要があります。しかし成せる事とそれを成したいと思うかは別でございましょう。この方法は美しさに欠けると私は思うのです。