2017-01-16 4 views
0

Я входе в Instagram с завитком и PHP, и он идет в цикле перенаправления где текст похож на это перекликается с некоторыми вариациями между каждым эхоPHP локон Войти в Instagram переходит в петлю Перенаправление

> HTTP/1.1 301 Moved Permanently Location: https://www.instagram.com/ 
> Content-Type: text/plain Server: proxygen Date: Mon, 16 Jan 2017 
> 12:53:26 GMT Connection: keep-alive Content-Length: 0 
> 
> HTTP/1.1 200 OK Content-Type: text/html Vary: Cookie, Accept-Language, 
> Accept-Encoding Content-Language: en Pragma: no-cache Expires: Sat, 01 
> Jan 2000 00:00:00 GMT Strict-Transport-Security: max-age=86400 Date: 
> Mon, 16 Jan 2017 12:53:27 GMT X-Frame-Options: SAMEORIGIN 
> Content-Encoding: gzip Cache-Control: private, no-cache, no-store, 
> must-revalidate Set-Cookie: sessionid=; expires=Thu, 01-Jan-1970 
> 00:00:00 GMT; Max-Age=0; Path=/; HttpOnly; Domain=instagram.com 
> Set-Cookie: csrftoken=uWHWfgmVVhdROoG3HsyIevXMq4mcEGVU; expires=Mon, 
> 15-Jan-2018 12:53:27 GMT; Max-Age=31449600; Path=/; Secure Connection: 
> keep-alive Content-Length: 3373 

код я использую это

<?php 

    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/pruebalogininsta3.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-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=http_build_query(array('username'=>$usuario,'password'=>$password)); 


     # Creo que falta agregar la variable POST para que mande un POST y no un GET 

     curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
     curl_setopt($ch, CURLOPT_POSTFIELDS, $sPost); 
     curl_setopt($ch, CURLOPT_ENCODING, 'gzip, deflate'); 
     curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
     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; 

    ?> 
+0

Вы знаете, что вы опубликовали реальный имя пользователя/пароль публично в stackoverflow? Я надеюсь, что эта учетная запись @pablodalmazzo может быть скомпрометирована без проблем, например, с помощью опубликованной учетной записи throwaway. Если нет, вы должны изменить свой пароль как можно скорее. – hanshenrik

+0

спасибо, я не заметил, нет ничего важного, хотя – Pablo

+0

помните, что имя пользователя/пароль все еще отображается, если вы проверяете историю изменений, общедоступную по адресу http://stackoverflow.com/posts/41676960/revisions - вам следует измените свой пароль – hanshenrik

ответ

2

вы пару ошибок,

1: добавить заголовок 'Accept-Encoding: gzip, deflate', вручную. если сервер решил использовать gzip/deflate, тело ответа будет выглядеть искаженным (двоичные сжатые данные), если вы хотите использовать сжатие в curl, вместо этого используйте CURLOPT_ENCODING, и завиток распакует его для вас. (По крайней мере, вы делаете это правильно во 2-й вызов)

2: вы добавляете Referer: https://www.instagram.com/, только переписать его моменты позже с curl_setopt($ch, CURLOPT_REFERER, $sTarget);, что делает пользовательский заголовок игнорируется, и $ Starget, кажется неопределенной переменной.

3: вы используете заглавные буквы в своих заголовках http. в протоколе входа в систему не используются заглавные буквы в любых заголовках, насколько я могу видеть. (Например, вы называете это X-Instagram-AJAX: 1, но страница Войти называет x-instagram-ajax: 1)

использованием hhb_curl из https://github.com/divinity76/hhb_.inc.php/blob/master/hhb_.inc.php,

вот рабочий пример кода:

<?php 
declare(strict_types = 1); 
require_once('hhb_.inc.php'); 
$hc = new hhb_curl(); 
$hc->_setComfortableOptions(); 

$username = 'nigeriansdddd'; 
$password = '[email protected]'; 
// get a cookie session and login page etc 
$hc->exec ('https://www.instagram.com/'); 
// hhb_var_dump($hc->getStdErr(),$hc->getResponseBody()); 
$html = $hc->getResponseBody(); 
$token = getCsrfToken ($html); 
$hc->setopt_array (array (
     CURLOPT_URL => 'https://www.instagram.com/accounts/login/ajax/', 
     CURLOPT_POST => true, 
     CURLOPT_HTTPHEADER => array (
       'x-csrftoken: ' . $token, 
       'x-instagram-ajax: 1', 
       'x-requested-with: XMLHttpRequest', 
       'accept-language: en-US,en;q=0.8,nb;q=0.6', 
       'origin: https://www.instagram.com', 
       'referer: https://www.instagram.com/' 
     ) 
     , 
     CURLOPT_POSTFIELDS => http_build_query (array (
       'username' => $username, 
       'password' => $password 
     )) 
)); 
$hc->exec(); 
// hhb_var_dump ($hc->getStdErr(), $hc->getResponseBody()); 
$jsonRAW = $hc->getResponseBody(); 
$json = json_decode ($jsonRAW, true); 
if (! is_array ($json) || $json ['status'] !== 'ok' || $json ['authenticated'] !== true) { 
    throw new RuntimeException ('failed to login. last curl request: ' . $hc->getStdErr() . $hc->getResponseBody()); 
} 
$hc->exec ('https://www.instagram.com/'); 
$html = $hc->getResponseBody(); 
if (false === strpos ($html, $username)) { 
    throw new RuntimeException ('failed to confirm login. last curl request: ' . $hc->getStdErr() . $hc->getResponseBody()); 
} 
hhb_var_dump ($hc->getStdErr(), $hc->getResponseBody()); 


function getCsrfToken(string $html): string { 
    $matches = array(); 
    $rexret = preg_match ('/\"csrf_token\"\s*\:\s*\"([^\"]*)/', $html, $matches); 
    if ($rexret !== 1) { 
     throw new RuntimeException ('failed to find the csrf token!'); 
    } 
    // hhb_var_dump($rexret,$matches); 
    $csrftoken = $matches [1]; 
    return $csrftoken; 
} 

(примечание: счет, nigeriansdddd/[email protected] - это просто фиктивная учетная запись, мне все равно, если учетная запись скомпрометирована, что, очевидно, происходит, когда я публикую учетные данные здесь)

+0

Я пробовал код, но он, похоже, не работает. Должен ли я получить основной канал после входа ?. Я создал учетную запись на хостинге с php7, потому что для этой библиотеки требуется php7, но я получил тот же результат, вот это https://yotambienmerio.000webhostapp.com/phpversion.png, и после второго вызова файла он вызывает фатальная ошибка здесь вы можете увидеть https://yotambienmerio.000webhostapp.com/codigo_del_pibe.php – Pablo

+1

@Pablo да, вы должны получить главную страницу. странно, это работает для меня. кажется, что он терпит неудачу на 'if (! is_array ($ json) || $ json ['status']! == 'ok' || $ json ['authenticated']! == true) {', замените этот код на 'if (! is_array ($ json) || $ json ['status']! == 'ok' || $ json ['authenticated']! == true) { hhb_var_dump ($ hc-> getStdErr(), $ hc-> getResponseBody()); throw new RuntimeException ('не удалось войти в систему. См. Stdout'); } ', и запустите его снова, что вы получаете? – hanshenrik

+1

@Pablo странно, моя тестовая учетная запись была удалена, кажется: 'Имя пользователя, которое вы ввели, не принадлежит учетной записи. Пожалуйста, проверьте свое имя пользователя и повторите попытку. '- неудивительно, что тестовый код не работает с этой учетной записью, вы проверили его с помощью действующей учетной записи? – hanshenrik