Pull to refresh

Костыли для социальных сетей. Часть 1: Авторизация

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

Небольшая предыстория


Работаю я помощником системного администратора, интересуюсь почти всем, что связано с миром IT. Так как специфика моей работы допускает большое количество свободного времени, то я стараюсь время от времени повышать какие-либо свои навыки и узнавать что-то новое. Однако, сидя на работе мне приходится тратить n-е количество времени для переписки со своей девушкой (почти женой). Думаю, не мне одному тяжко бывает изучать какой-либо материал, программировать и одновременно следить за тем, не пришло ли сообщение. Было решено написать под эти нужды небольшой мессенджер, который будет уведомлять меня о новых сообщениях, либо постоянно находиться поверх всех окон и при этом не занимать весь экран, а лишь небольшую его часть. Статья будет разделена на несколько частей, в этой части я расскажу как можно авторизоваться в одноклассниках.

Есть несколько путей авторизации: OAuth 2.0 авторизация и обычная https авторизация(как при работе через браузер).
Не смотря на то, что OAuth 2.0 наиболее выгодно подходит для моих целей (можно весьма легко реализовать необходимый функционал, благодаря API), мой выбор пал на имитацию браузерной авторизации. Почему? Всё просто: для OAuth 2.0 необходимо получить специальный ключ приложения, необходимый для авторизации, а меня это несколько смущало.

Подготовка


Что нам понадобится:
— Delphi 7 и выше (я работаю в 7-й версии, ибо адекватной замены так и не увидел)
— библиотека Indy
— библиотека OpenSSL (для работы с https)
— браузер и сниффер (в моем случае мне было достаточно одно лишь Chrome с его функцией «Инструменты разработчика» )

Некоторые оговорки


Авторизацию будем проводить через мобильную версию, ибо в последствии с ней будет удобнее работать.
При работе https протоколом на старых версиях Indy может потребоваться некоторое вмешательство, а именно:
вам потребуется скачать специальные версии библиотек OpenSSL и модифицировать модуль IdSSLOpenSSLHeaders, для этого нужно скачать специальную версию библиотеки для поддержки SSL в Indy (openssl-0.9.8l-i386-win32-IndyBackport.zip) в архиве будет простая инструкция по использованию.

Приступаем к работе


Переходим по адресу m.odnoklassniki.ru.
Мы видим поля ввода для логина и пароля соответственно и кнопку, при нажатии на которую, данные отправляются на сервер.
Настало время включить сниффер или режим разработчика в хроме. Давайте проанализируем процесс авторизации: при попытке авторизации данные отправляются POST-запросом на 443 порт того же хоста, на который мы и заходили, одновременно с несколькими GET параметрами.

Вроде бы всё просто. Но! Прежде чем отправить POST запрос на данный хост, нам необходимо сначала загрузить изначальную страницу с полями авторизации, чтоб получить cookie и выдернуть ссылку, по которой и будет отправлен запрос, поскольку один из GET параметров -«tkn» меня своё значение при каждой перезагрузке страницы.

Приступим к коду:

Подключаем в uses следующие модули:

 IdBaseComponent, IdComponent, IdTCPConnection,
  IdTCPClient, IdHTTP, IdCookieManager, IdIOHandler, IdIOHandlerSocket, IdSSLOpenSSL,StrUtils


Создаем новую форму, кидаем на нее 2 TEdit и 1 TButton.

В Edit1 будем вводить логин, в Edit2 — пароль, при нажатии на Button1 будет происходить авторизация.

procedure TForm1.Button1Click(Sender: TObject);
var
  request, tmp: TStringList;
  link: string;
begin
  HTTP.AllowCookies := True;
  HTTP.HandleRedirects := True;
  http.Request.Host := 'm.odnoklassniki.ru';
  HTTP.Request.Accept :=
    'application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5';
  HTTP.Request.AcceptCharSet := 'windows-1251,utf-8;q=0.7,*;q=0.3';
  HTTP.Request.AcceptLanguage := 'ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4';
  HTTP.Request.UserAgent :=
    'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36';
  HTTP.Request.Connection := 'keep-alive';
  request := TStringList.Create;
  request.Clear;
  tmp := TStringList.Create;
  request.Add('fr.posted=set');
  request.Add('fr.needCaptcha=');
  request.Add('fr.login=' + edit1.Text);
  request.Add('fr.password=' + edit2.Text);
  request.Add('button_login=Войти');
  request.Text := AnsiToUtf8(request.Text);
  tmp.Text := http.Get('http://m.odnoklassniki.ru');
  link := GetLink(tmp.Text);
  try  //тут может вывалится сообщение "Connection Closed Gracefully"
    tmp.Text := http.Post(link, request);
  except
  end;
  tmp.Text := http.Get('http://m.odnoklassniki.ru');
  tmp.SaveToFile('odnoklassniki.htm');
end;

function GetLink(source:string):string; //функция выдергивает из страницы адрес, на который отправляются данные
var
a,b:Integer;  s:string;
begin
a:=Pos('action="',source)+8;
b:=PosEx('"',source,a);
s:=Copy(source,a,b-a);
Result:=StringReplace(s,'amp;','&',[rfReplaceAll]); 
end;


В результате, мы получим файл odnoklassniki.htm, в котором будет содержаться главная страница вашего профиля.
В следующий раз я покажу, как можно красиво и аккуратно вытащить диалоги и отправить сообщение.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.