php curl в instagram возвращает нечетный результат


include_once('simple_html_dom.php'); 

    $usuario = "username";
    $password = "password";

    $url = 'https://www.instagram.com/';
    $url_login = 'https://www.instagram.com/accounts/login/ajax/';
    $user_agent = array("Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 ",
                  "(KHTML, like Gecko) Chrome/48.0.2564.103 Safari/537.36");

    $ch = curl_init(); 

    $headers = [
    'Accept-Encoding: gzip, deflate',
    'Accept-Language: en-US;q=0.6,en;q=0.4',
    'Connection: keep-alive',
    'Content-Length: 0',
    'Host: www.instagram.com',
    'Origin: https://www.instagram.com',
    'Referer: https://www.instagram.com/',
    'User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.103 Safari/537.36', 
    'X-Instagram-AJAX: 1',
    'X-Requested-With: XMLHttpRequest'  
    ];

    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_URL, $url);

    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
    curl_setopt($ch, CURLOPT_COOKIEFILE, "/tmp/cookie/pruebalogininsta2.txt");
    curl_setopt($ch, CURLOPT_REFERER, $sTarget);
    curl_setopt($ch, CURLOPT_HEADER, TRUE);

    $html = curl_exec($ch);

    preg_match_all('/^Set-Cookie:\s*([^;]*)/mi', $html, $matches);
    $cookies = array();
    foreach($matches[1] as $item) {
        parse_str($item, $cookie);
        $cookies = array_merge($cookies, $cookie);
    }


    $headers = [
    'Accept-Encoding: gzip, deflate',
    //'Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4',
    'Accept-Language: en-US;q=0.6,en;q=0.4',
    'Connection: keep-alive',
    'Content-Length: 0',
    'Host: www.instagram.com',
    'Origin: https://www.instagram.com',
    'Referer: https://www.instagram.com/',
    'User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.103 Safari/537.36', 
    'X-Instagram-AJAX: 1',
    'X-Requested-With: XMLHttpRequest'
    ];

    $cadena_agregar_vector = 'X-CSRFToken:'. $cookies["csrftoken"];

    $headers[] = $cadena_agregar_vector ;

    $sPost =  "username=".$usuario . "&password=". $password ;

    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $sPost);
    curl_setopt($ch, CURLOPT_URL, $url_login);  

    $html2 = curl_exec($ch);

    curl_setopt($ch, CURLOPT_URL, "http://www.instagram.com/");  

    $html4 = curl_exec($ch);

    echo $html4;

Вот что я получаюenter image description here

Author: Pablo, 2017-01-09

2 answers

Проблема заключается в том, как вы жестко кодируете Accept-Encoding: gzip, deflate, это заставляет curl действительно отправлять заголовок кодирования, но он не включает функцию декодирования curl, таким образом, вы получаете необработанные данные без декодирования curl для вас.

Удалите 'Accept-Encoding: gzip, deflate' и добавьте curl_setopt($ch, CURLOPT_ENCODING, 'gzip, deflate');, и curl расшифрует его для вас (при условии, что curl скомпилирован с поддержкой gzip и deflate) - или, еще лучше, просто сделайте curl_setopt($ch, CURLOPT_ENCODING, '');, и curl автоматически перечислит все поддерживаемые кодировки, поэтому вы не столкнетесь с проблемой кодирования, когда curl не компилируется с поддержкой gzip.

В несвязанном примечании вы, вероятно, захотите использовать CURLOPT_USERAGENT, а не устанавливать заголовок агента пользователя вручную. в противном случае строка UA будет просто отправлена с этим запросом 1 и будет сброшена при следующем запросе, в то время как CURLOPT_USERAGENT сохраняется до curl_close($ch)

Редактировать: в моей первой редакции этого поста я написал CURLOPT_POSTFIELDS вместо CURLOPT_ENCODING, извините, исправил это

Правка 2: в другой несвязанной заметке вы кодируете неверное имя пользователя/пароль. вместо $sPost = "username=".$usuario . "&password=". $password ;, сделайте $sPost=http_build_query(array('username'=>$usuario,'password'=>$password));, иначе учетные записи с & или= или пустыми значениями в пароле или имени пользователя не будут работать должным образом

 1
Author: hanshenrik, 2017-01-09 18:23:26

Ответ, опубликованный @hanshenrik, действительно должен быть принят. Но если вам просто нужно простое решение, которое работает и не является неправильным, удалите 'Accept-Encoding: gzip, deflate' из массива заголовков.

 1
Author: VKK, 2017-01-09 18:26:48