尝试解决typecho的文章未收录但却显示已收录的问题

shallgoing
2024-08-08 / 0 评论 / 12 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2024年08月14日,已超过99天没有更新,若内容或图片失效,请留言反馈。

分析

/* 查询是否收录 已测试 √ */
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,CURLOPTU​RL,baiduSite);
    curl_setopt(ch,CURLOPTHTTPHEADER,ch, CURLOPT_HTTPHEADER, ch,CURLOPTH​TTPHEADER,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-encodingaccept-languageCLIENT-IPX-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响应,表示网站已被收录。

lzl9tdcx.png

从调试输出的信息来看,API 返回的内容是一个包含验证码的链接,而不是我们预期的搜索结果。具体的输出是:

<a href="https://wappass.baidu.com/static/captcha/tuxing.html?...">Found</a>

这个链接指向百度的图形验证码页面,说明百度检测到了我们的请求,并认为这可能是自动化行为,因此要求进行验证码验证。

原因分析:

百度为了防止滥用或频繁的自动化查询请求,使用了图形验证码来验证请求的真实性。我们的代码通过 cURL 发送请求,但是由于频繁或异常的访问模式,触发了百度的安全机制,导致你获取到的不是搜索结果,而是一个要求验证码验证的页面。

解决方案:

还没想到,再说吧

0

评论

博主关闭了所有页面的评论