WebOS Goodies

WebOS の未来を模索する、ゲームプログラマあがりの Web 開発者のブログ。

WebOS Goodies へようこそ! WebOS はインターネットの未来形。あらゆる Web サイトが繋がり、共有し、協力して創り上げる、ひとつの巨大な情報システムです。そこでは、あらゆる情報がネットワーク上に蓄積され、我々はいつでも、どこからでも、多彩なデバイスを使ってそれらにアクセスできます。 WebOS Goodies は、さまざまな情報提供やツール開発を通して、そんな世界の実現に少しでも貢献するべく活動していきます。
Subscribe       

Ruby で livedoor blog の Atom API にアクセス

いろいろな野望実現のため(?)、 Ruby で livedoor blog の Atom API にアクセスするクラスを作ってみましたので、本日はそれをご紹介しようと思います。ただし GET のみですので、記事の取得くらいしかできません。 POST や PUT も同じ要領でいけるはずですが、動作確認が面倒なので実装していません。どなたか挑戦してみてください(笑)。

ここでは livedoor blog の Atom API を前提にしますが、他のサービス(はてなとか)でも使えるのではないかと思います。

クラスのソース

それでは、まずはクラスのソースです。

require 'net/http'
require 'digest/sha1'
require 'time'
 
class AtomAPI
  def initialize(domain, username, password)
    nonce = ''
    while nonce.size < 20
      nonce << rand(256)
    end
 
    created = Time.new.utc.iso8601.to_s
    digest  = encode64(Digest::SHA1.digest(nonce+created+password))
 
    @domain = domain
    @wsse = [
      %!UsernameToken Username="#{username}", !,
      %!PasswordDigest="#{digest}", !,
      %!Nonce="#{encode64(nonce)}", !,
      %!Created="#{created}"!].join('')
  end
 
  def encode64(str)
    [str].pack('m').gsub("\n", '')
  end
 
  def get(entry)
    req = Net::HTTP::Get.new(entry)
    req['X-WSSE'] = @wsse
    response = ''
    Net::HTTP.start(@domain) do |http|
      response += http.request(req).body
    end
    response
  end
end

すいません、なんの工夫もありませんね。強いて言うなら WSSE 認証用のヘッダを作っているあたりは他にも応用できるかもしれません。そうそう、 Atom API に関しては以下のページが日本語で詳しく解説されており、お勧めです。

http://www.witha.jp/Atom/ (解説:Atom)

このページでだいたい網羅されているので、ここでは詳細は省略です^^;。

使い方

まずは以下のようにして AtomAPI クラスのオブジェクトを作成してください。

api = AtomAPI.new('cms.blog.livedoor.com', <ユーザー名>, <パスワード>)

第一引数は Atom API エントリポイントの存在するドメインです。 livedoor blog なら上記の通り 'cms.blog.livedoor.com' で OK です。ユーザー名、パスワードは livedoor blog のものがそのまま使えます。あとは、取得したい情報のパスを指定して get メソッドを呼べばレスポンスが取得できます。以下、代表的な例をご紹介します。

フィードの取得

livedoor blog では、以下の URL で blog の最新記事が取得できます。取得できる件数などは通常の Atom フィードと同じではないかと思います(未確認)。

http://cms.blog.livedoor.com/atom/blog_id=<ブログID>

ブログIDはブログを識別するための番号です。 blog の投稿ページの URL が "http://cms.blog.livedoor.com/cms/article/add?blog_id=???????" のようになっていると思うのですが、この "???????" の部分です。

従って、例えばブログIDが 1234567 であれば、フィードの内容を表示するためには以下のように get メソッドを呼び出せば OK です。

print api.get('/atom/blog_id=1234567')

結果は XML 形式で返されますので、 REXML などで解析するのが手軽でしょう。文字コードが UTF-8 になっている点にもご注意ください。

個別記事の取得

ある特定の記事の情報を取得する場合は以下の URL になります。

http://cms.blog.livedoor.com/atom/blog_id=<ブログID>/entry_id=<記事ID>

記事IDは各記事に固有の番号です。記事のパーマリンクの URL が "http://blog.livedoor.jp/<ユーザー名>/archives/????????.html" のようになっていると思いますが、この ???????? の部分です。

先ほどと同じ 1234567 のブログから 11223344 の記事を表示するならば、以下のように get メソッドを呼び出します。

print api.get('/atom/blog_id=1234567/entry_id=11223344')

この方法なら、フィードの中には含まれない追記部分などもすべて取得できます。

以上、駆け足で申し訳ありませんが、 Atom API にアクセスする Ruby クラスをご紹介しました。 POST や PUT を実装すれば記事の投稿や編集も行えますので、 livedoor blog 投稿ツールなんてのも夢ではありませんね。我こそはという方はぜひ挑戦してみてください!

関連記事

この記事にコメントする

Recommendations
Books
「Closure Library」の入門書です。
詳しくはこちらの記事をどうぞ!
Categories
Recent Articles