最近一直在完善自己的博客,wordpress博客不可不谓之博客系统中最完善的一个,我的博客系统也一直以wordpress为样本,向wordpress学习。相信用过wordpress的人都用过windows live writer作为自己博客的客户端。windows live writer原本是微软为live博客开发的客户端,但是现在live博客已经关停,因此windows live writer也停止了更新。作为windows系统下最佳的博客离线客户端,即便它已经停止更新,它也将会是一款经典的软件,如同xp系统一样。
最近两天的时间,我将自己的博客系统实现了与windows live writer通讯,苦于找不到有用的指导资料,折腾得很辛苦。
调试工具:
服务端:本地搭建wordpress,我的博客blog
客户端:windows live writer,chrome浏览器的Postman应用扩展
调试过程:
进入本地wordpress首页,找到xmlrpc协议入口
<link title="RSD" rel="EditURI" type="application/rsd+xml" href="http://127.0.0.1/xmlrpc.php">
之后的所有请求都是从这个入口上实现的。
协议检查。windows live writer连接后的第一件事请是获取到首页上的接口(title为RSD的link标签),第二件事情便是向http://127.0.0.1/xmlrpc.php发送get请求,获取到的内容大致如下:
<?xml version="1.0" encoding="UTF-8"?><rsd version="1.0" xmlns="http://archipelago.phrasewise.com/rsd"> <service> <engineName>WordPress</engineName> <engineLink>http://wordpress.org/</engineLink> <homePageLink>http://127.0.0.1</homePageLink> <apis> <api name="WordPress" blogID="1" preferred="true" apiLink="http://127.0.0.1/xmlrpc" /> </apis> </service> </rsd>
登录,发送blogger.getUsersBlogs请求【以下请求的主体均在http request的body内,并且皆为post请求】
<?xml version="1.0" encoding="utf-8"?> <methodCall> <methodName>blogger.getUsersBlogs</methodName> <params> <param> <value> <string>ffffffabffffffce6dffffff93ffffffac29ffffffc9fffffff826ffffffdeffffffc9ffffffe43c0b763036ffffffa0fffffff3ffffffa963377716</string> </value> </param> <param> <value> <!-- 用户名 --> <string>lijun</string> </value> </param> <param> <value> <!-- 密码 --> <string>lijun</string> </value> </param> </params> </methodCall>
响应:
<?xml version="1.0" encoding="UTF-8"?> <methodResponse> <params> <param> <value> <array> <data> <value> <struct> <!-- 1 --> <member><name>isAdmin</name><value><boolean>1</boolean></value></member> <!-- homepage --> <member><name>url</name><value><string>%s</string></value></member> <!-- userid --> <member><name>blogid</name><value><string>%d</string></value></member> <!-- blogname --> <member><name>blogName</name><value><string>%s</string></value></member> <!-- xmlrpc url address --> <member><name>xmlrpc</name><value><string>%s</string></value></member> </struct> </value> </data> </array> </value> </param> </params> </methodResponse>
上面的%d%s等按照自己的博客替换成相应的返回参数,遵循printf函数的格式化规则。
新建文章metaWeblog.newPost
<?xml version="1.0" encoding="utf-8"?> <methodCall> <methodName>metaWeblog.newPost</methodName> <params> <param> <value> <string>1</string> </value> </param> <param> <value> <string>lijun</string> </value> </param> <param> <value> <string>lijun</string> </value> </param> <param> <value> <struct> <member> <name>title</name> <value> <string>test tag</string> </value> </member> <member> <name>description</name> <value> <string><p>test tag content</p></string> </value> </member> <member> <name>mt_text_more</name> <value> <string /> </value> </member> <member> <name>wp_slug</name> <value> <string /> </value> </member> <member> <name>mt_basename</name> <value> <string /> </value> </member> <member> <name>wp_password</name> <value> <string /> </value> </member> <member> <name>categories</name> <value> <array> <data> <value> <string>ceshi</string> </value> <value> <string>tag</string> </value> </data> </array> </value> </member> <member> <name>mt_excerpt</name> <value> <string /> </value> </member> </struct> </value> </param> <param> <value> <boolean>1</boolean> </value> </param> </params> </methodCall>
响应:
<?xml version="1.0" encoding="UTF-8"?> <methodResponse> <params> <param> <value> <!-- post id --> <string>%d</string> </value> </param> </params> </methodResponse>
新建分类标签请求wp.newCategory
<?xml version="1.0" encoding="utf-8"?> <methodCall> <methodName>wp.newCategory</methodName> <params> <param> <value> <string>1</string> </value> </param> <param> <value> <string>lijun</string> </value> </param> <param> <value> <string>lijun</string> </value> </param> <param> <value> <struct> <member> <name>name</name> <value> <string>测试</string> </value> </member> <member> <name>parent_id</name> <value> <int>0</int> </value> </member> </struct> </value> </param> </params> </methodCall>
响应:
<?xml version="1.0" encoding="UTF-8"?> <methodResponse> <params> <param> <value> <!-- catalog id --> <int>%d</int> </value> </param> </params> </methodResponse>
新建媒体文件metaWeblog.newMediaObject【图片上传】
<?xml version="1.0" encoding="utf-8"?> <methodCall> <methodName>metaWeblog.newMediaObject</methodName> <params> <param> <value> <string>1</string> </value> </param> <param> <value> <string>lijun</string> </value> </param> <param> <value> <string>lijun</string> </value> </param> <param> <value> <struct> <member> <name>name</name> <value> <string>loadfailed.png</string> </value> </member> <member> <name>type</name> <value> <string>image/png</string> </value> </member> <member> <name>bits</name> <value> <!-- base64转码的图片文件 --> <base64>iVBORw0KGgoAAAANSUhEUgAAAkJggg==</base64> </value> </member> </struct> </value> </param> </params> </methodCall>
响应:
<?xml version="1.0" encoding="UTF-8"?> <methodResponse> <params> <param> <value> <struct> <!-- file id --> <member><name>id</name><value><string>%d</string></value></member> <!-- file name --> <member><name>file</name><value><string>%s</string></value></member> <!-- file url --> <member> <name>url</name> <value><string>%s</string></value> </member> <!-- file type --> <member><name>type</name><value><string>%s</string></value></member> </struct> </value> </param> </params> </methodResponse>
协议的内容太多,如有需要还建议自己使用相关的工具进行捕捉请求,以及使用Postman捕捉响应,然后自己分析请求与响应的内容,并在自己的系统中实现它。响应部分的其他内容可以参考我的博客系统源码http://github.com/duguying/blog ,请求部分我已经打包可以直接下载。