[VK BOT] Полезные функции для бота вк (Часть 2)
Статьи / PHP
Подготовка к работе с ботом:
1) Готовый скрипт к написанию команд бота. Можно использовать уже использованный, главное не запутаться куда нужно прописывать новые команды.
2) VK_API - варианта два: можно использовать уже имеющийся с прошлых статей. Либо качаем новую версию,
важно если вы собираетесь делать персональные настройки беседы, а также для команд из след. статьи (для команды Погода (не обязательно), перевод, кубик 1-6 ставка)
kotoff_net.zip
В этом архиве есть все нужные файлы. Берите всё что вам нужно на здоровье )
3) Желание сотворить хоть что-то и следовать инструкциям
P.S. Давненько я ничего не писал. Постараюсь не испортить эту статью и сделать всё по красоте, а также побыстрее выпустить 3 часть
Начнем мы с самого простого - это проверка на обращение к боту:
После проверки на тип сообщения
if ($data->type == 'message_new') { // Код бота, где и добавляем }
добавляем
if(in_array($cmd, ['бот', 'bot'])){
// В скором поясню что тут будет
}
Чтобы всё работало как надо, нам нужно получить не всю строку $cmd а лишь первое слово из строки, для этого давайте в переменных добавим новую переменную (в bot.php из архива выше этого делать не надо, т.к. там всё это уже подготовлено)
$messages = explode(" ", $message); // Разделяем строку на массив слов
$cmd = mb_strtolower(str_replace(array("/", "!"), "", $messages[0])); // Убираем / ! перед первым словом массива
$args = array_slice($messages, 1); // Создали массив из аргументов, которые идут после команды (а точнее мы просто убрали команду)
Думаю пояснить тут нужно $args, как с ним работать и для чего оно нужно нам:
1) Нужен он нам для получения например id пользователя после команды. Пришла команды !бан id... и под $args[0] будет находиться id...
Или допустим пришла команда !сообщение id... Как дела?, Тут под args[0] - id.. , args[1] - как, $args[2] - дела?, но нам нужно же передать сообщение под args[1 и 2], для этого уберем args[0] и после преобразуем остальное в строку: $get_text = implode(" ", array_slice($args, 1));
Таким образом мы преобразовали $args в строку и убрали от туда id..
Отлично, теперь давайте вернемся к проверки на обращение к боту.. Ой
А ведь можно было немного по другому написать команду, чем мы и займемся. А переменные наши еще пригодятся в таком виде
Давайте заменим
if(in_array($cmd, ['бот', 'bot'])){
на
if(in_array(mb_strtolower($messages[0]), ['бот', 'bot'])){
Теперь в теле этой проверки просто нужно отредактировать $args, $cmd
$messages = array_slice($messages, 1); // Убрали bot/бот в начале массива
$cmd = mb_strtolower(str_replace(array("/", "!"), "", $messages[0])); // Получили первое слово массива
$args = array_slice($messages, 1); // Получили аргументы без команды и обращения
А теперь добавим интересную вещь. Если вам нужно чтобы бот отвечал только тогда, когда обратились к нему, то после закрывающей скобки добавляем
else{
exit;
}
В итоге у меня получился такой код:
if(in_array(mb_strtolower($messages[0]), ['бот', 'bot'])){
$messages = array_slice($messages, 1); // Убрали bot/бот в начале массива
$cmd = mb_strtolower(str_replace(array("/", "!"), "", $messages[0])); // Получили первое слово массива
$args = array_slice($messages, 1); // Получили аргументы без команды и обращения
}else{
exit;
}
Команда 'созвать всех'
Для этого нам нужно превратить всю команду в строку и проверить её на текст:
if(implode(' ', $messages) == 'созвать всех'){
Далее нам нужно получить список пользователей и из него отправить уведомление каждому:
if(implode(' ', $messages) == 'созвать всех'){
$get_members = $vk->request('messages.getConversationMembers', ['peer_id' => $peer_id]); // Получили список пользователей беседы
foreach ($get_members['profiles'] as $member) { // Прошли по массиву для регистрации пользователей по их id
$user_id = $member['id']; // Получили id пользоавтеля
$vk->sendMessage($peer_id, "@id{$user_id} (Господа, вас созывают)"); // Отправили уведомление на полученный id пользователя
}
}
Вот и готова команда, но давайте добавим интересную штуку как проверка на админ права в беседе
Сделаем это через vk_api.php откройте этот файл и листайте в самый конец скрипта и перед последней скобкой создадим новую функцию с названием isAdmin. Можно просто скопировать и вставить перед ПОСЛЕДНЕЙ скобкой
public function isAdmin ($peer_id, $id)
{
$chatInfo = $this->request('messages.getConversationsById', ['peer_ids' => $peer_id, 'extended' => 0]);
if($id == $chatInfo['items'][0]['chat_settings']['owner_id'] || in_array($id, $chatInfo['items'][0]['chat_settings']['admin_ids'])){
return true;
}else{
return false;
}
}
public function isAdmin ($peer_id, $id)
Создали новую функцию с названием isAdmin и принимаемыми переменными (аргументами) id беседы и id пользователя
$chatInfo = $this->request('messages.getConversationsById', ['peer_ids' => $peer_id, 'extended' => 0]);
Запрос к вк о получении данных о беседе
if($id == $chatInfo['items'][0]['chat_settings']['owner_id'] || in_array($id, $chatInfo['items'][0]['chat_settings']['admin_ids'])
Произвели проверку на совпадение id пользователя с id администраторов и создателя
Если проверка прошла, то вернули значение true, а иначе false
Объясняю как теперь это использовать в скрипте бота. Вернемся к bot.php (или как у вас называется файл бота)
После проверки на команду 'Созвать всех' добавляем проверку if где обратимся к созданной нами функции
if($vk->isAdmin($peer_id, $id)){
// Тут код если человек является администратором
}else{
// Если человек не является администратором
}
Таким образом у нас получиться:
if(implode(' ', $messages) == 'созвать всех'){
if($vk->isAdmin($peer_id, $id)){
$get_members = $vk->request('messages.getConversationMembers', ['peer_id' => $peer_id]); // Получили список пользователей беседы
foreach ($get_members['profiles'] as $member) { // Прошли по массиву для регистрации пользователей по их id
$user_id = $member['id']; // Получили id пользоавтеля
$vk->sendMessage($peer_id, "@id{$user_id} (Господа, вас созывают)"); // Отправили уведомление на полученный id пользователя
}
}else{
$vk->sendMessage($peer_id, "У вас нет доступа к этой команде!");
}
Важно: для следующих команд обязательно нужна база данныхМетод подключения и работы с ней можете использовать свой, однако я буду делать как и ранее через readBeanPHP. Как подключить и настроить можно найти в прошлых статьях, но вкратце:
1) Скачать архив выше
2) Заменить на свои данные в файле db.php
3) Подключить db.php к ваще файлу бота (в архиве он уже подключен к bot.php)
4) Используем как в статье
Также нужно отметить, что для следующей команды нужен vk_api.php который находится в архиве!!
Регистрации беседы в базе с персональными настройками
После
if ($data->type == 'message_new') {
Добавим
if($chat_id > 0){//Проверка на чат
if(!$vk->isChatAdmin($peer_id)){ // Проверка на админку бота в чате (Важно: это из моего vk_api, где я сам это дописывал)
$vk->sendMessage($peer_id, "⚠ Мне необходимы права администратора ⚠"); // Уведомляем что не выдали
exit;
}
Теперь в ином случаем проверим на регистрацию настроек беседы. После закрывающей скобки
else{
$chat = R::findOne('settings', 'peer_id = ?', [$peer_id]); // Проверка на регистрацию настроек беседы в базе
if(!$chat){ // Если таковы отсутствую, то отправляем id беседы на регистрацию
$vk->registrationChat($peer_id);
}
}
}
Полный код
if($chat_id > 0){//Проверка на админкиу в чате
if(!$vk->isChatAdmin($peer_id)){
$vk->sendMessage($peer_id, "⚠ Мне необходимы права администратора ⚠");
exit;
}else{// проверка на регистрацию чата
$chat = R::findOne('settings', 'peer_id = ?', [$peer_id]);
if(!$chat){
$vk->registrationChat($peer_id);
}
}
}
Чтобы сделать беседам какие-то свои настройки, то заходим в vk_api.php, ищем функцию
registrationChat
и в редактируем регистрацию в записи для бд.
Теперь нужно сделать смену названия беседы в настройках, если его изменили в беседе
Теперь в скрипте бота после регистрации (и проверки на админку) мы добавим проверку на измену названия
if($chat_act->type == 'chat_title_update'){
//Замена в бд
}
Таким образом мы узнали о действии в беседе,
ВАЖНО! в переменных у вас должен быть$chat_act = $data->object->action;
А теперь давайте получим настройки для беседы и заменим название беседы на новое. Я использую RedBeanPHP, а вы можете использовать что-то другое, однако в статье всё работает через (связанное с бд) rb.php
В теле создадим новую переменную с настройками беседы
$chatSettings = R::findOne('settings', 'peer_id = ?', [$peer_id]);
В базе название записано в столбце 'title', давайте же получим пришедшее название и заменим его
$chatSettings->title = $chat_act->text //text из action является название беседы для данного случая
R::store($chatSettings);
Далее просто можно уведомить, что новое название было записано в бд
Итоговый код:
if($chat_act->type == 'chat_title_update'){
$chatSettings = R::findOne('settings', 'peer_id = ?', [$peer_id]);
$chatSettings->title = $chat_act->text
R::store($chatSettings);
$vk->sendMessage($peer_id, "💬 Новое название чата: {$chat_act->text}");
}
В след. части полезных функций:
- Аккаунты пользователей с балансом для игр и перевод денег другим пользователям
- Парочка игр на коины (валюта)
- Перевод коинов
- Команды: онлайн, погода
Разработка ботов на заказ, любой сложности, обращаться:
Новость отредактировал: アレクセイ サモシュキン - 18-09-2019, 14:43
Причина: Добавлена функция проверки на администратора беседы (в команде 'созвать всех')