这是一篇很小的例子,事实上网上这些例子是超多的,不过由于我是要模拟metaweblog或者是wordpress的一些操作,那我就必须要先了解很多相关的背景。
不过这里只是模拟一些发布和读取的接口,稍作了解即可。
原文来自:用XML-RPC协议读写WordPress上的文章我这里只简要的摘取一部分。
WordPress提供了XML-RPC接口使得第三方的博客写作软件(如windows live writer等)可以与之通信来发布和修改博客。我们也可以在网站上使用这个接口做一些工作,例如:在网站首页显示最新的博客、在博客之外的页面上发表博 客文章、把博客与其他内容管理系统结合,等等。
一、开启XML-RPC支持
XML-RPC协议默认是未开启的,需要到WordPress管理后台的“设置–>撰写”里的“远程发布”给XML-RPC打上勾。其说明文 字为:启用 WordPress,Movable Type,MetaWeblog和Blogger 的 XML-RPC发布协议。
二、获取接口的信息
我们查看博客首页的源代码,在head中可以发现类似这样的link项
- <link title="RSD" rel="EditURI" type="application/rsd+xml" href="http://blog.bluesky.cn/xmlrpc.php?rsd" />
 
其中的"RSD"是“Really Simple Discovery”的意思,也就是说这是一个“简单的发现博客编辑接口”的地址。我们用浏览器直接访问这个地址就可以在其返回XML中获知博客的 ID(blogID,一般这个的值是“1”)以及它所支持的接口类型和接口地址。
三、API接口选择
WordPress提供了对Blogger API、metaWeblog API、Movable Type API以及其自身的WordPress API的支持。其中WordPress API最为丰富,提供了包括操作评论文章在内的各种各样的支持。Blogger API功能较少,基本上淘汰不用了;而metaWeblog API提供了常用的接口且参数比较简洁,用得较多一些。
四、例子代码
以下是使用Incutio的XML-RPC库和Blogger API发布文章的例子,其中IXR库也是Wordpress自身所用的库,可以在“wp-includes/class-IXR.php”找到。
- <?php
 - $xmlrpcurl='http://blog.bluesky.cn/xmlrpc.php';
 - $blogid='1';
 - $username='admin';
 - $password='pass';
 - $postTitle='标题';
 - $postContent='正文内容';
 - require('class-IXR.php'); // /wordpress/wp-includes/class-IXR.php
 - $client = new IXR_Client($xmlrpcurl);
 - $params=array(
 - '',
 - 'blog_ID'=>$blogid,
 - 'user_login'=>$username,
 - 'user_pass'=>$password,
 - 'post_content'=>'' . $postContent,
 - 'publish'=>true
 - );
 - $params=array_values($params);
 - $client->query("blogger.newPost",$params);
 - $response=$client->getResponse();
 - if ($response['faultCode']==0){
 - print 'Success';
 - } else {
 - print 'Fail:' . $response['faultString'];
 - }
 - ?>
 
- <?php
 - include("xmlrpc.inc"); // 这里要改成xmlrpc.inc所在的路径
 - $GLOBALS['xmlrpc_internalencoding'] = 'UTF-8';
 - define ('DOMAIN', 'blog.bluesky.cn'); // 博客的域名
 - define ('BLOGID', 1); // 博客ID,一般为1
 - define ('USER', 'admin'); // 博客登录的用户名
 - define ('PASSWORD', 'pass'); // 博客登录的密码
 - // 创建 xml-rpc client
 - $cl = new xmlrpc_client ( "/xmlrpc.php", DOMAIN, 80);
 - // 准备请求
 - $req = new xmlrpcmsg('metaWeblog.newPost');
 - // 逐个列出请求的参数:
 - $req->addParam ( new xmlrpcval ( BLOGID, 'int')); // 博客ID
 - $req->addParam ( new xmlrpcval ( USER, 'string' )); // 用户名
 - $req->addParam ( new xmlrpcval ( PASSWORD, 'string' )); // 密码
 - $struct = new xmlrpcval (
 - array (
 - "title" => new xmlrpcval ( '标题', 'string' ), // 标题
 - "description" => new xmlrpcval ( '正文内容', 'string'), // 内容
 - ), "struct"
 - );
 - $req->addParam ( $struct );
 - $req->addParam ( new xmlrpcval (1, 'int')); // 立即发布
 - // 发送请求
 - $ans = $cl->send($req);
 - var_dump ( $ans );
 - ?>
 
- <?php
 - include("xmlrpc.inc");
 - $GLOBALS['xmlrpc_internalencoding'] = 'UTF-8';
 - $c = new xmlrpc_client("/xmlrpc.php", "blog.bluesky.cn", 80);
 - $content['title']="标题"; //标题
 - $content['description']="正文内容"; //内容
 - $content['mt_keywords']="标签1,标签2"; //标签
 - $content['wp_password']=""; //文章密码,输入后显示加密
 - $content['categories'] = array("分类1","分类2"); //分类名
 - $x = new xmlrpcmsg("metaWeblog.newPost",
 - array(php_xmlrpc_encode("1"), //BLOG ID
 - php_xmlrpc_encode("admin"), //用户名
 - php_xmlrpc_encode("pass"), //密码
 - php_xmlrpc_encode($content),
 - php_xmlrpc_encode("1"))); //立即发表
 - $c->return_type = 'phpvals';
 - $r =$c->send($x);
 - if ($r->errno=="0")
 - echo "发表成功,文章序号为:".$r->val;
 - else {
 - echo "出错了";
 - print_r($r);
 - }
 - ?>
 
以下是读取最新一篇文章的例子代码:
- <?php
 - include("xmlrpc.inc");
 - $GLOBALS['xmlrpc_internalencoding'] = 'UTF-8';
 - $c = new xmlrpc_client("/xmlrpc.php", "blog.bluesky.cn", 80);
 - $msg = new xmlrpcmsg('metaWeblog.getRecentPosts',
 - array(php_xmlrpc_encode("1"),
 - php_xmlrpc_encode("admin"),
 - php_xmlrpc_encode("pass"),
 - php_xmlrpc_encode("1")) );
 - $res = $c->send($msg);
 - $val = $res->value();
 - $val->arraymem(0)->structreset();
 - while (list($key, $v) = $val->arraymem(0)->structeach())
 - {
 - echo "Element: $key; Type: ".$v->kindOf()."; Value:".$v->scalarval()."\n";
 - }
 - ?>
 


 #1