XML-RPCでブログシステムにアクセスしてみる。
ここではお手軽にRubyを使う。RubyにはXML-RPC用ライブラリが標準で付属するので、簡単に試すことができる。Rubyの対話環境irbを起動したら、まずはそれをロードする。
irb(main):001:0> require "xmlrpc/client" => true
seesaaブログのAPIにアクセス
RubyでXML-RPCを使うには、目的のサーバを表すプロキシオブジェクトを作ることが必要。seesaaのXML-RPC端のURLはhttp://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のリストを返してくれる。
=> ["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をそのまま与えてプロキシを作成。
=> #<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でブログを指定するために必要となる。
=> [{"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では致し方ない。
=> #<XMLRPC::Base64:0x8296924 @str="hogehoge\n">
それが出来たら送信。ファイルを送信するにはmetaWeblog.newMediaObject
というAPIを呼ぶ。
=> {"url"=>"http://smpl.up.seesaa.net/foo.txt", "upload_id"=>"11122233", "filename"=>"foo.txt"}
参考
- Movable Type で使える XML-RPC API: 各APIの仕様に詳しい。Seesaaもここに書かれたAPIをサポートしている。