Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Верный подход к применению API Вконтакте

Anna | 29.05.2014 | нет комментариев
Привет, Прогр!

В своё время, бороздя просторы интернета на предмет разумного применения API Вконтакте, я не сумел обнаружить чего-то вразумительного, исключительные библиотеки, которые были обнаружены мною были реализованы без применения каких-либо общепризнанных практик и без прекрасного кода. Я решил поправить, сложившееся неувязка и написал свою библиотеку для работы с API Вконтакте.
Животрепещущие подробности и подходы под програкатом.

Так уж сложилось, что API Вк, реализован достаточно отлично, за исключением некоторых не логичных моментов, о которых я упомяну позже. Но речь, сегодня не о качестве, а о определенном использовании.

Сразу нужно сделать оговорку, помимо изложения, я буду приводить куски рабочего кода к моей библиотеке, ссылку на которую я приведу в конце статьи. Библиотека работает на последней стабильной версии 5.5, если вырезать генераторы из пакетного приобретения, то должно трудиться на 5.4.

Начнём с того, как мы можем пройти авторизацию.
С точки зрения приобретения ключа доступа(Access Token), мы можем сделать это тремя методами:

  • Серверная авторизация(т.н. авторизация сайтов)
  • Клиентская авторизация(Standalone)
  • Авторизация сервера приложения

Самое увлекательное для разработчика, представляют первые два. 1-й, разрешает авторизовать пользователя на сайте и получить его ключ доступа, 2-й дозволит авторизовать ваше приложение, скажем Dekstop либо Mobile. Забегая, вперёд, 2-й вариант предоставляет нам большие вероятности, а 1-й, лишь малую их часть.

Алгорифм приобретения в первом случае сводится к выполнению следующих пунктов:

  • Мы выводим ссылку для авторизации пользователя, которую форматируем в соответствии с документацией
  • Пользователь переходит по ней и авторизуется
  • Пользователя перенаправляют на REDIRECT_URI нашего приложения с GET параметром code
  • Наше приложение должно исполнить запрос к API содержащий code, Дабы получить ключ доступа пользователя
  • API отвечает, либо с объектом, содержащим ключ доступа, либо оплошностью.

Пример кода, с поддержкой которого дозволено провернуть это не хитроумное дело.

$auth = getjumpVkAuth::getInstance();
$auth->setAppId('3470411')->setScope('SCOPE')->setSecret('SECRET CODE')->setRedirectUri('http://localhost/test.php');
$token=$auth->startCallback();
printf("<a href='%s' target='_top'>LINK</a>", $auth->getUrl());

Предполагается, что наш домен это localhost, а нынешний файл test.php. Если, всё прошло отлично, то в нашей переменной $token, будет содержаться ключ доступа пользователя, тот, что прошёл авторизацию.

С момента, когда мы имеем ключ доступа, мы можем исполнять запросы к API. Всеобщая логика запросов примитивна, вы передаёте намеренно сформированный запрос на URL API. Запрос должен содержать, наименование способа и доводы.

https://api.vk.com/method/METHOD_NAME?PARAMETERS&access_token=ACCESS_TOKEN

Список способов, это одна из богатых пророческой API. В нём вы можете встретить способы, которые не требуют ключ доступа для своей работы, следственно вызывать их вы можете, не получая его.

При применении библиотеки нам нужно сделать базовый объект, скажем так:

$vk = getjumpVkCore::getInstance()->apiVersion('5.5')->setToken($token);

Пара примеров запросов с применением библиотеки:

Через неизвестную функцию в each, пройдёт ровно 100 объектов, содержащих данные о пользователях от 1 до 100. Подметьте, если мы уберём вызов функции, то не произойдёт никакого запроса, всё потому что вернётся объект, у которого переопределены волшебные способы __call и __get, что разрешает нам делать запрос, когда нам это подлинно нужно.

$vk->request('users.get', ['user_ids' => range(1, 100)])->each(function($i, $v) {
        if($v->last_name == '') return;
        print $v->last_name . '<br>';
    });

Одна из пророческой, что открывает, нам применение генераторов — пакетное приобретение. То есть, мы получаем данные только тогда, когда они нам необходимы. Дальнейший пример, дозволит нам получить ВСЕ наши сообщения, запросами по 100. Будьте внимательны, способ требует от вас прав для messages, Standalone приложения, такой-же авторизации и соответственно передачи ключа доступа.

foreach($vk->request('messages.get')->batch(100) as $data)
{
    $data->each(function($i, $m) {
        if(isset($m->body)) print $m->body . PHP_EOL;
    });
}

Отличный способ, тот, что дозволено разыскать в API — execute. Он принимает параметр code в качестве довода, code — некоторый псевдо JavaScript, тот, что разрешает нам исполнять наш код на стороне сервера, так-же он разрешает исполнять хранимые процедуры, которые мы можем сделать при редактировании нашего приложения.

Эту вещь я не сумел обойти стороной и реализовал её в библиотеке. В 2-х словах, она разрешает исполнить несколько запросов, как один. Глядите дальнейший пример кода.

$js1 = $vk->request('messages.get', ['count' => 200, 'offset' =>0 * 200])->toJs(); // Вернёт объект типа VkJs
$js2 = $vk->request('messages.get', ['count' => 200, 'offset' =>1 * 200])->toJs();
$js3 = $vk->request('messages.get', ['count' => 200, 'offset' =>2 * 200])->toJs();
$js4 = $vk->request('messages.get', ['count' => 200, 'offset' =>3 * 200])->toJs();

$js1
        ->append($js2) // Мы прибавляем js2 к js1
        ->append($js3)
        ->append($js4) 
        ->execute() // Мы хотим исполнить это(на самом деле это вернёт RequestTransaction)
        ->response //Запрос исполнится только теперь
        ->each(
            function($i, $v) //Первая неизвестная функция необходима для обхода всех элементов массива полученного от execute(массив из 4 элементов, 4 запроса)
            {
                $v->each(function($c, $d) { // Дальнейшая для прохода всех 200 сообщений в всяком массиве
                    if(isset($d->body)) print $d->body; //Выведем сообщение если такое поле присутствует
                });
            });

Как и обещал, одно из тех недоразумений, которое вы можете встретить в нынешней версии API(5.21), способusers.get вернёт нам response, как массив, правда в других местах, скажем friends.get, начиная с версии номер 5, нам возвращаются поля count и items, мне кажется это не вовсе логичным, к тому же это требует лишнего кода при работе с API.

Так-же в библиотеке реализованы обработчики для некоторых операций, с вашей поддержкой их может стать огромнее.
С применением библиотеки мы можем добиться достаточно славного и прекрасного кода, а это, самое главное в нашем не лёгком деле.
Абсолютно видимо, что в коде остались какие-то неувязки либо баги, верю на вашу наблюдательность и Pull Requests приветствуются.
Библиотека в большинстве своём отвечает эталону PSR-0.

Верю, мне удалось показать вам, что API Вконтакте не жутко, а даже отрадно.

Благодарствую за внимание!

Ссылка на github: github.com/getjump/VkApiPHP
Досканальное начальство по API: vk.com/dev/main
PSR-0: github.com/getjump/fig-standards/blob/master/accepted/PSR-0.md

Composer будет сразу позже того, как дойдут руки дописать отличные PHPDoc. С Composer будет всё отлично, так как PSR-0.

 Источник: programmingmaster.ru
Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB