Пишем плеер для vk.com. Работа с API [0]

-----Предисловие-----

В общем не так давно (тем 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 я завершаю. Во второй рассмотрим как сделать уже рабочее приложение, а что оно должно делать - можете писать в комментарии.
Теги:
авторизации, token, приложение, можно, работы, будет, нужно, сайте, сайта, oauth, сделать, будем, параметры, реестр, секретный, часть, приложения, Предисловие, Цитата, Теперь
Добавлено: 24 Февраля 2015 20:41:08 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...