Работаем с Вконтакте API. Часть 2.
Аннотация
ВКонтакте — ресурс не требующий представления. Это и вторая по величине соц. сеть в мире, и огромнейшее хранилище различного аудио- и видеоконтента.
Интерес разработчиков к ВКонтакте вполне объясним — миллионы активных пользователей каждый день, а также, довольно выгодная партнерская модель размещения приложений.
Немаловажную роль в этом играет и довольно удобный API. Вот о нем как раз и пойдет речь.
Напоминаю, что процесс авторизации Desktop-приложений мы рассмотрели в предыдущей части статьи.
Как и во многих веб-сервисах, взаимодействие приложений с API происходит путем создания HTTP-запроса (POST или GET, в данном случае — не принципиально) по адресу: http://api.vkontakte.ru/api.php
Параметры, передаваемые в запросе
| api_id | Идентификационный номер вашего приложения | v | Версия API (на данный момент используется 3.0) | format | Формат возвращяемых данных (XML или JSON). По умолчанию — XML | sid | Идентификатор сессии. | method | Название метода из списка методов API Вконтакте + параметры самого метода | sig | Подпись запроса |
Как создать подпись запроса?
Все просто. sig — это хэш-сумма (алгоритм — md5) от объединения следующих строк:
- Параметр mid.
- Пары parameter_name=parameter_value, расположенные в порядке возрастания имени параметра (по алфавиту). При этом учитываются абсолютно все параметры, которые вы посылаете в запросе, за исключением параметра sid.
- Параметр secret.
Например, у нас есть параметры format = JSON, api_id = 1, method = getFreeVotes, countOfVotes = 100500 и v = 3.0, а mid и secret равны соответственно 12381 и 96htw82. Записывать их надо в следующем порядке:
md5(12381api_id=1countOfVotes=10
0500format=JSONmethod
=getFreeVotesv=3.096htw82).
Обратите внимание, что параметры при этом никакими символами (запятые, пробелы, «&» и пр.) друг от друга не отделяются.
Пример запроса
NSMutableURLRequest *requestToAPI =
[[NSMutableURLRequest alloc]
initWithURL: [NSURL URLWithString:@"http://api.vkontakte.ru/api.php"]];
NSString *sig =
[self md5HexDigest:@"1api_id=1count=1format="
@"JSONmethod=wall.getv=3.08i3t6wh9j8"];
// здесь sid - полученный при авторизации параметр сессии
NSString *bodyOfRequest =
[NSString stringWithFormat:
@"api_id=1&v=3.0&format=JSON&sid=%@&method=wall.get&count=1&sig=%@",sid,sig];
[requestToAPI setHTTPBody:
[bodyOfRequest dataUsingEncoding:NSUTF8StringEncoding]];
//получаем ответ от сервера
NSString *answerFromServer =
[NSString stringWithData:[NSURLConnection sendSynchronousRequest:requestToAPI
returningResponse:nil
error:nil]
encoding:NSUTF8StringEncoding];
Метод md5HexDigest — возврящает хеш строки. Реализация метода — в прилагаемом исходном файле.
Формат получаемых значений
Получаемые значения будут (в зависимости от того, что мы указали в парамере format) либо в XML, либо в JSON.
Для работы с первым можно использовать NSXMLParser или (несколько удобнее, но это на мой взгляд) TBXML. Для второго есть, например, хорошая библиотека JSONKit.
Что еще?
Хочу порекомендовать вам один замечательный во всех смыслах метод API — execute. Вот его краткое описание:
Универсальный метод, который позволяет запускать последовательность других методов, сохраняя и фильтруя промежуточные результаты.
Поддерживаются арифметические операции, массивы, списки, parseInt, parseDouble, конкатенация (+), фильтр массива по параметру (@.), создание массивов и списков ([X,Y]), вызовы методов API. В данный момент не поддерживаются функции, логические операции, циклыи условия.
То есть в один метод (а соответственно, в один запрос) мы можем включить целый ряд других запросов (причем, в качестве, например, параметров второго запроса, могут выступать значения, полученные в результате выполнения первого и т.п.). Это довольно сильно упрощает (и ускоряет) процесс написания программ.
Если говорить про соц.сети, хотелось бы знать, а есть ли API у МойКруг?
А там-то зачем?
Эмм… В во ВКонтакте зачем? Плюс вопрос был не «зачем», а «есть ли» :)
clubs.ya.ru/moikrug/replies.xml?item_no=1946
А можно увидеть исходные файлы? В тексте написано, что они должны быть, но их нет
Напишите автору напрямую (это можно сделать со странички автора).
Жаль, но автор не отвечает
Может, занят. Подождем.
Что вы, господа, я с вами! SanLLIer, и вам письмо отправил вчера.
Сегодня постараюсь выложить исходники — давно у своего компьютера рабочего не был просто.
ОК.
nt=1format=JSONmethod
=wall.getv=3.0secret=8i3t6wh9j8»
у меня еще вопрос по поводу генерации sig: вы находите хэш от данной строки:«mid=1api_id=1cou
Но на сайте API VK в примере нету первой фразы «mid=», а сразу идет значение «1». Да и когда еще на дельфях я авторизировался в ВК, я делал как сказано на сайте ВК. Кому верить? Ваш код не возвращает ошибку подписи?
Спасибо, исправил.
К первой части статьи прикрепил исходные файлы для работы с API. Там пара С-sytle функций для авторизации и совершения запросов.
Все! У меня опускаются руки. Никак не могу побороть Incorrect Sig! Уже и ваш код пробовал и по-своему писал — никак. И не вижу ошибки. Эх, а на делфи все с пол пинка завелось) Видимо прямоты моих рук только на делфи и хватает.
Попробуйте попользоваться функцией, которую я предложил (ссылка в первой части). Я сам ей пользуюсь — работает прекрасно :)
Как-то вот постарался описать как пользоваться здесь -> devstudio.tumblr.com
было бы неплохо еще про OAuth авторизацию написать :)
было бы неплохо описать функции из исходников полностью.
либо выложить в исходниках полностью рабочий пример, а то вы выложили функции для работы с вконтакте и какой-то json, причем оба ваших файла используют какой-то третий файл, которого там нет