研究这个的初衷是为了让 plog 能支持通过 Google Docs (http://docs.google.com) 写文章。那样的最直接好处就是有了一个 WYSIWYG 的编辑器,而且它都会帮你处理好 html 过滤的问题(后来发现我还需要再过滤一遍);另一个好处就是可以让 plog 支持桌面博客工具写文章,以提升我写作的动力 >o<
Google docs 支持三种 API: Blogger、MetaWeblog 和 Movable Type。A Core 说Movable Type 号称最有前途的 API,但是我没在网上找到太多的资料。。。。不过不管怎样,先看看 google docs 到底是怎么通过 API 和 blog 程序交流的。
往试验田 (http://joeseayam.appspot.com) 放了一个 dumper,用来记录 request 和 response 的数据,然后用 google docs 发文章,初步的实验结果如下:
三种 API 都是用的 xml-rpc 来和服务器通讯。
无论选择哪种 API,一开始都要调用 blogger.GetUsersBlogs,来获取该用户的 blog 列表,以及每个 blog 的基本信息(如 url、id、name)。于是我就造了个假的 response 返回给 google。
之后,如果选的 API 是MetaWeblog,那么会调用 metaWeblog.newPost;如果选的是 Blogger 或者 Movable Type,那么调用的是 blogger.newPost。
如果文章已经发过一次了,第二次 publish 调用的就是 metaWeblog.editPost 或者 blogger.editPost。
我不明白的是为什么 MT 和 blogger 要调用一样的 API,而且是 Blogger API 1.0,这个方法的问题就是没有 title 这个参数,也就是说我没法在 google doc 里面设置文章的标题。。。
但是 MetaWeblog 有另一个问题,不知道是不是 google doc 的 bug:
如果我想在文章中写一段有格式的 html 代码,比方说写一段文字<h1>Heading</h1>,然后格式成<h1>,那么 html 应该是这样:
<h1><h1>heading<h1></h1>
但是实际上发过去的 xml 中的内容却变成了这样:
<h1><h1>heading<h1></h1>
然后一转义,成了这样:
<h1><h1>heading<h1></h1>
于是格式乱掉了。
但是 blogger 的 API 就没有这样的问题。。。真是难两全啊……回头看看 别的 blog 程序,比如 wordpress 是怎么处理的这两个问题。
另外,google docs 生成的 html 中,每个标签都会有一个 id 属性,我觉得在文章中出现这个是没什么必要的,所以我希望把它过滤掉。所幸的是,昨天在网上找到一个现成的 python html filter:
http://amisphere.com/contrib/python-html-filter/
感觉很好很强大,可以自定义允许的标签以及属性的白名单,还可以修复一些不规范的格式,以后编辑之后的 html 就可以用它来过滤了。