Delphi работа с API Вконтакте (vkontakte) часть 2

Опубиковано: 15.07.2010 г., автор: , просмотров: 55046

Delphi работа с API Вконтакте (vkontakte) часть 2

Мы продолжаем заниматься написанием Delphi приложения для работы с API vkontakte. В прошлый раз мы остановились на том, что начали создавать запрос для вывода расширенной информации о пользователе. Запрос получился следующим:

http://api.vkontakte.ru/api.php?api_id=1905253&format=XML&method=getUserInfoEx

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

Итак, начнем с первого параметра - sig, необходим он для создания подписи запроса. Вычисляется он следующим образом: берем параметр mid или id пользователя вконтакте. Затем берем все необходимые параметры и их значения, которые хотим передавать, и выставляем их в алфавитном порядке. В конец добавляется параметр secret - или секрет сессии, получили мы его с вами ранее, когда проходили процедуру авторизации. После чего полученную строку кодируем в MD5

Уверен, что многие из вас мало что поняли из выше написанного), поэтому попытаюсь всё разжувать и положить в рот...

В нашем случае sig или подпись запроса будет выглядеть примерно так:

IDпользователяВконтактеapi_id=IDПриложенияformat=XMLmethod=getUserInfoExuids=IDпользователяВконтактеv=3.0СекретСессии

Разберем все на пальцах:

  • Вместо IDпользователяВконтакте мы подставим свой ID (узнать его можно посетив страницу http://vkontakte.ru/settings.php , в разделе Адрес вашей страницы => Ваш номер: будет указан этот самый ID, так же его можно взять из параметра mid)
  • api_id - вместо IDПриложения мы подставим ID нашего приложения, который получили ранее при регистрации. В моем случае это 1905253
  • format - мы указываем формат получаемых данных JSON или XML как вы видете я поставил здесь XML
  • metod - какой API метод мы будем использовать, в нашем случае это getUserInfoEx
  • uids - сюда опять подставляем IDпользователяВконтакте.
  • v=3.0 означает, что версия api равна 3.0
  • Завершает все секрет сессии или secret.

Значение всех переменных нам известны, кроме последней - Секрет Сессии.

Как вы помните, после успешной авторизации нас переадресовывают на http://vkontakte.ru/api/login_success.html Хотя полностью адрес выглядит примерно так:

http://vkontakte.ru/api/login_success.html#session=%7B%22mid%22%3A63790444%2C%22
sid%22%3A%22756d0c7c91db66f66f82dba3cb5b67be6629d2295f878d9a70210836%22%2C%22
secret%22%3A%224c63d7e10d%22%2C%22expire%22%3A1279018989%2C%22
sig%22%3A%228a5ea3f9ee8c57781782d402d6eea5ed%22%7D

Сейчас из этой запутанной строчки нам нужно достать значение переменной secret в моем случае оно равно 4c63d7e10d, но учтите, что при каждой новой авторизации значение будет изменятся и у вас оно может быть совсем другим!

Итак, кидаем на форму еще один компонент Button (у меня он будет называться button2) и компонент Label оба с закладки Standard

Переходим в код и в самом начале после ключевого слова var cоздаем 3 глобальные переменные stroka2,stroka3, sig типа string;

var
stroka2,stroka3, sig: string;

После чего создаем обработчик событий OnClick на новой кнопке. Перед ключевым словом begin также создадим 2 переменные типа integer и одну типа string

var
start2,start3:integer;
URL:string;

Далее, между begin end пишем вот такой код:

URL:=WebBrowser1.LocationURL;
start3:=Pos('secret%22%3A%22',URL);
stroka3:=Copy(URL, start3+15, 900);
Delete(stroka3, Pos('%22%2C%22expire',stroka3) , 5900);
Label1.caption:=stroka3;

Здесь мы в переменную URL заносим, то что находится в настоящей момент в адресной строке компонента WebBrowser1, т.е. вот эту строчку:

http://vkontakte.ru/api/login_success.html#session=%7B%22mid%22%3A63790444%2C%22
sid%22%3A%22756d0c7c91db66f66f82dba3cb5b67be6629d2295f878d9a70210836%22%2C%22
secret%22%3A%224c63d7e10d%22%2C%22expire%22%3A1279018989%2C%22
sig%22%3A%228a5ea3f9ee8c57781782d402d6eea5ed%22%7D

Затем с помощью, стандартных функций работы со строкой Pos, Copy, Delete мы достаем из строки значение переменной secret, это значение записываем в переменную Stroka3 и выводим её в компонент Label1. В принципе все просто, главное тут не запутаться.

Все, с секретом сессии мы разобрались, попробуем подставить все параметры:

Было:
IDпользователяВконтактеapi_id=IDПриложенияformat=XMLmethod=getUserInfoExuids=IDпользователяВконтактеv=3.0СекретСессии

Стало:
63790444api_id=1905253format=XMLmethod=getUserInfoExuids=63790444v=3.0stroka3

Тут вместо 63790444 подставляете ваш ID вконтакте, вместо 1905253 id вашего приложения.
Но, это еще не всё, полученную строку мы должны кодировать в MD5

Для этого после ключевого слова uses в список добавляем новый модуль, который называется IdHashMessageDigest
Далее создадим функцию для кодирования в md5. В коде почти в самом верху находим ключевое слово private после которого пишем:

function md5(s: string): string;

Затем нажимаем комбинацию клавиш Ctrl+Shift+C В результате чего Delphi создает заготовочку для нашей бедующей функции, которая как вы уже наверно заметили называется MD5. Итак сейчас между begin end в нашей заготовочке мы напишем код, который будет кодировать нашу строку в md5:

Result := '';
with TIdHashMessageDigest5.Create do
try
Result := AnsiLowerCase(AsHex(HashValue(s)));
finally
Free;
end;

Использовать эту функцию мы будем чуть позже, а сейчас разберемся с параметром sid - который хранит в себе идентификатор сессии. После успешной авторизации, этот параметр так же будет браться из адресной строки компонента WebBrowser.

Итак, вновь переходим в обработчик событий OnClick на второй кнопке, напомню вам что тут мы уже скопировали адресную строку компонента webbrowser в переменную URL, когда извлекали из неё параметр secret (секрет сессии)

Теперь таким же способом достанем от туда параметр sid, для этого в конце дописываем такой код:

start2:=Pos('sid%22%3A%22',URL);
stroka2:=Copy(URL, start2+12, 500);
Delete(stroka2, Pos('%22%2C%22secret',stroka2) , 5900);

Тут опять, все тоже самое.... С помощью, стандартных функций работы со строкой Pos, Copy, Delete мы достаем из неё значение переменной sid, это значение записываем в переменную Stroka2

Мозги еще не закипели ?! Ладно осталось совсем чуть-чуть.

Кидаем на форму еще один компонент Button с закладки Standard и сразу же создаем на нем обработчик событий OnClick, в котором прописываем следующий код:

sig:='63790444api_id=1905253format=XMLmethod=getUserInfoExuids=63790444v=3.0'+stroka3; //подпись запроса + секрет сессии
sig:=md5(sig); // кодируем подпись запроса, при помощи ранее созданной функции Md5
WebBrowser1.Navigate('http://api.vkontakte.ru/api.php?api_id=1905253&format=XML&method=getUserInfoEx&sid='+stroka2+
'&sig='+sig+'&uids=63790444&v=3.0'
);

* Везде естественно вместо 63790444 подставляете ваш ID вконтакте, вместо 1905253 id вашего приложения.

В последней строке мы полностью сформированный запрос и посылаем его по адресу по адресу: http://api.vkontakte.ru/api.php

А в начале статьи этот запрос выглядел так:

'http://api.vkontakte.ru/api.php?api_id=1905253&format=XML&method=getUserInfoEx'

Затем мы добавили к нему параметр sid и его значение, которое хранится в переменной stroka2. В итоге получилось это:

'http://api.vkontakte.ru/api.php?api_id=1905253&format=XML&method=getUserInfoEx&sid='+stroka2+'

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

'http://api.vkontakte.ru/api.php?api_id=1905253&format=XML&method=getUserInfoEx&sid='+stroka2+'&sig='+sig+'

Ну и наконец добавили параметры uids который равен id пользователя вконтакте и параметр v который равен версии API вконтакте, получилось:

'http://api.vkontakte.ru/api.php?api_id=1905253&format=XML&method=getUserInfoEx&sid='+stroka2+'&
sig='+sig+'&uids=63790444&v=3.0'

Вот в принципе и все запускаем проект, нажимаем поочередно, с начала первую кнопку, после того как в компоненте webbrowser появилась надпись login succes нажимаем вторую, а затем третью кнопку. В результате чего в компонент WebBrowser вывелся результат нашего запроса в формате XML. Вам остается лишь только достать от туда необходимые параметры и использовать их в своей программе.

Еще раз повторюсь, что данная статья описывает саму суть работы с API вконтакте и не является конечным решением поставленной задачи. Поняв основные моменты, вы всегда сможете самостоятельно доработать имеющийся исходник. На этом у меня все, удачного вам кодинга друзья !)

Скачать исходник Delphi Api Vkontakte

Delphi работа с API Вконтакте (vkontakte) часть 21

 

P.S. Хотите вперед всех остальных посетителей сайта получать свежие Видео уроки, Аудио подкасты, статьи по Delphi.
Участвовать в конкурсах и постепенно вливаться в нашу команду ?!
Тогда прямо сейчас подписывайтесь на бесплатную мультимедийную рассылку сайта delphiexpert.ru
Нас уже больше чем 5500 человек ! Подписаться

Ну, а если вы ищете где купить Explay Infinity , тогда обращайтесь в этот интернет магазин.

Похожие материалы

Последние из рубрики

Teratox 18 Jan 2013 в 00:00 #
Сколько перерыл в интернете исходников для контакта, ни один не работает, все хлам!
А ругается компилятор на AsHEX потому что, тот кто писал код не предупреждал о том что может у других какой-то другой компилятор.
Выбросьте эту функцию к чертовой матери она не рабочая, вставить сюда не получается комментарии не пускают, но погуглите, ответ есть.
max 31 Jul 2012 в 00:00 #
извиняюсь...так как я начинающий программер...хотелось бы пояснить для чего этот коддинг ВК?)
Иван 10 Jan 2012 в 00:00 #
1.Post запрос по адресу :
Иван 10 Jan 2012 в 00:00 #
Старый метод работы с API
Не работает он у меня
Алексей 08 Dec 2011 в 00:00 #
А можно такоеже толь для МойМир Api

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