Авторизация ВК посредством CURl и PHP

Discussion in 'Социальные сети' started by plitka123, 21 Jun 2015.

  1. plitka123

    plitka123 New Member

    Joined:
    17 Apr 2012
    Messages:
    9
    Likes Received:
    1
    Reputations:
    0
    Добрый день. У Вконтакте сейчас схема авторизации следующая.
    1. На странице логина есть два хеша: ip_h и lg_h. Эти хеши подставляются в форму логина.
    2. При логине отправляется POST-запрос с этими хешами, логином и паролем на https://login.vk.com/?act=login, который устанавливает куки remixq.
    3. Далее нас переадресовывает на http://vk.com/login.php?act=slogin&to=&s=1&__q_hash=xxx, где вместо xxx подставляется куки remixq.
    4. И только после этого Вконтакт устанавливает куки remixsid, по которому уже можно войти в сеть.

    Я сначала делаю парсинг хешей со страницы логина:
    PHP:
    $url 'http://vk.com';
    $ch curl_init($url);
    curl_setopt($chCURLOPT_USERAGENT"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1)");
    curl_setopt($chCURLOPT_FOLLOWLOCATION1);
    curl_setopt($chCURLOPT_RETURNTRANSFERtrue);
    curl_setopt($chCURLOPT_HTTPHEADER, array(
            
    'accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
            
    'content-type: application/x-www-form-urlencoded',
            
    'origin: http://vk.com',
            
    'referer: http://vk.com/',
    ));
    curl_setopt($chCURLOPT_SSL_VERIFYHOSTFALSE);
    curl_setopt($chCURLOPT_SSL_VERIFYPEERFALSE);

    $content curl_exec($ch);

    preg_match_all("/name=\"ip_h\" value=\"(.*?)\" \\//s"$content$res[0]);
    preg_match_all("/name=\"lg_h\" value=\"(.*?)\" \\//s"$content$res[1]);
    Далее подставляю эти хеши в POST-запрос:
    PHP:
    $url 'http://login.vk.com/?act=login';
    $ch curl_init($url);
    curl_setopt($chCURLOPT_USERAGENT"Mozilla/5.0 (iPhone; CPU iPhone OS 7_0 like Mac OS X; en-us) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A465 Safari/9537.53");
    curl_setopt($chCURLOPT_FOLLOWLOCATION1);
    curl_setopt($chCURLOPT_RETURNTRANSFERtrue);
    curl_setopt($chCURLOPT_VERBOSE1);
    curl_setopt($chCURLOPT_HEADER1);
    curl_setopt($chCURLOPT_POSTtrue);

    curl_setopt($chCURLOPT_POSTFIELDS'act=login&role=al_frame&_origin=http://vk.com&ip_h='.$res[0][1][0].'&ig_h='.$res[1][1][0].'&email=myemail&pass=mypass');

    curl_setopt($chCURLOPT_HTTPHEADER, array(
        
    'accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
        
    'content-type: application/x-www-form-urlencoded',
        
    'origin: http://vk.com',
        
    'referer: http://vk.com/',
    ));
    curl_setopt($chCURLOPT_SSL_VERIFYPEERFALSE);

    echo 
    curl_exec($ch);
    Но в ответ получаю не установку нужных куки (remixq), а их удаление:
    Такой же ответ получается, если отправить неправильные данные. Что я упускаю? У кого-то сейчас получается авторизоваться вконтакте через CURL (не через API)? Раньше эта схема позволяла пройти авторизацию, но недели две назад перестала.
     
    makag likes this.
  2. Metal-Core

    Metal-Core Member

    Joined:
    20 Sep 2011
    Messages:
    219
    Likes Received:
    21
    Reputations:
    0
    Добавить еще сохранение кук:
    PHP:
            curl_setopt($chCURLOPT_COOKIEJAR'666.txt');
            
    curl_setopt($chCURLOPT_COOKIEFILE'666.txt'); 
     
    plitka123 likes this.
  3. plitka123

    plitka123 New Member

    Joined:
    17 Apr 2012
    Messages:
    9
    Likes Received:
    1
    Reputations:
    0
    Нечего сохранять, т.к. куки не назначаются. Я бы их из заголовков достал, но сервер ведёт себя по разному, на одинаковые по-сути запросы (один нативный, один через CURL). И я не могу найти, в чём для него разница.
     
  4. bockor

    bockor New Member

    Joined:
    30 May 2009
    Messages:
    28
    Likes Received:
    2
    Reputations:
    0
    Может из-за того что юзерагенты разные?
     
  5. plitka123

    plitka123 New Member

    Joined:
    17 Apr 2012
    Messages:
    9
    Likes Received:
    1
    Reputations:
    0
    Вы были правы, таки куки не сохранялись.
    Вот это при правильном использовании помогло.
    curl_setopt($ch, CURLOPT_COOKIEJAR, '666.txt');
    curl_setopt($ch, CURLOPT_COOKIEFILE, '666.txt');
     
  6. djStarskiy

    djStarskiy New Member

    Joined:
    3 Sep 2011
    Messages:
    3
    Likes Received:
    0
    Reputations:
    0
    Авторизоваться можно только "вручную" вводя логин и пароль через llogin.vk.com, просто куки из браузера подставить не получится , так?

    Странно что если соц сеть использует такой метод для предотвращения воровства куки, что банки не использут такой метод.