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;
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));
, иначе учетные записи с & или= или пустыми значениями в пароле или имени пользователя не будут работать должным образом
Ответ, опубликованный @hanshenrik, действительно должен быть принят. Но если вам просто нужно простое решение, которое работает и не является неправильным, удалите 'Accept-Encoding: gzip, deflate'
из массива заголовков.