RSSとトラックバック

ウェブログなどのシステムでは、誰か別の作者の記事にコメントを付けたということを通知して、一種のコミュニケーションを形成していく「トラックバック」という機能がよく使われます。この仕組みとRSSを組み合わせることで、文書の関連をメタデータとして示すことができるか、DCのような汎用語彙との関係はどうか、少しだけ検討してみます。

RSSのTrackbackモジュール

RSSで利用できるモジュールのひとつとして、トラックバックのPING URIを記述するための仕様が定義されています。[TBMOD]

名前空間宣言
xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/"
ping
この記事(item)にトラックバックPINGを送ってもらうためのURI(いわゆるTrackBack URL)
about
この記事からトラックバックPINGを送った相手先URI(先方のTrackBack URL)

自分の記事にトラックバックしてくださいというURIを示すのがtrackback:pingで、各item要素に1つしか持つことができません。自分の記事からトラックバックPINGした相手のURIはtrackback:aboutを使って記述します。複数書くことができます。いずれもプロパティ要素として目的語URIを記述するので、rdf:resource属性を使います(rdf:aboutではない!)。

[例1]

<item rdf:about="http://example.org/myblog/article001.html">
 <title>....
 ...
 <trackback:ping rdf:resource="http://example.org/myblog/trackback?id=001"/>
 <trackback:about rdf:resource="http://foo.com/hisblog/tbsys?id=123"/>
 <trackback:about rdf:resource="http://bar.com/herblog/tb?id=039"/>
 ...
</item>

比較的新しく提案された語彙だということもあって、「標準」モジュール[RSSMOD]には含まれていません。いちおうmovabletype.orgの関係者が定義し、実際に実装されてもいるので、おおむねウェブログ方面では標準といえるのでしょう、たぶん(しかし、この実装での、RDFをXHTMLにコメントとして埋め込むというC.C.ライセンス語彙同様の手法は、いかがなものか)。

RSS 2.0でも利用できるとされていますが、こちらはRDFに基づかないので、rdf:resourceを使わず、たんなるリテラルとしてURIを記述するらしいです(RSS 1.0なのに、<trackback:ping>http://...</trackback:ping>という具合にURIをリテラルとして記述するのは、少なくともモジュール仕様書に照らすと誤りです)。

トラックバックと文書間の関連

ウェブログのシステムでは、トラックバックを「送ってくれた」相手(自分の記事についてコメントしている記事)のURIも記録できるため、このURIを示すプロパティはないのかということになるようです。これをTrackbackモジュールの語彙に含めなかった理由について、仕様の作者がRSS-DEVのメーリングリストに次のように投稿しています。

The reason pings received by an item was not in the module was because you can basically get those by looking at the pings sent for other items. Granted, you need a large pool of feeds to make this useable (the scenario under which I wrote the specs), but it does work. I'm certainly willing to add a "received" element to both specs. Sound good?

たくさんのRSSのデータが集積されれば、trackback:aboutだけで記事の関連は把握できる、というわけ?

TrackBack URLと文書の関係

しかし、trackback:pingはPING送信作業の自動化に使えるからいいとして、trackback:aboutのほうは、役割に疑問が残ります。ここにに記述するのは相手の文書のURIではなく、TrackBack PINGのURI(以下TB-uri)と定義されているわけですが、TB-uriへは“コメントを書いたよ”というメッセージを送れるだけで、実際の文書を参照できるわけではありません。ここで示したいのが、自分と言及した相手との「文書間の関連」だとすれば、むしろDublin Coreの拡張語彙などを使って相手文書のURI(permalink)を記述する方が有益なのでは?

いちおう、少なくともMovableTypeの実装では、TB-uriTrackBackIDとpermalinkは連動しているように見えます。

[例2]

http://example.org/mt/tb.cgi/123            (TB-uri)
http://example.org/mt/archives/000123.html  (permalink)

ただし、これは設定によって違ってくる可能性はあるし、ほかのウェブログシステムでどうなっているかも未調査で、実用性のほどは何とも言えません。エージェントがここから文書のURIを推測することを期待するのは、無理がありそうです。

#ああ、そうか、MTなどのシステムが「RSSを書き出す」自動処理は、相手のTB-uriの方が簡単ということか。TB-uriならPINGを送信した時にそのURIを記録しておけばいいが、相手文書のURIは、自分のウェブログ本文のa要素を解析するか、ログの作者自身がいちいち手入力する必要があるというわけだ。 しかし、機能から見てTB-uriは本来POSTのためのものであり、そのままGETするのはそもそも不適当だろう(次の'RSSモード'は、TB-uriをGETで使う方法のひとつ)。trackback:aboutに文書間の関係の記述を期待するのは、無い物ねだりということだ。

トラックバックの'RSSモード'

逆にTrackBack仕様書[TB-SPEC]の'Retrieving TrackBack Pings'セクションでは、TB-uriに?__mode=rssを加えてGETリクエストを送ると、その文書にPINGを送った(コメント元)文書に関するメタデータが取得できるとされています。

[例3] http://example.org/mt/tb.cgi/123?__mod=rss

このリクエストを送ると、次のようなRSS(0.91)もどきのXMLが戻ってきます(ただしRDFではありません)。

[例4]

<response>
 <error>0</error>
 <rss version="0.91">
  <channel>
   <!-- 記事本文に関するメタデータ -->
   <title>TrackBack at OSCON</title>
   <link>http://www.movabletype.org/trackback/archives/000549.html</link>
   <description>If you're at the ...</description>
   <language>en-us</language>
   <!-- 以下、PINGを受けたコメント元をitem要素として列挙 -->
   <item>
    <title>This is a test</title>
    <link>http://www.merthyr-tydfil.org/mt/archives/2002_07.shtml</link>
    <description>MOVABLE TYPE :: Personal Publishing System</description>
   </item>
   ...
  </channel>
 </rss>
</response>

これを利用すれば、RSSに'received'のURI(Pingを送ってくれた相手のURI)がなくても、trackback:pingのURI+?__mode=rssで逆リンクを辿ることができるはずです。いくつかのMovableTypeのウェブログで試してみたところ、少なくともMTでは?__mode=rssは実装されているような感じでした(ただし、たまに整形式XMLになっていない)。

とはいえ、MT以外では機能しないケースもあり、これがどの程度標準化されていて使い物になるのかは、今のところ不明です。それに、もちろん、メタデータに記述されているURIにエージェント側で特別なパラメータ(クエリ文字列)を加えるなどというのは、およそ汎用的な方法ではないので、(MT系の)ウェブログに限った特殊な情報としての利用に限定されてしまうわけですが。

Dublin Coreによる参照、被参照関係の記述

trackback:aboutなどで言いたいことが、文書間の参照、被参照の関係であれば、特殊な語彙を新たに考案するまでもなく、Dublin Coreの精密化要素(拡張語彙)で定義されているreferencesisReferencedByを使うことができます。

[例5]

<rdf:RDF
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:dcterms="http://purl.org/dc/terms/"
  xmlns:trackback=...
  ...>

 <item rdf:about="http://example.org/myblog/article002.html">
  <title>....
  ...
  <trackback:ping rdf:resource="http://example.org/myblog/trackback?id=002"/>
  <dcterms:references rdf:resource="http://foo.com/hisblog/archives/000123"/>
  <dcterms:isReferencedBy rdf:resource="http://bar.com/herblog/article/0039"/>
  ...
 </item>

</rdf:RDF>

この拡張要素は、基本要素DCMESとは別の名前空間を用います。referencesはこのitem要素の記事が参照・言及している(トラックバックを送った)相手、isReferencedByはこの記事が参照されている(トラックバックを受け取った)元の、それぞれ「記事そのもの」のURIを示しています。

この語彙では、参照、被参照という関係を示すだけで、そこに「トラックバック」という機能が介在していることは示しません。また、参照(reference)は、コメントを送るという積極的な働きかけのニュアンスがないので、その点も物足りないかも知れません。しかし、ウェブ上での文書間のつながりを示すという意味なら、これで十分であり、より広いアプリケーションに理解されることが期待できます。

エージェントが関連文書を辿っていくという意味では、現在の多くのエージェントが理解できるrdfs:seeAlsoという手もありそうです。もっとも、これはRDF/XMLを処理するエージェントが辿る「リンク」なので、その先にHTML文書があってもあまり素晴らしくはないんですけどね(その文書のメタデータがあれば、seeAlsoしてもいいかも)。

RSS 1.0のannotationモジュール

RSS 1.0のモジュールの中にAnnotation module[RSS-ANNOT]というものが(標準とはなっていませんが)あり、dcterms:referencesとほぼ同等の関係を記述することができます。

名前空間宣言
xmlns:annotate="http://purl.org/rss/1.0/modules/annotate/"
reference
この記事(item)が参照したりコメントしたりしている相手先URI

dctermsとちがって名詞形(最後のsがない)であることに注意してください。

[例6]

<rdf:RDF
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:dcterms="http://purl.org/dc/terms/"
  xmlns:annotate="http://purl.org/rss/1.0/modules/annotate/"
  ...>

 <item rdf:about="http://example.org/myblog/article002.html">
  <title>....
  ...
  <annotate:reference rdf:resource="http://foo.com/hisblog/archives/000123"/>
  ...
 </item>

</rdf:RDF>

意味としてはdcterms:referencesを使うのとあまり違いはありませんが、RSS関連の語彙ということで、RSSリーダーとしてはサポートしやすいかも知れません。例えば、ウェブログのコメントの連鎖を「スレッド」のようにして閲覧するなどの応用ができるでしょう(NewzCrawlerがVer1.6から対応すると謳っています。ただし、ここではrdf:resourceではなくて、link要素のような文字列にしてしまっていますが…)。

参照文献

[TBMOD]
Justin Klubnik, Benjamin and Mena Trott, TrackBack Module for RSS 1.0/2.0, , Version 1.0 (Draft)
<http://madskills.com/public/xml/rss/module/trackback/>
[TB-SPEC]
Benjamin and Mena Trott, TrackBack Technical Specification, , movabletype.org, version 1.1
<http://www.movabletype.org/docs/mttrackback.html>
[TB-STANDALONE]
tb-standalone - Standalone TrackBack, movabletype.org
<http://www.movabletype.org/docs/tb-standalone.html>
[TB-DEV]
TrackBack Development, movabletype.org
<http://www.movabletype.org/trackback/>
[RSSMOD]
, RDF Site Summary 1.0 Modules, , RSS-DEV Working Group
<http://purl.org/rss/1.0/modules/>
[RSS-ANNOT]
, RSS 1.0 Modules: Annotation, , Draft (proposed)
<http://web.resource.org/rss/1.0/modules/annotation/>