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 server:
万能的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的实现,感觉还是挺复杂的,记下来:
由此可见,wordpress为了实现pingback出现在评论里,以及智能提取摘要的功能,写了非常多的代码。
最后,原理都弄明白了,就等找时间开工了。
Copyright© 2013-2020
All Rights Reserved 京ICP备2023019179号-8