Итак, давайте вспомним первый пост по 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

Метки: , , , , ,




К записи “Проект VK API в Delphi. Авторизация приложения в сети” оставлено комментариев: 37.

  1. Guest:

    Большое спасибо за разъяснение трёх этапов авторизации! Чрезвычайно помогло! :)

  2. 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 теми данными, которые предположительно нужно заполнять, но в ответ возвращается ошибка. Помогите пожалуйста.

      • Andrey:

        сейчас вконтакте вообще надо получить сначала токен, а уже потом только проходить авторизацию

  3. Isaev:

    Смысл регистрации приложения не очень ясен, если в любом случае нужна авторизация по логину и паролю…
    Можно просто взять api_id и auth_key от любого приложения и вызывать что угодно через него.

  4. Andrey53:

    Isaev мы авторитизируем еще с нужными правами нашего приложения

  5. khachatur:

    Защищенный ключ
    куда его вводить?

  6. Andrey53:

    to khachatur защищенный ключ вообще не надо трогать

  7. Andrey53:
    26.09.2010 в 10:53 дп

    Isaev мы авторитизируем еще с нужными правами нашего приложения

    не обнаружил где это все таки происходит

  8. SanLLIer:

    Проблема с правами. Я пытаюсь авторизироваться с максимальными правами, но приложение всегда получает 31. Даже если я буду авторизироваться с 1. Почему? Где косяк?

  9. Andrey53:

    to SanLLIer так тогда приложению вручную установить права по максимуму

  10. Роман:

    А почему нельзя авторизоваться гет запросом 1 ? Видел описание его на вашем сайте.

    Я про то, чтобы не использовать 3 поста запроса.

  11. РОМАН:

    Авторизация в программе перестала работать, стала выдавать исключение, помогите, что с ней случилось?

  12. РОМАН:

    А как расскажите? На самом контакте вроде нет изменений.

  13. РОМАН:

    Я впринципе со всем разобрался, только не могу понять, как спарсить access tooken код доступа, потому что вконтакте для десктоп приложения не написано нового способа, как авторизовываться, у них просто описание браузерного приложения.

    Не подскажите, как его спарсить?

  14. РОМАН:

    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.

  15. РОМАН:

    http://vkontakte.ru/developers.....0%EA%20API

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

  16. РОМАН:

    Andrey53, вы можете мне помочь?

    • Andrey53:

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

  17. РОМАН:

    Хорошо, я выше писал проблемку, жду тогда вашего ответа, если можно, скажите icq, а то боюсь, что мое сообщение в давней теме не найдете.

  18. РОМАН:

    Андрей написал вам в аську, вы сейчас не зайдете туда?

  19. Tonnyripper:

    добавьте пожалуйста рабочий исходник

    • Andrey53:

      Сейчас изменилась технология авторизации, я об этом напишу чуть позже, как будет время

  20. Tonnyripper:

    посмотрите пожалуйста очень прошу

  21. РОМАН:

    Андрей, никак не получается с вами по аське связаться, добавьте меня, пожалуйста 62один34пять1ноль4

  22. Tonnyripper:

    уже прошло время когда будет авторизация?=(

  23. Tonnyripper:

    вижу админы спят.вот держите люди

    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;

    • Andrey53:

      и что это Вы предлагаете за сторонний сервис? и админы не спят, у них есть и своя личная жизнь

  24. Tonnyripper:

    там непонятные иероглифы это написано неправильный

  25. Никита:

    Я понимаю что личная жизнь, но могли бы вы выложить рабочий пример? :(

Оставить комментарий

Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

*