2007年02月23日

はじめてのXML-RPC in Ruby

XML-RPCでブログシステムにアクセスしてみる。

ここではお手軽にRubyを使う。RubyにはXML-RPC用ライブラリが標準で付属するので、簡単に試すことができる。Rubyの対話環境irbを起動したら、まずはそれをロードする。

% irb
irb(main):001:0> require "xmlrpc/client" => true

seesaaブログのAPIにアクセス

RubyでXML-RPCを使うには、目的のサーバを表すプロキシオブジェクトを作ることが必要。seesaaのXML-RPC端のURLはhttp://blog.seesaa.jp/rpcなので、これを指定してプロキシを作る。

irb(main):002:0> proxy = XMLRPC::Client.new("blog.seesaa.jp", "/rpc")
=> #<XMLRPC::Client:0x85b2158 @password=nil, @http_header_extra=nil, @use_ssl=false, @host="blog.seesaa.jp", @user=nil, @proxy_port=nil, @auth=nil, @cookie=nil, @create=nil, @port=80, @http=#<Net::HTTP blog.seesaa.jp:80 open=false>, @proxy_host=nil, @http_last_response=nil, @parser=nil, @timeout=30, @path="/rpc">

まずは簡単な、引数のないメソッドを呼んでみる。mt.supportedMethodsはサーバがサポートしているAPIのリストを返してくれる。

irb(main):003:0> result = proxy.call("mt.supportedMethods")
=> ["blogger.newPost", "blogger.editPost", "blogger.getRecentPosts", "blogger.getUsersBlogs", "blogger.getUserInfo", "blogger.deletePost", "metaWeblog.getPost", "metaWeblog.newPost", "metaWeblog.editPost", "metaWeblog.getRecentPosts", "metaWeblog.newMediaObject", "mt.getCategoryList", "mt.setPostCategories", "mt.getPostCategories", "mt.getTrackbackPings", "mt.supportedTextFilters", "mt.getRecentPostTitles", "mt.publishPost", "seesaa.newUser", "seesaa.newBlog", "seesaa.getCaptcha"]

SSL経由でもアクセス

ブログのXML-RPC APIでは、ユーザ情報が必要なときはユーザ名とパスワードをそのまま渡すので、セキュリティが心許ない。seesaaではSSLによる暗号化した通信も可能なので、こちらを使ってみよう。XML-RPC端にはhttp://ssl.seesaa.jp/blog/rpcを指定する。

今度はURLをそのまま与えてプロキシを作成。

irb(main):004:0> proxy = XMLRPC::Client.new_from_uri("https://ssl.seesaa.jp/blog/rpc")
=> #<XMLRPC::Client:0x8126b70 @password=nil, @http_header_extra=nil, @use_ssl=true, @host="ssl.seesaa.jp", @user=nil, @proxy_port=nil, @auth=nil, @cookie=nil, @create=nil, @port=443, @http=#<Net::HTTP ssl.seesaa.jp:443 open=false>, @proxy_host=nil, @http_last_response=nil, @parser=nil, @timeout=30, @path="/blog/rpc">

ブログのリストを取得

seesaaで開設しているブログのリストを取得する。戻り値の中のblogNameはUTF-8で「雫」と書いてある。irbの起動時にirb -KuとしてRubyにUTF-8エンコーディングを指示していたら(そして端末がUTF-8を表示できれば)「雫」と表示されるところ。一人でブログを複数持てるので戻り値はブログ情報の配列。blogidの値は他のAPIでブログを指定するために必要となる。

irb(main):005:0> r = proxy.call("blogger.getUsersBlogs", "", "mailaddress@example.com", "MyPassword")
=> [{"blogid"=>"112233", "blogName"=>"\351\233\253", "url"=>"http://uxlf.seesaa.net/"}]

ファイルのアップロード

XML-RPCを使って具体的に何かする例として、ファイルをアップロードしてみる。

XML-RPCで送信するために、まずはファイルの内容をBase64エンコードする必要がある。RubyのXMLRPC APIに文字列を渡すと、中身がバイナリデータであれEUC-JPの文字列であれ、何の変換もせずにそのままXMLメッセージに埋め込んでしまう。そのため簡単に不正なメッセージが作れてしまう。それを避けるためには、UTF-8でエンコードされた文字列以外は直接渡さないよう、プログラマが注意する必要がある。勝手によろしくやってくれればいいのだが、文字列がただのバイト列でしかない今のRubyでは致し方ない。

irb(main):006:0> f = XMLRPC::Base64.new(File.read("foo.txt"))
=> #<XMLRPC::Base64:0x8296924 @str="hogehoge\n">

それが出来たら送信。ファイルを送信するにはmetaWeblog.newMediaObjectというAPIを呼ぶ。

irb(main):007:0> r = proxy.call("metaWeblog.newMediaObject", "112233", "mailaddress@example.com", "MyPassword", { "bits" => f, "name" => "foo.txt" })
=> {"url"=>"http://smpl.up.seesaa.net/foo.txt", "upload_id"=>"11122233", "filename"=>"foo.txt"}

参考

posted by uxlf at 06:30| Comment(0) | TrackBack(0) | 日記
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.seesaa.jp/tb/34454416
※言及リンクのないトラックバックは受信されません。

この記事へのトラックバック