Создание бота Вк на языке PHP — уроки API Вк

Боты стали новой эпохой в соц сетях и мессенджерах. Мы расскажем как создать настоящего бота на PHP, используя API социальной сети Вконтакте.
Для создание ботов в социальной сети Вконтакте нужно несколько вещей:
- Специальный standalone token ;
- Токен вашей группы;
- Сам скрипт с ботом;
- Группа с подключенным сервером и API.
Получение токена
Первым делом необходимо получить standalone token вместе с токеном вашей группы. Для этого переходим в раздел для разработчиков и в » Мои приложения «. Здесь создаем новое приложение. Название приложения можете выбрать любым, главное чтобы оно было Standalone-приложение.

Включите Open API после создания приложения. В него пропишите сайт, с которым будет связано ваше приложение, а также базовый домен. В нашем случае это itProger.com .

После этого необходимо перейти по этой ссылке . Также вы её видите ниже:
https://oauth.vk.com/authorize?client_id=6678654&display=page&redirect_uri=https://oauth.vk.com/blank.html&scope=friends,photos,audio,video,status,messages,wall,groups,offline,stats,email&response_type=token&v=5.63
Единственное, вам необходимо изменить client_id и установить чтобы оно было равным ID вашего приложения.
Далее вы нажимаете на кнопку Разрешить и после этого получаете токен, который будет записан в ссылке. Копируете токен от знака равенства ( = ) и до амперсанда ( & ).
После этого создайте новую группу или воспользуйтесь вашей существующей группой. Зайдите в настройке, после чего в Ключи доступа и нажмите Создать ключ . Установите все права для ключа и после этого вы сможете получить токен вашей группы, который вам пригодиться для создания бота.
Создание самого бота
Для создания бота нам понадобиться три файла:
- config — файл служащий исключительно для нас. В нем мы запишем различные настройки и данные, которые сможем в дальнейшем использовать в других файлах;
- photos — файл для обработки альбома. В этом файле мы будем обрабатывать альбом, получать из него все изображение и записывать их в новый txt файл в специальном формате, который в дальнейшем будем передавать в качестве прикрепленного изображения к сообщению;
- bot — основной файл с ботом. Здесь мы прописываем обработку данных от пользователя, а также передачу сообщений от бота к пользователю Вконтакте.
Ниже представлены эти три файла. Они полностью готовы и с рабочим кодом. Детальное описание всего что в них происходит вы можете получить из видео.
$album = 'https://vk.com/album-113958919_252151167'; $res = parse_url($album); $path = substr($res['path'], 6); $arr = explode('_', $path); $owner_id = $arr[0]; $album_id = $arr[1]; $standalone = "ваш standalone токен приложения"; $group_token = 'ваш токен группы'; $conf = [ 'standalone' => $standalone, 'group_token' => $group_token, 'contorm_token' => 'eae5d4a2', 'mess' => 'Фото в студио', 'not_command' => 'Ничего не понял!', 'owner_id' => $owner_id, 'album_id' => $album_id, 'group_id' => '170785666', 'apiurl' => 'https://api.vk.com/method/', 'path' => substr($_SERVER['PHP_SELF'], 0, -2), 'photos' => 'photos.txt', 'temp_link' => 'temp_album.txt', 'random_id' => mt_rand(0000000000, 999999999999), 'v' => '5.50' ];
unlink($conf["photos"]); $query = file_get_contents($conf['apiurl'].'photos.get?owner_id='.$conf['owner_id'].'&album_id='.$conf['album_id'].'&v='.$conf['v'].'&access_token='.$conf['standalone']); $res = json_decode($query, true); foreach($res as $v) < foreach($v['items'] as $q) < $result = 'photo'.$q['owner_id'].'_'.$q['id']; file_put_contents($conf['photos'], $result."\n", FILE_APPEND | LOCK_EX); >>
require "config.php"; $data = json_decode(file_get_contents('php://input')); $u_id = $data->object->user_id; $mess = $data->object->body; $user_info = json_decode(file_get_contents($conf['apiurl'].'users.get?user_id='.$u_id.'&v='.$conf['v'].'&access_token='.$conf['standalone'])); $user_name = $user_info->response[0]->first_name; $temp_link = file($conf['temp_link']); if($temp_link[0] != $album) < file_put_contents($conf['temp_link'], $album); require "photos.php"; return true; >switch($data->type) < case 'confirmation': echo $conf['contorm_token']; break; case "message_new": if($mess == $conf['mess']) < $file = file_get_contents($conf['photos']); $photos_all = explode("\n", $file); $myCurl = curl_init(); curl_setopt_array($myCurl, array( CURLOPT_URL =>$conf['apiurl'].'messages.send?user_id='.$u_id.'&group_id='.$conf['group_id'].'&attachment='.$photos_all[mt_rand(0, count($photos_all) - 1)].'&message='.urlencode('Держи свое фото').'&v='.$conf['v'].'&access_token='.$conf['standalone'], CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_POSTFIELDS => http_build_query(array()) )); $response = curl_exec($myCurl); curl_close($myCurl); > else < $myCurl = curl_init(); curl_setopt_array($myCurl, array( CURLOPT_URL =>$conf['apiurl'].'messages.send?user_id='.$u_id.'&group_id='.$conf['group_id'].'&message='.urlencode($conf['not_command']).'&v='.$conf['v'].'&access_token='.$conf['standalone'], CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_POSTFIELDS => http_build_query(array()) )); $response = curl_exec($myCurl); curl_close($myCurl); > echo 'ok'; break; >
Детальное описание создания бота на языке PHP под систему Вконтакте:
Последнее что необходимо будет сделать, так это прописать URL адрес скрипта bot.php в группе, в настройках API:

После этого можете написать сообщение в группу и бот будет вам отвечать. Напишите «Фото в студио» и бот пришлет вам случайную фотографию из альбома.
Больше интересных новостей

Что вы должны знать о разнообразии видов баз данных?

Корпоративная IT-иерархия или кто такие Джун, Мидл и Сеньор?

ТОП-10 фреймворков для Java

5 классных, но недооценённых приложений для программистов
Первый бот на PHP для ВКонтакте
Здравствуйте, хабровчане. В этой публикации я напишу о том, как сделать своего первого чат-бота для ВКонтакте. Думаю, что опытным программистам это будет не интересно, а вот тем, кто только начинает свой путь, будет интересно, так как я ещё и сам не очень далеко ушёл и понимаю проблемы начинающих. И предупреждаю сразу, что большинство скриншотов будет на английском языке.
Сперва нам нужно создать сообщество. Думаю, с этим справится каждый.
Затем мы заходим в настройки сообщества и выбираем пункт «API usage» и нажимаем на кнопку «Create token».

Далее нужно выбрать, собственно, чем мы сможем пользоваться с помощью этого токена. Нам нужен доступ к сообщениям сообщества, но можно выбрать все права доступа, чтобы в дальнейшем не вспонимать о создании токенов.

И вот мы получили заветный токен. Его, кстати, нужно сохранить в надёжное место и никому не показывать. Теперь можно приступать к коду.

Мы будем писать код на языке PHP, поэтому можно скачать Visual Studio code или PHPStorm. В принципе, код можно писать и в блокноте, только это будет не удобно. После кода мы перейдём к дальнейшей настройке группы.
Итак, для начала нам нужно получить информацию о входящем сообщении и перевести её из формата JSON в понятный для PHP.
В переменной data теперь к нас находится массив с сообщением, ID пользователя и ID чата.
«А что за „json_decode(file_get_contents(‘php://input’))“, — спросите вы.
Начнём с этого момента:
file_get_contents('php://input')
Выражаясь, простым языком, мы спрашиваем у скрипта что у нас пришло на вход, то есть какой запрос отправил ВК. Ниже приведу пример такого запроса.
,"group_id":171524656>
Думаю, легко понять что написано в запросе, если иметь минимальные знания в английском языке.
Ну а „json_decode()“ — функция, которая переводит вышеприведённый JSON в массив, с которым может работать PHP.
Теперь напишем код, который смотрит какое событие произошло, и если к нам пришло новое сообщение, то сравнивает сообщение, с теми, на которые у нас есть ответ и смотрит ID чата.
type) < case 'confirmation': echo $confirmation_token; break; case 'message_new': $message_text = $data ->object -> text; $message_text = $data -> object -> peer_id; if ($message_text == "привет") < // что-то происходит >if ($message_text == "пока") < // что-то происходит >echo 'ok'; break; > ?>
Теперь нам нужно как-то отвечать на эти сообщения. Для этого напишем простую функцию.
$text, 'peer_id' => $peer_id, 'access_token' => "TOKEN", 'v' => '5.87' ); $get_params = http_build_query($request_params); file_get_contents('https://api.vk.com/method/messages.send?'. $get_params); > ?>
Что же тут происходит? Здесь мы строим запрос к API VK (документацию рекомендую почитать) с текстом сообщения, ID чата и токеном, который мы создали ранее, и отправляем его на сервер ВК.
Теперь соединим эти куски кода и напишем реакции бота на то или иное сообщение.
$text, 'peer_id' => $peer_id, 'access_token' => "TOKEN", 'v' => '5.87' ); $get_params = http_build_query($request_params); file_get_contents('https://api.vk.com/method/messages.send?'. $get_params); > $data = json_decode(file_get_contents('php://input')); switch ($data->type) < case 'confirmation': echo $confirmation_token; break; case 'message_new': $message_text = $data ->object -> text; $chat_id = $data -> object -> peer_id; if ($message_text == "привет") < vk_msg_send($chat_id, "Привет, я бот, который говорит две фразы."); >if ($message_text == "пока") < vk_msg_send($chat_id, "Пока. Если захочешь с кем-то поговорить, то у тебя есть бот, который говорит две фразы."); >echo 'ok'; break; > ?>
«Хорошо, а зачем нам писать ‘ok’ после отправки сообщения?»
Так как мы будем использовать метод получения обновлений с названием Call Back API, то есть сам ВКонтакте нам будет говорить о новых сообщениях, то нам нужно сказать, что мы его услышали, иначе он будет нам повторять несколько раз.
Теперь перейдём к настройке группы.
Заходим в настройки и выбираем версию API 5.87 (можно, конечно, и более новые версии, но лучше иметь единство версий API).

Из этого же раздела берём строку, которую должен вернуть сервер, и подставляем её в переменную confirmation_token.
После этого заполняем адрес сервера. Для этого нужно иметь домен и хостинг. По адресу, который Вы укажите, должен быть как раз файл с ботом. Надеюсь, с этим читатель справится сам.
Потом выбираем о каких событиях в сообществе нам будет сообщать ВКонтакте. Нам нужны только входящие сообщения.

Далее подтверждаем адрес сервера, и наш первый бот готов к использованию.

Так как это моя первая публикация на Хабре, я хочу получить замечания по статье и дальше только совершенствоваться.
Простой игровой бот для ВК, создаем игру для Вконтакте + исходники! | Часть 1

Данная статья, начало создания игровых механик для своего бота Вконтакте. Многие из вас завадались вопросом: А как создать игрового бота для ВК, давайте начнем создавать классного бота для совместных игр.

1. Подготовка.
Так как мы еще не определились что именно будет в нашем боте, мы будем создавать это ниже, мы подготовим наше сообщество для создания нового бота, а так же подключим сразу базу данных и сделаем регистрацию.
Создаем новое сообщество, указываем название, тематику и по желанию свой сайт (если есть).


Переходим в настройки и включаем сообщения сообщества, а так же создаем новое приветствие для новичков :), тут же в подразделе Настройки для бота не забываем включить их, и разрешить добавлять его в беседу!
Теперь переходим к настройке скрипта, назовем это основной файл отвечающий за прием событий от вк и их дальнейшей обработки
Если нет сервера, нужно приобрести, рекомендуем хостинг FirstVDS нам подойдет и обычный хостинг VDS-OVZ-Разминка, цена на время написания статьи всего 90 рублей в месяц. После заказа Вам придет на почту данные для авторизации на сервере. Использовать можете любой хостинг, на ваш вкус и цвет. Главное условие поддержка PHP 5.6+ (желательно 7.0+) и MySQL. Далее переходим на сервер, создаем любое доменное имя куда будем заливать скрипты. Мы будем использовать IP адрес. Если с с настройкой сервера не понятно, то почитайте эту статью на нашем сайте, где мы наглядно показываем как загрузить файлы на сервер.

После того как разобрались с сервером, нужно загрузить как раз необходимые библиотеки и основной файл, скачать ниже:
panamera.rar
Для работы с PHP я использую PHPStorm, это платный продукт, но как получить его бесплатно, Вам, наверно, объяснять не нужно 🙂
Распаковываем архив на сервер и открываем наш файл bot.php и пишем код который останется неизменным и может использоваться при создании новых ботов.
setDatabaseName($bdname)->setCharset('utf8mb4'); $vk = vk_api::create($vk_key, $v)->setConfirm($confirm); $my_msg = new Message($vk); $data = json_decode(file_get_contents('php://input')); //Получает и декодирует JSON пришедший из ВК $vk->sendOK(); // ТУТ УЖЕ БУДЕМ ПИСАТЬ КОД //
Здесь нам нужно заполнить следующие поля:
$host = ‘localhost’; // По умолчанию localhost или ваш IP адрес сервера
$name = »; // логин для авторизации к БД
$pass = »; // Пароль для авторизации к БД
$bdname = »; // ИМЯ базы данных
$vk_key = »; // Длинный ключ сообщества, который мы получим чуть позже
$confirm = »; // СТРОКА которую должен вернуть сервер
$v = ‘5.103’; // Версия API, последняя на сегодняшнее число, оставлять таким если на новых работать в будущем не будет
Получение ключа сообщества:
А так же в разделе Тип событий обязательно включите Входящие сообщения
Так как данные я буду вносить своего сервера, соответственно показывать их я не буду. После настройки возвращаемся снова в сообщество.
Надеюсь с этим все ясно, почти в каждой статье на нашем сайте мы каждый раз объясняем как настроить бот, почитайте их, если здесь не ясно что делать. После успешного подключения переходим уже ко второй части статьи, где будем делать регистрацию пользователей которые первый раз напишут боту.

2. Регистрация новых пользователей в боте.
Для создания игрового бота понадобится регистрация используя базу данных. Мы будем Использовать для этого обертку на родным MySQLi. Для начала создаем через PhpMyAdmin новую таблицу users с полями:
Или используем запрос ниже:
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; SET time_zone = "+00:00"; CREATE TABLE `users` ( `id` int(11) NOT NULL, `vk_id` int(11) NOT NULL, `nick` varchar(20) NOT NULL, `status` int(11) NOT NULL, `time` int(11) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; ALTER TABLE `users` ADD PRIMARY KEY (`id`); ALTER TABLE `users` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
Переходим к самому интересному, написанию кода.
Для начала как всегда, создание переменных которые чаще всего будут использоваться в боте:
// ТУТ УЖЕ БУДЕМ ПИСАТЬ КОД // // Переменные для удобной работы в будущем $id = $data->object->message->from_id; // ИД того кто написал $peer_id = $data->object->message->peer_id; // Только для бесед (ид беседы) $time = time(); $cmd = explode(" ", mb_strtolower($data->object->message->text)); // Команды $message = $data->object->message->text; // Сообщение полученное ботом $new_ids = current($data->object->message->fwd_messages)->from_id ?? $data->object->message->reply_message->from_id; // ИД того чье сообщение переслали $userinfo = $vk->userInfo($id); // Закончили с переменными

Пишем первую проверку, на входящее сообщение, именно туда мы будем вносить весь код
if ($data->type == 'message_new') < // ТУТ все что будем делать дальше >
Это нужно что бы исключить все другие события, ведь у нас игровой бот который использует только текст.
Обращаемся к базе данных, что бы проверить есть ли такой пользователь в ней:
if ($id < 0)// ПРОВЕРЯЕМ что сообщение прислал юзер а не сообщество if ($data->type == 'message_new') < $id_reg_check = $db->query('SELECT vk_id FROM users WHERE ids = ?i', $id)->fetch_assoc()['vk_id']; // Пытаемся получить пользователя который написал сообщение боту if (!$id_reg_check and $id > 0) < // Если вдруг запрос вернул NULL (0) это FALSE, то используя знак ! перед переменной, все начинаем работать наоборот, FALSE становится TRUE // Так же мы проверяем что $id больше нуля, что бы не отвечать другим ботам, но лучше в самом верху добавить такую проверку что бы не делать лишних обращений к БД! $db->query("INSERT INTO users (vk_id, nick, status, time) VALUES (?i, '?s', ?i, ?i)", $id, "$userinfo[first_name] $userinfo[last_name]", 0, $time); $vk->sendMessage ($peer_id, "Приветствую тебя, @id$id ($userinfo[first_name] $userinfo[last_name]), ты теперь один из нас, вступай в ряды мощных панамеровцев!"); > >

Давайте сразу добавим кнопки, ведь это удобно, так как у нас бот называется PANAMERA, давайте сделаем какую-нибудь автомобильную игру, где ваша задача получить Porshe PANAMERA, но не будем ограничиваться этим, а начнем развивать механику в разные направления.
После регистрации у вас ничего нет, нужны деньги, что бы их получить, можно использовать кнопку бонус, давайте ее и добавим в бот.
Пишем следующий код:
К переменным
$bonus = $vk->buttonText('⏰ Бонус!', 'green', ['command' => 'bonus']);
if ($data->type == 'message_new') < if (isset($data->object->message->payload)) < //получаем payload $payload = json_decode($data->object->message->payload, True); // Декодируем кнопки в массив > else < $payload = null; // Если пришел пустой массив кнопок, то присваиваем кнопке NULL >$payload = $payload['command']; $id_reg_check = $db->query('SELECT vk_id FROM users WHERE vk_id = ?i', $id)->fetch_assoc()['vk_id']; // Пытаемся получить пользователя который написал сообщение боту if (!$id_reg_check and $id > 0) < // Если вдруг запрос вернул NULL (0) это FALSE, то используя знак ! перед переменной, все начинаем работать наоборот, FALSE становится TRUE // Так же мы проверяем что $id больше нуля, что бы не отвечать другим ботам, но лучше в самом верху добавить такую проверку что бы не делать лашних обращений к БД! $db->query("INSERT INTO users (vk_id, nick, status, time) VALUES (?i, '?s', ?i, ?i)", $id, "$userinfo[first_name] $userinfo[last_name]", 0, $time); $vk->sendButton($peer_id, "Приветствую тебя, @id$id ($userinfo[first_name] $userinfo[last_name]), ты теперь один из нас, вступай в ряды мощных панамеровцев!", [[$bonus]]); > // Давайте для обработки кнопки воспльзуемся SWITCH - CASE switch ($payload) // Проще говоря мы загрузили кнопки кнопки в свич, теперь проверяем что за кнопка была нажата и обрабатываем ее < case 'bonus'; $vk->sendMessage($peer_id, "Вы взяли бонус, Вам выпало N монет"); break; > >


Давайте протестируем регистрацию и ответ на нажатие кнопки:
Ответил не сразу, в коде были допущены следующие ошибки:
ids заменить на vk_id и добавить переменную $userinfo = $vk->userInfo ($id);
Так как статья пишется параллельно созданию бота, могут быть допущены ошибки, выше в исходных файлах они будут исправлены.

Давайте сделаем что бы бонус начислялся на баланс. Добавляем 2 поля к таблице USERS:
ALTER TABLE `users` ADD `balance` INT NOT NULL AFTER `time`, ADD `time_bonus` INT NOT NULL AFTER `balance`;
переходим к коду и пишем следующую проверку и рандом:
case 'bonus'; $time_bonus = $id_reg_check = $db->query('SELECT time_bonus FROM users WHERE vk_id = ?i', $id)->fetch_assoc()['time_bonus']; if ($time_bonus < $time)< // + 21600 минут = 6 часов $next_bonus = $time + 21600; // Прибавляем 6 часов для следующего бонуса! $rand_money = mt_rand(100, 5000); // Рандомно выбираем число от 100 до 5000, используя встроенную функцию PHP mt_rand $db->query('UPDATE users SET time_bonus = ?i, balance = balance + ?i WHERE vk_id = ?i',$next_bonus, $rand_money, $id); // Обновляем данные $vk->sendMessage($peer_id, "Вы взяли бонус, Вам выпало $rand_money монет"); > else < // Иначе сообщим о том что бонус уже взят! $next_bonus = date("d.m в H:i:s",$time_bonus); $vk->sendMessage($peer_id,"Вы уже брали бонус ранее, следующий будет доступен \"$next_bonus\""); > break;
Проверяем:
Так это выглядит в базе данных:
Отлично у нас есть деньги, пора бы начать их и тратить 🙂 самое распространенное в играх конечно же казино, давайте сделаем что-то подобное, самое простейшее казино. Пока мы еще не придумали игровые механики для нашего игрового бота, сделаем фарм денег.
Как будет работать наше казино:
Казино все, казино 100, казино 1кк и прочие, означающие ставки. Погнали делать команду:
if ($cmd[0] == 'казино')< // Первая команда if (!$cmd[1])< // если вторая команда пустая она вернет FALSE $vk->sendMessage($peer_id, 'Вы не указали ставку!'); >elseif ($cmd[1] == 'все' or $cmd[1] == 'всё')< // Если указано все $balance = $db->query('SELECT balance FROM users WHERE vk_id = ?i', $id)->fetch_assoc()['balance']; // вытягиваем весь баланс if($balance == 0) < $vk->sendMessage($peer_id, 'У Вас нет денег :('); > else < $result = mt_rand(1, 4); // 1 - проиграл половину, 2 - победа x1.5, 3 - победа x2, 4 - проиграл все $win_money = ($result == 1 ? $balance / 2 : ($result == 2 ? $balance * 1.5 : ($result == 3 ? $balance * 2 : 0))); $win_nowin = ($result == 1 ? 'проиграли половину' : ($result == 2 ? 'выиграли x1.5' : ($result == 3 ? 'выиграли x2' : 'проиграли все'))); $vk->sendMessage($peer_id, "Вы $win_nowin, ваш баланс теперь составляет $win_money монет."); $db->query('UPDATE users SET balance = ?i WHERE vk_id = ?i', $win_money, $id); // Обновляем данные > > else < $sum = str_replace(['к','k'], '000', $cmd[1]); // наши Кk превращаем в человеческий вид, заменяя их на нули :) $sum = ltrim(mb_eregi_replace('[^0-9]', '', $sum),'0'); // удаляем лишние символы, лишние нули спереди и все что может поломать систему :), подробнее о функциях можно почитать в интернете $balance = $db->query('SELECT balance FROM users WHERE vk_id = ?i', $id)->fetch_assoc()['balance']; // вытягиваем весь баланс if($balance < $sum) < $vk->sendMessage($peer_id, 'У вас не достаточно денег'); > else < $result = mt_rand(1, 4); // 1 - проиграл половину, 2 - победа x1.5, 3 - победа x2, 4 - проиграл все $win_money = ($result == 1 ? $balance - ($sum / 2) : ($result == 2 ? $balance + ($sum * 1.5) : ($result == 3 ? $balance + ($sum * 2) : $balance - $sum))); $win_nowin = ($result == 1 ? 'проиграли половину' : ($result == 2 ? 'выиграли x1.5' : ($result == 3 ? 'выиграли x2' : 'проиграли все'))); $vk->sendMessage($peer_id, "Вы $win_nowin, ваш баланс теперь составляет $win_money монет."); $db->query('UPDATE users SET balance = ?i WHERE vk_id = ?i', $win_money, $id); // Обновляем данные > > >

Получилось довольно много кода, в будущем возможно мы еще вернемся для доработок, все зависит только от Вас, давайте попробуем это в действии:
Получилось не плохо, теперь в нашем игровом боте есть казино!
На этом наша первая часть по созданию игрового бота вконтакте подходит к концу, теперь ваши идеи и предложения будут появляться в новой статье, во второй части мы уже начнем реализацию ваших идей и предложений!
Если статья понравилась, оцените ее лайком.
Исходники готового проекта:
panamera.rar

- Сергей Котов
- 19.04.2020
- 49 263
- 12
- 33
Как написать чат-бота на PHP для сообщества ВКонтакте
На текущий момент большинство крупных сообществ ВКонтакте уже имеют ботов, актуальность этой темы обуславливается огромным спросом на круглосуточную работу приложения, оповещение при вступлении в сообщество и выходе из него, рассылку информационных сообщений, именно бот сообщества ВКонтакте может решить эти задачи. В статье мы рассмотрим решение основных задач, которые часто возникают в любом крупном сообществе.
Настройка Callback API для бота сообщества ВКонтакте
Подготовка серверной части к подключению
Callback API — это инструмент для отслеживания активности пользователей в Вашем сообществе ВКонтакте. С его помощью Вы можете реализовать новые полезные функции, например:
- Бота для отправки мгновенных ответов на поступающие сообщения.
- Систему автоматической модерации контента.
- Сервис для сбора и обработки показателей вовлеченности аудитории.
Инструкция по подключению подробно описана в отличной документации для разработчиков ВКонтакте.
Разберем её подробнее, для размещения скрипта чат-бота мы должны иметь функционирующий веб-сервер.
Для работы с callback API ВКонтакте рекомендует использовать протокол https, инструкцию по бесплатному получению сертификата cloudflare и настройки сервера вы сможете найти в статье, которую можно найти в поисковой системе Google по запросу Бесплатный SSL сертификат CloudFlare.
По окончании настройки сервера вы должны иметь рабочий web-сервер, на который мы загрузим скрипт нашего бота.
Настройка сообщества ВКонтакте
Генерация ключа доступа
Важным моментом в работе бота сообщества являются ответы на пользовательские сообщения и различные события, для того, чтобы мы могли взаимодействовать с пользователем от имени сообщества, нам необходимо создать специальный ключ. Для этого перейдем во вкладку «Управление сообществом«.

Далее спустимся в раздел «Работа с API» → «Ключи доступа«.

Для создания ключа необходимо нажать «Создать ключ» и выбрать необходимые права, которые мы предоставим нашему боту.

В нашем случае нам хватит доступа к сообщениям сообщества.

Сохраним данный ключ, он нам понадобится при настройке backend.
Настройка callback API
Теперь мы должны связать наш сервер и сообщество, для этого мы должны указать данные нашего сервера и создать секретный ключ. Для этого нам необходимо перейти в раздел управления сообщества и спуститься во вкладку «Работа с API».

Дальше наступает очень важный момент, нам необходимо ввести адрес нашего сервера и придумать секретный ключ, в качестве ключа выступает любая строка, а в качестве адреса, соотвественно, адрес к php скрипту на сервере.

Введем секретный ключ и нажимаем «Сохранить», после мы должны получить соответствующее уведомление о успешной установке ключа. Кнопку «Подтвердить» напротив поля с адресом сервера не нажимаем.
Заданный Вами секретный ключ будет передаваться с каждым уведомлением от сервера в отдельном поле secret. Это позволит Вам достоверно определять, что уведомление пришло именно от нашего сервера.

Также мы должны запомнить код, который должен вернуть сервер, запишите его, он нам понадобится при настройке backend.

Настройка типов событий
Важным моментом в работе бота сообщества, является ответы на пользовательские сообщения и различные события, для того, чтобы мы могли взаимодействовать с пользователем от имени сообщества, нам необходимо указать какие именно события мы хотим получать. Так как мы собираемся отслеживать входящие сообщения, вступления в сообщества и выход из него, то нам необходимо установить соответствующие галочки. Для этого перейдем во вкладку «Управление сообществом«.

Далее спустимся в раздел «Работа с API» → «Типы событий«.


Установите необходимые пункты в данном разделе.
Настройка backend бота ВКонтакте
Следующим этапом мы должны создать специальный скрипт, который будем принимать запросы от callback API вконтакте и определенным образом реагировать на события. Создадим, например, php-скрипт handler.php, адрес к этом скрипту, после настройки backend, мы должны указать в настройках сообщества.
Обратите внимание на значения следующих переменных:
$confirmationToken $token $secretKey
В confirmationToken хранится код, которые сервер должен вернуть, в нашем случае:
004eec27
token хранит в себе ключ доступа, который мы генерировали в главе «Генерация ключа доступа»
secretKey мы задавали в разделе управления сообщества callback API. Итоговый код выглядит следующим образом (handler.php):
Итоговый код handler.php
//Строка для подтверждения адреса сервера из настроек 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': //. отправляем строку для подтверждения адреса echo $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=&v=5.0")); //и извлекаем из ответа его имя $user_name = $userInfo->response[0]->first_name; //С помощью messages.send и токена сообщества отправляем ответное сообщение $request_params = array( 'message' => ", ваше сообщение зарегистрировано!
". "Мы постараемся ответить в ближайшее время.", '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=&v=5.0")); //и извлекаем из ответа его имя $user_name = $userInfo->response[0]->first_name; //С помощью messages.send и токена сообщества отправляем ответное сообщение $request_params = array( 'message' => "Добро пожаловать в наше сообщество МГТУ им. Баумана ИУ5 2016, !
" . "Если у Вас возникнут вопросы, то вы всегда можете обратиться к администраторам сообщества.
" . "Их контакты можно найти в соответсвующем разделе группы.
" . "Успехов в учёбе!", '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; > ?>
После того как вы загрузите код, вы должны вернуться в раздел «Управление сообществом» → «Работа с API» → «Callback API», ввести адрес до скрипта и нажать «Подтвердить»

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

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

Мы будем отлавливать событие group_join, для этого в операторе switch создадим новый раздел. Мы не будем рассматривать join_type подробно, так как у нас открытая группа, но вы можете обрабатывать этот параметр на ваше усмотрение.
Фрагмент кода оповещения о вступлении в сообщество
// Если это уведомление о вступлении в группу 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=&v=5.0")); //и извлекаем из ответа его имя $user_name = $userInfo->response[0]->first_name; //С помощью messages.send и токена сообщества отправляем ответное сообщение $request_params = array( 'message' => "Добро пожаловать в наше сообщество МГТУ им. Баумана ИУ5 2016, !
" . "Если у Вас возникнут вопросы, то вы всегда можете обратиться к администраторам сообщества.
" . "Их контакты можно найти в соответсвующем разделе группы.
" . "Успехов в учёбе!", '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;

Полный код обработчика бота ВКонтакте с функцией приветственного сообщения:
Исходный код handler.php. Приветственное сообщение
//Строка для подтверждения адреса сервера из настроек 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': //. отправляем строку для подтверждения адреса echo $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=&v=5.0")); //и извлекаем из ответа его имя $user_name = $userInfo->response[0]->first_name; //С помощью messages.send и токена сообщества отправляем ответное сообщение $request_params = array( 'message' => ", ваше сообщение зарегистрировано!
". "Мы постараемся ответить в ближайшее время.", '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=&v=5.0")); //и извлекаем из ответа его имя $user_name = $userInfo->response[0]->first_name; //С помощью messages.send и токена сообщества отправляем ответное сообщение $request_params = array( 'message' => "Добро пожаловать в наше сообщество МГТУ им. Баумана ИУ5 2016, !
" . "Если у Вас возникнут вопросы, то вы всегда можете обратиться к администраторам сообщества.
" . "Их контакты можно найти в соответсвующем разделе группы.
" . "Успехов в учёбе!", '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; > ?>
Реализация прощания с участником после того, как он покинул сообщество
Реализация идентичная, в конкретном случае мы обрабатываем group_leave
Фрагмент кода оповещения о выходе из сообщества
// Если это уведомление о выходе из группы 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=&v=5.0")); //и извлекаем из ответа его имя $user_name = $userInfo->response[0]->first_name; //С помощью messages.send и токена сообщества отправляем ответное сообщение $request_params = array( 'message' => ", нам очень жаль прощаться с вами
" . "Мы всегда будем ждать Вас в нашей уютной компании.
" . "Если возникли вопросы - свяжитесь с администратором сообщества
" . "Константин - 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;
Полный листинг кода:
Итоговый код handler.php с расширенным функционалом
//Строка для подтверждения адреса сервера из настроек 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': //. отправляем строку для подтверждения адреса echo $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=&v=5.0")); //и извлекаем из ответа его имя $user_name = $userInfo->response[0]->first_name; //С помощью messages.send и токена сообщества отправляем ответное сообщение $request_params = array( 'message' => ", ваше сообщение зарегистрировано!
". "Мы постараемся ответить в ближайшее время.", '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=&v=5.0")); //и извлекаем из ответа его имя $user_name = $userInfo->response[0]->first_name; //С помощью messages.send и токена сообщества отправляем ответное сообщение $request_params = array( 'message' => "Добро пожаловать в наше сообщество МГТУ им. Баумана ИУ5 2016, !
" . "Если у Вас возникнут вопросы, то вы всегда можете обратиться к администраторам сообщества.
" . "Их контакты можно найти в соответсвующем разделе группы.
" . "Успехов в учёбе!", '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=&v=5.0")); //и извлекаем из ответа его имя $user_name = $userInfo->response[0]->first_name; //С помощью messages.send и токена сообщества отправляем ответное сообщение $request_params = array( 'message' => ", нам очень жаль прощаться с вами
" . "Мы всегда будем ждать Вас в нашей уютной компании.
" . "Если возникли вопросы - свяжитесь с администратором сообщества
" . "Константин - 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; > ?>
Исходный код на GitHub: github.com/KostyaKulakov/vksocialbot
- вконтакте бот
- бот сообщества
- vk bot