Pingback和Xml

919次阅读  |  发布于5年以前

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