думаю, не осталось людей, которые бы не знали про крупнейшую социальную сеть (да и вообще, топ-сайт) россии — vkontakte.ru. конечно было было бы странно, не предоставляй этот сайт api для взаимодействия с приложениями пользователей. естественно, api есть, и к слову говоря, он гораздо более вменяемый (и простой, да ещё и с русским описанием), нежели api одноклассников.
далее я приведу простейший класс для взаимодействия приложений (точнее, php скриптов) с сайтом vkontakte. ничего особо сложного нет, единственно что, потребуется добавить новое приложение, через которое и будет происходить взаимодействие с api vkontakte (как добавить приложение будет разобрано в следующей статье).
далее привожу код класса. работать с ним очень просто: достаточно один раз внести основные данные (id пользователя, id приложения, секрет), после чего вызвать метод get() с 2 параметрами: имя требуемого метода api vkontakte и массив параметров, вида array(‘name1’ => ‘value1’, ‘name2’ => ‘value2’). всё остальное будет сделано автоматически. для простоты также будет считаться, что результат возвращается в виде json-данных (для xml несложно внести переделку, но особых «фишек» это не даст). сам код (для последующего примера код нужно скопировать и сохранить в файл cvk_api.php):
<?php
/**
* Класс для работы с api vkontakte.ru
*/
class cvk_api {
/** Уникальный идентификатор пользователя (Номер страницы) */
const ID_MEMBER = '1';
/** Уникальный идентификатор приложения (ID приложения) */
const ID_API = '2';
/** «Секрет» приложения (Защищенный ключ) */
const SECRET = '3';
/** url для запросов к API */
const API_URL = 'http://api.vk.com/api.php';
public static
$error = '';
/**
* Основной метод для запроса данных
*
* @param $method string имя метода api
* @param $method array дополнительные параметры api
* @return array результат запроса или FALSE при ошибке
*/
static function get($method, $params = array()) {
if (empty($method)) {
self::$error = 'Не задан метод';
return FALSE;
} else {
// обнулить статус ошибки
self::$error = '';
}
$params['api_id'] = self::ID_API;
$params['method'] = $method;
// версия API
if (empty($params['v'])) $params['v'] = '2.0';
// результат возвращаться в формате JSON
$params['format'] = 'JSON';
// упорядочить ключи по алфавиту
ksort($params);
// сформировать список значений вида key=value
$datas = array();
$strdatas = self::ID_MEMBER;
foreach ($params as $k => $v) {
$strdatas .= $k . '=' . $v;
$datas[] = $k . '=' . urlencode($v);
}
// формирование подписи
$sig = md5($strdatas . self::SECRET);
// полная строка запроса к API
$url = self::API_URL . '?' . implode('&', $datas) . '&sig=' . $sig;
// получить результат
$result = file_get_contents($url);
if ($result) {
// удалить ненужные символы
$result = preg_replace('![\\x00-\\x1f]!', '', $result);
// преобразовать json-строку в массив
$arr = json_decode($result, 1);
// при наличии ошибка
if (isset($arr['error'])) { // записать её текст
self::$error = 'Ошибка: ' . $arr['error']['error_msg'] . ' (' . $arr['error']['error_code'] . ')';
$arr = FALSE;
}
} else {
$arr = FALSE;
self::$error = 'Нет доступа к адресу ' . self::API_URL;
}
return $arr;
}
}
класс действительно получился очень простой. для общения с сервером может использовать любой из следующих адресов:
запрос на любой из url приводит к идентичным действиям. основные и дополнительные параметры должны передаваться с помощью метода GET или POST. вопроса что выбрать не стоит в принципе: для большинства случае вполне подойдёт GET. если адрес с GET-запросом получается слишком длинным, переходим на POST. для простоты можно считать, что GET будет хватать всегда (и пожалуй более, чем в 99% случаев, так оно и есть). сформировав запрос, отсылаем его по одному из адресов выше и получаем результат в виде XML или JSON. JSON чуть проще, но требует версию PHP 5.2 и выше. именно начиная с этой версии в php появилась функция распаковки json-данных.
для формирования запроса необходимы следующие данные:
- api_id — идентификатор приложения. присваивается каждому приложения при его создании;
- method — название метода, который требуется выполнить. это может быть audio.search, wall.get, video.get и ещё куча методов с этой страницы;
- необязательный параметр format может иметь значение JSON или XML (по умолчанию).
- sig — уникальная подпись. используется для проверки того, что запрос валидный. вычисляет как хеш md5 от сцепки следующих параметров:
- viewer_id — идентификатор пользователя (того самого, которому принадлежит данное приложение);
- пар param_name=param_value — все передаваемые переменные, расположенные по имени в алфавитном порядке
- api_secret — секрет приложения, уникальная строка, которая будет осложнять подбор корректных запросов на конкретное приложения. объяснение может быть непонятно, но достаточно знать, что это произвольная строка, известная только приложению vkontakte и скрипту, формирующему запросы (при желании её можно изменить. если была скомпрометирована, то изменить требуется обязательно).
в зависимости от запрашиваемого метода, ответ будет отличаться (что логично: к примеру, у картинки не должно быть значения длительности). при возникновении ошибки в ответе содержится элемент error. на первых порах (если писать указанный выше класс с нуля, либо некорректно ввести требуемые данные) наиболее частой ошибкой будет неверная подпись (сигнатура). если не предусмотереть искусственную задержу, то уже на рабочем варианте, при достаточно большом числе пользователей, будет появляться ошибка о превышении допустимого числа запросов (разрешается делать не более 3 запросов в секунду с уникальным id пользователя и id приложения).
пример кода для работы с данным классом:
<?php
header('Content-Type:text/plain;charset=utf-8');
// подключение класса для работы с API VKontakte
require 'cvk_api.php';
// массив с параметрами для запроса методов API
$params = array();
$params['q'] = 'а+';
$params['count'] = 10;
$params['format'] = 'JSON';
$params['test_mode']= 1;
// вызов метода audio.search
$arr = cvk_api::get('audio.search', $params);
if (
FALSE === $arr) {
echo cvk_api::$error;
} else {
// вывод массива с полученными данными
print_r($arr);
}
днём интернета
шоколадкой для работы мозга
коробочкой ароматного чая для бодрости
продлением хостинга на +1 месяц
Отличный класс!!! Его чуть допилить и описать нативные методы для каждого метода вконтакте и будет вообще превосходно!!!
Аплодирую стоя
Любопытно. Пока что не было необходимости вникать в эти тонкости. А в каких случаях эта информация может понадобиться? У меня виджет ВК грузится быстро, без проблем. Или это из другой оперы?
Если виджетов хватает, то API не нужен.
Но у ВК много разных методов: vk.com/dev/methods
Так что можно и постить, и получать, и кучу всякого разного, чего в плагинах либо нет, либо чрезмерно наворочено
Здорово, спасибо: не знала. Надо подробнее изучить. В последнее время ВК здорово помогает раскручивать сайты.
К сожалению, у меня в этом опыта никакого.
Надеюсь, что кто-то снизойдёт до меня, и поделится информацией ;-)
Если у меня получится, я поделюсь! ;)
Очень надеюсь