Пятница , 20 Январь 2017
Конкурс «Книга за вопрос»
ДомойПубликациикласс для работы 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);
}


Поддержать проект

WebMoney

Яндекс.Деньги


Рейтинг: 0

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

1 207
не в сети 1 день

x64 (aka andi)

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

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

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

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

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

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

    Рейтинг: 0

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

Ваш email не будет опубликован.Необходимы поля отмечены *

*

Добавьте изображение (jpg/gif/png)

Авторизация

Регистрация

Пароль не введен

Генерация пароля