为什么php通过curl模拟访问和真实浏览器返回的结果不符?

fhquemc 2020-11-09 09:06:57
我用php的curl模拟访问一个网址:https://nitroflare.com/view/26016A32E5FAFE0/Vol_13_standing_on_the_shoulders_of_giants.pdf
返回的header和真实浏览器不一致:

真实浏览器,第一次访问(清空cookie访问)有4个set-cookie项(__cfduid ,PHPSESSID,lastFile, __cf_bm),
而curl提交的 Response Header 返回结果set-cookie相关的项只有3个(__cfduid ,PHPSESSID,lastFile),缺少 __cf_bm 这项,
见下图对比,服务器后端检测识别了什么?如何才能正确模拟访问?求权威解答!谢谢

真实浏览器访问截图:




curl访问结果截图:



我的PHP源码如下:



<?php

$headers = array(
'Host: nitroflare.com',
'User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36',
'Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language: zh-cn,zh;q=0.9',
);

$cs = curl_init();
curl_setopt($cs, CURLOPT_URL,'https://nitroflare.com/view/26016A32E5FAFE0/Vol_13_standing_on_the_shoulders_of_giants.pdf');
curl_setopt($cs, CURLOPT_HTTPHEADER, $headers);
curl_setopt($cs, CURLOPT_RETURNTRANSFER,1);
curl_setopt($cs, CURLOPT_CONNECTTIMEOUT,60);
curl_setopt($cs, CURLOPT_TIMEOUT,15);
curl_setopt($cs, CURLOPT_HEADER, 1);
curl_setopt($cs, CURLOPT_NOBODY, 1);
curl_setopt($cs, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($cs, CURLOPT_SSL_VERIFYHOST, FALSE);
$html = curl_exec($cs);
curl_close($cs);
echo $html;

?>




...全文
686 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
fhquemc 2020-11-14
  • 打赏
  • 举报
回复
没有,先只能这样用了
下雨的声音丶 2020-11-11
  • 打赏
  • 举报
回复
你找到原因了吗?
horizon_zpy 2020-11-11
  • 打赏
  • 举报
回复

<?php

$headers=array('Host: nitroflare.com','User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36','Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8','Accept-Language: zh-cn,zh;q=0.9');
$cs=curl_init();
curl_setopt($cs,CURLOPT_URL,'https://nitroflare.com/view/26016A32E5FAFE0/Vol_13_standing_on_the_shoulders_of_giants.pdf');
curl_setopt($cs,CURLOPT_HTTPHEADER,$headers);
curl_setopt($cs,CURLOPT_RETURNTRANSFER,1);
curl_setopt($cs,CURLOPT_CONNECTTIMEOUT,60);
curl_setopt($cs,CURLOPT_TIMEOUT,15);
curl_setopt($cs,CURLOPT_HEADER,1);
curl_setopt($cs,CURLOPT_NOBODY,1);
curl_setopt($cs,CURLOPT_SSL_VERIFYPEER,FALSE);
curl_setopt($cs,CURLOPT_SSL_VERIFYHOST,FALSE);
$html=curl_exec($cs);
curl_close($cs);
echo $html;
?>HTTP/1.1 400 Bad Request Server: cloudflare Date: Wed, 11 Nov 2020 09:32:04 GMT Content-Type: text/html Content-Length: 155 Connection: close CF-RAY: -
我咋访问不到啊。

fhquemc 2020-11-10
  • 打赏
  • 举报
回复
引用 3 楼 下雨的声音丶 的回复:
curl 具体为啥获取不到,我没找到问题,我这边测试 同样的代码在windows 上获取不到,但是在linux上可以获取; 于是尝试了一下 file_get_contents 方法来获取 貌似都可以获取到,你可以尝试一下

$opts = array(
    'http'=>array(
        'method'=>"GET",
        'header'=>"Accept-language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6\r\n".
            "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36 Edg/86.0.622.63\r\n"
    )
);

$context = stream_context_create($opts);
$url = 'https://nitroflare.com/view/26016A32E5FAFE0/Vol_13_standing_on_the_shoulders_of_giants.pdf';
// Open the file using the HTTP headers set above
file_get_contents($url, false, $context);
var_dump($http_response_header);
最后,解决了麻烦也告知一下到底是什么问题
又试了下,window 下Apache没有输出__cf_bm的值,但 nginx下可以输出,这是什么原因呢?
fhquemc 2020-11-10
  • 打赏
  • 举报
回复
body是没有问题的,是可以获取到. 我需要得到的是Response Header中Set-cookie的 __cf_bm的值 用你这个来模拟,__cf_bm的值也没有,但真实浏览器却有。你清空浏览器Cookie去访问就有。需要解决的就是这个问题
下雨的声音丶 2020-11-10
  • 打赏
  • 举报
回复
curl 具体为啥获取不到,我没找到问题,我这边测试 同样的代码在windows 上获取不到,但是在linux上可以获取; 于是尝试了一下 file_get_contents 方法来获取 貌似都可以获取到,你可以尝试一下

$opts = array(
    'http'=>array(
        'method'=>"GET",
        'header'=>"Accept-language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6\r\n".
            "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36 Edg/86.0.622.63\r\n"
    )
);

$context = stream_context_create($opts);
$url = 'https://nitroflare.com/view/26016A32E5FAFE0/Vol_13_standing_on_the_shoulders_of_giants.pdf';
// Open the file using the HTTP headers set above
file_get_contents($url, false, $context);
var_dump($http_response_header);
最后,解决了麻烦也告知一下到底是什么问题
fhquemc 2020-11-10
  • 打赏
  • 举报
回复
引用 1 楼 trainee的回复:
要看下 request header 和你的请求语句差别 可能是http_referer 参数没指定
但是真实浏览器的是直接输入的网址,值也没有啊
trainee 2020-11-10
  • 打赏
  • 举报
回复
要看下 request header 和你的请求语句差别 可能是http_referer 参数没指定

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧