2008/01/31

Recent entries from same category

  1. 災害報告にtwitterを使うという提案
  2. ぼくが知ってる twitter じゃない
  3. サイトの新着はてなブックマークフィードのdelicious版みたいなのを作った。
  4. microformatsでWebページにメタデータを埋め込む
  5. 今さら聞くのは恥ずかしい「microformatsとは何か?」

Blogging APIは何処に行こうとしているのか...

先日は、XMLRPCについてのお話をさせて頂きました。
今日はその中で出てきたBlogging APIについて。
著名なブログツールの多くは、リモートからブログが更新出来る仕組みを提供しています。
その中でも、一般的な物が先日お話した「XMLRPC」をベースにした「Blogger API」や「metaWeblog API」、「MovableType API」があります。
※現在ではBloggerはXMLRPCではなく、Atompubを使用しています。
それとは別に、Atomフィードを使用したAtomPub APIがあります。
XMLRPCの場合は、リモートメソッドとしてXMLを生成してブログの投稿、削除等を行いますが、AtomPubの場合は送受信されるXMLの単位自身が文書になります。
この文書をHTTPのGET/POST(PUT)およびDELETEメソッドを使用して文書(ブログ)を更新します。
AtomPubではAtomフィードにひもづけられた登録用URIに対して文書をPOST(PUT)する事で新規エントリ、既存エントリにひもづけられた編集用URIに対してPOST(PUT)する事でエントリ更新、そして既存エントリの編集用URIに対してDELETEメソッドを送信する事でエントリ削除という動作になります。
一部のサーバではDELETEメソッドを受け付けない物もあるので、「X-Http-Method-Override: DELETE」というヘッダでDELETEメソッドと同じ処理が行える様になっているサーバもあります。

この2つのAPIの大きな違いとして、文書形式と認証方法が挙げられます。

XMLRPCの場合は、各メソッドに対してユーザIDおよびパスワードを渡す事になります。
またXMLRPCでは送信されるXML自身はメソッドパラメータが含まれ、その中にはユーザIDやパスワードも含まれてしまいます。二次利用する事は出来ません。

AtomPubの場合は、上で説明した通り送受信されるXML自身が文書である為に二次利用も可能です。
また認証方法は一般的にはBasic認証か、WSSE認証が用いられています。

巷のブログサービスは以下の様なAPI実装を行っています。
ブログサービス提供APIフォーマットエントリポイント
teacupXMLRPCHTMLhttp://white.ap.teacup.com/applet/[username]/postmsgrpc
EGOISTブログXMLRPCHTMLhttp://[blogid].ebsystems.jp/xmlrpc.php
自分のブログサイトの先頭に付いているblogid
FC2ブログXMLRPCHTMLhttp://blog.fc2.com/xmlrpc.php
JUGEMXMLRPCHTMLhttp://[blogid].jugem.jp/admin/xmlrpc.php
JustBlogAtompubHTMLhttp://app.justblog.jp/t/atom/weblog/blog_id=[blogid]
Livedoor BlogAtompubHTMLhttp://cms.blog.livedoor.com/atom/blog_id=[blogid]
MSN SpaceXMLRPCHTMLhttps://storage.msn.com/storageservice/MetaWeblog.rpc
NetLaputaXMLRPCHTMLhttp://blog.netlaputa.ne.jp/rpc/mt-xmlrpc.cgi
News HandlerXMLRPCHTMLhttp://blog.nettribe.org/xmlrpc.php
SeesaaブログXMLRPCHTMLhttp://blog.seesaa.jp/rpc/
WordPressXMLRPCHTMLhttp://faq.wordpress.com/xmlrpc.php
Yahoo!ブログXMLRPCHTMLhttp://api.my.yahoo.co.jp/RPC2
BloggerAtompubHTMLhttp://[blogid].blogspot.com/feeds/posts/default
BloggerXMLRPCHTMLhttp://blog.goo.ne.jp/xmlrpc.php
pwBlogXMLRPCHTMLhttp://www.pwblog.com/xmlrpc
VoxAtompubHTMLhttp://[blogid].vox.com/library/posts/atom.xml
はてなブックマークAtomPubTEXThttp://b.hatena.ne.jp/[username]/atom/
はてなダイアリーAtompubはてな記法http://d.hatena.ne.jp/[blogid]/edit
アメーバブログAtompubHTMLhttp://ameblo.jp/servlet/_atom/blog/[blogid]
ココログXMLRPCHTMLhttp://app.f.cocolog-nifty.com/t/api
ドリコムXMLRPCHTMLhttp://blog.drecom.jp/api/xmlrpc
ブログ人XMLRPCHTMLhttp://app.blog.ocn.ne.jp/t/api/
PLAYLOGXMLRPCWikihttp://playlog.jp/_atom/blog/[blogid]
ちなみに、アメーバブログはWSSEヘッダを作成する際、パスワードをMD5した値でSHA1/NONCEを作成する必要があります。
これは正直言ってしまうと、バグとしか思えません...汗
Atompubの場合、実際には上記エントリポイントを直接参照するのではなく、ブログページからオートディスカバリする事が推奨されます。
例えば、私のVoxのサイトのHTMLを参照してみると <link rel="EditURI" type="application/rsd+xml" href="http://mattn.vox.com/rsd.xml" title="RSD" />
というヘッダがあるのが分かるかと思います。
次にこのhrefを参照すると <?xml version="1.0"?>
<rsd version="1.0" xmlns="http://archipelago.phrasewise.com/rsd">
    <service>
        <engineName>Vox</engineName>
        <engineLink>http://www.vox.com/</engineLink>
        <homePageLink>http://mattn.vox.com/</homePageLink>
        <apis>
            <api name="Atom" preferred="true"
                apiLink="http://www.vox.com/services/atom" />
        </apis>
    </service>
</rsd>
このようなXMLが戻ります。ここまでは認証無しに参照出来ます。
このapiノードに記述されているapiLinkにX-WSSEヘッダを付けて要求すると、以下の様な登録/編集用URIが記述されたXMLが返されます。
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://purl.org/atom/ns#">
  <link rel="service.post" href="http://www.vox.com/services/atom/svc=post/collection_id=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" title="matt'n roll" type="application/x.atom+xml"/>
  <link rel="alternate" href="http://mattn.vox.com/" title="matt'n roll" type="text/html"/>
  <link rel="service.feed" href="http://www.vox.com/services/atom/svc=asset/XXXXXXXXXXXXXXXXXX" title="matt'n roll" type="application/atom+xml"/>
  <link rel="service.upload" href="http://www.vox.com/services/atom/svc=asset" title="matt'n roll" type="application/atom+xml"/>
  <link rel="replies" href="http://www.vox.com/services/atom/svc=asset/XXXXXXXXXXXXXXXXXX/type=Comment" title="matt'n roll" type="application/atom+xml"/>
</feed>
service.feedにはAtomフィードURIが、service.postは新規エントリポスト用のURIが格納されています。
Voxの場合は画像ファイル等のアップロード(service.upload)に対応しているようですね。
また、service.feedから取得したフィード自身にはrel属性とtype属性で指定されたlink要素も付与されていますから <entry xmlns:default="http://www.sixapart.com/ns/atom/privacy" xmlns:default1="http://www.w3.org/1999/xhtml">
  <id>tag:vox.com,2007-11-03:asset-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX</id>
  <title>スケスケ</title>
  <published>2007-11-03T09:25:46Z</published>
  <updated>2007-11-03T09:25:46Z</updated>
  <link rel="alternate" href="http://mattn.vox.com/library/post/%E3%82%B9%E3%82%B1%E3%82%B9%E3%82%B1.html" title="スケスケ" type="text/html"/>
  <privacy xmlns="http://www.sixapart.com/ns/atom/privacy">
    <allow policy="http://www.sixapart.com/ns/atom/permissions#read" name="Everyone" ref="http://www.sixapart.com/ns/atom/groups#everyone"/>
  </privacy>
  <link rel="alternate" href="http://www.vox.com/services/atom/svc=asset/XXXXXXXXXXXXXXXXXX/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" type="application/atom+xml"/>
  <link rel="replies" href="http://www.vox.com/services/atom/svc=comment/xid=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" type="application/atom+xml"/>
  <author>
    <name>mattn</name>
    <uri>http://mattn.vox.com/</uri>
  </author>
  <category term="携帯から" label="携帯から"/>
  <content xmlns:default="http://www.w3.org/1999/xhtml" type="xhtml">
    <div xmlns="http://www.w3.org/1999/xhtml">
      <p>今日、とある遊園地の横を通り過ぎた時に嫁が「この遊園地スケスケやなぁ」って言って来た。少し考えた後「うん」と答えた。どうやら嫁は「この遊園地スカスカやなぁ」と言いたかったらしい。ところで「スケスケ遊園地」って、ちょっとエッチ…</p>
    </div>
  </content>
</entry>
このエントリフィードの、type="application/atom+xml"であるlink要素のhrefに対してPOST(PUT)すれば更新、DELETEすれば削除となります。
POST時に送信する文書は、feedからentryのみを抜き取った、丁度上のようなXMLを送信する事になります。
前回、今回とブログサービスが提供するAPIについてお話して来ましたが、最近はAtomPubの方が活発だったりします。
XMLRPCの場合は特に決められたXMLネームスペースが存在していない為、貧祖なXMLパーサでもクライアントを実装でき、それ程敷居は高くないかと思います。
※但し、XMLRPCのパラメータは各サービスによって型が統一されていない場合があります。汎用的に作るのならば苦労するかもしれません。

それに比べAtomPubでは仕様が結構キッチリと決められている為、各サービス毎に異なる仕様で苦しめられる事はあまりありませんが、XMLネームスペース/スキーマを意識してXMLを操作しなければならなくなります。
幾分AtomPubを使ったクライアント実装の方が敷居が高い気もします。
※参考にするならばVoxが良いと思います。

今後、ブログAPIの主流としては、AtomPubがリードして行くと私は思っていますが、クライアントアプリがXMLRPCもAtomPubも対応しなければならない時代は、早く消え去った方が良いのでは?と切に願うばかりです。

ちなみに...
私のサイトではblosxomというブログツールを使用しています。blosxomをXMLRPCで操作しようというライブラリは既に存在しており私も使ってはいるのですが、AtomPubで実装した物はありませんでした。
昨日からですが、少しずつ作り始める事にしました。
ある程度出来上がったらCodeReposに上げる予定です。

追記
id:teahutさんから、ご指摘頂きました。
確かにAtomPub(app)という点で、Voxは参考にならないかもしれません。
app要素の入った新しいAtomPubについては、こちらに仕様書の日本語訳があります。
Posted at by