KOTOFF.NET
  • Главная
  • Пользователи
  • Контакты
  • Статистика
  • Правила
  • О нас
  • Вход / Регистрация

Создаем бота VK на библиотеке SimpleVK 3.x [Часть 1]

Статьи / PHP


С релизом новой ветки библиотеки 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;
}


Настройка сообщества

 Показать / Скрыть текст

1. Включаем сообщения сообщества и возможности для ботов:

2. Создаём новый токен и вставляем его в константу VK_KEY:

3. Выбираем версию API и вставляем её в константу VERSION -> указываем ссылку на бота -> копируем и вставляем ACCESS_KEY в одноимённую константу в коде -> сохраняем файл на сервере -> нажимаем кнопку 'Подтвердить':

4. В типах событий выбираем входящие:


На этом первая часть по SimpleVK 3.x завершена, осталось протестировать бота:


bot.zip

  • 5id15
  • 26.07.2022
  • 3 357
  • 3
Callback-кнопки для бота ВК
Callback-кнопки для бота ВК
22-07-2022, 20:20, PHP
Карусели для бота ВК
Карусели для бота ВК
24-07-2022, 15:48, PHP
  1. Артём Миронов

    Артём Миронов@Артём Миронов 9 ноября 2023 11:54

    как то можно сделать чтобы через команду давать ответ на репорт?

    1. kenny

      kenny 10 ноября 2023 21:20

      Можно, сохраняйте в бд ID репорта и user_id пользователя, при ответе используйте ID репорта, далее по этому ID уже находите юзерский ид и отправляете ему сообщение, если нужен пример и реализация, напишем статью по полноценному репорт боту с крутыми функциями)

  2. Kem142

    Kem142@Александр Александр 18 октября 2024 14:12

    Как при нажатии на инлайн-кнопку под сообщением удалить или обновить это сообщение?


{login}

Твой комментарий..

Заказывай!
Разработка ботов на заказ, любой сложности, обращаться:
 VK KOTOFF.net - Сообщество, в личные сообщения или по контактам указанным там 
 mail: [email protected]

Рекламный блок
  • Новости
  • Платная категория
  • Блог
  • Игры
  • Обновления
  • Программы
  • Статьи
    • PHP
    • Python
    • JS
  • Дизайн
    • PSD исходники
  • DLE
    • Шаблоны
    • Модули
    • Хаки
  • Магазин
    • Скрипты
Комментарии
Система комментариев на PHP
Полезная статья
Создание простого Telegram-бота с клавиатурой и inline-кнопками [Часть 2]
Класс, хорошая тема
Динамическая обложка для группы ВК, последний подписчик, топ комментатор и прочее
Как отключить вывод результата cron в папку modules/cron в Open Server? Крон запускает несколько
Динамическая обложка для группы ВК, последний подписчик, топ комментатор и прочее
Планируете ли вернуться к динамической обложке?
Скрипт для скачивания видео с YouTube на PHP
Уже не работает.
Все комментарии..
Полный список последних комментариев
Лучшие новости
Всего публикаций: 111
Добавлено за сутки: +0
Записей в блоге: 1
Добавлено за сутки: +0
Комментариев: 936
Добавлено за сутки: +0
Пользователей: 4124
Добавлено за сутки: +0
Полная статистика..
Подробная статистика сайта
Loading...

Нашли ошибку?
Вы можете сообщить об этом администрации.
Выделив текст нажмите CTRL+Enter

Полезные ссылки
  • О проекте
  • Наши контакты
  • Администрация
  • Рекламные материалы
  • Идеи и предложения
  • Ответы на вопросы
Информация
  • Условия сделки
  • Способы оплаты
  • Поддержка / F.A.Q
  • Онлайн документация
  • Статистика сайта
  • Список пользователей
Услуги/Работа
  • Разработка ботов ВК
  • Обновление проекта
  • Консультация/поддержка
KOTOFF.net

Copyright © Footer 2019-2023. All right reserved.
KOTOFF.net - Уроки по PHP, SQL, IT новости
Быстрый вход

Используйте социальные сети для быстрой регистрации и авторизации.

Google
ВКонтакте
Яндекс
Mail.ru
Создать аккаунт / Регистрация
Авторизация

Я забыл свой пароль