V
V
vknyazev52014-09-24 23:27:46
PHP
vknyazev5, 2014-09-24 23:27:46

Authorization m.vk.com via php and curl to get a token?

We use the API seriously, and everything would be fine, but we need to get a token for each user of the application.
Thinking about automating this function.
In order to do this, you need to log in through the login password, and confirm the rights.
After studying for a day on the Internet, I understood the algorithm of how this is done.
Algorithm.
1. Extract ip_h from m.vk.com page
2. Parse page $url = ' https://login.vk.com/?act=login&_origin=http://mv.. '.$ip_h.'&role=pda&utf8 =1'; with saving cookies and get in the header /Location: m.vk.com/login?role=fast&to=&s=1&__q_hash=4baa84d7...
3. Load this link with the cookies received at the previous step.
In theory, everything should work. But doesn't work.

$curl = curl_init();

  $browser = 'Mozilla/5.0 (Windows NT 6.1; rv:26.0) Gecko/20100101 Firefox/26.0';

  $data = array(
        'email' => 'login'
        ,'pass' => 'pas'
      );
  // подготовительные данные

  $options = array(
          CURLOPT_USERAGENT		=> $browser
                    ,CURLOPT_COOKIEJAR => $_SERVER['DOCUMENT_ROOT'].'/cookie.txt'
                  ,CURLOPT_COOKIEFILE => $_SERVER['DOCUMENT_ROOT'].'/cookie.txt'
          ,CURLOPT_URL		=> 'http://m.vk.com'
          ,CURLOPT_FOLLOWLOCATION => true
          ,CURLOPT_RETURNTRANSFER	=> 1
          ,CURLOPT_TIMEOUT		=> 30
        );

  curl_setopt_array($curl, $options);
  $response = curl_exec($curl);
  // запрос делаем на мобильную версию ВКонтакте

  preg_match('/ip\_h\=(.*?)\&/is', $response, $match);

  $ip_h = $match[1];
  // парсим ip_h

  $url = 'https://login.vk.com/?act=login&_origin=http://m.vk.com&ip_h='.$ip_h.'&role=pda&utf8=1';
  // формируем url

  $options = array(
          CURLOPT_USERAGENT		=> $browser
          ,CURLOPT_URL		=> $url
          ,CURLOPT_POSTFIELDS		=> http_build_query($data)
          ,CURLOPT_COOKIEJAR => $_SERVER['DOCUMENT_ROOT'].'/cookie.txt'
                  ,CURLOPT_COOKIEFILE => $_SERVER['DOCUMENT_ROOT'].'/cookie.txt'
          ,CURLOPT_POST		=> 1
          ,CURLOPT_RETURNTRANSFER	=> 1
          ,CURLOPT_HEADER		=> 1
          ,CURLOPT_SSL_VERIFYPEER	=> 0
          ,CURLOPT_SSL_VERIFYHOST	=> 0
          ,CURLOPT_TIMEOUT		=> 30
                );

  curl_setopt_array($curl, $options);
  $response = curl_exec($curl);
  // делаем запрос на сформированный url

  preg_match('/Location: (.*?)\n/is', $response, $match); 

  $url = trim($match[1]);
  echo $url;
  /*
    парсим оттуда ссылку на которую нас должно перебросить
    CURLOPT_FOLLOWLOCATION не включил, т.к так удобнее/
    Что интересно, если эту ссылку вывести на данном этапе,
    то перейдя по ней авторизация пройдёт до конца,
    и пользователь оказывается в своей новостной ленте.
    Ссылка вида
    http://m.vk.com/login?role=fast&to=&s=1&__q_hash=4baa84d796ed6a2d826ace41508614eb
    После запроса возвращается нужная кука и происходит переадресация на /
    Пробовал с абсолютно чистого браузера(открывал режим инкогнито),
    авторизация всё равно проходит до конца.
    Для того что-бы исключить фактор IP адреса, пробовал развернуть
    Open Server на своём ПК - результат такой же.
  */

  $options = array (
          CURLOPT_USERAGENT		=> $browser
           ,CURLOPT_COOKIEFILE => $_SERVER['DOCUMENT_ROOT'].'/cookie.txt'
        ,CURLOPT_COOKIEJAR => $_SERVER['DOCUMENT_ROOT'].'/cookie.txt'
          ,CURLOPT_URL		=> $url
          ,CURLOPT_RETURNTRANSFER	=> 1
          ,CURLOPT_HEADER		=> 1
          ,CURLOPT_TIMEOUT		=> 30
                );

  curl_setopt_array($curl, $options);
  $response = curl_exec($curl);
  // делаем запрос на нужный url

        $kat = "vk.txt";
    $fp = fopen($kat, 'w');
      $vkbot= $response." \n";
    fwrite ( $fp, $vkbot);
  echo $response;
  // результат - 400 Bad Request

  curl_close($curl);

At the last step, I specifically write the result to a file, since otherwise some kind of eternal redirect occurs.
Hypotheses why does not work. I'm not working with cookies correctly. At step 3, after seeing how the contact works, the remixsid parameter is passed to the input cookies. It is the only one not delete. But there is no such parameter in the output cookies at step #2. I don't understand how to get it.
Any direction in the right direction would be welcome.

Answer the question

In order to leave comments, you need to log in

4 answer(s)
Александр Таратин, 2014-09-24
@Taraflex

Для того что бы это сделать надо залогиниться через логин пароль, и подтвердить права.

Вся эта возьня с api придумана отчасти чтобы вы не могли так делать.
Решение на питоне
habrahabr.ru/post/143972
Как на php провернуть не знаю.

Хазрат Гаджикеримов, 2014-09-25
@hazratgs

Вот тут все подробно описано.

S
sdwvit, 2015-05-08
@sdwvit

Если последний запрос сформировать как POST, то работать будет.
POST https://m.vk.com/login?__q_hash=3dcf81592afake358d... HTTP/1.1
Host: m.vk.com
Cookie: cookie: remixq_3dcf815fakeebf0e49358df6d8=b5b4sofake6370231c0fce
В ответ приходит set-cookie:remixsid=84f74d93fakeremixidb91efake977747c284;

S
Stas, 2016-07-31
@gufibox

начни писать свой класс подключения) я скопировал отсюда и своего добавил) Не забудь там csrf токен еще передается.

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question