POST авторизация в Instagram

Discussion in 'PHP' started by toxam9, 5 Jan 2014.

  1. toxam9

    toxam9 New Member

    Joined:
    22 May 2009
    Messages:
    19
    Likes Received:
    0
    Reputations:
    0

    1) Делаю вот так:

    Code:
     $url="https://instagram.com/accounts/login/"; 
    $page = file_get_contents($url);   
    $content = preg_match('<input type="hidden" name="csrfmiddlewaretoken" value="(.*?)">', $page, $found); 
    
     function login($url,$login,$pass,$key){  
    
      $ch = curl_init();   
     if(strtolower((substr($url,0,5))=='https')) { // если соединяемся с https   
      curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); 
      curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);    }    
    curl_setopt($ch, CURLOPT_URL, $url);  
      curl_setopt($ch, CURLOPT_REFERER, $url); 
       curl_setopt($ch, CURLOPT_VERBOSE, 1);   
     curl_setopt($ch, CURLOPT_POST, 1);  
      curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
       curl_setopt($ch, CURLOPT_POSTFIELDS,"username=".$login."&password=".$pass."&csrfmiddlewaretoken=".$key);    
    curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (Windows; U; Windows NT 5.0; En; rv:1.8.0.2) Gecko/20070306 Firefox/1.0.0.4");
        curl_setopt($ch, CURLOPT_HEADER, 1);  	//Отправляем key в заголовок 
    	curl_setopt($ch, CURLOPT_COOKIE, "Cookie: csrftoken=".$key);  
       curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);  
      curl_setopt($ch, CURLOPT_COOKIEJAR, $_SERVER['DOCUMENT_ROOT'].'/cookie.txt');  
       curl_setopt($ch, CURLOPT_COOKIEFILE, $_SERVER['DOCUMENT_ROOT'].'/cookie.txt');  
        $result=curl_exec($ch);  
        //var_dump($result);   
     if(strpos($result,"Location: https://instagram.com/")===false) die('Login incorrect');  
    	    curl_close($ch); 
        return $result; 	} 
    		//print $found[1]."<br>";
       	  	login($url,$login,$pass,$found[1]);   
              header('Location: https://api.instagram.com/oauth/authorize/?client_id='.$client_id.'&redirect_uri=http://localhost/inst/step1.php&response_type=code&scope=basic+comments+relationships+likes&client_id='.$client_id.'&client_secret='.$client_secret.'');	       

    Получаю форму для ввода логина и пароля от инстаграм. Token приложения и т.д. получил и передаю инстаграмму. Есть мысль полученные cookies с помощью curl каким то образом записывать в браузер для домена instagram.com, только вот не представляю каким образом выдрать их из файла и записать.

    2) Если меняю в getCSRFToken код
    Code:
    $body = $this->curl->get($this->url)->body;     
    preg_match("/window\._csrf_token = '(.*)';/", $body, $found);
    на

    Code:
    $page = file_get_contents($this->url);   
      $content = preg_match("/window\._csrf_token = '(.*)';/", $page, $found);
    уже говорит что не верные логин и пароль... var_dump говорит что $body пустой...почему пустой не понятно((
     
    #21 toxam9, 6 Jan 2014
    Last edited: 6 Jan 2014
  2. mrDebian

    mrDebian Member

    Joined:
    27 Jan 2013
    Messages:
    96
    Likes Received:
    13
    Reputations:
    10
    1) Ты через браузер что ли все делаешь? Зачем ты перенаправляешь на https://api.instagram.com ? Ты явно что-то не то мутишь.

    2) Я не представляю почему у тебя $body пустой. Поставь xdebug себе что ли, и с ним трассируй. Если $body пустой, то сервер тебе ничего не возвращает, может тебя забанили. Понатыкай везде var_dump() и смотри промежуточный вывод.

    Попробуй так же поменять
    Code:
    $body = $this->curl->get($this->url)->body; 
    На
    Code:
    die(var_dump($this->curl->get($this->url)));
    И посмотри что скажет.
     
  3. toxam9

    toxam9 New Member

    Joined:
    22 May 2009
    Messages:
    19
    Likes Received:
    0
    Reputations:
    0

    Так а как тогда после получения куков залогиниться и подключиться к api? :mad:
     
  4. mrDebian

    mrDebian Member

    Joined:
    27 Jan 2013
    Messages:
    96
    Likes Received:
    13
    Reputations:
    10
    Ну куки от курла у тебя же есть? Вот и используй и дальше curl для общения через API. Я не понимаю как ты реализовал API, но не можешь реализовать логин...
     
  5. toxam9

    toxam9 New Member

    Joined:
    22 May 2009
    Messages:
    19
    Likes Received:
    0
    Reputations:
    0
    Да куки есть в файлике


    Так API я без cUrl реализовывал как прототип Jquery+php
     
  6. mrDebian

    mrDebian Member

    Joined:
    27 Jan 2013
    Messages:
    96
    Likes Received:
    13
    Reputations:
    10
    Причем тут jquery вообще? Зачем он тебе? Получил куки от логина, и пошель дальше курлом запросы слать.
    Когда забанят, просто сменишь логин\пароль, и дальше будешь слать...

    Ты либо залей на гитхаб свой код, чтоб можно было в нем разобраться, либо делай как тебе говорят.
     
  7. M_script

    M_script Members of Antichat

    Joined:
    4 Nov 2004
    Messages:
    2,581
    Likes Received:
    1,317
    Reputations:
    1,557
    Тут 2 варианта - учить матчасть или заказать готовый скрипт в разделе "о работе".

    В общем, алгоритм простой, можно без curlopt_cookie(file|jar):
    1) Авторизация, получение сессии.
    POST-запрос
    https://instagram.com/accounts/login/
    username=ЛОГИН&password=ПАРОЛЬ&csrfmiddlewaretoken=CSRF_ТОКЕН
    В куках csrftoken=CSRF_ТОКЕН

    Парсим из ответа "^Set-Cookie: sessionid=(.+?)\;"

    2) Установка приложения. Если уже установлено, получение токена авторизации.
    POST-запрос
    https://instagram.com/oauth/authorize/?client_id=ID_ПРИЛОЖЕНИЯ&redirect_uri=URI_ПРИЛОЖЕНИЯ&response_type=token&scope=relationships
    csrfmiddlewaretoken=CSRF_ТОКЕН&allow=Authorize
    В куках сессия из предыдущего пункта и csrftoken=CSRF_ТОКЕН

    Из ответа берем "#access_token=(.+?)$"

    3) Выполняем любые запросы к API, используя access_token. Куки и аккаунты уже не нужны. access_token для каждого аккаунта постоянный, не меняется даже при смене пароля и переустановке приложения. Лимит запросов к API - 160 в час.


    P.S.: CSRF токены подобного типа вообще не надо парсить со страницы. Главное, чтобы в куках и теле запроса был одинаковый токен. Генерируй рандомный md5-хеш на каждый запрос и отправляй его.
     
    #27 M_script, 6 Jan 2014
    Last edited: 6 Jan 2014
  8. toxam9

    toxam9 New Member

    Joined:
    22 May 2009
    Messages:
    19
    Likes Received:
    0
    Reputations:
    0
    Всем спасибо за советы, реализовал все задуманное с помощью CUrl. Вопрос только такой остался, как сделать визуальный лог работы скрипта? Как с Curl правильно передать на страницу выполнение? С помощью js?

    Ну т.е. чтобы типо писало ставим лайк такой то ID и т.д.

    Может пример привидете для более понятной реализации.

    Еще раз спасибо ребята за помощью, много для себя почерпнул.
     
    #28 toxam9, 8 Jan 2014
    Last edited: 8 Jan 2014
  9. Mr.Draco

    Mr.Draco Member

    Joined:
    27 May 2007
    Messages:
    10
    Likes Received:
    7
    Reputations:
    0
    Прочитал всю тему и не могу залогиниться в инстаграме никак. Использую perl, вот код:
    Code:
    #!/usr/bin/perl -w
    use strict;
    use LWP::UserAgent;
    use HTTP::Cookies;
    
    my $login = "login";
    my $pass = "pass";
    my $url="https://instagram.com/accounts/login/";
    
    my $cj = HTTP::Cookies->new(file     => 'cookies.txt',
                                autosave => 1);
    my $ua = LWP::UserAgent->new();
    $ua -> agent(agents());
    $ua -> timeout(35);
    $ua -> default_headers($h);
    $ua -> cookie_jar($cj);
    
    my $result = $ua -> get( $url ) -> content;
    my $token;
    if ($result =~ /name=\"csrfmiddlewaretoken\" value\=\"(\w.*)\"/) {$token = $1;}
    
    my $resp = $ua -> post($url, 	['csrfmiddlewaretoken' => $token,
    			      	 'username'            => $login, 
    			      	 'password'            => $pass]);
    print "Token = ".$token."\n";
    print $resp -> code."\n";
    
    
    sub agents {
        my @agents = qw(Opera/9.15 Opera/9.12 Opera/8.60b IE/4.0 IE/5.0 IE/6.0 IE/7.0 Mozilla/4.0 Mozilla/5.0 Mozilla/2.0 Mozilla/3.0);
        return $agents[rand scalar @agents];}
    Выше было сказанно что необходимо в заголовке токен передавать, как это реализовать?

    Токен в куках и спарсенный со странице одинаковый
     
  10. LStr1ke

    LStr1ke Elder - Старейшина

    Joined:
    29 Jul 2009
    Messages:
    801
    Likes Received:
    145
    Reputations:
    73
    Поискал в своих работах проверь этот код:
    PHP:
    use LWP::UserAgent;
    use 
    HTTP::Request::Common;
    use 
    HTTP::Cookies;

    my $login 'LOGIN';
    my $password 'PASSWORD';

    my $cookie_jar HTTP::Cookies->new();
    my $ua LWP::UserAgent->newssl_opts => { verify_hostname => } );
    $ua->timeout(10);
    $ua->agent$userAgent );
    $ua->cookie_jar$cookie_jar );
    my $res $ua->get'https://instagram.com/accounts/login/' );
    my $result $res->content;
    if( 
    $result =~ /<input type="hidden" name="csrfmiddlewaretoken" value="(.+?)"/ ) {
        
    my $token = $1;
        
    my $postString 'csrfmiddlewaretoken='.$token.'&username='.$login.'&password='.$password;
        
    my $req HTTP::Request->newPOST => 'https://instagram.com/accounts/login/' );
        
    $req->content_type'application/x-www-form-urlencoded' );
        
    $req->content$postString );
        
    $req->header'Accept-Language' => 'en-US,en;q=0.5' );
        
    $req->header'Referer' => 'https://instagram.com/accounts/login/' );
        
    my $res $ua->request$req );
        
    my $result $res->content;
        if( 
    $res->code == '302' ) {
            print 
    'Login success';
        }else {
            print 
    'Login failed';
        }
    }
     
    1 person likes this.
  11. Mr.Draco

    Mr.Draco Member

    Joined:
    27 May 2007
    Messages:
    10
    Likes Received:
    7
    Reputations:
    0
    Все работает, спасибо!)