Яркий тренд IT-индустрии добрался и до социальной сети «ВКонтакте»: ещё в прошлом году многие разработчики стали создавать ботов для различных мессенджеров и социальных сетей. Далее мы рассмотрим сам процесс создания бота и самые частые «подводные камни». Стоит сразу заметить, что статья рассчитана на PHP-программистов, уже работавших с API ВКонтакте.
И, конечно, вот примеры существующих ботов: «Бот Гифак», «Бот Максим» и «Бот Генератор Стихов».
Стоит ли заниматься созданием бота?
Ответ на этот вопрос целиком и полностью зависит от ваших целей.
Если вы хотите безвозмездно предоставлять пользователям информацию — бот станет идеальным решением. Например, нет необходимости разрабатывать интерфейс, ведь всё взаимодействие происходит через личные сообщения. Аналогично с другими аспектами, где соц. сеть уже проделала всю работу: вход и регистрация пользователей, разнообразные проверки и т.п.
Расплачиваться за меньший объем работы приходится почти полной невозможностью монетизации. Когда вы создаёте сайт, то можете, например, разместить контекстную рекламу. Как реализовать подобное с ботом? Конечно, позднее администрация ВКонтакте может добавить возможность простого заработка для ботов, но мы не думаем, что это произойдет в ближайшее время.
Как работает бот ВКонтакте?
Принцип работы любого бота — получить сообщение от пользователя, сформировать ответ и отправить его обратно.
К сожалению, используя API ВКонтакте, сделать это в рамках одного метода невозможно: отправка и получение сообщений никак не связаны между собой.
На момент написания статьи получение сообщений проще всего реализовывать на основе Callback API. Работает оно следующим образом: вы подписываетесь на определенные типы событий, а когда они происходят, ВКонтакте отправляет HTTP-запрос с данными о произошедшем событии на заданный вами URL.
Независимо от того, собираетесь ли вы взаимодействовать с этим событием, в ответ на запрос нужно вывести HTTP-статус «ok», его код равен 200. Если этого не произойдет, сервер ВКонтакте будет считать, что уведомление не получено и продолжит отправлять его с некоторой периодичностью, а потом временно прекратит отправку уведомлений.
Примечание Если вы не знакомы с работой Callback API, рекомендуем изучить документацию перед продолжением чтения статьи.
Ответ пользователю мы будем отправлять методом messages.send с ключом доступа сообщества. Получить его можно на странице настроек сообщества, рядом с вкладкой Callback API.
С токенами сообщества и связаны «подводные камни». Во-первых, один ключ имеет ограничение: 3 запроса в секунду. Решается это выпуском новых ключей — их число неограниченно, а значит можно забыть о лимитах. Во-вторых, новый ключ сообщества может оказаться недействительным, тогда любой запрос приведет к ошибке «Access denied». Защититься от этого можно лишь проверяя каждый новый ключ в рабочем приложении.
Какие инструменты пригодятся для создания бота?
Пример кода на чистом PHP дан на странице Callback API, но он написан без соблюдения любых соглашений программирования и выглядит нечитабельно.
Кроме того, маловероятно, что в своем проекте вы будете использовать процедурную архитектуру. Большинство разработчиков используют для ботов Laravel (или микро-фреймворк Lumen): помимо более удобной архитектуры эти фреймворки радуют своей системой «очередей» (queue).
Дело в том, что статус «ok» на запрос ВКонтакте необходимо вывести менее чем за 3 секунды, что не всегда возможно при выполнении ресурсоёмких операций. Именно в этой ситуации нам помогают очереди: мы можем вывести код 200 сразу при получении запроса, а остальную логику, включая отправку ответа пользователю, добавить в очередь и обработать асинхронно. Собственно говоря, в большинстве случаев именно так и следует поступать.
Пример реализации контроллера бота в фреймворке Laravel с использованием очередей:
class BotController extends Controller
{
/**
* Проводим верификацию URL
*
* @return mixed
*/
private function confirm()
{
return config('vk.confirmationCode');
}
/**
* Обрабатываем Callback
*
* @param \Illuminate\Http\Request $request Запрос от ВКонтакте
* @return mixed
*/
public function __invoke(Request $request)
{
$data = json_decode($request->getContent());
switch ($data->type) {
case 'confirmation':
return $this->confirm();
case 'message_new':
dispatch(new HandleMessage($data->object->user_id));
return 'ok';
default:
return 'ok';
}
}
}
В отложенном таске, попадающим в очередь в результате работы этого кода, дальнейшую работу с API ВКонтакте, в том числе отправку сообщений, удобнее всего проводить через пакет VK-Client.
От других подобных пакетов VK-Client отличает поддержка генерации VKScript для метода execute, и исключений при ошибках API, что делает программу с его использованием быстрее и стабильнее. Главное, не забывайте про try/catch, а подробнее про обработку исключений в многопоточных приложениях читайте в нашем переводе.
Стоит упомянуть и библиотеку VkApiPHP, о которой мы рассказали в подборке библиотек для работы с VK API, ведь она тоже поможет сгенерировать код для execute-запроса.