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

BOT VK — Скрипт бана и мута пользователей в беседе (PHP)

Статьи / PHP


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



Шаг 1: Подготовка 

Для работы с ботами понадобится сообщество ВКонтакте. В спойлере ниже есть памятка по настройке этого самого сообщетсва:

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

1. Переходим в настройки, далее во вкладку Сообщения, включаем их:

2. Во вкладке Настройки для бота включаем возможности для бота и разрешаем добавлять его в беседы:

3. Во вкладке Настройки > Работа с API > Ключи доступа создаём ключ, даём права доступа к сообщениям сообщества, сохраняем ключ у себя (например, в блокноте):

4. Во вкладке Callback API указываем ссылку на нашего бота, копируем и сохраняем строку, которую должен будет вернуть сервер. Также в процессе написания кода  нужно будет нажать кнопку Подтвердить:

5. Ну, и наконец во вкладке Типы событий ставим галочку напротив входящих:

На этом моменте подготовительную работу можно считать оконченной. 



Шаг 2: Работа с БД

Информацию о банах, мутах, а также о их сроках нужно где-то хранить. Поэтому для этих целей мы будем использовать специальную таблицу, которую сейчас необходимо будет создать в базе данных:

В ней будет всего-навсего 4 поля:

id - айди записи (число);

user_id - айди пользователя (число);

type - тип записи (1 - мут, 2 - бан);

duration - срок (число).



Шаг 3: Написание бота

Для начала подключаю библиотеки и создаю несколько констант:

<?php


/* Подключение библиотек */
require_once 'simplevk-master/autoload.php';
require_once 'vendor/autoload.php';



/* Константы для работы с VK */
const VK_KEY = '********************************'; // Тот самый длинный ключ, который мы создавали
const ACCESS_KEY = '*******'; // Строка, которую должен вернуть сервер
const VERSION = '5.131'; // Версия VK API

/* Константы для работы с Mysql */
const SERVER = 'localhost';
const USERNAME = 'Имя пользователя';
const PASSWORD = 'Пароль';
const DATABASE_NAME = 'Имя БД';
const CHARSET = 'utf8mb4';

 

Далее подключаюсь к базе данных, авторизируюсь через токен сообщества ВК:

$vk = \DigitalStar\vk_api\vk_api::create( VK_KEY, VERSION )->setConfirm( ACCESS_KEY ); // Авторизация через токен сообщества
$db = \Krugozor\Database\Mysql::create( SERVER, USERNAME, PASSWORD )->setDatabaseName( DATABASE_NAME )->setCharset( CHARSET ); // Подключение к БД

$vk->initVars( $peer_id, $message, $payload, $vk_id, $type, $data ); // Инициализация переменных, они понадобятся для дальнейшей работы


Теперь приступаем непосредственно к написанию скрипта для бота и к обработке входящих сообщений. Начинаем с проверки на тип события. Поскольку мы поставили галочку только напротив входящих сообщений, то уведомления ни о никаких других событиях приходить к нам на сервер не будут, однако проверку всё равно пишем:

if ( $type == 'message_new' )
{
    // Тут будем продолжать писать код
}


Теперь мы приступаем к обработке команд на блокировку, мут, разблокировку и размут пользователей. Чтобы этими привилегиями в беседе не пользовался кто попало - нужно убедиться, что их использует именно администратор, а не кто-либо другой. Для этого я использую метод isAdmin() класса vk_pi.

Список возвращаемых методом значений:

'owner' - создатель беседы;

'admin' - администратор;

false - пользователь;

null - пользователя нет в беседе.


Чтобы продолжить выполнение кода - нужно, чтобы была возвращена строка ('admin' или 'owner'):

if ( $type == 'message_new' )
{

    if ( $vk->isAdmin( $vk_id, $peer_id ) )
    {
        // Тут продолжим кодить
    }

}


Команды для бота будут состоять из нескольких параметров (из нескольких частей). К примеру, "/бан @id1 5 часов". Чтобы удобнее было работать с этими параметрами - разобьём строку на массив с помощью функции explode(). В итоге получится так: [ '/бан', '@id1', '5', 'часов' ]:

$message_data = explode( ' ', $message );


Теперь получившийся массив нужно немного подредачить:

  • Когда пользователь мутится или банится по пересланному сообщению, то ссылка на него не указывается (/бан 5 минут). Следовательно, ID этого юзера нужно вытянуть вручную, после чего запихнуть этот айди на 2 позицию массива $message_data:

  • Пользователя можно будет также замутить или забанить с указанием ссылки на него. Можно указать полную ссылку на страницу, айди страницы или короткое имя. Если админ выбрал вариант с упомяналкой (пример: @id1), то в строковом представлении это будет выглядеть так: '[id1|@id1]'. А значит часть этой строки придётся обрезать.

Надеюсь, идею плюс минут я объяснил понятно. Так что слова теперь преобразовываю в код:

        if ( isset( $data->object->reply_message ) )
        {
            $message_data = array_merge( array_slice( $message_data, 0, 1 ), [ $data->object->reply_message->from_id ], array_slice( $message_data, 1 ) );
        }
        else
        {
            if ( strpos( $message_data[1], '@' ) !== false )
                $message_data[1] = substr( substr( $message_data[1], strpos( $message_data[1], '@' ) + 1 ), 0, -1 );
            else if ( strpos( $message_data[1], '*' ) !== false )
                $message_data[1] = substr( substr( $message_data[1], strpos( $message_data[1], '*' ) + 1 ), 0, -1 );
        }


Теперь, когда в массив $message_data мы запихали адекватную ссылку на пользователя, можно приступать к извлечению из ВК инфы о нём (о пользователе) с помощью метода userInfo(). Нам понадобится только ID страницы, имя и фамилия:

$user_info = $vk->userInfo( $message_data[1], $scope = [ 'fields' => 'id, first_name, last_name' ] );


Пришло время сделать обработку команд. Начнём с команды /бан и команды /мут. Чтобы не делать двойную проверку - я буду использовать конструкцию try catch. Если пользователь является админом беседы или вовсе не состоит в ней, то будет присылаться соответствующее предупреждение. В ином случае мы заносим в таблицу black_list инфу о бане (или о муте) юзера, а также фиксируем срок. Ах да, тут я использую пользовательскую функцию durationCount() (для подсчёта срока наказания в секундах), о её работе напишу чуть ниже. А сейчас пишем обработку команд:

        if ( $message_data[0] == '/мут' )
        {


            try
            {
                $duration = durationCount( $message_data[2], $message_data[3] );

                $db->query( "INSERT INTO `black_list` SET `user_id` = ?i, `type` = ?i, `duration` = ?i", $user_info['id'], 1, $duration );

                $vk->sendMessage( $peer_id, '@id' . $user_info['id'] . '(' . $user_info['first_name'] . ' ' . $user_info['last_name'] . ') замучен до ' . date( 'd.m.y H:i:s', $duration ) . ' (' . ( $message_data[4] ?? 'Без причины' ) . ')' );
            }
            catch ( \DigitalStar\vk_api\VkApiException $e )
            {
                $vk->sendMessage( $peer_id, 'Произошла ошибка. Вероятно, пользователь является администратором или отсутствует в этой беседе.' );
            }


        }


        if ( $message_data[0] == '/бан' )
        {


            try
            {
                $duration = durationCount( $message_data[2], $message_data[3] );

                $db->query( "INSERT INTO `black_list` SET `user_id` = ?i, `type` = ?i, `duration` = ?i", $user_info['id'], 2, $duration );

                $vk->request( 'messages.removeChatUser', [ 'chat_id' => $peer_id - 2000000000, 'member_id' => $user_info['id'] ] );

                $vk->sendMessage( $peer_id, '@id' . $user_info['id'] . '(' . $user_info['first_name'] . ' ' . $user_info['last_name'] . ') забанен до ' . date( 'd.m.y H:i:s', $duration ) . ' (' . ( $message_data[4] ?? 'Без причины' ) . ')' );
            }
            catch ( \DigitalStar\vk_api\VkApiException $e )
            {
                $vk->sendMessage( $peer_id, 'Произошла ошибка. Вероятно, пользователь является администратором или отсутствует в этой беседе.' );
            }


        }


Пока не ушли от темы - делаем ещё две команды (/разбан и /размут). Принцип их работы простой - после их использования из БД удаляются все записи, в которых фигурирует ID амнистируемого пользователя:

        if ( $message_data[0] == '/размут' )
        {


            $db->query( "DELETE FROM `black_list` WHERE `user_id` = ?i AND `type` = ?i", $user_info['id'], 1 );

            $vk->sendMessage( $peer_id, '@id' . $user_info['id'] . '(' . $user_info['first_name'] . ' ' . $user_info['last_name'] . ') размучен' );


        }


        if ( $message_data[0] == '/разбан' )
        {


            $db->query( "DELETE FROM `black_list` WHERE `user_id` = ?i AND `type` = ?i", $user_info['id'], 2 );

            $vk->sendMessage( $peer_id, '@id' . $user_info['id'] . '(' . $user_info['first_name'] . ' ' . $user_info['last_name'] . ') разбанен' );


        }


Я обещал разобрать и показать функцию durationCount(). Показываю:

function durationCount( $value, $unit )
{
    if ( strpos( $unit, 'сек' ) === 0 )
        $duration = time() + ( $value * 1 );
    else if ( strpos( $unit, 'мин' ) === 0 )
        $duration = time() + ( $value * 60 );
    else if ( strpos( $unit, 'час' ) === 0 )
        $duration = time() + ( $value * 3600 );
    else if ( strpos( $unit, 'дн' ) === 0 )
        $duration = time() + ( $value * 86400 );


    return $duration;
}

На вход мы даём значение (время) и единицу измерения времени (секунды, минуты, часы или дни). Чтобы единицы измерения можно было на письме сокращать и использовать в разных падежах  - прибегаю к услугам функции strpos(), которая возвращает позицию первого вхождения подстроки в строку. После определения временной единицы - умножаем полученное значение на количество секунд в неё входящее. Ну, а потом уже функция возвращает результат вычисления.

Функцию вставляем в самом низу файла.


Смотрим, как работает. В качестве последнего параметра, кстати, можно указать причину бана (мута) - "/мут @id1 10 дней Причина". Если причина не указана, то бот уведомит об её отсутствии:



Нам осталось сделать обработку сообщений ото всех пользователей беседы. 

  • Если сообщение пишет замученный чел - значит нужно это сообщение удалить; 
  • Если кто-то пригласил в беседу заблоченного юзера - значит его вновь кикаем.
    if ( isset( $data->object->action ) and $data->object->action->type == 'chat_invite_user' ) // Если кто-то кого-то пригласил
    {

        $result = $db->query( "SELECT * FROM `black_list` WHERE `user_id` = ?i AND `type` = ?i", $data->object->action->member_id, 2 )->fetchAssoc(); // Запрос к БД. Проверяем, нет ли приглашенного в чёрном списке?

        if ( isset( $result['id'] ) and $result['id'] and $result['duration'] > time() ) // Проверяем, истёк ли срок наказания
        {
            $vk->request( 'messages.removeChatUser', [ 'chat_id' => $peer_id - 2000000000, 'member_id' => $data->object->action->member_id ] ); // Кикаем, если срок не истёк

            $vk->sendMessage( $peer_id, 'Пользователь находится в чёрном списке беседы' ); // Уведомляем об этом участников беседы
        }

    }
    else
    {

        $result = $db->query( "SELECT * FROM `black_list` WHERE `user_id` = ?i AND `type` = ?i", $vk_id, 1 )->fetchAssoc();

        if ( isset( $result['id'] ) and $result['id'] and $result['duration'] > time() )
        {
            $vk->request( 'messages.delete', [ 'delete_for_all' => 1, 'peer_id' => $peer_id, 'cmids' => $data->object->conversation_message_id ] ); // Удаляем сообщение, если человек замучен
        }

    }


На этом написание бота окончено, архив с исходниками прикрепляю ниже. Бонусом, кстати, добавил команду /кик. Здесь её не разбирал, поскольку статья на эту тему уже была на сайте.

bot.zip

  • 5id15
  • 29.06.2022
  • 8 127
  • 8
Скрипт исключения из беседы VK и не только, написанный на PHP
Скрипт исключения из беседы VK и не только, написанный на PHP
21-02-2019, 04:04, Статьи / PHP
[VK BOT] Полезные функции (команды) для бота вк
[VK BOT] Полезные функции (команды) для бота вк
24-07-2019, 15:30, Статьи / PHP
  1. Виталий

    Виталий Гость 18 октября 2022 19:52

    Какая версия php требуется для работы этого скрипта?

    1. 5id15

      5id15@Константин Дорофеев 18 октября 2022 23:17

      Любая, функции/возможности новых версий php тут не использовались 

  2. Дмитрий

    Дмитрий Гость 19 ноября 2022 15:37

    Здравствуйте, сделал как тут всё указано, но вк не подтверждает запрос "Сервер вернул неправильный ответ". как исправить?

    1. Сергей Котов

      Сергей Котов@Сергей Котов 20 ноября 2022 15:51

      Версия PHP какая стоит? В настройках группы адрес до файла верно указываете?

      1. Дмитрий

        Дмитрий Гость 21 ноября 2022 19:39

        1) Версия php 5.6

        2) Адрес: https://del-bot.store/index.php

        1. Сергей Котов

          Сергей Котов@Сергей Котов 27 ноября 2022 18:19

          Нужна версия php 7+

  3. Younfik

    Younfik Гость 15 февраля 2024 22:14

    где взять базу данных? как создать/открыть

    1. kenny

      kenny 16 февраля 2024 00:26

      В архиве все есть

{login}

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

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

Рекламный блок
  • Новости
  • Платная категория
  • Блог
  • Игры
  • Обновления
  • Программы
  • Статьи
    • PHP
    • Python
    • JS
  • Дизайн
    • PSD исходники
  • DLE
    • Шаблоны
    • Модули
    • Хаки
  • Магазин
    • Скрипты
Комментарии
Система комментариев на PHP
<Script>Alert("hello");</Script>
Генерация всевозможных комбинаций из набора символов — комбинаторика в Python (itertools)
Qwertyuiopasdfghjklzxcvbnm 1234567890
Система комментариев на PHP
Полезная статья
Создание простого Telegram-бота с клавиатурой и inline-кнопками [Часть 2]
Класс, хорошая тема
Динамическая обложка для группы ВК, последний подписчик, топ комментатор и прочее
Как отключить вывод результата cron в папку modules/cron в Open Server? Крон запускает несколько
Все комментарии..
Полный список последних комментариев
Лучшие новости
Всего публикаций: 115
Добавлено за сутки: +0
Записей в блоге: 1
Добавлено за сутки: +0
Комментариев: 938
Добавлено за сутки: +0
Пользователей: 4125
Добавлено за сутки: +0
Полная статистика..
Подробная статистика сайта
Loading...

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

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

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

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

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

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