Здравствуйте!
— Не хотите ли войти
Оглавление

Работаем с Вконтакте API. Часть 2.

14 февраля 2011
Уровень сложности: для начинающих

Аннотация

ВКон­так­те — ре­сурс не тре­бу­ю­щий пред­став­ле­ния. Это и вто­рая по ве­ли­чине соц. сеть в ми­ре, и огром­ней­шее хра­ни­ли­ще раз­лич­но­го аудио-​ и ви­део­кон­тен­та.

Ин­те­рес раз­ра­бот­чи­ков к ВКон­так­те вполне объ­яс­ним — мил­ли­о­ны ак­тив­ных поль­зо­ва­те­лей каж­дый день, а та­к­же, до­воль­но вы­год­ная парт­нер­ская мо­дель раз­ме­ще­ния при­ло­же­ний.

Нема­ло­важ­ную роль в этом иг­ра­ет и до­воль­но удоб­ный 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) от объединения следующих строк:

  1. Параметр mid.
  2. Пары parameter_name=parameter_value, расположенные в порядке возрастания имени параметра (по алфавиту). При этом учитываются абсолютно все параметры, которые вы посылаете в запросе, за исключением параметра sid.
  3. Параметр secret.

Например, у нас есть параметры formatJSON, api_id1, methodgetFreeVotes, countOfVotes100500 и v3.0, а mid и secret равны соответственно 12381 и 96htw82. Записывать их надо в следующем порядке:

md5(12381api_id=1countOfVotes=100500format=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 у МойКруг?

А там-то зачем?

alex

Эмм… В во ВКонтакте зачем? Плюс вопрос был не «зачем», а «есть ли» :)

А можно увидеть исходные файлы? В тексте написано, что они должны быть, но их нет

SanLLIer

Напишите автору напрямую (это можно сделать со странички автора).

alex

Жаль, но автор не отвечает

SanLLIer

Может, занят. Подождем.

alex

Что вы, господа, я с вами! SanLLIer, и вам письмо отправил вчера.
Сегодня постараюсь выложить исходники — давно у своего компьютера рабочего не был просто.

VioLet

ОК.
у меня еще вопрос по поводу генерации sig: вы находите хэш от данной строки:«mid=1api_id=1count=1format=JSONmethod=wall.getv=3.0secret=8i3t6wh9j8»
Но на сайте API VK в примере нету первой фразы «mid=», а сразу идет значение «1». Да и когда еще на дельфях я авторизировался в ВК, я делал как сказано на сайте ВК. Кому верить? Ваш код не возвращает ошибку подписи?

SanLLIer

Спасибо, исправил.
К первой части статьи прикрепил исходные файлы для работы с API. Там пара С-sytle функций для авторизации и совершения запросов.

VioLet

Все! У меня опускаются руки. Никак не могу побороть Incorrect Sig! Уже и ваш код пробовал и по-своему писал — никак. И не вижу ошибки. Эх, а на делфи все с пол пинка завелось) Видимо прямоты моих рук только на делфи и хватает.

SanLLIer

Попробуйте попользоваться функцией, которую я предложил (ссылка в первой части). Я сам ей пользуюсь — работает прекрасно :)
Как-то вот постарался описать как пользоваться здесь -> devstudio.tumblr.com

VioLet

было бы неплохо еще про OAuth авторизацию написать :)

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

Gargo
© 2009-2012, ООО «Инру»
Вход
Имя пользователя:
Пароль:
Или…
Twi
Отмена
Войти
Восстановить забытый пароль…