zoukankan      html  css  js  c++  java
  • 用word2007在博客园发布带图片的blog

    一直以来,我比较喜欢用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客户端来在论坛上发布帖子,这样便能很容易的发布各种漂亮的帖子了。

       

  • 相关阅读:
    Java实现 LeetCode 30 串联所有单词的子串
    Java实现 LeetCode 29 两数相除
    Java实现 LeetCode 29 两数相除
    Java实现 LeetCode 29 两数相除
    Java实现 LeetCode 28 实现strStr()
    Java实现 LeetCode 28 实现strStr()
    Java实现 LeetCode 28 实现strStr()
    Java实现 LeetCode 27 移除元素
    Java实现 LeetCode 27 移除元素
    字符编码终极笔记:ASCII、Unicode、UTF-8、UTF-16、UCS、BOM、Endian
  • 原文地址:https://www.cnblogs.com/TianFang/p/852138.html
Copyright © 2011-2022 走看看