分析
/* 查询是否收录 已测试 √ */
function _getRecord($self)
{
$self->response->setStatus(200);
site=site = site=self->request->site;
$encryption = md5(mt_rand(1655, 100860065) . time());
$baiduSite = "https://www.baidu.com/s?ie=utf-8&newi=1&mod=1&isid={$encryption}&wd={$site}&rsv_spt=1&rsv_iqid={$encryption}&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=0&rsv_dl=ib&rsv_sug3=2&rsv_sug1=1&rsv_sug7=001&rsv_n=2&rsv_btype=i&inputT=3083&rsv_sug4=3220&rsv_sug=9&rsv_sid=32818_1460_33042_33060_31660_33099_33101_32961_26350_22159&_ss=1&clist=&hsug=&f4s=1&csor=38&_cr1=32951";
$ip = mt_rand(0, 255) . '.' . mt_rand(0, 255) . '.' . mt_rand(0, 255) . '.' . mt_rand(0, 255);
$header[] = "accept-encoding: gzip, deflate";
$header[] = "accept-language: en-US,en;q=0.8";
header[]="CLIENT−IP:".header[] = "CLIENT-IP:" . header[]="CLIENT−IP:".ip;
header[]="X−FORWARDED−FOR:".header[] = "X-FORWARDED-FOR:" . header[]="X−FORWARDED−FOR:".ip;
$header[] = "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9";
$ch = curl_init();
$ch = curl_init();
curl_setopt(ch,CURLOPTURL,ch, CURLOPT_URL, ch,CURLOPTURL,baiduSite);
curl_setopt(ch,CURLOPTHTTPHEADER,ch, CURLOPT_HTTPHEADER, ch,CURLOPTHTTPHEADER,header);
curl_setopt($ch, CURLOPT_REFERER, "https://www.baidu.com/s?ie=UTF-8&wd={$site}");
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_ENCODING, 'gzip,deflate');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
$output = curl_exec($ch);
curl_close($ch);
$res = str_replace([' ', "\n", "\r"], '', $output);
if (strpos($res, "抱歉,没有找到与") || strpos($res, "找到相关结果约0个") || strpos($res, "没有找到该URL") || strpos($res, "抱歉没有找到")) {
$self->response->throwJson(array("data" => "未收录"));
} else {
$self->response->throwJson(array("data" => "已收录"));
}
}
这段代码是一个用于检查网站是否被百度收录的PHP函数 _getRecord
。它通过模拟浏览器请求访问百度搜索页面,并解析返回的HTML内容来判断目标网站是否已经被百度收录。
代码详解
1. 函数声明和设置响应状态
function _getRecord($self)
{
$self->response->setStatus(200);
- 函数
_getRecord
接收一个参数$self
,通常是一个包含响应和请求相关信息的对象(可能是某个框架中的对象)。 setStatus(200)
设置HTTP响应状态码为200,表示请求成功。
2. 构造查询URL和请求头
$site = $self->request->site;
$encryption = md5(mt_rand(1655, 100860065) . time());
$baiduSite = "https://www.baidu.com/s?ie=utf-8&newi=1&mod=1&isid={$encryption}&wd={$site}&rsv_spt=1&rsv_iqid={$encryption}&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=0&rsv_dl=ib&rsv_sug3=2&rsv_sug1=1&rsv_sug7=001&rsv_n=2&rsv_btype=i&inputT=3083&rsv_sug4=3220&rsv_sug=9&rsv_sid=32818_1460_33042_33060_31660_33099_33101_32961_26350_22159&_ss=1&clist=&hsug=&f4s=1&csor=38&_cr1=32951";
$ip = mt_rand(0, 255) . '.' . mt_rand(0, 255) . '.' . mt_rand(0, 255) . '.' . mt_rand(0, 255);
$header[] = "accept-encoding: gzip, deflate";
$header[] = "accept-language: en-US,en;q=0.8";
$header[] = "CLIENT-IP:" . $ip;
$header[] = "X-FORWARDED-FOR:" . $ip;
$header[] = "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9";
$site
: 从请求对象$self->request
中获取用户传递的站点URL,用于查询是否被收录。$encryption
: 生成一个随机的MD5加密字符串,用于伪装请求的唯一性。$baiduSite
: 拼接百度的查询URL,其中wd={$site}
用于指定要查询的网站,其他参数用来模拟真实的搜索请求。$ip
: 生成一个随机的IP地址,用于伪装请求的来源IP,防止被百度识别为机器请求。$header
: 构造请求头,用于模拟真实用户的请求。包括accept-encoding
、accept-language
、CLIENT-IP
、X-FORWARDED-FOR
等字段。
3. 初始化并发送CURL请求
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $baiduSite);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_REFERER, "https://www.baidu.com/s?ie=UTF-8&wd={$site}");
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_ENCODING, 'gzip,deflate');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
$output = curl_exec($ch);
curl_close($ch);
curl_init()
: 初始化CURL会话。curl_setopt($ch, CURLOPT_URL, $baiduSite)
: 设置CURL请求的URL为百度查询链接。curl_setopt($ch, CURLOPT_HTTPHEADER, $header)
: 设置请求头,模拟真实请求。curl_setopt($ch, CURLOPT_REFERER, ...)
: 设置请求的来源页面(即伪装成从百度搜索页面点击进入)。curl_setopt($ch, CURLOPT_USERAGENT, ...)
: 设置用户代理(浏览器标识),模拟真实用户。curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1)
: 设置为返回请求结果,而不是直接输出。curl_setopt($ch, CURLOPT_ENCODING, 'gzip,deflate')
: 设置CURL自动解压Gzip或Deflate编码的内容。curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE)
: 禁用SSL证书验证(用于处理HTTPS请求)。curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE)
: 禁用SSL主机名验证。curl_setopt($ch, CURLOPT_TIMEOUT, 5)
: 设置请求超时时间为5秒。$output = curl_exec($ch)
: 执行CURL请求,并将返回的HTML内容赋值给$output
。curl_close($ch)
: 关闭CURL会话。
4. 解析返回结果并判断是否收录
$res = str_replace([' ', "\n", "\r"], '', $output);
if (strpos($res, "抱歉,没有找到与") || strpos($res, "找到相关结果约0个") || strpos($res, "没有找到该URL") || strpos($res, "抱歉没有找到")) {
$self->response->throwJson(array("data" => "未收录"));
} else {
$self->response->throwJson(array("data" => "已收录"));
}
}
$res = str_replace([' ', "\n", "\r'], '', $output);
: 将返回的HTML内容中的空格、换行符和回车符去除,得到更干净的字符串,方便进行字符串匹配。if (strpos($res, ...) || ...)
: 检查返回的内容中是否包含以下字符串:"抱歉,没有找到与"
"找到相关结果约0个"
"没有找到该URL"
"抱歉没有找到"
这些字符串通常表示百度未收录目标网站。
$self->response->throwJson(array("data" => "未收录"));
: 如果检测到上述字符串之一,则返回JSON格式的响应,表示网站未被收录。$self->response->throwJson(array("data" => "已收录"));
: 否则,返回JSON响应,表示网站已被收录。
从调试输出的信息来看,API 返回的内容是一个包含验证码的链接,而不是我们预期的搜索结果。具体的输出是:
<a href="https://wappass.baidu.com/static/captcha/tuxing.html?...">Found</a>
这个链接指向百度的图形验证码页面,说明百度检测到了我们的请求,并认为这可能是自动化行为,因此要求进行验证码验证。
原因分析:
百度为了防止滥用或频繁的自动化查询请求,使用了图形验证码来验证请求的真实性。我们的代码通过 cURL
发送请求,但是由于频繁或异常的访问模式,触发了百度的安全机制,导致你获取到的不是搜索结果,而是一个要求验证码验证的页面。
解决方案:
还没想到,再说吧
评论