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

[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..

Отлично, теперь давайте вернемся к проверки на обращение к боту.. Ой  sweat_smile А ведь можно было немного по другому написать команду, чем мы и займемся. А переменные наши еще пригодятся в таком виде  blush
Давайте заменим 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}");
  }



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


Разработка ботов на заказ, любой сложности, обращаться:
 VK Дмитрий Котов, Сергей Котов mail: [email protected]
TELEGRAM: @seriamod
Новость отредактировал: アレクセイ サモシュキン - 18-09-2019, 14:43
Причина: Добавлена функция проверки на администратора беседы (в команде 'созвать всех')
  • アレクセイ サモシュキン
  • 04.09.2019
  • 18 277
  • 29
[VK BOT] Полезные функции (команды) для бота вк
[VK BOT] Полезные функции (команды) для бота вк
24-07-2019, 15:30, Статьи / PHP
Обновление бота VK Conference Kot до версии 3.1
Обновление бота VK Conference Kot до версии 3.1
24-01-2019, 02:53, Обновления
Скрипт исключения из беседы VK и не только, написанный на PHP
Скрипт исключения из беседы VK и не только, написанный на PHP
21-02-2019, 04:04, Статьи / PHP
Создаем собственного бота VK, подробная инструкция как создать бота VK за 5 минут!
Создаем собственного бота VK, подробная инструкция как создать бота VK за 5 минут!
16-01-2019, 06:02, Статьи / PHP
  1. Emil Guseynov

    Emil Guseynov@imillka 8 сентября 2019 11:31

    Спасибо за статью! Еще интересно, как отправить голосовое сообщение? Допустим на сервере лежит .ogg файл. Попробовал по такому же принципу как с картинками, но не получилось.
    1. アレクセイ サモシュキン

      アレクセイ サモシュキン@アレクセイ 8 сентября 2019 12:15

      https://vk.com/dev/bots_docs_2?f=3.2.%2BВложения
      Читайте в 3.2 под загрузкой документа, там описано как отправить ГС от бота
      1. Emil Guseynov

        Emil Guseynov@imillka 8 сентября 2019 12:26

        Разобрался, спасибо
  2. Никита Майоров

    Никита Майоров@Никита Майоров 8 сентября 2019 14:51

    Полезна была была функция записывания голосовых сообщений. Команда «голос [текст]», и бот присылает голосовое сообщение с этим текстом.

    Также хотелось бы видеть автоматичекую функцию распознавания этих голосовых  сообщений. Пользователь прислал сообщение - бот обработал и выдал текст из этого голосового.
    1. アレクセイ サモシュキン

      アレクセイ サモシュキン@アレクセイ 9 сентября 2019 02:58

      Первое также есть в документации вк, почитайте. Если сами не найдете напишите помогу найти
      Второе можно на подобии первого сделать, единственное что сервис с записи на распознавание сменится
      1. Никита Майоров

        Никита Майоров@Никита Майоров 9 сентября 2019 13:55

        Не нашел:(
        1. アレクセイ サモシュキン

          アレクセイ サモシュキン@アレクセイ 9 сентября 2019 14:59

          https://vk.com/dev/bots_docs?f=Примеры%2Bреализации
          На GitHub
          https://github.com/VKCOM/bot-example-php
          1. Никита Майоров

            Никита Майоров@Никита Майоров 9 сентября 2019 17:16

            Спасибо.
  3. Артем Фриз

    Артем Фриз@Артем Фриз 14 сентября 2019 06:27

    ЧОтка


  4. Илья Говорухин

    Илья Говорухин@Илья Говорухин 16 сентября 2019 17:00

    Кто может помочь с базой к этому боту? SQL не лучший мой конек, а без него бот отказывается работать.
    1. Нео Метал

      Нео Метал@Infinite 21 сентября 2019 12:42

      почитай как работать с mysqli(документация: https://www.php.net/manual/ru/book.mysqli.php) или redbeanphp(на котоффе, или же тут уже эту штуку расписали: https://kotoff.net/article/36-rabota-s-bazoj-dannyh-phpmyadmin-cherez-redbeanph
      p.html). если будешь использовать mysqli, заменяй везде redbeanphp на его.
      да и sql простой. почитай о нём, поймёшь всё. я его за час выучил до нужного минимума.
  5. FunNikita

    FunNikita@FunNikita 17 сентября 2019 20:03

    Как можно через команду обновить аватарку группы? (Фото - image.png)
  6. skaen

    skaen@Alexander 17 сентября 2019 22:58

    Держу небольшой проект по серверам CS:GO и твои статьи сподвигли на создание чат-бота для общей беседы пользователей.
    Спасибо большое за отличные статьи, а так же прикрепленные ссылки на github репозитории
  7. kikikhoo

    kikikhoo@Sho Nado 25 марта 2020 01:15

    Как сделать так, чтоб когда я созывал по команде, все было в одну строчку ?
    https://sun9-9.userapi.com/c857732/v857732924/1ac126/f2Gojzf_0to.jpg
    1. Clyrow

      Clyrow@Teo Xidi 10 апреля 2020 08:07

      if(implode(' ', $messages) == 'созвать всех'){
          $get_members = $vk->request('messages.getConversationMembers', ['peer_id' => $peer_id]);
          foreach ($get_members['profiles'] as $member) {     
          $user_id = $member['id'];
          $list .= "@id{$user_id} (̅)";
          }
          $vk->sendMessage($peer_id, "Господа, вас созывают\n$list"); 

      Не знаю на сколько нормально это будет работать, не тестил
  8. Clyrow

    Clyrow@Teo Xidi 10 апреля 2020 07:50

    Я бы в команде "Созвать всех" написал следующий код:
    if(implode(' ', $messages) == 'созвать всех'){    
    $get_members = $vk->request('messages.getConversationMembers', ['peer_id' => $peer_id]);
    foreach ($get_members['profiles'] as $member) {     
    $user_id = $member['id'];
    $callInfo = $vk->request("users.get", ["user_ids" => $member['id'], "fields" => "last_seen"]);
    $user_name = $callInfo[0]['first_name'];
    $list .= "@id{$user_id} ({$user_name}), ";
    }
    $list .= "\n\n💎 Участник @id{$id} ({$first_name}) созывает всех!";
    $vk->sendMessage($peer_id, "$list");

    В первом случае будет один флуд



    1. TREiV

      TREiV@Дмитрий Котов 10 апреля 2020 14:59

      Да, это более правильное решение :)
  9. andhors

    andhors@Алексей Голубев 18 апреля 2020 13:40

    Вопрос наверное странный, но как получить текущее название беседы?

    1. Clyrow

      Clyrow@Teo Xidi 18 апреля 2020 20:41

      $testname = $vk->request('messages.getConversationsById', ['peer_ids' => $peer_id]); 
      $title_peer = $testname['items'][0]['chat_settings']['title'];

      $title_peer - Является переменной с названием беседы...
      Одно примечание. Чтобы бот получил название, он должен быть админом


      1. andhors

        andhors@Алексей Голубев 18 апреля 2020 22:21

        Благодарю

        Благодарю
  10. andhors

    andhors@Алексей Голубев 26 апреля 2020 14:43

    Опять обращаюсь за помощью сюда.  Как сделать так, чтобы бот прикреплял картинку к сообщению?
  11. Роман Карпов

    Роман Карпов@Роман Карпов 26 апреля 2020 20:37

    Я реализовал это так:
    if ($cmd == 'команда, по которой будет выдаваться нужная фотография'){
        $img = ['id пользователя_id фото']; // для этого фото должно лежать в вк
        $rand_img = array_rand($img, 1);
        $vk->request('messages.send', ['peer_id' => $peer_id, 'attachment' => "photo{$img[$rand_img]}"]);
    }
  12. Константин Авдонин

    Константин Авдонин@Константин Авдонин 30 мая 2020 09:41

    Помогите подключить ! бота Просит выдать права админа чата, выдаю пишу команды не на одну не реагирует, у кого так было?

    $vk = new vk_api(VK_KEY, VERSION);
    $data = json_decode(file_get_contents('php://input'));
    //print_r($data);
    if ($data->type == 'confirmation') {
        exit(ACCESS_KEY);
    }
    $vk->sendOK();
    // ---------- Переменные ----------
    $peer_id = $data->object->peer_id;
    $id = $data->object->from_id;
    $chat_id = $peer_id - 2000000000;
    // ---------- Сообщение ----------
    $message = $data->object->text;
    $messages = explode(" ", $message);
    $cmd = mb_strtolower(str_replace(array("/", "!"), "", $messages[0]));
    $args = array_slice($messages, 1);
    $reason = implode(" ", $args);
    // ---------- Другое ----------
    $reply_message = $data->object->reply_message;
    $reply_author = $data->object->reply_message->from_id;
    $chat_act = $data->object->action;
    $fwd_messages = $object['fwd_messages'];
    if(empty($fwd_messages) && !empty($reply_message)) {
      array_push($fwd_messages, $reply_message);
    }
    if(empty($reply_message) && !empty($fwd_messages)) {
      $reply_message = $fwd_messages[0];
    }
    if ( !R::testConnection() )
    {
        $vk->sendMessage($peer_id, "Нет соединения с базой данных, обратитесь к администраторам ");
        exit;
    }
    if ($data->type == 'message_new') {
      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);
          }
        }
     
    1. Clyrow

      Clyrow@Teo Xidi 30 июня 2020 19:45

      Во-первых. Вы прописывали константы с токеном и версией API? Обычно это делается с помощью "const TOKEN = "ТОКЕН СООБЩЕСТВА";"

      Во-вторых. Вы подключили базу данных вместе с RedBeans? Это делается через "require"

      В-третьих. Лучше регистрировать беседу самостоятельно:
      $newpeer = R::dispense("settings");
      $newpeer->peer_id = $peer_id;
      $newpeer->owner = $id;
      R::store($newpeer);

      В-четвёртых. Я не заметил в коде команд, которые отвечали бы сообщениями 
  13. andhors

    andhors@Алексей Голубев 11 июня 2020 21:50

    Кто может подсказать, как сделать так, чтобы бот отвечал на сообщение? Т.е пересылал его
    1. Clyrow

      Clyrow@Teo Xidi 30 июня 2020 19:52

      Можно указать в аргументах через метод "messages.send"
      К сожалению данный метод не работает в группах, так как ВК не хранит message_id, но примерно выглядит вот так:
      $vk->request('messages.send', ['peer_id' => $peer_id, 'message' => "Сообщение", 'reply_to' => "ИДЕНТИФИКАТОР СООБЩЕНИЯ"]);


  14. andhors

    andhors@Алексей Голубев 20 августа 2020 16:36

    И еще вопросик. Как получить вложение, если оно прикреплено к сообщению? Допустим фото, музыка или видео.
  15. Евгений

    Евгений Гость 14 октября 2022 23:58

    Как получить айди всех тех кто есть в беседе ,нигде найти не могу

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

      Сергей Котов@Сергей Котов 15 октября 2022 13:43

      В статье же есть эта информация:

      $get_members = $vk->request('messages.getConversationMembers', ['peer_id' => $peer_id]); // Получили список пользователей беседы


{login}

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

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

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

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