其实很长时间不怎么收集类似功能性的代码文章,今天还是记录下吧,很早以前就尝试了「百度是否收录检测」这个功能,无论是从WP还是TP的各种途径都进行了测试,代码基本大同小异,通过php中科院使用crl模拟搜索请求,对返回的数据进行分析判断是否被收录,曾经在「Typecho添加“百度是否收录”判断的方法」文章提及,基于成功率太低太低,也就放弃了这个功能。
今天在wfblog看到了一篇文章,初始以为和以前的一样,瞄了一眼后才知道已经升级为API版本,通过模拟UA的方式绕过百度的反爬虫,再利用curl模拟header成功实现了「百度收录」的查询,结果准确度基本都是OK的。
1、调用查询
在模板post.php加入(CSS样式自行修改吧)
<!--百度收录--> <li class="meta-baidu"><span class="post-icons"><i class="glyphicon glyphicon-refresh" id="baidu_icon"></i></span><span class="meta-value" id="baidu_result">加载中</span></li>
2、JQ判断收录
还是在post.php内加入(必须引入jquery),提示文字在这里自行修改吧。
<script> function baidu_check(){ $.getJSON("https://cn1.api.wfblog.net/baidu.php?domain="+window.location.href,function(result){ if (result.code == 200) { $('#baidu_icon').removeClass('glyphicon-refresh'); $('#baidu_icon').addClass('glyphicon-ok-circle'); $('#baidu_result').text('百度已收录'); }else if(result.code == 403){ $('#baidu_icon').removeClass('glyphicon-refresh'); $('#baidu_icon').addClass('glyphicon-info-sign'); $('#baidu_result').text('百度未收录'); }else{ $('#baidu_icon').removeClass('glyphicon-refresh'); $('#baidu_icon').addClass('glyphicon-remove-circle'); $('#baidu_result').text('查询收录失败'); } }); } baidu_check(); </script>
3、API调用源码
为了防止第三方API调用挂掉,wfblog贡献了API的代码,可以自己建立一个php页面进行调用,如果不想建立调用Weifeng的也可以,我的是自己建立的。
<?php /** * Baidu * @editer: Weifeng * @link: https://wfblog.net * @version: 1.0 */ error_reporting(0); header("Access-Control-Allow-Origin:*"); header('Content-type: application/json'); $domain = @$_GET['domain']; if(!isset($domain) || empty($domain) || $domain==''){ $data = array( "code" => false, "msg" => "未传入请求参数!" ); echo json_encode($data,JSON_UNESCAPED_UNICODE); exit; } $data = checkBaidu($domain); echo json_encode($data,JSON_UNESCAPED_UNICODE); function checkBaidu($url){ $header = array( "Host:www.baidu.com", "Content-Type:application/x-www-form-urlencoded",//post请求 "Connection: keep-alive", "Referer:https://www.baidu.com", "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.162 Safari/537.36" ); $url = 'https://www.baidu.com/s?ie=UTF-8&wd='.urlencode($url).'&usm=3&rsv_idx=2&rsv_page=1'; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt ($ch, CURLOPT_HTTPHEADER, $header); curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $output = curl_exec($ch); curl_close($ch); if(strpos($output, '没有找到') || strpos($output, '很抱歉')){ $data = array( "code" => 403, "msg" => "该域名暂时未被百度收录!" ); }else{ $number = GetBetween($output,'<span class="nums_text">百度为您找到相关结果约','个</span>'); if(empty($number) || $number == 0){ $number = GetBetween($output,'<b>找到相关结果数约','个</b></p>'); if(empty($number) || $number == 0){ $data = array( "code" => false, "msg" => "获取百度收录失败!" ); return $data; } } $data = array( "code" => 200, "msg" => "该域名已被百度收录!", "number" => str_replace(',','',$number) ); } return $data; } function GetBetween($content,$start,$end){ $r = explode($start, $content); if (isset($r[1])){ $r = explode($end, $r[1]); return $r[0]; } } ?>
整体来说,检测结果的正确度是提升了很高,随便点开几个都是准确的,当然这个判断理论上适用于大多数的网站,TP也好、WP也好,自写的PHP都是很不错的。
谢谢分享