[VK BOT] Полезные функции (команды) для бота вк
Статьи / PHP
Список функций:- !cmd - список команд, в зависимости от места запроса (лс сообщества или беседа)
- !kick - изменим команду исключения не от введенного id, а на пересланное сообщение
- !nick - дадим возможность использовать ники в чате
- !art - рандомное изображение из вашей группы вк
- АвтоКик при выходе из беседы
Подготовка:
Я буду использовать redBeanPHP. Как скачать и настроить можно посмотреть
тут или
тутТакже можно просто скачать готовый архив к написанию команд:
vk-bot.zip
(не забудьте изменить на свои данные)
Переменные должны быть следующие:
$peer_id = $data->object->peer_id; // Узнаем ИД беседы 2000000.....
$id = $data->object->from_id; // Узнаем ид пользователя который отправляет команду
$message = $data->object->text; // Текст самого сообщения
$cmd = mb_strtolower($message, 'utf-8'); // Изменили текст сообщение из БоТ в бот
$chat_id = $peer_id - 2000000000; // id беседы
!CMD:
Дадим ответ один при запросе в беседе и другой ответ при запросе в лс группы
Создадим команду !cmd, для этого просто проверим в пришедшем к нам сообщении на её наличие:
if ($data->type == 'message_new') { // Если это новое сообщение то выполняем код указанный в условии
if($cmd == '!cmd'){
}
}
Теперь надо проверить, где пришло это сообщение. Для этого проверим наш chat_id, если он будет меньше 0, то это личные сообщения группы
if($chat_id < 0){
//Это в группе
}else{
//Это в беседе
}
Дальше просто заполняем команды в первом случае для группы, во втором для бесед, у меня получиться так:
!KICK:
Для этой команды мы подготовим доп. переменные (имя пользователя) добавляем в начале перед обработкой команд:$userInfo = $vk->request("users.get", ["user_ids" => $id]);
$first_name = $userInfo[0]['first_name'];
Теперь мы можем в любой команде вывести имя пользователя. Приступим к самой команде, для неё добавим переменную $reply_author, где мы получили автора пересланного сообщения:
$reply_author = $data->object->reply_message->from_id; // автор пересланного сообщения
ВНИМАНИЕ!: Была найдена ошибка с киком, если версия API в самой группе вк стоит 5:81, то он не работает, в таком случае измените его на 5:92 и выше, на этих версиях проблем нет.
Теперь приступим к команде
if($cmd == '!kick'){
if($reply_author == ''){
$vk->sendMessage($peer_id, "@id{$id} ({$first_name}), вы не указали человека, которого нужно исключить (перешлите любое его сообщение)");
}else{
//Будущий код исключения
}
}
для этого просто используем messages.removeChatUser при помощи $vk->request:
$vk->request('messages.removeChatUser', ['chat_id' => $chat_id, 'member_id' => $reply_author]);
Давайте перед этим попрощаемся с этим человеком, для этого нужно отправить простое сообщение используя ссылку на пользователя. Такие ссылки делаются очень просто (выше уже использовали)
@id(числовой id пользователя без скобок, кавычек и т.п.) (в скобках указываем как его будем называть)
У меня это выглядит так, код ниже под спойлером
if($cmd == '!kick'){
if($reply_author == ''){
$vk->sendMessage($peer_id, "@id{$id} ({$first_name}), вы не указали человека, которого нужно исключить (перешлите любое его сообщение)");
}else{
$userInfo_reply = $vk->request("users.get", ["user_ids" => $reply_author]);
$first_name_reply = $userInfo[0]['first_name'];
$vk->sendMessage($peer_id, "@id{$reply_author} ({$first_name_reply}), прощайте");
$vk->request('messages.removeChatUser', ['chat_id' => $chat_id, 'member_id' => $reply_author]);
}
}
!NICK:
Давайте дадим возможность пользователям использовать свои никнеймы, для этого нужна база и соединение к ней. Подробнее можно прочитать в прошлых статьях (моих т.к. я буду использовать RedBeanPHP):
[VK BOT] Бот раздающий ключи Steam или
[Часть 1] Написание своего сайта. Регистрация и АвторизацияПосле чего мы создадим саму команду и проверим на наличие пользователя в базе. Для начала нам нужно обрезать сообщение и узнать что нам отправили, что делается прям в самой проверке:
if(mb_substr($cmd,0,5) == '!nick'){
$get_user = R::findOne('users', 'user_id = ?', [$id]);
if($get_user){
//Пользователь существует
}else{
//Такой пользователь отсутствует из-за чего создадим его
}
}
Теперь нужно от сюда выразить текст после команды, что нужно делать из $message чтобы ник оставался таким, каким его задал пользователь, для этого после проверки команды создадим новую переменную с ником:
$new_nick = mb_substr($message, 6);
Теперь нужно записать пользователя, для чего выберем базу при помощи:
R::dispense('название');
Теперь нужно заполнить поля будущей строки в нашей базе:
$new_user->user_id = $id;
$new_user->nick = $new_nick;
И записать их в базу:
R::store($new_user);
В итоге получиться:
if(mb_substr($cmd,0,5) == '!nick'){
$new_nick = mb_substr($message, 6);
$get_user = R::findOne('users', 'user_id = ?', [$id]);
if($get_user){
//Пользователь существует
}else{
$new_nick = mb_substr($message, 6);
$new_user = R::dispense('users');
$new_user->user_id = $id;
$new_user->nick = $new_nick;
R::store($new_user);
}
}
Теперь давайте менять ник существующему пользователю в базе, для этого нужно просто в найденном пользователе заменить наш столбец с ником:
$get_user->nick = $new_nick;
R::store($get_user);
Остается уведомить пользователя, что его называем теперь $new_nick
$vk->sendMessage($peer_id, "@id{$id} ($first_name), теперь именуется как {$new_nick}");
Итогом получилась команда:
if(mb_substr($cmd,0,5) == '!nick'){
$new_nick = mb_substr($message, 6);
$get_user = R::findOne('users', 'user_id = ?', [$id]);
if($get_user){
$get_user->nick = $new_nick;
R::store($get_user);
}else{
$new_nick = mb_substr($message, 6);
$new_user = R::dispense('users');
$new_user->user_id = $id;
$new_user->nick = $new_nick;
R::store($new_user);
}
$vk->sendMessage($peer_id, "@id{$id} ($first_name), теперь именуется как {$new_nick}");
}
Но бот меняет ник даже когда мы отправили просто !nick, давайте исправим (признаю свою ошибку, но у меня сейчас 22:46, надеюсь простите). Для этого просто нужно после $new_nick проверить на его пустоту:
if($new_nick != ''){
После чего идет выше написанный скрипт, потом закрываем эту проверку и пишем действие в else
}else{
$vk->sendMessage($peer_id, "@id{$id} (Вы) не указали желаемое имя");
}
Итог:
if(mb_substr($cmd,0,5) == '!nick'){
$new_nick = mb_substr($message, 6);
if($new_nick != ''){
$get_user = R::findOne('users', 'user_id = ?', [$id]);
if($get_user){
$get_user->nick = $new_nick;
R::store($get_user);
}else{
$new_nick = mb_substr($message, 6);
$new_user = R::dispense('users');
$new_user->user_id = $id;
$new_user->nick = $new_nick;
R::store($new_user);
}
$vk->sendMessage($peer_id, "@id{$id} ($first_name), теперь именуется как {$new_nick}");
}else{
$vk->sendMessage($peer_id, "@id{$id} (Вы) не указали желаемое имя");
}
}
!art:
Данная команда будет выводить нам одно рандомное изображение из альбома вк. Для этого в команде !art создайте массив:
if($cmd == '!art'){
$img = [];
}
Внутри скобок заполняйте id изображений вместе с владельцем, получить их можно из адресной строки открытого изображения:
Если этот id начинается с минуса, то его обязательно оставляем (это указывает что автором является группа), после чего такие id заносим в наш массив, пример:
$img = ['-183754490_456239026', '-183754490_456239025', '-183754490_456239024', '-183754490_456239023', '-183754490_456239022'];
Теперь нам нужно выбрать одно из них рандомным способом:
$rand_img = array_rand($img, 1);
При помощи array_rand мы выбрали одно изображение из массива (т.е. id слота в массиве), теперь давайте отправим его, для этого мы будем отправлять простое сообщение, но с дополнительным атрибутом из-за чего используем request:
$vk->request('messages.send', ['peer_id' => $peer_id, 'message' => 'Красивая не правда ли?', 'attachment' => "photo{$img[$rand_img]}"]);
'peer_id' => Переменная - используем $peer_id если бот должен отправлять в беседу или $id если отправляем личным сообщением пользователю
'message' => переменная - не обязательно, но я решил отправить сообщение 'Красивая не правда ли?'
'attachment' => "типа{переменная со всеми изображениями[сгенерированный id слота]" - Используем двойные кавычки ОБЯЗАТЕЛЬНО т.к. в одинарных нельзя указывать { } (переменные). мы к нашему id (владелец_фотография) прикрепили что это тип Фотографии и таким образом прикрепили его.
Автокик при выходе из беседы:
Для данного случая нам нужно получить акт, который произошел с пользователем, добавляем ко всем переменным:
$chat_act = $data->object->action; // получаем действие, которое совершил пользователь (присоединился или покинул беседу)
В конце проверок на команды добавим:
if($chat_act->type == 'chat_kick_user'){
// Исключаем
}
В данном случае мы проверили, что пользователь покинул беседу ('chat_kick_user'), также можно проверить на любое другое действие, о которых вы можете узнать в
разделе разработчиков VKТеперь исключим из беседы этого пользователя,ничего сложного нет. Это как !kick, только без команды (
)
$vk->request('messages.removeChatUser', ['chat_id' => $chat_id, 'member_id' => $chat_act->member_id]);
В данном случае мы просто заменили $reply_author на id пользователя который указан в массиве с действием
Можно еще попрощаться с пользователем как я:
if($chat_act->type == 'chat_kick_user'){
$userInfo = $vk->request("users.get", ["user_ids" => $id]);
$first_name = $userInfo[0]['first_name'];
$vk->sendMessage($peer_id, "@id{$chat_act->member_id} ({$first_name}) был исключен");
$vk->request('messages.removeChatUser', ['chat_id' => $chat_id, 'member_id' => $chat_act->member_id]);
}
Это конец, если найдете какие-то недочеты, то пишите в комментариях
(во время написания произошел съезд фрагментов кода из-за чего могут попадаться недочеты)
Также хочу вам показать фрагмент кода, как сделать переменную $nick, а не каждый раз получать её из базы. Для этого в начале кода (где получали имя) допишите:
$get_user = R::findOne('users', 'user_id = ?', [$id]);
$nick = $get_user['nick'];
if(!$nick){
$nick = $first_name;
}
При обращении по нику мы получаем (в первом случае, если не зарегистрировать пользователь в нашей базе, второй наоборот):
Разработка ботов на заказ, любой сложности, обращаться: