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命令:
- 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推送示例
- POST /sitemap?site=www.oicqzone.com&resource_name=sitemap&access_token=xxxx HTTP/1.1
- User-Agent: curl/7.12.1
- Host: ping.baidu.com
- Content-Length: 368
- <?xml version="1.0" encoding="UTF-8"?>
- <urlset>
- <url>
- <loc><![CDATA[http://www.example.com/thread-15-1-1.html]]></loc>
- <lastmod>2013-09-24</lastmod>
- <changefreq>daily</changefreq>
- <priority>0.8</priority>
- </url>
- <url>
- <loc><![CDATA[http://www.example.com/thread-11135-1-1.html]]></loc>
- <lastmod>2013-09-25</lastmod>
- <changefreq>daily</changefreq>
- <priority>0.8</priority>
- </url>
- </urlset>
注:XML内容部分,请参考resouce_name参数声明的格式—URL列表详细格式说明填写。
2、查看推送反馈
数据推送后,服务器会返回xml反馈推送是否成功,反馈示例:
- <?xml version="1.0" encoding="UTF-8"?>
- <methodResponse>
- <params>
- <param>
- <value>
- <int>200</int>
- </value>
- <param>
- </params>
- </methodResponse>
目前支持以下反馈码,各反馈码含义如下:
反馈码 说明
200 无使用方式错误,需要进一步观察返回的内容是否正确
400 必选参数未提供
405 不支持的请求方式,我们只支持POST方式提交数据
411 HTTP头中缺少Content-Length字段
413 推送的数据过大,超过了10MB的限制
422 HTTP头中Content-Length声明的长度和实际发送的数据长度不一致
500 站长平台服务器内部错误
好吧,进入正题,php实时推送代码(两个,大家自选):
- function tobaidu($url){
- $ntime=time();
- $now=date('Y-m-d',$ntime);
- $data='<?xml version="1.0" encoding="UTF-8"?>';
- $data.=' <urlset>';
- $data.=' <url>';
- $data.=' <loc><![CDATA['.$url.']]></loc>';
- $data.=' <lastmod>'.$now.'</lastmod>';
- $data.=' <changefreq>daily</changefreq>';
- $data.=' <priority>0.8</priority>';
- $data.=' </url>';
- $data.=' </urlset>';
- $pingurl="http://ping.baidu.com/sitemap?site=www.oicqzone.com&resource_name=sitemap&access_token=xxxx";//你的接口地址
- $curl= curl_init();// 启动一个CURL会话
- curl_setopt($curl, CURLOPT_URL,$pingurl);// 要访问的地址
- curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);// 对认证证书来源的检查
- curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1);// 从证书中检查SSL加密算法是否存在
- curl_setopt($curl, CURLOPT_USERAGENT,"curl/7.12.1");// 模拟用户使用的浏览器
- curl_setopt($curl, CURLOPT_COOKIE,$cookie);
- curl_setopt($curl, CURLOPT_REFERER,"");
- curl_setopt($curl, CURLOPT_POST, 1);// 发送一个常规的Post请求
- curl_setopt($curl, CURLOPT_POSTFIELDS,$data);// Post提交的数据包
- curl_setopt($curl, CURLOPT_TIMEOUT, 30);// 设置超时限制防止死循环
- curl_setopt($curl, CURLOPT_HEADER, 0);// 显示返回的Header区域内容
- curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);// 获取的信息以文件流的形式返回
- $tmpInfo= curl_exec($curl);// 执行操作
- if(curl_errno($curl)) {
- echo'Errno'.curl_error($curl);//捕抓异常
- }
- curl_close($curl);// 关闭CURL会话
- return$tmpInfo;// 返回数据
- }
- $tt= tobaidu("http://www.oicqzone.com/"); //实时推送新发文章的url
- function sitemap_ping_baidu($urls){
- $baidu_ping_url = 'ping.baidu.com';
- $get = '/sitemap?site=www.oicqzone.com&resource_name=sitemap&access_token=xxxx';//接口地址
- $port=80;
- if ( ( $io = fsockopen( $baidu_ping_url, $port, $errno, $errstr, 50 ) ) !== false ) {
- $send = "POST $get HTTP/1.1"."\r\n";
- $send .= 'Accept: */*'."\r\n";
- $send .= 'Cache-Control: no-cache'."\r\n";
- $send .= 'Host: '.$baidu_ping_url."\r\n";
- $send .= 'Pragma: no-cache'."\r\n";
- //$send .= "Referer: http://".$url.$get."\r\n";
- //$send .= 'User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)'."\r\n";
- $xml = '<?xml version="1.0" encoding="UTF-8"?><urlset>';
- foreach($urls as $url){
- $xml .= '<url>';
- $xml .= '<loc><![CDATA['.$url.']]></loc>';
- $xml .= '<lastmod>'.date('Y-m-d').'</lastmod>';
- $xml .= '<changefreq>monthly</changefreq>';
- $xml .= '<priority>0.8</priority>';
- $xml .= '</url>';
- }
- $xml .= '</urlset>';
- $send .= 'Content-Length:'.strlen($xml)."\r\n";
- $send .= "Connection: Close\r\n\r\n";
- $send .= $xml."\r\n";
- fputs ( $io, $send );
- $return = '';
- while ( ! feof ( $io ) )
- {
- $return .= fread ( $io, 4096 );
- }
- return $return;
- }else{
- return false;
- }
- }
- $return = sitemap_ping_baidu(array('http://www.oicqzone.com/')); //需要提交收录的地址。