用ASP为blog程序编写Trackback功能

  作为所谓的Blog三大特征之一的Trackback Ping,在网络上并没有一个真正的规范,它实际上最早是在Moveable发明并开始运用的一种技术,与另外两项被广泛认为是Blog最主要特征的RSS和Permalink相比,RSS本质上是是一种遵循W3C RDF规范的XML格式,Permalink是一种非常通用的静态地址技术,而Trackback Ping目前为止仅仅是在blog程序中得到运用,除了Moveable的一份技术规范文档外,也没有什么权威的标准,尤其在国内,众多blog程序有的支持有的不支持,有的有限支持,甚至还有因标准不一致而不能互相通信的(参见《blog is dead(blog已死)》)。

   但是作为开发人员,我们不需要去讨论或者争论Trackback是不是死了、它会不会带来恶意Spam这些问题,就像垃圾邮件的存在,并不影响电子邮件的技术进步和使用一样。对于开发人员来讲,既然Trackback被认为是Blog的三大技术之一,而且blog程序的用户有这种需求,那我们在开发blog的时候,就应该包含这项技术。而且,我们应该尽可能地使我们开发的技术符合标准,或者规范,至少让它发挥作用。

   Trackback Ping是由Moveable Type发明的规范,那么在没有更权威的标准之前,我们使用这项技术,当然应该以他们的规范为准,这里是他们的Trackback技术规范文档:http://www.movabletype.org/docs/mttrackback.html

   Trackback的完整实现至少包含两个方面,其一:客户端发送Trackback Ping;其二:服务器端接收和处理Trackback Ping,并向客户端返回处理结果。然后,根据需要我们可以考虑在客户端接收或者不接收,处理或者不处理返回的信息。下面是具体的代码:

'#函数名:Trackback 
'#作 用:向指定的URL发送Trackback Ping,并根据服务器端返回的信息,提示用户处理情况。 
'#参 数: 
'#RemoteURL = 目标URL,也即所引用的blog所提供的引用地址 
'#MyBlogURL = 我的Blog的URL 
'#MyBlogName = 我的blog站点名称 
'#MyBlogTitle = 当前这篇blog的标题 
'#MyBlogExcerpt = 当前这篇blog的摘要 
'#返回结果:字符串,以“|”分隔,第一部分为数字,0表示成功,1表示有错;第二部分是具体信息。 

Function Trackback(RemoteURL,MyBlogURL,MyBlogName,MyBlogTitle,MyBlogExcerpt) 
    Dim objXMLHttp,objXML,intStat,strMessage,strPostInfo 
    '对参数进行必要的处理,比如URLEncode之类 
    MyBlogURL = Server.URLEncode(MyBlogURL) 
    MyBlogName = Server.URLEncode(MyBlogName) 
    MyBlogTitle = Server.URLEncode(MyBlogTitle) 
    MyBlogExcerpt = Server.URLEncode(MyBlogExcerpt) 
    '构造要发送的请求内容 
    strPostInfo = "title=" & MyBlogTitle 
    strPostInfo = strPostInfo & "&url=" & MyBlogURL 
    strPostInfo = strPostInfo & "&excerpt=" & MyBlogExcerpt 
    strPostInfo = strPostInfo & "&blog_name=" & MyBlogName 
    '创建对象 
    Set objXMLHttp = Server.CreateObject("MSXML2.ServerXMLHTTP") 
    Set objXML = Server.CreateObject("Microsoft.XMLDOM") 
    '以post方式打开XMLHTTP对象 
    objXMLHttp.Open "POST", RemoteURL, false 
    '发送请求内容,判断发送情况,并进行处理 
    On Error Resume Next 
    objXMLHttp.Send strPostInfo 
    If Err.Number <> 0 Then 
        Trackback = "1|TrackBack错误:无法连接服务器" 
    Else 
        If (objXMLHttp.readyState <> 4) or (objXMLHttp.Status <> 200) Then 
            objXMLHttp.Abort Trackback = "1|Trackback超时" 
        Else 
            objXML.async = false 
            objXML.load(objXMLHttp.responseXML) 
            If objXML.parseError.errorCode <> 0 Then 
                Trackback = "1|TrackBack响应解析错误" 
            Else 
                If objXML.getElementsByTagName("error")(0).Text="0" Then 
                    Trackback = "0|Trackback成功" 
                Else 
                    Trackback = "1|Trackback错误:"&objXML.getElementsByTagName("message")(0).Text 
                End If 
            End If 
        End If 
    End If 
    '释放对象 
    Set objXMLHTTP = Nothing 
    Set objDom = Nothing 
End Function
'#过程名:DealRequest 
'#作 用:接收和处理客户端发来的Trackback Ping 
'#参 数:无 
Sub DealRequest() 
    Dim blog_id,tbTitle,tbName,tbURL,tbExcerpt,stat 
    
    '从所请求的URL中提取所引用的blogID,以便从数据库中检索对应的blog 
    '这个参数根据你所写的blog程序提供的Trackback地址形式而定 
    '这里我们假设这个参数为“id” 
    
    blog_id = Request.QueryString("id") 
    
    '读取出客户端传来的请求中的每个部分 
    '注意,这里没有对以Get方式提交的请求作出处理 
    '因为2003年以后根据技术规范已经不再接受Get方式的请求 
    '如果希望增强兼容性,可以加上对Get方式的请求的处理 
    
    tbTitle = Request.Form("title") 
    tbName = Request.Form("blog_name") 
    tbURL = Request.Form("url") 
    tbExcerpt = Request.Form("excerpt") 
    
    '检索数据库中id为blog_id的blog数据和url为tbURL的Trackback记录 
    '如果blog不存在,或者Trackback记录已存在,向客户端返回相应的出错说明 
    '我们这里调用一个进程tbResponseXML来完成这项工作 
    '调用时,以参数stat=0[1,2]分别表示成功、日志不存在和记录已存在 
    
    tbResponseXML(stat,"utf-8") 
    
    '如果是成功,还应当做好更新TrackBack记录和相关blog引用数的工作
End Sub
'#过程名:tbResponseXML 
'#作 用:接收和处理客户端发来的Trackback Ping 
'#参 数: 
'#stat:错误代码,0=成功;1=日志不存在;2=Trackback记录已存在 
'#strCharset:要返回的XML的编码 

Sub tbResponseXML(stat,strCharset) 
    Response.ContentType = "text/xml"
    Response.Charset = strCharset
    Response.Write "<?xml version=""1.0" encoding=""" & strCharset & """?>" 
    Response.Write "<error>" & stat & "</error>" 
    If stat = 1 Then 
        Response.Write "<message>The blog you're trackbacking isn't exist!</message>"
    ElseIf stat = 2 Then 
        Response.Write "<message>You can not Trackback a blog twice from the same URL.</message>" 
    End If
End Sub