На текущий момент большинство крупных сообществ ВКонтакте уже имеют ботов, актуальность этой темы обуславливается огромным спросом на круглосуточную работу приложения, оповещение при вступлении в сообщество и выходе из него, рассылку информационных сообщений, именно бот сообщества ВКонтакте может решить эти задачи. В статье мы рассмотрим решение большинства задач, которые часто возникают в любом крупном сообществе.
Настройка Callback API для бота сообщества ВКонтакте
Подготовка серверной части к подключению
Callback API — это инструмент для отслеживания активности пользователей в Вашем сообществе ВКонтакте. С его помощью Вы можете реализовать новые полезные функции, например:
- Бота для отправки мгновенных ответов на поступающие сообщения.
- Систему автоматической модерации контента.
- Сервис для сбора и обработки показателей вовлеченности аудитории.
Чтобы начать использовать Callback API, подключите свой сервер в настройках сообщества и выберите типы событий, данные о которых требуется получать (например, новые комментарии и новые фотографии). Когда в сообществе произойдет событие выбранного типа, ВКонтакте отправит на Ваш сервер запрос в формате JSON с основной информацией об объекте, вызвавшем событие (например, добавленный комментарий). Вам больше не нужно делать регулярные запросы к API, чтобы отслеживать обновления — теперь Вы будете получать их мгновенно.
Инструкция по подключению подробно описана в отличной документации для разработчиков ВКонтакте.
Разберем её подробнее, для начала мы должны иметь выделенный сервер, я рекомендую использовать хостинг firstvds, наш тестовый сервер мы расположим именно там, так же по промокоду 648336027 вы получите неплохую скидку.
Для работы с callback API ВКонтакте рекомендует использовать протокол https, инструкцию по бесплатной получении сертификата cloudflare и настройки сервера вы сможете найти в статье Бесплатный SSL сертификат CloudFlare.
По окончании настройки сервера вы должны иметь рабочий web-сервер, на который мы загрузим скрипт нашего бота.
Настройка сообщества ВКонтакте
Генерация ключа доступа
Важным моментом в работе бота сообщества являются ответы на пользовательские сообщения и различные события, для того, чтобы мы могли взаимодействовать с пользователем от имени сообщества, нам необходимо создать специальный ключ. Для этого перейдем во вкладку «Управление сообществом«.
Далее спустимся в раздел «Работа с API» -> «Ключи доступа«.
Для создания ключа необходимо нажать «Создать ключ» и выбрать необходимые права, которые мы предоставим нашему боту.
В нашем случае нам хватит доступа к сообщениям сообщества.
Сохраним данный ключ, он нам понадобится при настройке backend.
Настройка callback API
Теперь мы должны связать наш сервер и сообщество, для этого мы должны указать данные нашего сервера и создать секретный ключ. Для этого нам необходимо перейти в раздел управления сообщества и спуститься во вкладку «Работа с API».
Дальше наступает очень важный момент, нам необходимо ввести адрес нашего сервера и придумать секретный ключ, в качестве ключа выступает любая строка, а в качестве адреса, соотвественно, адрес к php скрипту на сервере.
Введем секретный ключ и нажимаем «Сохранить», после мы должны получить соответствующее уведомление о успешной установке ключа. Кнопку «Подтвердить» напротив поля с адресом сервера не нажимаем.
Заданный Вами секретный ключ будет передаваться с каждым уведомлением от сервера в отдельном поле secret. Это позволит Вам достоверно определять, что уведомление пришло именно от нашего сервера.
Также мы должны запомнить код, который должен вернуть сервер, запишите его, он нам понадобится при настройке backend.
Настройка типов событий
Важным моментом в работе бота сообщества, является ответы на пользовательские сообщения и различные события, для того, чтобы мы могли взаимодействовать с пользователем от имени сообщества, нам необходимо указать какие именно события мы хотим получать. Так как мы собираемся отслеживать входящие сообщения, вступления в сообщества и выход из него, то нам необходимо установить соответствующие галочки. Для этого перейдем во вкладку «Управление сообществом«.
Далее спустимся в раздел «Работа с API» -> «Типы событий«.
Установите необходимые пункты в данном разделе.
Настройка backend бот ВКонтакте
Следующим этапом мы должны создать специальный скрипт, который будем принимать запросы от callback API вконтакте и определенным образом реагировать на события. Создадим, например, php-скрипт handler.php, адрес к этом скрипту, после настройки backend, мы должны указать в настройках сообщества.
Обратите внимание на значения следующих переменных:
1 |
$confirmationToken $token $secretKey |
В confirmationToken хранится код, которые сервер должен вернуть, в нашем случае:
1 |
004eec27 |
token хранит в себе ключ доступа, который мы генерировали в главе «Генерация ключа доступа»
secretKey мы задавали в разделе управления сообщества callback API.
Итоговый код выглядит следующим образом (handler.php):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
<?php if (!isset($_REQUEST)) { return; } //Строка для подтверждения адреса сервера из настроек Callback API $confirmationToken = '004eec27'; //Ключ доступа сообщества $token = 'Ваш ключ доступа'; // Secret key $secretKey = 'testSecureKey'; //Получаем и декодируем уведомление $data = json_decode(file_get_contents('php://input')); // проверяем secretKey if(strcmp($data->secret, $secretKey) !== 0 && strcmp($data->type, 'confirmation') !== 0) return; //Проверяем, что находится в поле "type" switch ($data->type) { //Если это уведомление для подтверждения адреса сервера... case 'confirmation': //...отправляем строку для подтверждения адреса die($confirmationToken); break; //Если это уведомление о новом сообщении... case 'message_new': //...получаем id его автора $userId = $data->object->user_id; //затем с помощью users.get получаем данные об авторе $userInfo = json_decode(file_get_contents("https://api.vk.com/method/users.get?user_ids={$userId}&v=5.0")); //и извлекаем из ответа его имя $user_name = $userInfo->response[0]->first_name; //С помощью messages.send и токена сообщества отправляем ответное сообщение $request_params = array( 'message' => "Приветствую, {$user_name}!", 'user_id' => $userId, 'access_token' => $token, 'v' => '5.0' ); $get_params = http_build_query($request_params); file_get_contents('https://api.vk.com/method/messages.send?' . $get_params); //Возвращаем "ok" серверу Callback API echo('ok'); break; } echo('ok'); ?> |
После того как вы загрузите код, вы должны вернуться в раздел «Управление сообществом» -> «Работа с API» -> «Callback API», ввести адрес до скрипта и нажать «Подтвердить»
После этого, конфигурация сообщества для работы с ботом завершена, теперь, если мы отправим сообщением в сообщество, мы получим ответ.
Дополнительные возможности
Реализация приветствия при вступлении в сообщество ВКонтакте
На данном этапе мы уже имеем настроенный сервер и обработчик бота, все возможные события указаны в документации, она хорошо написана, рекомендую с ней ознакомиться.
Мы будем отлавливать событие group_join, для этого в операторе switch создадим новый раздел. Мы не будем рассматривать join_type подробно, так как у нас открытая группа, но вы можете обрабатывать этот параметр на ваше усмотрение.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
// Если это уведомление о вступлении в группу case 'group_join': //...получаем id нового участника $userId = $data->object->user_id; //затем с помощью users.get получаем данные об авторе $userInfo = json_decode(file_get_contents("https://api.vk.com/method/users.get?user_ids={$userId}&v=5.0")); //и извлекаем из ответа его имя $user_name = $userInfo->response[0]->first_name; //С помощью messages.send и токена сообщества отправляем ответное сообщение $request_params = array( 'message' => "Добро пожаловать в наше сообщество МГТУ им. Баумана ИУ5 2016, {$user_name}!<br>" . "Если у Вас возникнут вопросы, то вы всегда можете обратиться к администраторам сообщества.<br>" . "Их контакты можно найти в соответсвующем разделе группы.<br>" . "Успехов в учёбе!", 'user_id' => $userId, 'access_token' => $token, 'v' => '5.0' ); $get_params = http_build_query($request_params); file_get_contents('https://api.vk.com/method/messages.send?' . $get_params); //Возвращаем "ok" серверу Callback API echo('ok'); break; |
Полный код обработчика бота ВКонтакте с функцией приветственного сообщения:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
<?php if (!isset($_REQUEST)) { return; } //Строка для подтверждения адреса сервера из настроек Callback API $confirmationToken = '004eec27'; //Ключ доступа сообщества $token = 'Ваш ключ'; // Secret key $secretKey = 'testSecureKey'; //Получаем и декодируем уведомление $data = json_decode(file_get_contents('php://input')); // проверяем secretKey if(strcmp($data->secret, $secretKey) !== 0 && strcmp($data->type, 'confirmation') !== 0) return; //Проверяем, что находится в поле "type" switch ($data->type) { //Если это уведомление для подтверждения адреса сервера... case 'confirmation': //...отправляем строку для подтверждения адреса die($confirmationToken); break; //Если это уведомление о новом сообщении... case 'message_new': //...получаем id его автора $userId = $data->object->user_id; //затем с помощью users.get получаем данные об авторе $userInfo = json_decode(file_get_contents("https://api.vk.com/method/users.get?user_ids={$userId}&v=5.0")); //и извлекаем из ответа его имя $user_name = $userInfo->response[0]->first_name; //С помощью messages.send и токена сообщества отправляем ответное сообщение $request_params = array( 'message' => "{$user_name}, ваше сообщение зарегистрировано!<br>". "Мы постараемся ответить в ближайшее время.", 'user_id' => $userId, 'access_token' => $token, 'v' => '5.0' ); $get_params = http_build_query($request_params); file_get_contents('https://api.vk.com/method/messages.send?' . $get_params); //Возвращаем "ok" серверу Callback API echo('ok'); break; // Если это уведомление о вступлении в группу case 'group_join': //...получаем id нового участника $userId = $data->object->user_id; //затем с помощью users.get получаем данные об авторе $userInfo = json_decode(file_get_contents("https://api.vk.com/method/users.get?user_ids={$userId}&v=5.0")); //и извлекаем из ответа его имя $user_name = $userInfo->response[0]->first_name; //С помощью messages.send и токена сообщества отправляем ответное сообщение $request_params = array( 'message' => "Добро пожаловать в наше сообщество МГТУ им. Баумана ИУ5 2016, {$user_name}!<br>" . "Если у Вас возникнут вопросы, то вы всегда можете обратиться к администраторам сообщества.<br>" . "Их контакты можно найти в соответсвующем разделе группы.<br>" . "Успехов в учёбе!", 'user_id' => $userId, 'access_token' => $token, 'v' => '5.0' ); $get_params = http_build_query($request_params); file_get_contents('https://api.vk.com/method/messages.send?' . $get_params); //Возвращаем "ok" серверу Callback API echo('ok'); break; } echo('ok'); ?> |
Реализация прощания с участником после того, как он покинул сообщество
Реализация идентичная, в конкретном случае мы обрабатываем group_leave
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
// Если это уведомление о выходе из группы case 'group_leave': //...получаем id ушедшего участника $userId = $data->object->user_id; //затем с помощью users.get получаем данные об авторе $userInfo = json_decode(file_get_contents("https://api.vk.com/method/users.get?user_ids={$userId}&v=5.0")); //и извлекаем из ответа его имя $user_name = $userInfo->response[0]->first_name; //С помощью messages.send и токена сообщества отправляем ответное сообщение $request_params = array( 'message' => "{$user_name}, нам очень жаль прощаться с вами 😔<br>" . "Мы всегда будем ждать Вас в нашей уютной компании.<br>" . "Если возникли вопросы - свяжитесь с администратором сообщества<br>" . "Константин - https://vk.com/kulakovkostya", 'user_id' => $userId, 'access_token' => $token, 'v' => '5.0' ); $get_params = http_build_query($request_params); file_get_contents('https://api.vk.com/method/messages.send?' . $get_params); //Возвращаем "ok" серверу Callback API echo('ok'); break; |
Полный листинг кода:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 |
<?php if (!isset($_REQUEST)) { return; } //Строка для подтверждения адреса сервера из настроек Callback API $confirmationToken = '004eec27'; //Ключ доступа сообщества $token = 'Ваш ключ'; // Secret key $secretKey = 'testSecureKey'; //Получаем и декодируем уведомление $data = json_decode(file_get_contents('php://input')); // проверяем secretKey if(strcmp($data->secret, $secretKey) !== 0 && strcmp($data->type, 'confirmation') !== 0) return; //Проверяем, что находится в поле "type" switch ($data->type) { //Если это уведомление для подтверждения адреса сервера... case 'confirmation': //...отправляем строку для подтверждения адреса die($confirmationToken); break; //Если это уведомление о новом сообщении... case 'message_new': //...получаем id его автора $userId = $data->object->user_id; //затем с помощью users.get получаем данные об авторе $userInfo = json_decode(file_get_contents("https://api.vk.com/method/users.get?user_ids={$userId}&v=5.0")); //и извлекаем из ответа его имя $user_name = $userInfo->response[0]->first_name; //С помощью messages.send и токена сообщества отправляем ответное сообщение $request_params = array( 'message' => "{$user_name}, ваше сообщение зарегистрировано!<br>". "Мы постараемся ответить в ближайшее время.", 'user_id' => $userId, 'access_token' => $token, 'v' => '5.0' ); $get_params = http_build_query($request_params); file_get_contents('https://api.vk.com/method/messages.send?' . $get_params); //Возвращаем "ok" серверу Callback API echo('ok'); break; // Если это уведомление о вступлении в группу case 'group_join': //...получаем id нового участника $userId = $data->object->user_id; //затем с помощью users.get получаем данные об авторе $userInfo = json_decode(file_get_contents("https://api.vk.com/method/users.get?user_ids={$userId}&v=5.0")); //и извлекаем из ответа его имя $user_name = $userInfo->response[0]->first_name; //С помощью messages.send и токена сообщества отправляем ответное сообщение $request_params = array( 'message' => "Добро пожаловать в наше сообщество МГТУ им. Баумана ИУ5 2016, {$user_name}!<br>" . "Если у Вас возникнут вопросы, то вы всегда можете обратиться к администраторам сообщества.<br>" . "Их контакты можно найти в соответсвующем разделе группы.<br>" . "Успехов в учёбе!", 'user_id' => $userId, 'access_token' => $token, 'v' => '5.0' ); $get_params = http_build_query($request_params); file_get_contents('https://api.vk.com/method/messages.send?' . $get_params); //Возвращаем "ok" серверу Callback API echo('ok'); break; // Если это уведомление о выходе из группы case 'group_leave': //...получаем id ушедшего участника $userId = $data->object->user_id; //затем с помощью users.get получаем данные об авторе $userInfo = json_decode(file_get_contents("https://api.vk.com/method/users.get?user_ids={$userId}&v=5.0")); //и извлекаем из ответа его имя $user_name = $userInfo->response[0]->first_name; //С помощью messages.send и токена сообщества отправляем ответное сообщение $request_params = array( 'message' => "{$user_name}, нам очень жаль прощаться с вами 😔<br>" . "Мы всегда будем ждать Вас в нашей уютной компании.<br>" . "Если возникли вопросы - свяжитесь с администратором сообщества<br>" . "Константин - https://vk.com/kulakovkostya", 'user_id' => $userId, 'access_token' => $token, 'v' => '5.0' ); $get_params = http_build_query($request_params); file_get_contents('https://api.vk.com/method/messages.send?' . $get_params); //Возвращаем "ok" серверу Callback API echo('ok'); break; } echo('ok'); ?> |
Изменения в VK API от 18 марта 2018 года
С мая 2018 года сервисный ключ доступа обязателен для работы с этими методами:
- users.get
- wall.getComments
- friends.get
- groups.getMembers
- likes.getList
Если в Вашем приложении используются открытые методы, необходимо изменить связанную с ними логику таким образом, чтобы в запросах передавался параметр access_token, содержащий сервисный ключ доступа. Получить или обновить его Вы можете в разделе редактирования Вашего приложения.
after:
1 |
$userInfo = json_decode(file_get_contents("https://api.vk.com/method/users.get?user_ids={$userId}&v=5.0")); |
before:
1 |
$userInfo = json_decode(file_get_contents("https://api.vk.com/method/users.get?user_ids={$userId}&v=5.0&access_token=32b64dfb6e7dyrdy1l5320c643yrdy36fcffdisfijsd5454a583a0724d961a05a522eatest88c1af76da214e26d9bcd87e")); |
Спасибо большое, все крайне подробно и понятно написано! Уже смог сам написать первый бот)
Спасибо за отзыв, мои данные есть в разделе контакты, если будут вопросы — пишите 🙂
Обратите внимание: после получения уведомления Ваш сервер должен возвращать строку «ok» и статус HTTP 200. Если сервер несколько раз подряд вернет ошибку, Callback API временно перестанет отправлять на него уведомления.
«Когда в сообществе произойдет событие выбранного типа, ВКонтакте отправит на Ваш сервер запрос с данными в формате JSON с основной информацией об объекте, вызвавшем событие (например, добавленный комментарий). В ответ на каждый такой запрос Ваш сервер должен отправить строку «ok». »
Если он ответит еще чем-то, например выдаст мусор или notice, error, то это работать не будет. По возможности отключайте вывод ошибок для скрипта в php.
php:
ini_set(‘error_reporting’, 0);
ini_set(‘display_errors’, 0);
.htaccess:
php_flag display_errors off
Если бот отправляет бесконечное количество сообщений в ответ, то необходимо убедиться, что скрипт на сервере сохранен в кодировке UTF8 без BOM, иначе сервер будет слать в ответ на VK API следующее: п»їok , а это в свою очередь не является ответом ok. В данной ситуации добавляется BOM метка, её необходимо убрать.
А как организовать анализ сообщения? То есть как получить текст полученного сообщения в коде?
9684552294
Добрый вечер.. Вы понимаете что нужно заниматься сайтом и интернет маркетингом, но некому поручить это важное дело? Если так, поручите нам! Фишки здесь https://vtop.moscow
Это коммерческое предложение, отправленное с вашего сайта через форму обратной связи. Предложение отправлено вам 1 раз. Если вы не желаете быть в курсе новых эффективных способов раскрутки сайта, просто ответьте пожалуйста нам с указанием адреса сайта, мы больше никогда вам не пришлём сообщение.
экспорт товаров заказать
электропол
купить теплый пол под ламинат