Пятница , 29 Март 2024
ДомойПубликациикласс для работы vkontakte api, php

класс для работы vkontakte api, php

vkontakte api php

думаю, не осталось людей, которые бы не знали про крупнейшую социальную сеть (да и вообще, топ-сайт) россии — 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($result1);
            
            
// при наличии ошибка
            
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);
}


Рейтинг: 0

Автор публикации

2 070
не в сети 11 месяцев

x64 (aka andi)

Комментарии: 2893Публикации: 405Регистрация: 02-04-2009
Так себеНеплохоХорошоЗамечательноСупер! (Оценок пока нет)
Загрузка...

8 комментариев

  1. Отличный класс!!! Его чуть допилить и описать нативные методы для каждого метода вконтакте и будет вообще превосходно!!!

    Рейтинг: 0
  2. Аплодирую стоя

    Рейтинг: 0
  3. Надежда Давыдова

    Любопытно. Пока что не было необходимости вникать в эти тонкости. А в каких случаях эта информация может понадобиться? У меня виджет ВК грузится быстро, без проблем. Или это из другой оперы?

    Рейтинг: 0

Оставить комментарий

Политика конфиденциальности

Наш сайт использует файлы cookies, чтобы улучшить работу и повысить эффективность сайта. Продолжая работу с сайтом, вы соглашаетесь с использованием нами cookies и политикой конфиденциальности.

Принять