Pingback和Xml-RPC

WordPress有一个功能:当有人引用本站文章时,会添加一条评论在文后,显示引用页面的信息;发博客时WordPress也会通知文章内每个链接,让它知道自己被引用了。这个功能非常赞,让博客间的互动变得更容易。

改用自己的博客系统后,还想用这么高级的功能,只有靠自己了。搜索得知,这个功能叫Pingback,是基于XML-RPC的一个协议。Pingback功能需要实现一个xmlprc client,在文章更新时ping对方服务;以及一个xmlrpc server,来接受其它服务器发过来的ping。

先研究下XML-RPC协议,走http用xml来交换数据,跟SOAP很像,但比SOAP简单的多。Python里有现成的库可以方便的处理xmlrpc。

来尝试下写个xmlrpc客户端:

from xmlrpclib import ServerProxy
from pprint import pprint

s = ServerProxy('http://www.aoao.org.cn/xmlrpc.php')
pprint(s.system.listMethods())

这段代码运行完,输出了aoao同学提供的好多方法。那些metaWeblog、blogger、wt、wp开头的都是跟博客管理有关的,调用时需要传帐号密码,就先不玩了。试下addTwoNumbers和sayHello,看名字应该可以玩:

>>> s.demo.addTwoNumbers(1, 2)
3
>>> s.system.multicall([{'methodName':'demo.addTwoNumbers','params':[1,2]},{'met
hodName':'demo.sayHello','params':[]}])
[[3], ['Hello!']]

果然成功了。看起来跟本地函数一样的调用形式,xmlrpclib却在后台把输入参数拼装成xml,post给远端服务,再拿到返回的xml数据解析出返回值。也支持多个方法批量调用,真是太赞了~

回过头来看Pingback协议,更新文章时怎么通知他人就有思路了:

  • 先找出文章中所有链接,还要找出链接对应的xmlrpc(pingback) server;
  • 调用该server的pingback.ping方法,把本文链接和对方链接作为参数传过去;
  • 处理返回状态,记录下这次pingback的信息,这是为了避免更新文章时多次ping。

官方文章中提供了两种方案从一个链接找到对应的xmlrpc server:

  • 查找该链接response header里的X-Pingback字段;
  • 查找该链接页面里的标记。

万能的python搭建一个xmlrpc服务也很简单:

from SimpleXMLRPCServer import SimpleXMLRPCServer

def sayHello(name='Kitty'):
    return 'Hello %s' % name

server = SimpleXMLRPCServer(("localhost", 8000))
server.register_function(sayHello, 'hello')
server.serve_forever()

上面的代码搭建了地址为http://localhost:8000的xmlrpc服务,并提供了hello方法,试下:

>>> from xmlrpclib import ServerProxy
>>> s = ServerProxy('http://localhost:8000')
>>> s.hello()
'Hello Kitty'
>>> s.hello('Jerry Qu')
'Hello Jerry Qu'

没问题。剩下的工作就是实现一个能提供pingback.ping方法的xmlrpc server了。看了wordpress的实现,感觉还是挺复杂的,记下来:

  • 从过来的xml中解析出pagelinkedfrom(来源url)和pagelinkedto(被请求url);
  • 根据pagelinkedto找出被请求页面post_ID,wp支持多种格式的文章链接,找post_Id这部分代码非常纠结;
  • 抓取pagelinkedfrom网页内容,提取标题,并找出pagelinkedfrom的位置,并提取该位置附近的文字作为摘要,这一步代码也非常复杂;
  • 将上一步得到的标题、摘要、和pagelinkedfrom添加到被请求页面的评论中;
  • 上面任何一步出现异常都将终止流程并返回异常,否则记录该pingback状态,返回成功。

由此可见,wordpress为了实现pingback出现在评论里,以及智能提取摘要的功能,写了非常多的代码。

最后,原理都弄明白了,就等找时间开工了。

本文链接:参与评论 »

--EOF--

提醒:本文最后更新于 2095 天前,文中所描述的信息可能已发生改变,请谨慎使用。

Comments