Итак, давайте вспомним первый пост по VK API в Delphi, в котором я описал как зарегистрировать свое приложение в сети, чтобы в дальнейшем его можно было использовать. Теперь нам необходимо авторизировать приложение в сети и получить секретный код и значение sid, которые в дальнейшем нам пригодятся для того, чтобы получать список друзей пользователя, список фотографий, альбомов и так далее. Что нам потребуется на данный момент
- Tedit — 2 шт
- TButton
- TLabel — 3 шт
- TidHTTP
- ну и я поставил еще TPageControl
Для того, чтобы получить данные сессии для нашего приложения, нам необходимо отправить запрос на
http://vkontakte.ru/login.php.
Для начала мы получим запрос GET-ом для того, чтобы получить необходимые данные для отправки запроса POST на страницу vkontakte.ru/login.php. Для того, чтобы получить запрос GET нам необходимо получить следующую страницу ввида
http://vkontakte.ru/login.php?app=1918788&layout=popup&type=browser&settings=130
То есть мы должны заполнить данными наш URL для дальнейшего получения нужной нам информации. Где
- app — идентификатор приложения, который вы получили при регистрации, мой идентификатор равен — 1918788
- layout — указывает тип дизайна, получаемой страницы
- type — указывает каким образом передается значение сессии
- settings — битовая маска доступа настроек приложения к вашей странице.
Более подробно про авторизацию приложения Вы сможете прочитать на сайте ВК. Далее, когда мы получили нужный нам параметр с этой страницу, а получали мы значение app_hash путем парсинга страницы полученной, нам необходимо отправить POST запрос на страницу http://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('http://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('http://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('http://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 — Идентификатор сессии
Эти данные в дальнейшем понадобятся нам для получение более нужной информации с ВК. Но это в следующей статье и готовится модуль, который одной функцией будет получать все эти данные для дальнейшей работы.
Сейчас без сайта очень трудно представить крупную компанию, да и вообще продвинутого Интернет-пользователя. Для того, чтобы Ваш сайт постоянно и стабильно работал — Вам необходим надежный хостинг. Без хостинга никуда, так как это то место, где будет размещаться Ваш сайт. Хостинг Украины предоставляет Вам такую надежность, а самое главное качество и поддержка пользователей профессиональными специалистами. |
Так как проект с открытым исходным кодом, то исходники качаем тут
Автор статьи - Andrey53
Большое спасибо за разъяснение трёх этапов авторизации! Чрезвычайно помогло!
Не за что, обращайтесь
Андрей, сейчас немного изменилась форма авторизации и код стал не актуальным. Помогите пожалуйста расшифровать вот этот кусок кода, весь день бьюсь и никак не разберусь
Вот эта часть проходит отлично, возвращает страницу авторизации для приложения.
logVK:=IdHTTP1.Get('http://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('http://login.vk.com/',PostVK);
А вот этот кусок
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('http://vkontakte.ru/login.php',PostVK);
Не проходит, судя по форме которая приходит — там совсем другие поля надо заполнять, а также повторно логин и пароль, я пытался заполнять PostVK теми данными, которые предположительно нужно заполнять, но в ответ возвращается ошибка. Помогите пожалуйста.
сейчас вконтакте вообще надо получить сначала токен, а уже потом только проходить авторизацию
Смысл регистрации приложения не очень ясен, если в любом случае нужна авторизация по логину и паролю…
Можно просто взять api_id и auth_key от любого приложения и вызывать что угодно через него.
Isaev мы авторитизируем еще с нужными правами нашего приложения
Защищенный ключ
куда его вводить?
to khachatur защищенный ключ вообще не надо трогать
ок
Andrey53:
26.09.2010 в 10:53 дп
Isaev мы авторитизируем еще с нужными правами нашего приложения
не обнаружил где это все таки происходит
Проблема с правами. Я пытаюсь авторизироваться с максимальными правами, но приложение всегда получает 31. Даже если я буду авторизироваться с 1. Почему? Где косяк?
to SanLLIer так тогда приложению вручную установить права по максимуму
А почему нельзя авторизоваться гет запросом 1 ? Видел описание его на вашем сайте.
Я про то, чтобы не использовать 3 поста запроса.
Авторизация в программе перестала работать, стала выдавать исключение, помогите, что с ней случилось?
видимо теперь необходимо авторитизироваться по новому протоколу
А как расскажите? На самом контакте вроде нет изменений.
через OAuth, чуть позже
Я впринципе со всем разобрался, только не могу понять, как спарсить access tooken код доступа, потому что вконтакте для десктоп приложения не написано нового способа, как авторизовываться, у них просто описание браузерного приложения.
Не подскажите, как его спарсить?
с чем именно разобрался, покажи код, я тебе помогу, если нет, то используй WebBrowser
http://vkontakte.ru/developers.....5%ED%E8%E9
Я прочитал эту инструкцию, у них везде по новому протоку надо использовать access tooken(ключ доступа), как мне его спарсить программой, я не знаю как по новому протоколу, вы мне только это подскажите, пожалуйста.
procedure TForm1.Button1Click(Sender: TObject);
begin
ShellExecute(0,’Open’,’http://api.vkontakte.ru/oauth/authorize?client_id=1918788&scope=15657&redirect_uri=http://api.vkontakte.ru/blank.html&display=popup&response_type=token’,nil,»,SW_SHOWNORMAL);
end;
Вот таким кодом обхожусь пока что, там ручками копирую этот код и вставляю в программу, а как заставить программу его парсить не пойму, помогите.
Да и с webbrowser не работал никогда, мне нравится больше idhttp.
http://vkontakte.ru/developers.....0%EA%20API
Вот тут я разобрался, как делать запросы апи методов, где везде требуется Access tooken, который у меня не получается спарсить.
Andrey53, вы можете мне помочь?
я обязательно помогу, но я тоже живой человек, у которого должно быть время и для личных целей
Хорошо, я выше писал проблемку, жду тогда вашего ответа, если можно, скажите icq, а то боюсь, что мое сообщение в давней теме не найдете.
45один07328четыре
Андрей написал вам в аську, вы сейчас не зайдете туда?
сегодня вечером постараюсь зайти
добавьте пожалуйста рабочий исходник
Сейчас изменилась технология авторизации, я об этом напишу чуть позже, как будет время
посмотрите пожалуйста очень прошу
Андрей, никак не получается с вами по аське связаться, добавьте меня, пожалуйста 62один34пять1ноль4
уже прошло время когда будет авторизация?=(
вижу админы спят.вот держите люди
procedure TForm1.Button1Click(Sender: TObject);
var
p:Tstrings;
i:string;
begin
p:=Tstringlist.Create;
p.Add(‘method=getInfo’);
p.Add(‘key=’+edit1.Text);
p.Add(‘user=’+edit2.Text);
i:=IdHTTP1.Post(‘http://109.234.156.251/prison/universal.php?getInfo’, p);
if Pos(‘0′,i) 0 then
ShowMessage(‘Íåïðàâèëüíûé auth_key’)
else
end;
и что это Вы предлагаете за сторонний сервис? и админы не спят, у них есть и своя личная жизнь
это не сторонний сервис это для входа через аутхкей код в приложение тюряга
там непонятные иероглифы это написано неправильный
Я понимаю что личная жизнь, но могли бы вы выложить рабочий пример?