トラックバック技術仕様書


名称

mttrackback - トラックバック技術仕様書


著者

Benjamin and Mena Trott, movabletype.org


バージョン

1.1


概要

この文書は web サイト間のピアツーピア通信/通知のためのフレームワークであるトラックバックについて解説したものです。トラックバックの中心となっているアイディアはトラックバック ping です。トラックバック ping は「リソース A は リソース B に関連/リンクしています」という内容を通知するリクエストです。トラックバックの「リソース」とはトラックバック Ping URLであり、これはいわゆる URI のことです。

トラックバック を使うことで複数のサイトが、お互い関連するリソースに関する通信が可能になります。ウェブロガー A さんが何かおもしろいこと(あるいはB さんに関連していること、またはショッキングなこと)を書いたので、そのことをウェブロガー B さんに伝えたいとします。A さんはトラックバック ping を B さんへ送ります。これによって、次の2つの内容が実現されます。

  1. ウェブロガー B さんのサイトでは、B さんのエントリを参照しているすべてのサイトが自動的に一覧表示され、彼のサイトを訪れる読者は、彼のエントリに関連していて、(他サイトにある) web 上のエントリもすべてを読むことが可能になります。もちろんその中には、A さんのエントリも含まれます。

  2. トラックバック ping は誰かがリンクをクリックすることによって成立する暗黙のリンク(例: refferrer ログ)とは違い、2つのサイトにそれぞれある特定のエントリと特定のエントリの間に明示的なリンク関係を築きます。


(サーバへ)トラックバック Ping を送信する

トラックバックは REST アーキテクチャを採用しており、リクエストは普通のHTTP プロトコルを使っておこなわれます。トラックバック ping の送信は、クライアントからサーバへ HTTP リクエストを送ることで実現されます。サーバからの応答は簡単な XML の形式で返ってきます(詳細は後述)。

トラックバックシステムにおいて、トラックバック ping を受信するための URL はトラックバック Ping URL と呼ばれます。トラックバック Ping URL は http://www.foo.com/mt-tb.cgi/5 のような形式で、この例の場合最後の5がトラックバック ID になります。 サーバの実装にあたり、トラックバック Ping URL の形式はどのようなものにしてもかまいませんが、クライアントの実装は特定の URL 形式に依存しないようにしてください。

ping の送信は、クライアントがトラックバック Ping URL に対し、HTTP POST リクエストを送信することで実現されます。コンテンツのコンテントタイプは必ず application/x-www-form-urlencoded とします。たとえば、 http://www.foo.com/mt-tb.cgi/5 に対するトラックバック 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 による ping 送信は廃止で、 Movable Type 2003年1月以降のバージョンではサポートされません。

指定可能なパラメータは次の通りです。

  • title
    (クライアント側)エントリのタイトルです。

  • excerpt
    (クライアント側)エントリの要約です。Movable Type の実装においては、255バイト以上ある場合、252バイトでちょん切られ、後に...が付けられるようになっています。

  • url
    (クライアント側)エントリの permalink です。他の permalink 同様、このリンクはできる限り、HTML ページ上の実際のエントリを指すようにすべきです。その理由は、その理由はたとえば、(クライアント側のエントリの中でサーバ側エントリへの)質問をしているような場合でも分かりやすくするためです。

  • blog_name
    エントリを post した(クライアント側)ブログの名前です。

Movable Type の実装においては、上記のうち url だけが入力必須項目になっています。title が設定されていない場合、url の値が title として使われます。

上記リクエストに対するレスポンスは、アプリケーションレベルでエラー検知ができるように簡単な XML 形式で返されます(HTTP レベルのエラーは数値で返されます。たとえば、トラックバック URL に指定されたコンテンツが存在しないときは、404 が返されます。)。

トラックバック ping の送信に成功すると、サーバから次のようなレスポンスが返ります。

<?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 構造は変わりません。


(サーバから)トラックバック Ping の一覧を受信する

特定のトラックバック Ping URL に対する ping の一覧をサーバから受信するには、(サーバ側の)トラックバック Ping URL の後に ?__mode=rss という query string を付けて、HTTP GET リクエストを送信します。なお、(前項で述べた)トラックバック Ping の GET から POST への変更猶予期間が済んだら、単にトラックバック Ping URL に GET リクエストを送るだけで ping のリストを受信できるという簡単な仕様に変更されるかもしれません。

GET リクエストは次のようになります。

GET http://192.168.1.103/mt/mt-tb.cgi/3?__mode=rss

このリクエストに対するレスポンスは、エラーの場合前述の内容と同じになります。成功の場合、トラックバック ping のリストが <response> タグで囲まれた RSS マークアップの形式で返されます。

例:

<?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 データの実体です。残りは単純なレスポンスラッパーで、処理の際には切り捨てられます。


トラックバック Ping URL の自動検知

サーバ側のトラックバック Ping URL をクライアントに自動的に検知させるには、トラックバック クライアントが特定の 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 部分をコメント記号で囲むようにしてください。

<!--
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
...
</rdf:RDF>
-->

完全な解決方法とはいえませんが、応急処置にはなります。

dc: 要素は Dublin Core 標準に準拠した要素です。trackback:ping 要素は http://madskills.com/public/xml/rss/module/trackback/ の TrackBack Module for RSS 1.0/2.0 に準拠しています。 .

(対象となるエントリの web ページ) URL my_url を与えられたクライアントは(トラックバック Ping を送信する前に)次のステップに従って動作します。

  1. my_url に対し HTTP GET リクエストを送信、コンテンツを受信します。

  2. ページコンテンツをスキャンして、埋め込まれている RDF を探します。ページ内には複数の RDF インスタンスを記述できるため、クライアントは dc:identifier ブロックが my_url と一致する インスタンスを探します。

  3. 見つかった RDF ブロックにある trackback:ping の値を展開します。これがトラックバック Ping URL です。

トラックバック Ping URL がわかったところでトラックバック ping の送信(トラックバック Pingの送信 参照)が可能になります。

自動検知コードの実装例はの項に掲載しています。


トラックバックの実装例

自分でトラックバックを実装しようという開発者に全体像を把握してもらうため、Movable Type に依存しない、スタンドアロン版のトラックバック実装をリリースしています。このシステムは HTTP リクエスト経由で ping を受信し、その内容をファイルシステム上に保存、そして特定のトラックバックアイテムに対する ping のリストを RSS 形式で返します。また、このシステムは必要であれば、スタティックな 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 をご覧ください。

トラックバック URL 自動検知の実装例

use LWP::UserAgent;
sub discover_tb {
    my $url = shift;
    my $ua = LWP::UserAgent->new;
    $ua->agent('TrackBack/1.0');  
    $ua->parse_head(0);   
    $ua->timeout(15);
    my $req = HTTP::Request->new(GET => $url);
    my $res = $ua->request($req);
    return unless $res->is_success;
    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;
        if ($rdf =~ m!trackback:ping="([^"]+)"!) {
            return $1;
        } elsif ($rdf =~ m!about="([^"]+)"!) {
            return $1;
        }
    }
}

この Perl コードではサブルーチン discover_tb を定義しています。URL を与えられると、それに対応するトラックバック Ping URL を探します。見つかればトラックバック Ping URL を返し、見つからなければ、undef を返すようになっています。


変更履歴

1.1 (October 10, 2002)

  • 現在トラックバック ping は HTTP GET ではなく、POST を使うように変更されています。以前の仕様は廃止され、GET のサポートは2003年1月で打ち切られます。

  • トラックバック Ping URL は RDF において rdf:about ではなく、trackback:pingに格納されるようになりました。

  • query string の代わりに PATH_INFO を使うようトラックバック Ping URL の例を変更しました。。

  • 自動検知に使う埋め込み RDF はバリデーションを通るようになりました。

  • 自動検知のサンプルコードを追加しました。

1.0 (August 28, 2002)

最初のリリース。


謝辞

Paul Prescod さんをはじめ、トラックバックを REST アーキテクチャに沿った形にするのを助けてくれたみなさんに感謝します。


Copyright © 2001, 2002 Ben Trott and Mena Trott. All Rights Reserved.
Japanese translation 2003 Yasushi Iwata

最終更新 2005-05-23 21:58:40

5月 2005
       1
2 3 4 5 6 7 8
9101112131415
16171819202122
23242526272829
3031     
4月
2005
 6月
2005

TrackBack Technical Specification の日本語訳。

XML-Image Letterimage

© 2005-2011, Yasushi Iwata