PHP Curl请求被阻止,但可在浏览器中使用

时间:2018-08-04 21:50:33

标签: php http curl web-scraping

我有一个脚本,可以从网站上抓取一些网页。该网站首先需要一个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

Pic2: POST request by Chrome

我第一次被阻止时,我还没有使用COOKIEJAR选项,所以我认为这可能是问题所在。我启用了它,但仍然被阻止。

所以我知道我的代码可以正常工作,因为它在该块之前甚至在完全启用cookie之前都运行良好。从那以后我什么都没改变。但是似乎他们可以识别出此请求来自curl,然后将其阻止。

所以我的问题是:如果不通过我的IP,他们如何阻止我?我的curl请求与正常的浏览器请求有何不同?

我敢打赌,这与cookie有关,但是除了在curl请求上启用COOKIEJAR选项外,我对如何处理此问题一无所知。

我的两个cookie文件都是这样的:

Pic3: Cookie Files

谢谢。

0 个答案:

没有答案