番茄的梦想

那一抹夕阳

  博客园  :: 首页  ::  :: 联系 :: 订阅 订阅  :: 管理

TrackBack技术规范

  原文是TrackBack Technical Specification,此处是译文。

TrackBack 技术规范


名称

mttrackback - TrackBack 技术规范


作者

Benjamin and Mena Trott, movabletype.org


版本

1.1


描述

本文描述了TrackBack, 一个点对点通信和网站间互相通告的框架. TrackBack的中心思想是TrackBack ping的概念, 从本质上讲,TrackBack ping是一个请求,通告“资源A与资源B相关,或有链接到资源B.” 一个TrackBack “资源” 用一个TrackBack Ping URL表示, 这是一个标准的URI.

利用TrackBack,站点间可以互相通告相关的资源. 例如,如果博客(weblogger)甲希望通知博客乙他写了一些有趣的/相关的/骇人听闻的文字,甲发送一个TrackBack ping给乙。这完成了两件事:

  1. 乙能自动列出那些引用他的某篇文章的网站,到他网站的访问者能读到网络上所有与此文相关的文章,包括甲的文章。

  2. ping在他的文章和你的文章间提供了一种稳固的、直接的链接,而不是那种依赖于外部行为(某人点击那个连接)的非直接连接(如反向连接referrer)。


发送一个TrackBack Ping

TrackBack使用REST(Representational State Transfer,http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm)模式工作, 请求通过标准的HTTP调用传送。要发送一个TrackBack ping, 客户端向服务器端发送一个标准的HTTP请求,然后接收一个简单XML格式的应答(详见下述).

在TrackBack系统中,接收TrackBack pings的URL叫TrackBack Ping URL.一个典型的TrackBack Ping URL如http://www.infomall.cn/cgi-bin/mallgate/20040514/http://www.foo.com/mt-tb.cgi/5, 其中5是TrackBack ID. 服务器端可以用任何有意义的格式来定义TrackBack Ping URL;客户端不应该只限于特定的格式.

为了发送一个ping, 客户端发送一个POST格式的HTTP请求到TrackBack Ping URL. 请求的内容的content type应是application/x-www-form-urlencoded. 例如, 到http://www.infomall.cn/cgi-bin/mallgate/20040514/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

注意: 在旧版本的TrackBack规范中,ping是用GET格式的HTTP请求发送的. 这种方式将不再支持; 2003年1月发布的Movable Type系统将会去掉对GET方式的支持。.

可能的参数包括:

  • title
    文章的标题

  • excerpt
    文章的摘要. 在Movable Type系统中, 如果摘录信息超过255个字符将会被截断为252个字符, 并在后面增加 ...三个字符.

  • url
    文章的永久连接. 象其它永久连接一样,这个连接应可能准确地在页面中定位文章的入口,因有疑问时这个链接会用到。

  • blog_name
    发表文章的blog的名称。

在Movable Type系统中, 在上述的参数中只有 url 是必须的. 如果 title 没有提供,, url 的值将被用作标题.

对上述请求的应答信息,以XML格式编排,从而能实现应用层的错误检查。(HTTP层的错误将会这样返回--例如,如果TrackBack URL 所指的资源在服务器上已经不存在,状态码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 结构保持不变.


取回TrackBack Pings

要取回某个特定TrackBack Ping URL收到的ping,向它发一个GET格式的HTTP请求,请求字符串(query string)是 ?__mode=rss. 在规范的将来修订中,--一旦从POST转换到GET的过渡期结束--这将非常简单,向TrackBack Ping URL发送一个GET请求,将返回一列ping.

一个GET请求样例如下::

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

对此请求的应答,要么返回如上所述的错误信息,要么返回一列用RSS规范格式标志的TrackBack pings, 整个应答内容的覆巢无根元素是 <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数据; 剩余的部分都是应答内容的包装,处理时可以忽略.


TrackBack Ping URLs的自动发现

TrackBack客户端需要一种方法,来确实一个特定的URL或blog文章的TrackBack Ping URL. 服务器在生成页面时应内嵌RDF; RDF 描述关于该文章的元数据,允许客户端自动发现TrackBack 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:identifer="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元素来自RSS 1.0/2.0的TrackBack模块,参见http://www.infomall.cn/cgi-bin/mallgate/20040514/http://madskills.com/public/xml/rss/module/trackback/.

给定一个URL my_url, 客户按下列步聚来寻找TrackBack Ping URL:

  1. 发送GET格式的HTTP请求,取回 my_url对应的页面的内容.

  2. 扫描页面内容,查找内嵌的RDF. 页面中可能嵌有多处RDF--客户端要找到 dc:identifier等于my_url的那块RDF信息.

  3. 从RDF块中抽取trackback:ping值,这就是TrackBack Ping URL.

客户端一旦确实了TrackBack Ping URL, 它就可以发送TrackBack ping了 (参见 发送 TrackBack Ping).

自动发现的代码样例参见 例子.


例子

TrackBack实现样例

为帮助那些有远见的开发人员在他们的系统中实现 TrackBack , 我们发布了一个TrackBack的独立的实现,它不依赖于Movable Type系统. 它可接收通过HTTP请求发送来的ping, 将ping存放在本地的文件系统中, 且可以返回某个特定TrackBack项(文章)的一列RDF格式的ping. 如果你要求,它还可以静态地产生 RSS文件. 例如,要将最近的15个ping列在工具条,这项功能就会泒上用场。

这个独立的TrackBack实现可从http://www.infomall.cn/cgi-bin/mallgate/20040514/http://www.movabletype.org/downloads/tb-standalone.tar.gz下载.

它的发行遵循 Artistic License. Artistic License条款的描述在 http://www.infomall.cn/cgi-bin/mallgate/20040514/http://www.perl.com/language/misc/Artistic.html.

它的安装和使用指令说明在http://www.infomall.cn/cgi-bin/mallgate/20040514/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相对应的TrackBack Ping URL. 如果找到了,它会返回 TrackBack Ping URL; 否则返回 undef.


变动

1.1 (2002年10月10日)

  • 在此版本中,TrackBack pings 的发送用 POST 格式的HTTP请求代替 GET格式的请求.旧版本的GET方式将不在支持,MT中从2003年1月起也不再提供对GET方式的支持。

  • 在RDF中,现在TrackBack Ping URL应在trackback:ping 元素中保存, 而不是原先的 rdf:about元素.

  • 修改了 TrackBack Ping URL的样例的格式,用 PATH_INFO 代替了请求串(query string).

  • 内嵌的供自动发现使用的RDF不再导致页面检查时出错。

  • 增加了自动发现的样例代码.

1.0 (2002年8月28日)

规范首次发布.


致谢

感谢Paul Prescod和其他朋友,他们的指导让TrackBack更符合REST.


Copyright © 2001, 2002 Ben Trott and Mena Trott. All Rights Reserved. Posted by Hilton at November 7, 2003 11:28 AM | TrackBack
Comments

谢谢你的文章,受益多多

Posted by: 出境旅游 at April 7, 2004 03:46 PM

Hi Chergen,
  我用的blog引用你说这个blog的“实验室成员个人blog大爆发”,成功了(也麻烦你将它删除吧),也就是说它是可以接收trackback的。
  是不是系统不稳定,你再试一下?

Hilton

Posted by: Hilton at March 4, 2004 07:24 PM

在Blog服务器http://www.infomall.cn/cgi-bin/mallgate/20040514/http://www.etc.edu.cn/blog/(Moveable Type) 中的Blog中,发送引用通告时会显示出错了(实际上已经发送出去,目的地能够接收到),但是它本身不能收到其他服务器发送过来的引用通告!请问这是什么原因,以及怎么解决。
希望能得到你的解答!谢谢!

Posted by: Chergen at March 4, 2004 07:06 PM

看的非常犀利糊涂,不知道在程序里如何实现

Posted by: kimjooy at November 14, 2003 09:55 AM

看了你的这两篇教材,开始多少对trackback有些了解了!
谢谢你的共享!

Posted by: tsingove at November 13, 2003 01:14 PM

  从这个规范的定义来看,trackback系统是在两个支持tb的两个web服务器之间互相传递信息的一套机制。传递的信息有两类:
  一是引用信息,以ping发送,数据包中可以含有 title、excerpt、url、blog_name等内容,其中只有url信息是必须的。这类信息,主要是想告诉对方,我这儿有一篇什么样的文章(如标题为何,摘要是何,URL是何等)引用了你的哪一篇文章(POST信息到的目标URL,已经指定了是哪篇文章了)。
  另一类,是从某个站点取回这个站点的某篇文章收到的所有的引用。有了这个功能,你就可以找到所有与你兴趣相投的文章了(只少它们都引用了这篇文章)。

  至于当你收到某人发来的ping时,如何处理,要不要显示,显示哪些内容,要不要分类,要不要计数,则是个人的自由,规则没有作规定。
  不过有一点,就是没有必要分析referer,一是因为这个ping包中本身就有url信息,二是这个请求是web服务器发出的,请求头里可能没有referer信息。

  还有一点,就是从规范中可知,trackback系统中,每篇文章有两个URI,一个正常的可以访问页面的URL,另一个用来接收ping的URL(即所谓trackback ping url),至于后一种URL如何设计,规范也没作规定,只要这个URL中的信息能区别出是那篇文章,即可。

  以上是我的理解,供参考。

Posted by: Hilton at November 9, 2003 11:57 AM

TRACK BACK 系统:是不是就是真对每篇文章(URL)设置独立的计数器,并且GROUP BY REFERER的域名?

posted on 2006-12-07 19:31  番茄的梦想  阅读(408)  评论(0编辑  收藏  举报