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

≪ 目次


名称

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


作者

Benjamin、Mena Trott、movabletype.org


バージョン

1.1


説明

このドキュメントは、トラックバックを説明しています。トラックバックは、ウェブサイト間での一対一のコミュニケーションと通知を可能にするフレームワークです。 トラックバックのメカニズムは、 トラックバックping という1つのリクエストが「リソースAはリソースBに関連またはリンクしている」と告げていることによります。 1つのトラックバック「リソース」は、標準のURIである トラックバックping先URL で表します。

トラックバックを使うと、サイト間で関連したリソースについてコミュニケーションができます。 たとえば、ブロガー(ウェブログ作成者)AがブロガーBに、何か面白いことや関連することやショックなことを書いたと通知したい場合、AはBにトラックバックpingを送信します。 それによって、以下の2つが達成できます。

  1. ブロガーBは、自分のサイトにある特定の投稿を参照したすべてのサイトを自動的にリストでき、ブロガーBのサイトの読者は、ブロガーAの投稿を含むウェブ中の関連した投稿を読むことができます。
  2. pingは、別のブロガーのエントリーとあなたのエントリーの間に、確かで明白なリンクを提供します。これは、外部のアクション(あなたのエントリーへのリンクを誰かがクリックすること)による、リンク元ログのような暗示的なリンクとは異なります。

トラックバックpingの送信

トラックバックは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構造は将来も同じです。


トラックバックpingの取得

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データです。残りの部分は単に応答に使うタグで、削除できます。


トラックバック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を、以下のように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 の場合、クライアントは以下のステップに従うはずです。

  1. HTTP GETリクエストを送り、 my_url にあるページ・コンテンツを取得します。
  2. 埋め込まれたRDFのページ・コンテンツを走査します。 ページには、埋め込まれたRDFのインスタンスが複数ある可能性があります。クライアントは、 dc:identifier my_url に一致するブロックを拾い上げるはずです。
  3. trackback:ping 値をRDFブロックから抽出します。 これがトラックバックping先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 を返します。


変更事項

1.1 (2002年10月10日)

1.0 (2002年8月28日)

最初のリリース


謝辞

トラックバックをRESTのように作成するため指導していただいたPaul Prescod氏およびその他の方々に感謝いたします。


Copyright © 2001-2005 Six Apart, Ltd. All Rights Reserved.