mttrackback - トラックバックの技術仕様
Benjamin、Mena Trott、movabletype.org
1.1
このドキュメントは、トラックバックを説明しています。トラックバックは、ウェブサイト間での一対一のコミュニケーションと通知を可能にするフレームワークです。 トラックバックのメカニズムは、トラックバックpingという1つのリクエストが「リソースAはリソースBに関連またはリンクしている」と告げていることによります。 1つのトラックバック「リソース」は、標準のURIであるトラックバックping先URLで表します。
トラックバックを使うと、サイト間で関連したリソースについてコミュニケーションができます。 たとえば、ブロガー(ウェブログ作成者)AがブロガーBに、何か面白いことや関連することやショックなことを書いたと通知したい場合、AはBにトラックバックpingを送信します。 それによって、以下の2つが達成できます。
トラックバックはRESTモデルを使っています。RESTモデルでは、リクエストが標準のHTTP呼び出しによって作られます。 トラックバックpingを送信するため、クライアントはサーバーに標準のHTTPリクエストを送信し、簡単なXMLフォーマットで応答を受信します(詳細は後述参照)。
トラックバック・システムでは、トラックバックpingを受信するURLのことをトラックバックping先URLといいます。 典型的なトラックバックping先URLはhttp://www.foo.com/mt-tb.cgi/5のようなフォーマットを取ります。このときの5はトラックバックのIDです。 サーバーの実装は、トラックバックping先URLのために適したフォーマットであれば、どんなフォーマットも採用できます。クライアントの実装は、特定のフォーマットに依存しないはずです。
pingを送信するため、クライアントは、HTTP POSTリクエストをトラックバックping先URLに送ります。 リクエスト・コンテンツは、コンテンツ・タイプapplication/x-www-form-urlencodedのものであるはずです。 たとえば、http://www.foo.com/mt-tb.cgi/5というURLへのpingリクエストは以下のようになります。
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
注: 古いバージョンのトラックバック仕様では、pingがHTTPのGETリクエストを使って送られます。 この動作は軽視されています。GETリクエストのサポートは2003年1月に、Movable Typeの実装から削除されました。
以下のパラメータが使用できます。
...」が付きます。
Movable Typeでは、上記のパラメータのうち、urlだけが必須です。 titleがない場合は、urlの値がタイトルとして送られます。
上のクエリーに対しての応答は、アプリケーション・レベルのエラー検出を有効にする簡単なXMLフォーマットで記述されています。HTTPレベルのエラーは、たとえば、トラックバック先のURLがサーバー上に存在しない場合にping送信すると、404エラーが返されるなどの形を取ります。
ping送信に成功すると、以下の応答が返ります。
<?xml version="1.0" encoding="iso-8859-1"?>
<response>
<error>0</error>
</response>
ping送信に失敗すると、以下の応答が返ります。
<?xml version="1.0" encoding="iso-8859-1"?>
<response>
<error>1</error>
<message>The error message</message>
</response>
アプリケーションはもちろん、将来必要なときに備え、フィールドを追加できるようにしておくべきです。 ただし、応答のXML構造は将来も同じです。
1つのトラックバックping先URLに送ったpingのリストを得るには、HTTPのGETリクエストを、クエリー文字列の?__mode=rssと共にトラックバックping先URLに送ります。 POSTからGETへの切り替えのための移行期間が終わった後、仕様の将来の更新では、GETリクエストをトラックバックping先URLに送るとpingのリストを返すように簡素化される可能性があります。
GETリクエストの一例を以下に挙げます。
GET http://192.168.1.103/mt/mt-tb.cgi/3?__mode=rss
このリクエストへの応答は、このリクエストに対するエラーが同じフォーマットで返るか、<response>タグに挟まれたRSSマークアップに、そのトラックバック・アイテムのトラックバックpingが列挙されているかのいずれかです。
以下に例を挙げます。
<?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やウェブログ・エントリーのトラックバックping先URLを決定する方法が必要です。 サーバーは、サーバーで生成されるページにRDFを埋め込んでいるはずです。RDFはエントリーについてのメタデータを表し、それによってクライアントはトラックバックping先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>
注: 現在のバリデータが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は、以下のURLにあるRSS 1.0/2.0用のトラックバック・モジュールから来ます。 http://madskills.com/public/xml/rss/module/trackback/.
URLがmy_urlの場合、クライアントは以下のステップに従うはずです。
クライアントは、トラックバックping先URLを限定すると、トラックバックpingを送信できるようになります(「トラックバックpingの送信」を参照)。
自動検知コードの例は下記の「例」を参照してください。
Movable Type以外のシステムにトラックバックを実装しようと考えている開発者をサポートするため、当社はMovable Typeに依存しないトラックバックのスタンドアロン型実装をリリースしています。 この実装では、HTTPリクエストを介して送られたpingを受け取り、pingをローカルのファイルシステムに保存し、RSSフォーマットで固有のトラックバック・アイテムに送ったpingの一覧を返すことができます。 また、任意でRSSを静的に生成することもできます。 この機能は、たとえば、サイトのサイドバーに、過去15のトラックバックpingのリストを含めるのに役立ちます。
スタンドアロン型の実装は、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); ## したがってHTML::HeadParserは必要ありません。
$ua->timeout(15);
## 1. GETリクエストを送信し、ページ・コンテンツを取得します。
my $req = HTTP::Request->new(GET => $url);
my $res = $ua->request($req);
return unless $res->is_success;
## 2. 埋め込まれた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. trackback:ping値をRDFから抽出します。
## 'trackback:ping'を探しますが、'about'に戻ります。
if ($rdf =~ m!trackback:ping="([^"]+)"!) {
return $1;
} elsif ($rdf =~ m!about="([^"]+)"!) {
return $1;
}
}
}
このPerlコードは、discover_tbというサブルーチンを定義しています。 URLがあると、このサブルーチンはそのURLに対応するトラックバックping先URLを検知しようとします。 それを検知すると、サブルーチンはトラックバックping先URLを返します。検知できない場合は、undefを返します。
最初のリリース
トラックバックをRESTのように作成するため指導していただいたPaul Prescod氏およびその他の方々に感謝いたします。