杰拉斯的博客

[SEO]利用Ping服务通知搜索引擎博客更新的原理与代码实现

杰拉斯 杰拉斯 | 时间:2012-08-14, Tue | 38,057 views
后台技术 

什么是Ping服务

Ping服务是基于XML_RPC标准协议的更新通告服务,当博客内容发生更新时,可以向搜索引擎发出通知,而搜索引擎接收到通知后将派出蜘蛛对博客进行更新或收录。

如何Ping服务

Ping服务的使用方式有两种,一种是利用搜索引擎的博客提交页面进行提交,第二种是使用博客程序中的Ping功能,如WordPress自带的更新服务(设置-撰写-更新服务),或者Typecho Ping插件。具体的提交地址请参考《[SEO]在线Ping服务地址与RPC服务地址集合》

Ping请求包的例子

POST /ping/RPC2 HTTP/1.0
User-Agent: request
Host: ping.baidu.com
Content-Type: text/xml
Content-Length: 511

<?xml version="1.0" encoding="UTF-8"?>
<methodCall>
	<methodName>weblogUpdates.extendedPing</methodName>
	<params>
		<param>
			<value>博客名称</value>
		</param>
		<param>
			<value>博客地址</value>
		</param>
		<param>
			<value>文章地址</value>
		</param>
		<param>
			<value>RSS地址</value>
		</param>
	</params>
</methodCall>

需要说明的一点是百度的规范比较奇葩,数据需要以<string>标签包裹:

POST /ping/RPC2 HTTP/1.0
User-Agent: request
Host: ping.baidu.com
Content-Type: text/xml
Content-Length: 511

<?xml version="1.0" encoding="UTF-8"?>
<methodCall>
	<methodName>weblogUpdates.extendedPing</methodName>
	<params>
		<param>
			<value><string>博客名称</string></value>
		</param>
		<param>
			<value><string>博客地址</string></value>
		</param>
		<param>
			<value><string>文章地址</string></value>
		</param>
		<param>
			<value><string>RSS地址</string></value>
		</param>
	</params>
</methodCall>

可以看出,请求方式应为POST,而各个搜索引擎的返回形式不尽相同,但均是以0表示推送成功,1表示失败。

以百度为例子:

推送成功时的服务器响应包为:

HTTP/1.1 200 OK
Date: Mon, 11 May 2009 11:54:53 GMT
Content-Length: 156
Connection: close
Content-Type: text/xml

<?xml version="1.0" encoding="UTF-8"?><methodResponse>
	<params>
		<param>
			<value>
				<int>0</int>
			</value>
		</param>
	</params>
</methodResponse>

推送失败时的服务器响应包为:

HTTP/1.1 200 OK
Date: Mon, 11 May 2009 11:54:53 GMT
Content-Length: 156
Connection: close
Content-Type: text/xml

<?xml version="1.0" encoding="UTF-8"?><methodResponse>
	<params>
		<param>
			<value>
				<int>1</int>
			</value>
		</param>
	</params>
</methodResponse>

具体可参考百度Ping服务帮助谷歌Ping服务帮助

代码实现

原理很简单,使用PHP的cURL进行POST推送:

<?php
function ping($server, $xml) {
	$ch = curl_init();
	$headers = array(
		"Content-type: text/xml;charset=\"utf-8\"",
		"Accept: text/xml"
	);
	curl_setopt_array(
		$ch,
		array(
			CURLOPT_URL => $server,
			CURLOPT_RETURNTRANSFER => true,
			CURLOPT_POST => true,
			CURLOPT_HTTPHEADER => $headers,
			CURLOPT_POSTFIELDS => $xml
		)
	);
	return curl_exec($ch);
}
$xml = '<?xml version="1.0" encoding="UTF-8"?>
<methodCall>
<methodName>weblogUpdates.extendedPing</methodName>
<params>
<param><value>博客名称</value></param>
<param><value>博客地址</value></param>
<param><value>文章地址</value></param>
<param><value>RSS地址</value></param>
</params>
</methodCall>';
$res = ping('http://blogsearch.google.com/ping/RPC2', $xml);
echo $res;
?>

若返回0,则说明推送成功,具体的拓展与应用蓝飞在这里就不再赘述了,留给大家自由发挥吧O(∩_∩)O~

如需转载请注明出处:杰拉斯的博客

相关文章

12 条评论 »

  1. 支持一个,还在读书呀,话说你这个还是新博客吧!

    1. 也不算很新了,是域名比较新,之前用的是SAE的二级域名。

  2. 好东西,过来MARK一下,肯定用得着。

  3. 我下载了这个东西,但是不知道是干什么的。。求解答

  4. 感谢分享,不过ping也不能肯定就是能被收录,重点还是在于页面的内容。

  5. 请问最后这个代码实现的代码应该放在哪里呢?是放在后台写文章的php页面里还是怎么弄,求指教

    1. 在提交文章的PHP中。

  6. jim jim

    可以应用到B2B商业网站吗?