VK BOT Полезные функции для бота вк (Часть 2) » KOTOFF.net
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
  • 9 409
  • 27
[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 под загрузкой документа, там описано как отправить ГС от бота

    2. Emil Guseynov

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

      Разобрался, спасибо

  2. Никита Майоров

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

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

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

    1. アレクセイ サモシュキン

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

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

    2. Никита Майоров

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

      Не нашел:(

    3. アレクセイ サモシュキン

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

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

    4. Никита Майоров

      Никита Майоров@Никита Майоров 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 - Является переменной с названием беседы...
      Одно примечание. Чтобы бот получил название, он должен быть админом


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

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

{login}

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

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

  • Новости
  • Блог
  • Игры
  • Обновления
  • Программы
  • Статьи
    • PHP
    • Python
  • Магазин
Комментарии
Авторизация на сайте с помощью ВК, простой и понятный способ на PHP!
В настройках приложения какой урл для редиректа указали?
Авторизация на сайте с помощью ВК, простой и понятный способ на PHP!
{"error":"invalid_request","error_description":"redirect_uri is incorrect, check application
Python и LongPoll VK, или как запустить скрипт ВК и настроить Python, для новичков
откуда наследуется peer_id - не возвращает его. Скорее всего потому, что получение peer_id идёт до
Python и LongPoll VK, или как запустить скрипт ВК и настроить Python, для новичков
Помогите, всё работает, но при отправке сообщения боту, выходит ошибка Traceback (most recent call
[VK BOT] Бот раздающий ключи Steam
keys users Но если память мне не изменяет, библиотека RB сама создает таблицы
Все комментарии..
Полный список последних комментариев
Лучшие новости
Делаем отображение статистики за день, неделю месяц и все время PHP простой и удобный способ

Делаем отображение ...

14-02-2021, 22:30
Прием авто платежей в своем боте с самым низким процентом, используем VLITO.ru

Прием авто платежей в своем ...

22-02-2021, 22:08
Всего публикаций: 47
Добавлено за сутки: +0
Записей в блоге: 0
Добавлено за сутки: +0
Комментариев: 684
Добавлено за сутки: +0
Пользователей: 3003
Добавлено за сутки: +1
Полная статистика..
Подробная статистика сайта
Loading...

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

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

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

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

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

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