PHP Curl实时推送百度Sitemap代码(转)

今天偶然进入百度站长平台,发现sitemap里有了新功能:实时推送。

实时推送基于POST协议,用于网站把网页及包含的结构化数据迅速提交给百度,使得网站在百度保持最新状态。

请按照以下步骤,实时推送数据。

1、推送数据

 数据推送接口

接口调用地址:http://ping.baidu.com/sitemap?site=www.oicqzone.com&resource_name=sitemap&access_token=xxxx

参数名称 是否必选 参数类型 说明

site string 在站长平台验证的站点,比如www.example.com

resource_name string 你被允许推送的数据名称,比如RDF_BBS_Thread

access_token string 在站长平台申请的推送用的准入密钥

 Curl推送示例

将xml数据写入一个本地文件,比如thread.xml,然后调用curl命令:

 

  1. curl -H 'Expect:' --data-binary @thread.xml "http://ping.baidu.com/sitemap?site=www.oicqzone.com&resource_name=sitemap&access_token=xxxx" 

使用php、python、java等可以参照这个过程推送结构化数据。

 Post推送示例

 

  1. POST /sitemap?site=www.oicqzone.com&resource_name=sitemap&access_token=xxxx HTTP/1.1 
  2.  
  3. User-Agent: curl/7.12.1  
  4.  
  5. Host: ping.baidu.com  
  6.  
  7. Content-Length: 368 
  8.  
  9. <?xml version="1.0" encoding="UTF-8"?> 
  10.  
  11.     <urlset
  12.  
  13.         <url
  14.  
  15.             <loc><![CDATA[http://www.example.com/thread-15-1-1.html]]></loc
  16.  
  17.             <lastmod>2013-09-24</lastmod
  18.  
  19.             <changefreq>daily</changefreq
  20.  
  21.             <priority>0.8</priority
  22.  
  23.         </url>        
  24.  
  25.         <url
  26.  
  27.             <loc><![CDATA[http://www.example.com/thread-11135-1-1.html]]></loc
  28.  
  29.             <lastmod>2013-09-25</lastmod
  30.  
  31.             <changefreq>daily</changefreq
  32.  
  33.             <priority>0.8</priority
  34.  
  35.         </url
  36.  
  37.     </urlset

注:XML内容部分,请参考resouce_name参数声明的格式—URL列表详细格式说明填写。

2、查看推送反馈

数据推送后,服务器会返回xml反馈推送是否成功,反馈示例:

 

  1. <?xml version="1.0" encoding="UTF-8"?> 
  2.  
  3.     <methodResponse
  4.  
  5.         <params
  6.  
  7.             <param
  8.  
  9.                 <value
  10.  
  11.                     <int>200</int
  12.  
  13.                 </value
  14.  
  15.             <param
  16.  
  17.         </params>         
  18.  
  19.     </methodResponse

目前支持以下反馈码,各反馈码含义如下:

反馈码 说明

200 无使用方式错误,需要进一步观察返回的内容是否正确

400 必选参数未提供

405 不支持的请求方式,我们只支持POST方式提交数据

411 HTTP头中缺少Content-Length字段

413 推送的数据过大,超过了10MB的限制

422 HTTP头中Content-Length声明的长度和实际发送的数据长度不一致

500 站长平台服务器内部错误

 

好吧,进入正题,php实时推送代码(两个,大家自选):

 

  1. function tobaidu($url){ 
  2.     $ntime=time(); 
  3.     $now=date('Y-m-d',$ntime); 
  4.     $data='<?xml version="1.0" encoding="UTF-8"?>'; 
  5.     $data.='   <urlset>'; 
  6.     $data.='       <url>'; 
  7.     $data.='           <loc><![CDATA['.$url.']]></loc>'; 
  8.     $data.='           <lastmod>'.$now.'</lastmod>'; 
  9.     $data.='           <changefreq>daily</changefreq>'; 
  10.     $data.='           <priority>0.8</priority>'; 
  11.     $data.='       </url>'; 
  12.     $data.='   </urlset>'; 
  13.   
  14.     $pingurl="http://ping.baidu.com/sitemap?site=www.oicqzone.com&resource_name=sitemap&access_token=xxxx";//你的接口地址 
  15.     $curl= curl_init();// 启动一个CURL会话 
  16.     curl_setopt($curl, CURLOPT_URL,$pingurl);// 要访问的地址 
  17.     curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);// 对认证证书来源的检查 
  18.     curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1);// 从证书中检查SSL加密算法是否存在 
  19.     curl_setopt($curl, CURLOPT_USERAGENT,"curl/7.12.1");// 模拟用户使用的浏览器 
  20.     curl_setopt($curl, CURLOPT_COOKIE,$cookie); 
  21.     curl_setopt($curl, CURLOPT_REFERER,""); 
  22.     curl_setopt($curl, CURLOPT_POST, 1);// 发送一个常规的Post请求 
  23.     curl_setopt($curl, CURLOPT_POSTFIELDS,$data);// Post提交的数据包 
  24.     curl_setopt($curl, CURLOPT_TIMEOUT, 30);// 设置超时限制防止死循环 
  25.     curl_setopt($curl, CURLOPT_HEADER, 0);// 显示返回的Header区域内容 
  26.     curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);// 获取的信息以文件流的形式返回 
  27.     $tmpInfo= curl_exec($curl);// 执行操作 
  28.     if(curl_errno($curl)) { 
  29.        echo'Errno'.curl_error($curl);//捕抓异常 
  30.     } 
  31.     curl_close($curl);// 关闭CURL会话 
  32.     return$tmpInfo;// 返回数据 
  33.   
  34. $tt= tobaidu("http://www.oicqzone.com/"); //实时推送新发文章的url  

 

 

  1. function sitemap_ping_baidu($urls){ 
  2.         $baidu_ping_url = 'ping.baidu.com'; 
  3.         $get = '/sitemap?site=www.oicqzone.com&resource_name=sitemap&access_token=xxxx';//接口地址 
  4.         $port=80; 
  5.         if ( ( $io = fsockopen( $baidu_ping_url, $port, $errno, $errstr, 50 ) ) !== false )  { 
  6.             $send = "POST $get HTTP/1.1"."\r\n"; 
  7.             $send .= 'Accept: */*'."\r\n"; 
  8.             $send .= 'Cache-Control: no-cache'."\r\n"; 
  9.   
  10.             $send .= 'Host: '.$baidu_ping_url."\r\n"; 
  11.             $send .= 'Pragma: no-cache'."\r\n"; 
  12.             //$send .= "Referer: http://".$url.$get."\r\n"; 
  13.             //$send .= 'User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)'."\r\n"; 
  14.               
  15.             $xml = '<?xml version="1.0" encoding="UTF-8"?><urlset>'; 
  16.             foreach($urls as $url){ 
  17.                 $xml .= '<url>'; 
  18.                 $xml .= '<loc><![CDATA['.$url.']]></loc>'; 
  19.                 $xml .= '<lastmod>'.date('Y-m-d').'</lastmod>'; 
  20.                 $xml .= '<changefreq>monthly</changefreq>'; 
  21.                 $xml .= '<priority>0.8</priority>'; 
  22.                 $xml .= '</url>'; 
  23.             } 
  24.             $xml .= '</urlset>'; 
  25.   
  26.             $send .= 'Content-Length:'.strlen($xml)."\r\n"; 
  27.             $send .= "Connection: Close\r\n\r\n"; 
  28.   
  29.             $send .= $xml."\r\n"; 
  30.   
  31.             fputs ( $io, $send ); 
  32.   
  33.             $return = ''; 
  34.             while ( ! feof ( $io ) ) 
  35.             { 
  36.                 $return .= fread ( $io, 4096 ); 
  37.             } 
  38.             return $return; 
  39.         }else{ 
  40.             return false; 
  41.         } 
  42.     } 
  43. $return = sitemap_ping_baidu(array('http://www.oicqzone.com/')); //需要提交收录的地址。 

 

posted on 2015-01-09 10:48  混元真人  阅读(484)  评论(0编辑  收藏  举报