TrackBack Technical Specification(日本語訳)
下記は、http://www.movabletype.org/docs/mttrackback.htmlにある「トラックバック」に関する仕様書を私が日本語訳したものです。トラックバックはMovable Typeをはじめとするブログツールに取り入れられている、エントリー間の相互リンクを容易にするシステムです。
当然ながら、訳の信頼性などに対して、私は何らの保証をしません。また、この翻訳はmovabletype.orgとは無関係です。
名称
mttrackback - TrackBack Technical Specification
著者
ベンジャミン・トロットとメナ・トロット、(Benjamin and Mena Trott,) movabletype.org
バージョン
1.1
概要
この文書ではトラックバックについて述べる。トラックバックとは、ピアトゥーピアにおける対話、通知の枠組みである。トラックバックの中心となるのは「トラックバック・ピング」と呼ぶアイディアで、「リソースAとはリソースBに関連している」というようなことを示すものである。トラックバックの「リソース」は、「トラックバック・ピングURL」という単なる標準のURLで表される。
トラックバックを使えば、関連するリソースに関してサイトが対話することができる。たとえば、甲乙二つのサイトがあって、甲が乙についての記事を書いたとき、甲が乙に知らせたいと思ったら、トラックバック・ピングを送ればよい。これにより、次の二つが実現できる。
- 乙は、甲も含めて乙の特定の記事に言及しているすべてのサイトを、自動的に一覧にすることができる。
- トラックバック・ピングはリンクを甲乙双方の記事に作ることができる。これは(参照元ログなどのような)外部からの間接的なリンクよりも(リンクをクリックしたりするような)外部の働きかけを必要としない、という点で強固かつ系統立っている。
トラックバック・ピングの送信
トラックバックでは、RESTモデルというものを使用する。これは、標準的なHTTPを利用してリクエストが送られる。トラックバック・ピングを送るため、クライアントは標準的なHTTPリクエストをサーバーに送り、単純なXMLフォーマットのレスポンスを受け取る(この詳細については下記参照)。
トラックバックの仕組みでは、トラックバック・ピングを受け取るURLのことをトラックバック・ピングURLと呼ぶ。トラックバック・ピングURLの典型的なものはhttp://www.foo.com/mt-tb.cgi/5というような形をしており、ここでは5
がトラックバックIDを示す。
サーバーは、理解できるなら、どんなフォーマットのトラックバック・ピングURLを使用してもよい。一方、クライアントは特定のフォーマットのみを使用するべきではない。
ピングを送るため、クライアントはHTTP POSTのリクエストをトラックバック・ピングURLに送る。リクエストのContent-Typeはapplication/x-www-form-urlencoded
でなければならない。たとえば、http://www.foo.com/mt-tb.cgi/5というURLへのリクエストは、下記のような形になる。
POST http://www.foo.com/mt-tb.cgi/5 Content-Type: application/x-www-form-urlencoded title=Foo+Bar&url=http://www.bar.com/&excerpt=My+Excerpt&blog_name=Foo
使える変数は以下の通りである。
- title
エントリーのタイトル。 - excerpt
エントリーの引用。Movable Typeの実装では、この文字列が255文字(訳注:おそらく255バイト)を超える場合、これは252文字に縮められ、最後に...
が付加される。 - url
エントリーの永続的なリンク。他の永続的リンクと同様、これは実際のエントリーを正確に指し示すようにしなくてはならない。そうすることで、そのエントリーにリンクを張り返す際に利用することができる。 - blog_name
エントリーを送ったブログの名前。
Movable Typeの実装では、上記の変数のうち、urlだけが必須である。もしtitleがなければ、urlの値がtitleになる。
上記クエリに対するレスポンスはシンプルなXMLフォーマットでで返される。このため、アプリケーションレベルでのエラー検知が可能である(HTTPレベルのエラーも同様に返ってくる。たとえば、もしトラックバックURLがサーバ上に存在しない場所を指していたら、404
エラーがピングから返ってくる)。
ピングが成功すると、以下のようなレスポンスが返ってくる。
<?xml version="1.0" encoding="iso-8859-1"?> <response> <error>0</error> </response>
失敗したときには以下のようなレスポンスが返ってくる。
<?xml version="1.0" encoding="iso-8859-1"?> <response> <error>1</error> <message>The error message</message> </response>
当然のことながら、アプリケーションは将来このフィールドに必要に応じて追加があることを想定していなければならない。しかし、レスポンスのXML構造自体は変わらないままであるはずである。
トラックバック・ピングの取得
特定のトラックバック・ピングURLに送られてきたピングのリストを取得するためには、そのトラックバック・ピングURLにHTTP GETリクエストを、?__mode=rssとい文字列を付加して送る。将来的に仕様が改訂されれば――POSTからGETへのスウィッチングが完了した、優雅な時代になれば――トラックバック・ピングURLにGETリクエストを送れば、ピングのリストが返ってくるように単純化されるはずである。
GETリクエストは、たとえば下記にようになる。
GET http://192.168.1.103/mt/mt-tb.cgi/3?__mode=rss
エラーがあったときには、リクエストに対するレスポンスは、上述したものと同様になる。そうでなければ、その項目に対するトラックバック・ピングのリストはRSSマークアップで返され、<response>
タグに入ってくる。
下記に例を挙げる。
<?xml version="1.0" encoding="iso-8859-1"?> <response> <error>0</error> <rss version="0.91"><channel> <title>TrackBack Test</title> <link>http://this.is/the/trackback/item/link/</link> <description>Description of the TrackBack item</description> <language>en-us</language> <item> <title>TrackBack Demo</title> <link>http://this.is/the/permalink/</link> <description>Excerpt</description> </item> </channel> </rss></response>
<rss>
と</rss>
に囲まれた部分が、実際のRSSデータである。残りの部分は単純にレスポンスの包装紙であり、破棄してよい。
トラックバック・ピングURLの自動取得
あるウェブログのエントリーやURLに対して、トラックバック・ピングURLがどこであるかをトラックバックのクライアントは検知しなくてはならない。サーバー側は実装としてページにRDFを埋め込んでおくべきである。RDFはそのエントリーに対するメタデータを表し、クライアントがトラックバック・ピングURLを自動的に検知できるようにする。
RDFの例は下記のようになる。
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/"> <rdf:Description rdf:about="http://www.foo.com/archive.html#foo" dc:identifier="http://www.foo.com/archive.html#foo" dc:title="Foo Bar" trackback:ping="http://www.foo.com/tb.cgi/5" /> </rdf:RDF>
注:現在のvalidator(訳注:HTMLをチェックするスクリプト)は、XHTMLに埋め込まれたRDFにあたると詰まってしまうので、自分のページをチェックさせたいと思う場合には、上記のRDFをHTMLのコメントにしてもよい。
<!-- <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" ... </rdf:RDF> -->
これは完全な解決ではないが、応急措置としては有効である。
dc:エレメントは、標準的なDublin Coreエレメントである。trackback:pingエレメントはRSS 1.0や2.0用のトラックバック・モジュールhttp://madskills.com/public/xml/rss/module/trackback/からのものである。
my_urlというURLが与えられると、クライアントは下記の手順を踏む。
- HTTP GETリクエストをmy_urlにあるページのコンテンツにに送る。
- ページのコンテンツから埋め込みRDFの部分を探す。ページには埋め込みRDFの実体が複数ある場合があるので、クライアントはdc:identifierがmy_urlにマッチするブロックを探さなければならない。
- RDFのブロックからtrackback:pingの値を抽出する。これがトラックバック・ピングURLになる。
トラックバック・ピングURLが判明すれば、クライアントはトラックバック・ピングを送ることができる(トラックバック・ピングの送信参照)。
自動取得するコードの例は下記の実例にある。
実例
トラックバック実装の例
自らのシステムにトラックバックを実装させようとしている開発者の助けになるように、ここにMovable Typeに依存しないスタンドアローンなトラックバックの実装を示す。これはHTTPリクエストによるピングを受け付け、これをローカルなファイルシステムに蓄積し、特定のトラックバック項目にRSSフォーマットでそのリストを送付するものである。また、これは静的にRSSファイルを生成することもできる。これは例えば、サイトのサイドバーに最近の15個のトラックバックを表示する、などと言うときに有効である。
このスタンドアローンな実装は、http://www.movabletype.org/downloads/tb-standalone.tar.gzからダウンロードすることができる。
これはArtistic Licenseの下で配布される。Artistic Licenseについてはhttp://www.perl.com/language/misc/Artistic.htmlにある。
インストール方法、使用方法についてはhttp://www.movabletype.org/docs/tb-standalone.htmlにある。
自動検知の例
use LWP::UserAgent; sub discover_tb { my $url = shift; my $ua = LWP::UserAgent->new; $ua->agent('TrackBack/1.0'); $ua->parse_head(0); ## So we don't need HTML::HeadParser $ua->timeout(15); ## 1. Send a GET request to retrieve the page contents. my $req = HTTP::Request->new(GET => $url); my $res = $ua->request($req); return unless $res->is_success; ## 2. Scan te page contents for embedded RDF. my $c = $res->content; (my $url_no_anchor = $url) =~ s/#.*$//; my $item; while ($c =~ m!(<rdf:RDF.*?</rdf:RDF>)!sg) { my $rdf = $1; my($perm_url) = $rdf =~ m!dc:identifier="([^"]+)"!; next unless $perm_url eq $url || $perm_url eq $url_no_anchor; ## 3. Extract the trackback:ping value from the RDF. ## We look for 'trackback:ping', but fall back to 'about' if ($rdf =~ m!trackback:ping="([^"]+)"!) { return $1; } elsif ($rdf =~ m!about="([^"]+)"!) { return $1; } } }
このPerlのコードはdiscover_tbというサブルーチンを定義する。URLが与えられると、そのURLに対応するトラックバック・ピングURLを検知しようとする。検知できた場合、サブルーチンはそのトラックバック・ピングURLを返す。そうでなければundef
を返す。
変更履歴
1.1 (2002年10月10日)
- トラックバック・ピングをGETリクエストではなくPOSTリクエストで送るべきとした。 古い動作は廃止されるべきであり、GETリクエストに対するサポートは2003年1月に終了する。
- RDFにおいて、トラックバック・ピングURLはrdf:aboutエレメントではなくtrackback:pingエレメントに格納されるようにした。
- トラックバック・ピングURLの例について、QUERY_STRINGを使用するのではなく、PATH_INFOを使用する形に変更した。
- 自動検知のための埋め込みRDFは今では文法チェックの失敗を引き起こさなくなった。
- 自動検知のコード例を追加した。
1.0 (2002年8月28日)
初版発表。
謝辞その他
トラックバックをRESTライクな形にするために様々な助言をくれたポール・プレスコッド他の諸君に謝意を表する。
Copyright © 2001-2004 Six Apart. All Rights Reserved.