Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > [for newbie] Проходим авторизацию "Вконтакте"


Автор: Jakeroid 10.1.2011, 15:16
Предыстория:
Недавно мне понадобилось авторизоваться вконтакте программно. Я попробовал, но потом началась сессия... И так не закончил. Но вот теперь я закрыл сессию на стипендию. Да, поздравьте меня smile! И решил закончить это дело.
Цель:
Получить доступ к персональной части страницы vkontakte.ru. То есть заиметь злой rmixsid! Кто пробовал, тот поймет.
Примечание:
Статья объясняет принцип авторизации, я не выкладываю готовый код, или программу, в этом нет смысла. Кто понимает в программировании, тот сможет это сделать и на Delphi и на C++.
Тем кому не понятны слова, прошу на этот замечательный СЕКРЕТНЫЙ сайт, о котором не знают новички! Я вам раскрываю секрет откуда черпают знания трУхАцкЕры.
_http://google.com/
Что использовал я?
Среда разработки:----------------------Delphi 7
Язык программирования:----------------Object Pascal 
Библиотека для протокола HTTP:------Indy 10
Библиотека для парсинга текста:-----TRegExpr
Сниффер:--------------------------------HTTP Analyzer V5

И так приступим!
Let's go! Let's Rock!


Разобрав что и как, я выяснил. Браузер отправляет 2 пост запроса. При этом данные передаваемые серверу одинаковые всегда для одного и того же пользователя. Копнув глубже я увидел, что в куках сидит remixsid. Он же ведь где то генерируется? Да. Это происходит после первого пост запроса. Сервер редиректид браузер на другую страницу, пустую, но в коде java скрипт. В скрипте генерятся куки. Поскольку Indy не захотела скачать этот скрипт. Я решил не заморачиваться. Ведь есть простой путь. 
Пройти авторизацию на мобильной версии вконтакте. А потом добавить куки, и получить доступ к полноценной.

Авторизация мобильной версии проходит тоже в два пост запроса.
Первый очень простой, нам следует передать только два параметра:
Цитата

[email protected]
pass=qwerty

Где email - мыло пользователя, pass - пароль(и дураку понятно).
В ответе приходит "мНогАбУкФ". 
Например:
Цитата
<html>
  <head>
    <meta http-equiv='content-type' content='text/html; charset=windows-1251' />
  </head>
  <body onload="try { document.getElementById('l').submit(); } catch(e) { document.getElementsByTagName('form')[0].submit(); }">
    <form id='l' method='post' action='http://m.vkontakte.ru/login'>
      <input type='hidden' name='s' value='5555540eb7f66d5f3678037aa931883eca1bd1ae77a32cae9361aff0' />
            <input type='hidden' name='op' value='slogin' />
      <input type='hidden' name='redirect' value='1' />
      <input type='hidden' name='expire' value='0' />
      <input type='hidden' name='to' value='' /><input type='hidden' name='to' value='' /><input type="submit" value="Продолжить"/>
    </form>
  </body>
</html>

Как мы сдесь видим, нас интересуют несколько параметров. Каждый из них имеет свой "name" и "value".
Что бы спарсить их я использовал следующую функцию:
Код
function AuthPars(rStr: string): string;
var
  rExp: TRegExpr;
begin
  try
    rExp:= TRegExpr.Create;
    rExp.Expression:= 'name=\''(.*?)\''\svalue=\''(.*?)\''';
    if rExp.Exec(rStr) then
    begin
      http.Request.CustomHeaders.Add('Cookie: remixsid='+rExp.Match[2]); //Описание этой строки ниже
      repeat
        Result:= Result + rExp.Match[1] + '=' + rExp.Match[2] + #13#10;
      until not rExp.ExecNext;
    end;
  finally
    rExp.Free;
  end;

Зачем же я добавил в CustomHeaders remixsid? А что бы мы смогли после авторизации на m.vkontakte.ru, зайти на любую страницу полной версии.
А вот как примерно должна выглядеть функция авторизации:
Код
function AuthVK(login, pass: string): string;
var
  s: TStringList;
  Astr: string;
begin
  try
    s:= TStringList.Create;
    s.Add('email='+login);
    s.Add('pass='+pass);
    http.HandleRedirects:= true;
    Astr:= http.Post('http://login.vk.com/?act=login&to=&from_host=m.vkontakte.ru&pda=1', s);
    s.Clear;
    s.Text:= AuthPars(Astr); //Функция парсинга
    Result:= http.Post('http://m.vkontakte.ru/login', s);
  finally
    s.Free;
  end;
end;


Вот собственно и все.
Для особо продвиннутых, пищущих на сокетах, не обязательно авторизоваться сначала на мобильной версии. Вы можете сразу в ответе первого пост запроса распарсить значения и передавать их потом как кукисы. 

УДАЧИ! ;) 

P.S. Тему создал для уменьшения количества вопросов по поводу авторизации вконтакте. Я думаю новичкам теперь не создаст трудностей разобраться что и как.

Автор: Mifody 11.1.2011, 10:13
Доброго времени суток.
Глупый вопрос можно? А зачем такие танцы с бубном???
И зачем "танцы" с мобильным контактом ???

По моему намного проще авторизоваться сразу на нормальном контакте, на не искать заднюю дверь smile.

Автор: Jakeroid 11.1.2011, 14:50
Потому что статья только для новичков в программировании. А моя indy не захотела качать скрипт ПК версии.

НО! Как я отписался в статье, там главное понять откуда берется remixsid. Если вы умеете работать с сокетами в С++, никто вам не мешает сделать это через ПК версию, по своему. Елегантно и красиво. Ну а если вы школьник, и вчера установили делфи. То статья максимально ориентированна на вас ;).

Автор: Mifody 11.1.2011, 17:15
Тогда сори, не знал что Инди такое не умеет, сам синапсом пользуюсь smile.
А так, неплохая статейка ;).

Автор: bagos 2.2.2011, 11:09
Да, молодец парень что написал, но имхо много лишнего, rmixsid так и не понял зачем он нужен для получения доступа к странице, я не профи в этом вопросе, но когда то делал прогу визуально работающую как icq, только для вконтакте, и никакой rmixsid мне не понадобился;) хотя может там многое поменялось, но не думаю)))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)