Итак, давайте вспомним первый пост по VK API в Delphi, в котором я описал как зарегистрировать свое приложение в сети, чтобы в дальнейшем его можно было использовать. Теперь нам необходимо авторизировать приложение в сети и получить секретный код и значение sid, которые в дальнейшем нам пригодятся для того, чтобы получать список друзей пользователя, список фотографий, альбомов и так далее. Что нам потребуется на данный момент
- Tedit — 2 шт
- TButton
- TLabel — 3 шт
- TidHTTP
- ну и я поставил еще TPageControl
Для того, чтобы получить данные сессии для нашего приложения, нам необходимо отправить запрос на
https://vkontakte.ru/login.php.
Для начала мы получим запрос GET-ом для того, чтобы получить необходимые данные для отправки запроса POST на страницу vkontakte.ru/login.php. Для того, чтобы получить запрос GET нам необходимо получить следующую страницу ввида
https://vkontakte.ru/login.php?app=1918788&layout=popup&type=browser&settings=130
То есть мы должны заполнить данными наш URL для дальнейшего получения нужной нам информации. Где
- app — идентификатор приложения, который вы получили при регистрации, мой идентификатор равен — 1918788
- layout — указывает тип дизайна, получаемой страницы
- type — указывает каким образом передается значение сессии
- settings — битовая маска доступа настроек приложения к вашей странице.
Более подробно про авторизацию приложения Вы сможете прочитать на сайте ВК. Далее, когда мы получили нужный нам параметр с этой страницу, а получали мы значение app_hash путем парсинга страницы полученной, нам необходимо отправить POST запрос на страницу https://login.vk.com/ после чего получить новое значение app_hash и только потом отправить POST запрос на страницу vkontakte.ru/login.php, где мы уже будем получать данные сессии путем парсинга.
Перед началом всей этой работы я написал функцию парсинга вот такую
function Pars(str:String;str_begin:String;str_end:String;count:integer):String;
begin
Delete(str,1,pos(str_begin,str)+length(str_begin));
Delete(str,pos(str_end,str)-count,length(str));
Pars:=str;
end;
И объявил вот такие вот переменные
PostVK:TStringList;
htmlVK:WideString;
logVK,app_nash:String;
Итак на событие onClick кнопки получить я написал следующий код
procedure TForm1.ButtonGoClick(Sender: TObject);
begin
try
logVK:=IdHTTP1.Get('https://vkontakte.ru/login.php?app=1918788&layout=popup&type=browser&settings=15615');
PostVK:=TStringList.Create;
PostVK.Clear;
PostVK.Add('act=login');
PostVK.Add('app=1918788');
PostVK.Add('app_hash='+Pars(logVK,'app_hash = ',';',1));
PostVK.Add('email='+EditLogin.Text);
PostVK.Add('pass='+EditPass.Text);
PostVK.Add('permanent=1');
logVK:=IdHTTP1.Post('https://login.vk.com/',PostVK);
PostVK.Clear;
PostVK.Add('s='+Pars(logVK,'value=','/>',2));
PostVK.Add('act=auth_result');
PostVK.Add('m=4');
PostVK.Add('parmanent=1');
PostVK.Add('expire=""');
PostVK.Add('app=1918788');
PostVK.Add('app_hash='+Pars(logVK,'app_hash" value=','"',0));
logVK:=IdHTTP1.Post('https://vkontakte.ru/login.php',PostVK);
LabelSid.Visible:=True;
LabelMid.Visible:=True;
LabelSecret.Visible:=True;
LabelMid.Caption:=Pars(logVK,'mid"',',',0);
LabelSid.Caption:=Pars(logVK,'sid":','",',0);
LabelSecret.Caption:=Pars(logVK,'secret":','",',0);
PostVK.Free;
except
on e:Exception do
PostVK.Free;
end;
end;
То есть все как и говорил, получаем сначала GET-ом, а затем 2 POST-запроса, чтобы наконец-то добраться до нашей сессии и пропарсив ее, мы получим нужные нам данные — это
- expire — Время истечения сессии в формате UNIX
- mid — ID пользователя в ВКонтакте
- secret — Специально сгенерированный секрет сессии
- sid — Идентификатор сессии
Эти данные в дальнейшем понадобятся нам для получение более нужной информации с ВК. Но это в следующей статье и готовится модуль, который одной функцией будет получать все эти данные для дальнейшей работы.