一直以来,我比较喜欢用word2007来写blog,虽然它的管理功能不是很强大,但是它的文本编辑功能是其它blog软件所不能比的。然而,word却对MetaWeblog API的支持不够——不能发布图片,如图1,我以前的blog中很少带图片,一直也没有理会这个bug,昨天一时兴起,想写个程序来解决这个问题。

通过对word和livewriter的发布blog时的抓包分析,发现word不能发布图片的原因出在newMediaObject这个API上,

该Api的形式为:
metaWeblog.newMediaObject (blogid, username, password, struct)

根据该API的声明, newMediaObject的blogid 参数应为string类型,然而ms却自作聪明的将它改为了int型(虽然该参数确实是个数字),这样,当该api传送进来时,blogserver便认为参数不对,直接该拒绝了该信息。

图表 1:服务器拒绝图片上传

解决这个问题的方法有如下几种:

  1. ms发布补丁来解决word的这个bug
  2. dudu兼容word的这个错误的api
  3. 自己写程序来改正api,使之以正确的形式发送至blogserver

其中方法1和方法2才是王道,可以一劳永逸的解决这个问题,然而ms却好像无暇顾及这个bug,并且也存在许多只支持标准MetaWeblog的api的blog。因此我决定主动出击,写个程序纠正这个bug。

程序的原理较简单,就是在word和blogserver中间加一个代理proxy,当word发送blog时,并不直接发给blogserver,而是发给proxy。proxy再将信息发给blogserver,并将blogserver的应答给返回给word。如图2所示:

图表 2:proxy运行过程

在这种方式下,proxy能获取所有的word发布的信息,当检测到信息为newMediaObject时,改正blogid的类型,并将正确的信息发送到blogserver,这样就能正常发布带图片的blog了。

程序及代码如下,感兴趣的朋友可以下载试用一下。    程序下载     代码下载
(作为一个兴起写的小程序,很多地方不完善,也没有什么注释,望见谅)

 本程序是在vista底下用VS2008下构建的.net 2.0程序,没有在xp上测试过。

使用方式如下。

  1. 给程序添加启动参数,该程序需要2个参数:blogserverapiurl,其中blogserver随便取,建议取blogserver的网站名,而apiurl就是发布blog的地址。
    如我的blog启动参数如下: WordBlogger.execnblogs http://www.cnblogs.com/TianFang/services/metaweblog.aspx(可以在快捷方式中配置,这样便能方便启动了)
    我程序中是支持多个blogserver的,本来我想通过一个xml文件来配置多blogserver的,后来嫌麻烦,懒得弄了,有需要的朋友可以改一下代码。
  2. 启动程序(由于绑定了80端口,故需要管理员权限才能执行)。
  3. 启动word,打开帐户管理,新建帐户,新建的帐户的各配置数据和原来的基本一致,就是需要将apiurl改为http://localhost/blogserver/api.aspx的形式。

图表 3:新建帐户配置示例

配置完成后,在程序启动的情况下,便能通过word2007对新建的帐户发布带图片的文章了,该文章会自动发布至apiurl上(本文就是这么发布的^_^)。

这个程序只是暂时性的补丁作用,待ms或者dudu改正word的这个bug后就可以下课了。当然本程序可以适用于所有基于MetaWeblog API的blog,以解决word发布blog的图片问题。同时,基于这个原理可以写一些扩展应用。我想到的有如下几种:

  1. 将同一篇文章同时发送到多个blogserver。(别说,还真有人有这种需求)
  2. 可以将blog中的图片上传至带外链的相册,文章中只保存图片的链接,这样就不用担心因为图片过多导致blog空间不足了。
  3. 通过world2007或其它blog客户端来在论坛上发布帖子,这样便能很容易的发布各种漂亮的帖子了。

   

posted on 2007-08-11 22:17  天方  阅读(2548)  评论(11编辑  收藏  举报