С релизом новой ветки библиотеки SimpleVK появилось немало новых возможностей, что-то добавилось, что-то поменялось. Поэтому, если вы переходите со второй на третью ветку, код своего приложения придётся переделывать под новые реалии. Всё это мы будем постепенно разбирать в этой и последующих статьях на сайте.
Подготовка
Начинаем со стандартных процедур: подключаем библиотеку SimpleVK (будет в архиве с исходниками в конце статьи), создаём константы для работы с ботом (позже их заполним), инициализируем классы SimpleVK, Message и Bot:
<?php
require_once __DIR__ . '/vendor/digitalstars/simplevk/autoload.php';
const VK_KEY = '*********************************'; // Токен сообщества
const ACCESS_KEY = '********'; // Строка, которую должен вернуть сервер
const VERSION = '5.131'; // Версия VK API
const ADMIN_ID = '*******'; // Айди своей страницы (для лога ошибок)
$vk = \DigitalStars\SimpleVK\SimpleVK::create( VK_KEY, VERSION )->setConfirm( ACCESS_KEY )->setUserLogError( ADMIN_ID ); // Включаем лог ошибок в личку себе
$msg = \DigitalStars\SimpleVK\Message::create( $vk ); // Экземпляр класса Message
$bot = \DigitalStars\SimpleVK\Bot::create( $vk ); // Экземпляр класса Bot
Простые команды для бота
Для простых команд бота используется следующая конструкция:
$bot->cmd( $id, $mask )->text( $text );
Также в конце необходимо будет запустить бота (метод run()):
$bot->run();
Метод cmd() принимает на вход $id (уникальный идентификатор команды) и $mask (маска команды). А метод text() - текст сообщения.
Попробуем сделать команду для получения даты и времени:
$bot->cmd( 'date', '/дата' )->text( 'Точное время: ' . date( 'd.m.Y H:i:s' ) );
В качестве второго параметра в методе cmd() можно передать также и массив. Например, если мне необходимо сделать несколько вариаций написания одной и той же команды, то сделать это можно так:
$bot->cmd( 'hi', [ 'привет', 'хелло', 'ку', 'здарова' ] )->text( 'Приветик' );
То есть бот будет отправлять "Приветик", если написать ему одно из четырёх значений из переданного массива.
Отправка картинок
Чтобы заставить бота отправлять изображения пользователям - достаточно приписать к вышеуказанной конструкции метод img() и передать в него ссылку на картинку:
$bot->cmd( 'img', '/картинка' )->text( 'Держи картинку' )->img( 'http://s2.fotokto.ru/photo/full/266/2668620.jpg' );
Опять же, можно передать массив из нескольких картинок, бот отправит все (максимум 10):
$bot->cmd( 'img', '/картинка' )->text( 'Держи картинку' )->img( [ 'http://s2.fotokto.ru/photo/full/266/2668620.jpg', 'https://img.desktopwallpapers.ru/rocks/pics/wide/1920x1200/27640f370156a0e0ae3ee9608fc8480a.jpg' ] );
Команды с параметрами
Для примера добавлю боту команду '/пароль', которая будет генерировать рандомный ключ из указанного количества символов. Для удобства создам функцию для генерации, а потом будем её каждый раз вызывать по команде:
function generatePassword( int $length ) : string
{
if ( $length < 4 or $length > 120 )
return 'Минимальная длина пароля - 4 символа, максимальная - 120';
$symbols = array (
'A', 'a', 'B', 'b', 'C', 'c', 'D', 'd', 'E', 'e', 'F', 'f', 'G', 'g', 'H', 'h', 'I', 'i',
'J', 'j', 'K', 'k', 'L', 'l', 'M', 'm', 'N', 'n', 'O', 'o', 'P', 'p', 'Q', 'q', 'R', 'r',
'S', 's', 'T', 't', 'U', 'u', 'V', 'v', 'W', 'w', 'X', 'x', 'Y', 'y', 'Z', 'z',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
);
$password = '';
$max = count( $symbols ) - 1;
for ( $i = 0; $i < $length; $i++ )
{
$password .= $symbols[ mt_rand( 0, $max ) ];
}
return 'Твой пароль: ' . $password;
}
Теперь можно добавить обработку команды '/пароль':
$bot->cmd( 'sum', '/пароль %n' )->func( function ( $msg, $params )
{
$msg->text( generatePassword( $params[0] ) );
} );
В маску команды добавляем числовой заполнитель %n (числовой, т.к. вторым параметром указывается длина пароля в виде числа). Для строк, кстати, есть свой заполнитель - %s.
Команды с регулярным выражением
Чтобы в качестве параметра команды можно было писать какой-то произвольный текст - следует воспользоваться методом preg_cmd(). Для примера сделаю команду для отправки репорта админу бота (в моём случае самому себе):
$bot->preg_cmd('report', "!/репорт (.*)!")->func( function ( $report, $params )
{
global $msg;
$msg->text( 'Новый репорт: ' . $params[1] )->send( ADMIN_ID );
$report->text( 'Репорт отправлен, текст твоего сообщения: ' . $params[1] );
} );
Кнопки для бота
Сразу сделаю общее меню, а также редирект на это меню, если от пользователя пришла неизвестная команда:
$bot->redirect( 'other', 'first' ); // Отправляем юзеру меню, если от него пришла неизвестная команда/кнопка
$bot->cmd( 'first' )->kbd( [ [ 'commands' ], [ 'btn_1', 'btn_2', 'btn_3' ] ] )->text( 'Меню:' ); // Отправляется при нажатии на кнопку 'Начать'
Принцип работы с кнопками такой же, как и с обычными командами. Метод btn() принимает на вход уникальный идентификатор и текст кнопки. Метод text() - текст сообщения, которое бот отправил юзеру вместе с клавиатурой.
Кнопка для отправки пользователю списка команд:
$bot->btn( 'commands', 'Список команд' )->text( "/дата - точное время\n/картинка - рандомная картинка\n/пароль - генерация пароля заданной длины" );
Вторым параметром для метода btn() можно передать массив, в котором указать текст кнопки и её цвет:
$bot->btn( 'btn_1', [ 'Кнопка №1', 'green' ] )->text( 'Ты нажал на зелёную кнопку (№1)' );
$bot->btn( 'btn_2', [ 'Кнопка №2', 'blue' ] )->text( 'Ты нажал на синюю кнопку (№2)' );
$bot->btn( 'btn_3', [ 'Кнопка №3', 'red' ] )->text( 'Ты нажал на красную кнопку (№3)' );
Напомню, что в конце нужно запустить бота:
$bot->run(); // Запуск
Весь код
<?php
require_once __DIR__ . '/vendor/digitalstars/simplevk/autoload.php';
const VK_KEY = '*********************************'; // Токен сообщества
const ACCESS_KEY = '********'; // Строка, которую должен вернуть сервер
const VERSION = '5.131'; // Версия VK API
const ADMIN_ID = '*******'; // Айди своей страницы (для лога ошибок)
$vk = \DigitalStars\SimpleVK\SimpleVK::create( VK_KEY, VERSION )->setConfirm( ACCESS_KEY )->setUserLogError( ADMIN_ID ); // Включаем лог ошибок в личку себе
$msg = \DigitalStars\SimpleVK\Message::create( $vk ); // Экземпляр класса Message
$bot = \DigitalStars\SimpleVK\Bot::create( $vk ); // Экземпляр класса Bot
/* Команды для бота [Начало] */
$bot->cmd( 'date', '/дата' )->text( 'Точное время: ' . date( 'd.m.Y H:i:s' ) );
$bot->cmd( 'img', '/картинка' )->text( 'Держи картинку' )->img( [ 'http://s2.fotokto.ru/photo/full/266/2668620.jpg', 'https://img.desktopwallpapers.ru/rocks/pics/wide/1920x1200/27640f370156a0e0ae3ee9608fc8480a.jpg' ] );
$bot->cmd( 'hi', [ 'привет', 'хелло', 'ку', 'здарова' ] )->text( 'Приветик' );
$bot->cmd( 'sum', '/пароль %n' )->func( function ( $msg, $params )
{
$msg->text( generatePassword( $params[0] ) );
} );
$bot->preg_cmd('report', "!/репорт (.*)!")->func( function ( $report, $params )
{
global $msg;
$msg->text( 'Новый репорт: ' . $params[1] )->send( ADMIN_ID );
$report->text( 'Репорт отправлен, текст твоего сообщения: ' . $params[1] );
} );
/* Команды для бота [Конец] */
/* Кнопки для бота [Начало] */
$bot->redirect( 'other', 'first' ); // Отправляем юзеру меню, если от него пришла неизвестная команда/кнопка
$bot->cmd( 'first' )->kbd( [ [ 'commands' ], [ 'btn_1', 'btn_2', 'btn_3' ] ] )->text( 'Меню:' ); // Отправляется при нажатии на кнопку 'Начать'
$bot->btn( 'commands', 'Список команд' )->text( "/дата - точное время\n/картинка - рандомная картинка\n/пароль - генерация пароля заданной длины" );
$bot->btn( 'btn_1', [ 'Кнопка №1', 'green' ] )->text( 'Ты нажал на зелёную кнопку (№1)' );
$bot->btn( 'btn_2', [ 'Кнопка №2', 'blue' ] )->text( 'Ты нажал на синюю кнопку (№2)' );
$bot->btn( 'btn_3', [ 'Кнопка №3', 'red' ] )->text( 'Ты нажал на красную кнопку (№3)' );
/* Кнопки для бота [Конец] */
$bot->run(); // Запуск
function generatePassword( int $length ) : string
{
if ( $length < 4 or $length > 120 )
return 'Минимальная длина пароля - 4 символа, максимальная - 120';
$symbols = array (
'A', 'a', 'B', 'b', 'C', 'c', 'D', 'd', 'E', 'e', 'F', 'f', 'G', 'g', 'H', 'h', 'I', 'i',
'J', 'j', 'K', 'k', 'L', 'l', 'M', 'm', 'N', 'n', 'O', 'o', 'P', 'p', 'Q', 'q', 'R', 'r',
'S', 's', 'T', 't', 'U', 'u', 'V', 'v', 'W', 'w', 'X', 'x', 'Y', 'y', 'Z', 'z',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
);
$password = '';
$max = count( $symbols ) - 1;
for ( $i = 0; $i < $length; $i++ )
{
$password .= $symbols[ mt_rand( 0, $max ) ];
}
return 'Твой пароль: ' . $password;
}
Настройка сообщества
На этом первая часть по SimpleVK 3.x завершена, осталось протестировать бота:
Нашли ошибку?
Вы можете сообщить об этом администрации.
Выделив текст нажмите CTRL+Enter