Написать пост

Бот ВКонтакте: руководство и полезные инструменты разработки

Аватар Тарас Сереванн

Разработка ботов для мессенджеров — тренд 2016 года. Бот в соц. сети «ВКонтакте» — новый тренд в России, а потому мы разберём его разработку прямо сейчас

Обложка поста Бот ВКонтакте: руководство и полезные инструменты разработки

Яркий тренд IT-индустрии добрался и до социальной сети «ВКонтакте»: ещё в прошлом году многие разработчики стали создавать ботов для различных мессенджеров и социальных сетей. Далее мы рассмотрим сам процесс создания бота и самые частые «подводные камни». Стоит сразу заметить, что статья рассчитана на PHP-программистов, уже работавших с API ВКонтакте.

И, конечно, вот примеры существующих ботов: «Бот Гифак», «Бот Максим» и «Бот Генератор Стихов».

Стоит ли заниматься созданием бота?

Ответ на этот вопрос целиком и полностью зависит от ваших целей.

Если вы хотите безвозмездно предоставлять пользователям информацию — бот станет идеальным решением. Например, нет необходимости разрабатывать интерфейс, ведь всё взаимодействие происходит через личные сообщения. Аналогично с другими аспектами, где соц. сеть уже проделала всю работу: вход и регистрация пользователей, разнообразные проверки и т.п.

Расплачиваться за меньший объем работы приходится почти полной невозможностью монетизации. Когда вы создаёте сайт, то можете, например, разместить контекстную рекламу. Как реализовать подобное с ботом? Конечно, позднее администрация ВКонтакте может добавить возможность простого заработка для ботов, но мы не думаем, что это произойдет в ближайшее время.

Как работает бот ВКонтакте?

Принцип работы любого бота — получить сообщение от пользователя, сформировать ответ и отправить его обратно.

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

На момент написания статьи получение сообщений проще всего реализовывать на основе Callback API. Работает оно следующим образом: вы подписываетесь на определенные типы событий, а когда они происходят, ВКонтакте отправляет HTTP-запрос с данными о произошедшем событии на заданный вами URL.

Независимо от того, собираетесь ли вы взаимодействовать с этим событием, в ответ на запрос нужно вывести HTTP-статус «ok», его код равен 200. Если этого не произойдет, сервер ВКонтакте будет считать, что уведомление не получено и продолжит отправлять его с некоторой периодичностью, а потом временно прекратит отправку уведомлений.

Бот ВКонтакте: руководство и полезные инструменты разработки 1

Примечание Если вы не знакомы с работой 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-запроса.

API
Инструменты
PHP
Боты
ВКонтакте
42569