博客中加入Trackback(引用通告)功能
博客中又增加了一个不错的功能:Trackback(引用通告)。其实我在去年的时候就想要在博客中加入Trackback,但由于一直不知道其运行原理,所以很没有头绪。
今天经过查阅资料后了解了Trackback的实现原理:在发送Trackback的时候伪造了一个POST方式的HTTP请求,然后对方服务器接收到这个请求后,会返回一段XML格式的应答。由于Trackback Ping是由Moveable Type发明的规范,就应当遵循他们的Trackback规范,这是他们的技术规范文档:http://www.movabletype.org/docs/mttrackback.html
要实现Trackback的功能至少要包括两个功能:1、发送Trackback Ping;2、接收和处理Trackback Ping,并返回处理结果。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
'发送Trackback Ping Public Function Trackback(RemoteURL,BlogName,LogURL,LogTitle,LogExcerpt) Dim objXMLHttp,objXML,intStat,strMessage,strPostInfo '将要发送的参数进行URL编码 BlogName = Server.URLEncode(BlogName) LogURL = Server.URLEncode(LogURL) LogTitle = Server.URLEncode(LogTitle) LogExcerpt = Server.URLEncode(LogExcerpt) strPostInfo = "title=" & LogTitle strPostInfo = strPostInfo & "&url=" & BlogURL strPostInfo = strPostInfo & "&excerpt=" & LogExcerpt strPostInfo = strPostInfo & "&blog_name=" & BlogName '创建对象 Set objXMLHttp = Server.CreateObject("MSXML2.ServerXMLHTTP") Set objXML = Server.CreateObject("Microsoft.XMLDOM") '以POST方式打开XMLHttp对象 objXMLHttp.Open "POST", RemoteURL, False objXMLHttp.setRequestHeader "Content-Type", "application/x-www-Form-urlencoded" '发送请求内容 On Error Resume Next objXMLHttp.Send strPostInfo If Err.Number <> 0 Then Trackback = "TrackBack错误:无法连接服务器" Else If (objXMLHttp.readyState <> 4) or (objXMLHttp.Status <> 200) Then objXMLHttp.Abort Trackback = "Trackback超时" Else objXML.async = False objXML.load(objXMLHttp.responseXML) If objXML.parseError.errorCode <> 0 Then Trackback = "TrackBack响应解析错误" Else If objXML.getElementsByTagName("error")(0).Text="0" Then Trackback = "Trackback成功" Else Trackback = "Trackback错误:"&objXML.getElementsByTagName("message")(0).Text End If End If End If End If '释放对象 Set objXMLHTTP = Nothing : Set objDom = Nothing End Function |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
'接收和处理Trackback Ping Public Sub DealRequest() Dim logid,tbTitle,tbName,tbURL,tbExcerpt,stat logid = Request.QueryString("id") '网上说QueryString集合已经在2004年就被费除了,所以只使用了form集合。如果想要都兼容的话可以写为:request("title")这种类型 tbTitle = Request.Form("title") tbName = Request.Form("blog_name") tbURL = Request.Form("url") tbExcerpt = Request.Form("excerpt") '根据判断返回相应的信息 '先根据接收到的logid查询是否存在日志,返回stat = 0 '如果存在则继续判断,根据tbURL判断是否已经引用过此日志,返回stat = 2 '日志不存在返回stat = 1 Set r = execute("select id from table where id="&logid) If not (r.eof and r.bof) Then stat = 0'成功 Set r_tb = execute("select * from trackback where logid="&logid&" and tburl='"&tbURL&"'") If r_tb.eof and r_tb.bof Then '执行到这步表示一切都正确,下面运行插入trackback表的数据,这里省略 Else stat = 2'记录存在 str = "您已经引用过此文章" End If r_tb.close : set r_tb=nothing Else stat = 1'日志不存在 str = "引用的文章不存在" End If r.Close : Set r=Nothing Response.ContentType = "text/xml" Response.Charset = "utf-8" Response.Write "<?xml version=""1.0"" encoding=""utf-8""?>" & vbNewLine Response.Write " <response>" & vbNewLine Response.Write " <error>" & stat & "</error>" & vbNewLine If stat > 0 Then Response.Write " <message>"&str&"</message>" & vbNewLine End If Response.Write " </response>" End Sub |
以上两段代码便是用ASP实现Trackback的核心代码了。其中要注意的是提交的内容必须经过URL编码后再发送,否则遇到中文字符就会出错。