本文介绍基于XML-RPC的PING更新通知实例代码,也是天缘博客正在使用的,没有完全按照XML-RPC标准那样完善设计,毕竟是个人博客,还是按需设计简单点,以后有时间再慢慢完善,如果大家需要自己写网站或论坛系统时,可能会用到,欢迎随时CTRL+C/CTRL+V。
一、XML-RPC客户端请求和服务器端响应
XML-RPC客户端请求
PING更新服务要求XML-RPC客户端请求元素有三个:
1、RPC端点,也就是大家常见的RPC地址,比如 http://blogsearch.google.com/ping/RPC2
2、调用方法,Google和Baidu都支持weblogUpdates.extendedPing,Feedsky似乎只支持 weblogUpdates.ping
3、参数部分,Google和百度都约定,必须顺序包含: 网站名、网站地址、更新文章地址、网站RSS地址或ATOM种子等在<param><value>xxx</param></value>字段中。
XML-RPC服务器端响应
XML-RPC响应中一般都只有两个元素,分别是响应状态标志和提示信息两部分,也有是乱七八糟的返回值的,这个要看人品了,比如GOOGLE会跟你说声thanks,Baidu则只会仍个0给你,下面看一下PHP实例。
二、PHP编程PING更新通知实例
1、发送和接收数据包
//发送和接收数据包
function fnSendPacket($hosturl,$data)
{
$uinfo = parse_url($hosturl);
if($uinfo[‘query’])
{
$data .= “&”.$uinfo[‘query’];
}
if(!$fsp = @fsockopen($uinfo[‘host’], (($uinfo[‘port’]) ? $uinfo[‘port’] : “80”), $errno, $errstr, 3))
{
return false;
}
fputs ($fsp, “POST “.$uinfo[‘path’].” HTTP/1.0rn”);
fputs ($fsp, “Host: “.$uinfo[‘host’].”rn”);
fputs ($fsp, “Content-type: text/xmlrn”);
//fputs ($fsp, “Content-type: application/x-www-form-urlencodedrn”);
fputs ($fsp, “Content-length: “.strlen($data).”rn”);
fputs ($fsp, “Connection: closernrn”);
fputs ($fsp, $data);
$http_response = ”;
while(!feof($fsp))
{
$http_response .= fgets($fsp, 128);
}
@fclose($fsp);
list($resp_headers, $resp_content) = explode(“rnrn”, $http_response);//劈开头和内容
return $resp_content;
}
2、调用程序
$pingHostArr=array(‘http://www.feedsky.com/api/RPC2′,’http://ping.baidu.com/ping/RPC2′,’http://blogsearch.google.com/ping/RPC2’);
$methodArr=array(‘weblogUpdates.ping’,’weblogUpdates.extendedPing’);
$htmlurl=’http://www.metsky.com/archives/1.html’;//这里是实际的更新通知网址,实际使用动态创建
$hnum = count($pingHostArr);
for($i=0; $i<$hnum; $i++)
{
$data = ‘<?xml version=”1.0″?><methodCall><methodName>weblogUpdates.extendedPing</methodName><params><param><value>天缘博客</value></param><param><value>http://www.metsky.com</value></param><param><value>’.$htmlurl.'</value></param><param><value>http://www.metsky.com/rss.xml</value></param></params></methodCall>’;
$res = fnSendPacket($pingHostArr[$i],$data);
echo ‘<pre>’;
print_r($res);
if(strpos($res, “<int>0</int>”)||strpos($res, “<boolean>0</boolean>”)||strpos($res, “<string></string>”))//这里就是返回信息,各家网站约定有所差别,天缘直接判断字符了,不规范。
echo “PING:”.$pingHostArr[$i].”成功<br/>”;
else
echo “PING:”.$pingHostArr[$i].”失败<br/>”;
}
程序中的调用方法很重要,Google和Baidu都是采用weblogUpdates.extendedPing调用方法,Feedsky似乎只支持weblogUpdates.ping调用方法。
百度的XML-RPC请求元素,似乎官方的帮助页面是还要嵌套一级<string></string>,稍后再测试一下是否必须的。另外实际测试PING结果,要根据各家返回OK的约定值,比如文中百度的0值、Google的boolean 0、thanks等等。
3、FeedSky、Google和Baidu三家的PING特点
Google PING服务应用编程接口说明:http://www.google.com/intl/zh-CN/help/blogsearch/pinging_API.html
Baidu PING服务应用编程接口说明:http://www.baidu.com/search/blogsearch_help.html
FeedSky PING服务编程接口每看到在哪里,不过可以采用测试方式猜测返回值,并结合Feedsky后台来看效果。
整体来讲Google PING服务的容错性最好,Baidu次之,Feedsky再再次之,实际上PING更新通知本来就很简单,也不是什么重要的服务,只要通知到当前更新网页和RSS地址就可以了,没有必要约定的太死。而实际上确不是,要想向一个新的RPC地址PING更新,似乎非得尝试几种方法才能OK。
评论