我有一个脚本,可以从网站上抓取一些网页。该网站首先需要一个OPTIONS请求,然后是一个POST请求,该请求导致返回一个json并附带我需要的数据。它运行正常,我只运行了6到7次,结果还可以,但是现在我的POST请求结果显示在HTML页面中,该页面显示“您对我们网站的访问已被阻止。我们的网站使用了安全性服务以防御攻击。您的访问权限正在触发我们的一项安全措施。“
我知道他们没有阻止我的IP,因为我可以使用相同的IP通过浏览器访问相同的站点,并且工作正常。那么他们怎么知道我使用的是curl而不是真正的浏览器?
正如您在下面的代码中看到的那样,我已经更改了用户代理以使其与浏览器中的代理匹配,我正在发送与浏览器发送的标题完全相同的标题。
$useragent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36';
$headerOptions = array(
':authority: flight-pricing.maxmilhas.com.br',
':method: OPTIONS',
':path: /search?time='.$epochtime,
':scheme: https',
'accept: */*',
'accept-encoding: gzip, deflate, br',
'accept-language: pt-BR,pt;q=0.9,en-US;q=0.8,en;q=0.7',
'access-control-request-headers: authorization,content-type',
'access-control-request-method: POST',
'origin: https://www.maxmilhas.com.br',
'user-agent: '.$useragent
);
$url = 'https://flight-pricing.maxmilhas.com.br/search?time='.$epochtime;
$curl = curl_init();
curl_setopt($curl, CURLOPT_USERAGENT, $useragent );
curl_setopt($curl, CURLOPT_AUTOREFERER, true);
curl_setopt($curl, CURLINFO_HEADER_OUT, true);
curl_setopt($curl, CURLOPT_COOKIEJAR, "C:/wamp64/www/maxmilhas/tmp/cookieoptions.txt");
curl_setopt_array($curl, array(
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_CUSTOMREQUEST => "OPTIONS",
CURLOPT_HTTPHEADER => $headerOptions
));
$response = curl_exec($curl);
$err = curl_errno($curl);
file_put_contents('log/headerout/options.txt',curl_getinfo($curl, CURLINFO_HEADER_OUT ));
curl_close($curl);
if ($err) {
echo "cURL -OPTIONS Request- Error #:" . $err;
}
file_put_contents('log/options.txt',$response);
$headerPost = array(
':authority: flight-pricing.maxmilhas.com.br',
':method: POST',
':path: /search?time='.$epochtime,
':scheme: https',
'accept: application/json, text/plain, */*',
'accept-encoding: gzip, deflate, br',
'accept-language: pt-BR,pt;q=0.9,en-US;q=0.8,en;q=0.7',
'authorization: '.$authorization,
'content-length: 145',
'content-type: application/json;charset=UTF-8',
'origin: https://www.maxmilhas.com.br',
'referer: '.$refererPost,
'user-agent: '.$useragent
);
$curl2 = curl_init();
curl_setopt($curl2, CURLOPT_URL, $url);
curl_setopt($curl2, CURLOPT_USERAGENT, $useragent );
curl_setopt($curl2, CURLOPT_REFERER, $refererPost);
curl_setopt($curl2, CURLINFO_HEADER_OUT, true);
curl_setopt($curl2, CURLOPT_AUTOREFERER, true);
curl_setopt($curl2, CURLOPT_COOKIEJAR, "C:/wamp64/www/maxmilhas/tmp/cookiepost.txt");
curl_setopt($curl2, CURLOPT_POSTFIELDS, $payload);
curl_setopt_array($curl2, array(
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => $headerPost
));
$response2 = curl_exec($curl2);
$err2 = curl_errno($curl2);
file_put_contents('log/headerout/post.txt',curl_getinfo($curl2, CURLINFO_HEADER_OUT ));
curl_close($curl2);
if ($err2) {
echo "cURL -POST Request- Error #:" . $err2;
}
file_put_contents('log/post.txt',$response2);
因此,我要复制Google Chrome发送的完全相同的请求,如下图所示:
Pic1: OPTIONS Request by Chrome
我第一次被阻止时,我还没有使用COOKIEJAR选项,所以我认为这可能是问题所在。我启用了它,但仍然被阻止。
所以我知道我的代码可以正常工作,因为它在该块之前甚至在完全启用cookie之前都运行良好。从那以后我什么都没改变。但是似乎他们可以识别出此请求来自curl,然后将其阻止。
所以我的问题是:如果不通过我的IP,他们如何阻止我?我的curl请求与正常的浏览器请求有何不同?
我敢打赌,这与cookie有关,但是除了在curl请求上启用COOKIEJAR选项外,我对如何处理此问题一无所知。
我的两个cookie文件都是这样的:
谢谢。