最近一段时间,总觉得自己博客缺少点什么,回想一下自己每次发博文的时候,好像过程略显繁琐,所以就想到了自己编写博文的工具似乎是支持 MetaWeblog API 的,所以就稍作研究,然后给他实现了。同时,代码也放出来了,有兴趣的同学可以将就着看这个:MetaWeblog Python Implements,下面我就以我实现的过程写一写其中有意思的地方。

MetaWeblog API 概述

MetaWeblog API(MWA)是一个Blog程序接口标准,允许外部程序 get 或者 set 博客中博文的内容和属性。MetaWeblog API 以当年很流行的 XML-RPC 通信协议为基础,在很多编程语言上都有了便捷的实现[引自 wiki 翻译]。但是,很可惜,没有看到很不错的 Python 实现,所以,自己动手搞了一个基于 Tornado 的。

MetaWeblog API 实例

其实 MetaWeblog API 可以理解成一个 HTTP 请求,然后请求的内容为 XML,这个 XML 内容可不是随便编纂的,而是有严格的格式要求的,具体的格式要求可以参考这篇:CnBlog MetaWeblog API。其实,更好的推荐应该是 Wordpress 的,但是,我懒得自己搭建一个,所以就找个国内实现得比较齐全的 CNBlogs 试验了,国内很多博客平台都实现了这些接口,我只尝试了 OSChina 和 CNBlogs 的,相比之下 OSChina 实现的不全,例如 metaWeblog.getPost 这个就没有实现,所以我推荐使用 CNBlogs 的。

既然说了给实例,那么就上一个实例,例如刚才说的 metaWeblog.getPost 这个接口,这个是用于获取指定 id 的博文的接口,首先,我们就先来看下别人的文档是怎么写的:

snsh 3

这里的参数有三个,分别是 postidusernamepassword,所以我们请求的时候代码是这样的:

可以很简单得从这里看到:第 12/17/22 行就是参数的值,发送请求之后,就返回了 getPost 的值了。

调试 API 的方法

可能有很多同学在调试 API 的时候很苦恼,因为构造请求 API 的内容很繁琐,而且没有太多营养,所以,我这里教大家一个方法如何快速方便得调试 MetaWeblog API。

假设你使用的 Windows 平台的 Live Writer,那么正常的一个调用过程是这样的:

snsh 5

如果我们要调试的话,既可以在 Live WriterCNBlogs 之间加一个代理,例如常用的 Fiddler,然后再把中间的包抓出来就有了请求的明文(这也是 MetaWeblog API 的缺点,很容易被人抓包),这样我们就根本不需要自己构建请求内容了,直接从现有工具中提取出来即可。

snsh 6

如果你由于各种原因不能抓包,或者说使用不顺畅,那么自己写一个简单的 Web 服务器,问题也不大,例如我使用 Tornado 简单写了一个:

这里直接就将 Live Writer 的内容请求到我们自己的服务器中,然后将请求内容打印出来,也是可以直接拿来用了,省了超多的编辑时间。

Python 处理 MetaWeblog 的不错实践

因为 API 的接口比较多,所以不免需要对 API 的请求方法进行判断然后再调用对应的方法,然而,在 Python 中,因为有很多神奇的语法,所以我将 MetaWeblog 封装成了一个类,然后稍作封装,这方法调用就变得很简单了:

这个实践我用在开篇中的项目中了,完整源码可以在 Github 中看到。

Python 处理 XML

对于 XML 的处理在 Python 中似乎也是有些繁琐的,我也疲于应对这个繁琐,所以想找些简单的库来用,其中有一个:Python 解析 XML 的几种方式 的库还不错,它可以将 XML 转化成字典,但是,我觉得还是过于麻烦,因为对于不存在的参数,我需要经常像这么一样调用:

req_obj.get("a", {}).get("b", {}).get("c", {})

所以,为了简化这个痛点,我封装了一个更加方便的库,但是需要说明的是,这个库我只用于我的这个个人项目,没有用于线上项目,而且,需要提醒的是这个库占用内存会比普通解析的方式高很多,至于高多少,大概比 DOM 型多一丢丢吧。

封装之后,像刚才那种调用方式,我可以直接得这么调用:

req_obj.a.b.c

不需要担心 req_obj 中不存在 a 元素,也不担心 req_obj.a 中不存在 b 元素,这个封装我也放在开篇中的 github 项目中了,感兴趣的同学也可以自行查看一下。

总结

这篇博文对 MetaWeblog API 这个接口协议进行了一个简单的介绍,更多得是从实战角度来解析,同时,以开发者的角度给希望自行开发接口的同学实质性的帮助,希望对同学们有帮助。

Reference

  1. Wordpress 的说明
  2. RFC: MetaWeblog API
  3. CNBlog MetaWeblog API Docs
  4. XML 在线格式化
  5. XML to Python Dict
  6. Python 解析 XML 的几种方式
  7. Tornado 服务器教程