Сегодня напишем бота, который будет логировать все оставляемые комментарии в вашей группе. Также с помощью inline-кнопок добавим возможность быстрой блокировки пользователей и удаления всего того, что они успели понаписать.
Шаг 1: Ключ доступа сообщества
Начинаем с подготовки сообщества:
Первый этап уже позади, переходим к следующему.
Шаг 2: Ключ доступа пользователя
Для удаления комментариев и выдачи банов потребуется ещё один ключ - пользовательский ключ. Получать его мы будет в Standalone-приложении через Implicit Flow:
Шаг 3: Скрипт
Начинаю с подключения библиотеки и создания некоторых констант:
<?php
require_once 'simplevk-master/autoload.php'; // Подключение библиотеки SimpleVK
const VK_KEY = '**********************'; // Ключ доступа сообщества
const VK_USER_KEY = '***********************'; // Ключ доступа пользователя
const ACCESS_KEY = '7a6e4873'; // Строка, которую должен вернуть сервер
const VERSION = '5.131'; // Версия API
const BOT_ENABLED = true; // Константа, отвечающая за статус бота (вкл/выкл)
const CONF_LOG_ID = **********; // Айди беседы, в которой будут логироваться комменты
const GROUP_ID = **********; // Айди вашей группы
const EXCEPTION_USERS = array (
123456789,
987654321,
); // Массив с айдишниками юзеров, на чьи комментарии бот реагировать не будет
Проверяем, включён ли бот (константа BOT_ENABLED). Внутри этой конструкции будем писать весь остальной код:
if ( BOT_ENABLED ) // Проверка на включённость бота
{
// Тут продолжим
}
Авторизируемся с помощью двух ключей, которые мы получили ранее, а также инициализируем основные переменные для работы с ботом:
$vk = \DigitalStar\vk_api\vk_api::create( VK_KEY, VERSION )->setConfirm( ACCESS_KEY ); // Авторизация с помощью ключа сообщества
$vk_user = \DigitalStar\vk_api\vk_api::create( VK_USER_KEY, VERSION ); // Авторизация с помощью ключа пользователя
$vk->initVars( $peer_id, $message, $payload, $vk_id, $type, $data ); // Инициализация переменных
Далее вставляем конструкцию if-elseif, с помощью которой будем определять тип события. Всего событий будет 3: новое сообщение (messge_new), новый комментарий (wall_reply_new), редактирование комментария (wall_reply_edit):
if ( $type == 'message_new' )
{
// Тут продолжим писать код
}
else if ( $type == 'wall_reply_new' or $type == 'wall_reply_edit' )
{
// Тут продолжим писать код
}
Итак, начнём с логирования, дабы соблюдать не запутаться в командах и кнопках:
else if ( $type == 'wall_reply_new' or $type == 'wall_reply_edit' )
{
if ( in_array( $data->object->from_id, EXCEPTION_USERS ) )
exit; // Если пользователь в списке исключений, то завершаем работу скрипта
$userInfo = $vk->userInfo( $data->object->from_id, $scope = [ 'first_name', 'last_name', 'sex' ] ); // Получаем имя, фамилию и пол юзера
$end = $userInfo['sex'] == 1 ? 'а' : ''; // Если пол женский - добавленям окончание 'а' для глагола
$do = $type == 'wall_reply_new' ? 'оставил' . $end . ' новый' : 'изменил' . $end . ' свой';
$is_member = $vk->request( 'groups.isMember', $params = [ 'group_id' => GROUP_ID, 'user_id' => $userInfo['id'] ] ) ? 'Подписчик ' : ''; // Если юзер является подписчиком сообщетсва, то добавляем соответсвующую приписку к сообщению бота
$del_btn = $vk->buttonText( 'Удалить', 'red', [ 'command' => 'del_' . $data->object->owner_id . '_' . $data->object->id ] ); // Формируем команду для кнопки 'Удалить', записываем в неё айди юзера и айди комментария
$ban_btn = $vk->buttonText( 'Забанить', 'red', [ 'command' => 'ban_' . $data->object->owner_id . '_' . $data->object->id . '_' . $data->object->from_id ] ); // Формируем команду для кнопки 'Забанить', записываем в неё айди юзера и айди комментария
$vk->sendButton( CONF_LOG_ID, $is_member . '@id' . $userInfo['id'] . '(' . $userInfo['first_name'] . ' ' . $userInfo['last_name'] . ')' . $do . ' комментарий', [ [ $del_btn, $ban_btn ] ], true, false, $params = [ 'attachment' => 'wall' . $data->object->owner_id . '_' . $data->object->id ] ); // Отправляем сообщение с inline-кнопками и прикрепленным комменом
}
Теперь перехожу к обработке команд на удаление комментариев и блокировку пользователей. Сразу добавляю команду '/айди' для быстрого просмотра айди беседы:
if ( $type == 'message_new' )
{
if ( $message == '/айди' and $peer_id > 2000000000 ) {
$vk->sendMessage( $peer_id, $peer_id );
}
// Тут продолжим
}
Получаем payload:
if ( $type == 'message_new' )
{
if ( $message == '/айди' and $peer_id > 2000000000 ) {
$vk->sendMessage( $peer_id, $peer_id );
}
if ( isset( $data->object->payload ) )
$payload = json_decode( $data->object->payload, true );
else
$payload = null;
$payload = $payload['command'];
// Тут продолжим
}
Если payload не пустой, значит пользователь использовал кнопки. Соответственно, необходимо обработать это нажатие. Напомню, что команды кнопок имеют у нас следующий вид: действие_айди-пользователя_айди-комментария. Поэтому нужно разбить эту строку на массив с помощью функции explode():
if ( $type == 'message_new' )
{
if ( $message == '/айди' and $peer_id > 2000000000 ) {
$vk->sendMessage( $peer_id, $peer_id );
}
if ( isset( $data->object->payload ) )
$payload = json_decode( $data->object->payload, true );
else
$payload = null;
$payload = $payload['command'];
if ( $payload !== null )
{
$command = explode( '_', $payload );
// Тут продолжим
}
}
Удаление комментариев:
if ( $command[0] == 'del' ) // Если была нажата кнопка 'Удалить'
{
try
{
$vk_user->request( 'wall.deleteComment', $params = [ 'owner_id' => $command[1], 'comment_id' => $command[2] ] ); // Удаление комментария
$vk->sendMessage( CONF_LOG_ID, 'Комментарий удалён' ); // Отправление в беседу сбщ о том, что комментарий был успешно удалён
}
catch ( \DigitalStar\vk_api\VkApiException $e )
{
$vk->sendMessage( CONF_LOG_ID, 'Произошла ошибка. Возможно, комментарий уже удалён.' ); // Уведомление об ошибке
}
}
Блокировка пользователя с удалением его комментария:
else if ( $command[0] == 'ban' ) // Если была нажата кнопка 'Забанить'
{
try
{
$vk_user->request( 'wall.deleteComment', $params = [ 'owner_id' => $command[1], 'comment_id' => $command[2] ] ); // Удаление комментария
$vk_user->request( 'groups.ban', $params = [ 'group_id' => GROUP_ID, 'owner_id' => $command[3], 'comment' => '*Причина*', 'comment_visible' => 1 ] ); // Бан пользователя,
$vk->sendMessage( CONF_LOG_ID, 'Пользователь заблокирован' );
}
catch ( \DigitalStar\vk_api\VkApiException $e )
{
$vk->sendMessage( CONF_LOG_ID, 'Произошла ошибка. Возможно, пользователь уже заблокирован или его комментарий был удалён.' );
}
}
Хочу обратить внимание на строку с занесением юзера в ЧС:
$vk_user->request( 'groups.ban', $params = [ 'group_id' => GROUP_ID, 'owner_id' => $command[3], 'comment' => '*Причина бла бла*', 'comment_visible' => 1 ] );
В параметре 'comment' указывается причина блокировки. В параметре 'comment_visible' - значение 1, если пользователю будет видна причина, значение 0 - если нет. Так вот, причину можно либо сразу вписать какую-то стандартную на все случаи жизни, либо удалить оба этих параметра из строки (они необязательны).
Шаг 4: Смотрим, как работает
На этом, пожалуй, всё. Архив с исходниками прикреплён ниже.
Перед публикацией, советую ознакомится с правилами!
Нашли ошибку?
Вы можете сообщить об этом администрации.
Выделив текст нажмите CTRL+Enter