-----Предисловие-----
В общем не так давно (тем 3-5) назад поднимался вопрос авторизации на сайте vk.com. Я выступал с тем, что авторизироваться нужно по-правилам, что бы получить token (секретный ключ, выдающийся приложению для работы с API сайта vk), а мой аппонент (vershik) говорил, что можно залогинниться и простым POST-запросом. В принципе тут как посмотреть и какие цели преследовать. Если брутить аккаунты, то можно и post'ы слать, а если делать приложение для работы с сайтом - то нужно всё сделать по уму. Чем мы сегодня и займёмся.
На vb.net, на c#, да и на всём, на чём только что-то пишется, есть статьи по работе с vk-api. Delphi далеко не уходил, и статей по нему тоже в избытке. Разница лишь в том, что все они (или почти все), написаны в 2010-2011 годах, и многое в API vk.com с тех пор изменилось: начиная от авторизации, заканчивая простыми API'шками, показывающими информацию о пользователе.
-----/Предисловие-----
Сегодня (1-ая часть как никак), рассмотрим процесс авторизации на сайте, затронем многие API-функции и сделаем по-итогу небольшое приложение для сайта.
Сначала нужно проделать то, что собственно закрепит за нашим будущим проектом статус приложения - создать его на сайте. Это нужно для привязки вашего приложения к клиентской платформе. А связкой будет служить id приложения и секретный ключ, выдаваемый разработчику при создании. Переходим на страницу http://vk.com/dev, нажимаем создать приложение:
Далее называем своё детище, и указываем его тип: IFrame/Flash приложение. После чего можно указать описание, поставить галочку напротив пункта "Приложение", прочитать правила размещения приложений, перейти к загрузке:
После чего на телефон, привязанный к аккаунту, будет отправлен код подтверждения. Вводим его и нажимаем "Отправить код". Всё, часть работы уже сделана, приложение создано. Осталось всего ничего, создать его клиентскую платформу =).
Заходим в Delphi, создаём проект. Я покажу лишь авторизацию и принцип работы с API.
Для авторизации можно сделать отдельную форму, так как с ней нам придётся подать пользовтаелю WebBrowser. Зачем? Потому что при авторизации пользователь должен подтвердить , что он согласен с тем, что приложение будет иметь доступ к его аккаунту (не, ну а что? мы делаем обычную программу=) ).
В общем создали форму, кинули туда WebBrowser, idhttp, IdSSLIOHandlerSocketOpenSSL1, Button. У меня что-то вроде этого:
Соответственно, при нажатии на кнопку с названием "Auth" (ваш КЭП - это название метода), будет производиться авторизация. Теперь по коду и по принципу действия. У меня всё свелось к следующему:
Юзера кидает на страницу подстверждения, он там вводит свои данные, затем приложение перекидывает его на ссылку, в которой будет секретный ключ. Этот ключ мы будем использовать для дальнейшей работы с API.
В глобальных переменных у меня лежат:
var
token: String; // Сам ключ
data: TStringList; //Переменная типа TStringList, для отчётов
http: TidHTTP; //переменная типа TIdHTTP, что бы не прописывать имя компонента
И так же имеются 2 публичных функции:
function TForm1.virvytoken(s: string): string;
begin
delete(s,pos('&expires_in',s), length(s));
Result:= copy(s, pos('access_token=',s)+13, length(s));
end;
и
procedure TForm1.krinthereg(s: string);
var reg: TRegistry;
begin
reg:= TRegistry.Create;
reg.RootKey:= HKEY_CURRENT_USER;
reg.LazyWrite:= true;
try
reg.OpenKey('Software\VKbot', true); //путь до ключа
reg.WriteString('key',s);
reg.CloseKey;
except
MessageBox(handle,PChar('Не удалось записать ключ в реестр'), PChar('Error'), MB_ICONSTOP);
end;
end;
Первая, как понятно из названия =), парсит token из ссылки, куда нас кинул браузер после авторизации.
Вторая же записывает ключ в реестр. Соответственно потом мы будем его оттуда извлекать и работать с ним дальше.
Теперь возможно будут возгласы, что у ключа есть время действия. Это так, но если передать в качестве параметра "offline", то ключ будет без времени ограничения.
В функциях ничего особенного нет, а всё что может вызвать затруднения - выделено комментариями.
Мы пришли к самому главному - отправки запроса с помощью браузера. Делается это просто:
form1.WebBrowser1.Navigate('http://api.vkontakte.ru/oauth/authorize?client_id=id_юзера&scope=friends,video,offline,notify,photos&redirect_uri=http://oauth.vk.com/blank.html&display=page&response_type=token');
Метод Navigate перебрасывает нас на указанную страницу.
http://api.vkontakte.ru - тут, думаю, понятно.
oauth - протокол, по которому производится авторизация на сайте. Если кому-то это интересно, то в тут о нём подробно расписано.
authorize - метод, сообщающий vk, что мы пытаемся авторизироваться
client_id - идентификатор Вашего приложения
scope - Права доступа. Передаём тут те параметры, с которыми будем работать. Все права тут.
redirect_uri=http://oauth.vk.com/blank.html - редирект, куда мы будем перенаправлены
display - параметр, отвечающий за вид окна авторизации (page, popup, touch и wap)
response_type=token - мы требуем токен
redirect_uri=https://oauth.vk.com/blank.html
Это обязательное условие для работы с методами, в описании которых указано, что они доступны только для Desktop-приложений.
И ещё одна цитата:
После успешной авторизации приложения браузер пользователя будет перенаправлен по адресу REDIRECT_URI, указанному при открытии диалога авторизации. При этом ключ доступа к API access_token и другие параметры будут переданы в URL-фрагменте ссылки:
http://REDIRECT_URI#access_token= 533bacf01e11f55b536a565b57531ad114461ae8736d6506a3&expires_in=86400&user_id=8492
Вместе с ключом access_token также будет указано время его жизни expires_in, заданное в секундах.
Идём дальше.
На событие onclick кнопки пишем следующее:
token:= virvytoken(form1.WebBrowser1.LocationURL); //Получение token'а
krinthereg(token); //запись token'а в реестр
На этом процесс авторизации завершён. Токен скопирован в реестр (про безопасность и какое-либо шифрование в первой части я умышленно забыл).
Пробуем авторизироваться и получаем по-итогу следующий текст:
Пожалуйста, не копируйте данные из адресной строки для сторонних сайтов. Таким образом Вы можете потерять доступ к Вашему аккаунту.
Так. Теперь разбираемся с API vk.com. Первым делом, как и планировалось - вывод элементов профиля. Сделать это не сложно, можно даже одним API-методом - users.get. Подробней про него можно прочитать тут -
http://vk.com/dev/users.get
Скажу, что у него 2 обязательных параметра - user_ids (идентификатор пользователя) и fields(то, что хотим от него узнать). В качестве fields можно запросить имя, пол, фотографию и так далее.
data.Text:= http.Get('https://api.vk.com/method/users.get?user_ids=ваш_id&fields=sex,city,country,photo_50,photo_100,online');
Рассмотрим такой GET запрос. Параметры: SEX - пол, city - город, country - страна, photo_50 - фотография со сторонами 50x50 px, online - статус, в сети ли юзер.
Про остальные параметры читаем там же, где и про функцию. В data нам вернётся следующее:
{"response":[{"uid":11111111,"first_name":"Иван","last_name":"Иванов","sex":2,"bdate":"01.01","city":"100","country":"1","photo_50":"http:\/\/vk.com\/images\/camera_c.gif","photo_100":"http:\/\/vk.com\/images\/camera_b.gif","online":1}]}
Ну а что вы хотели? Тут надо парсить .
Некоторые параметры передаются ключами. Например "sex":2 - значит, что пол мужской. Если бы было "sex":1 - был бы женский.
Примечание: это открытый метод, и token'а, который мы спарсили выше он не требует. Если метод требует токен - то просто добавляем к запросу данный параметр.
На этом первую часть работы с API сайта vk.com я завершаю. Во второй рассмотрим как сделать уже рабочее приложение, а что оно должно делать - можете писать в комментарии.