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

Карусели для бота ВК на библиотеке SimpleVK2 (ч2)

Статьи / PHP

Летом я писал статью по созданию каруселей для бота ВК, использовав при этом последнюю (третью) ветку SimpleVK. Сегодня же сделаем то же самое, но только на старой версии библиотеки. В особенности это может быть полезно тем, кто не имеет возможности переделывать своих старых ботов под новый релиз SimpleVK.


Для каруселей нам понадобится токен с доступом к сообщениям. В прошлой статье мы также ставили доступ к фотографиям, однако сейчас этого делать не придётся. Почему - потому что в текущей версии библиотеки, к сожалению, нет встроенной возможности для загрузки изображений. Да, это можно сделать самостоятельно, но сегодня не об этом. Я вручную залью фотки в группу, а далее скопирую их айди (из адресной строки):



Да, и библиотеку мне всё же пришлось немного доработать, ведь в дефолтной версии каруселей в ней не было. Это ни коем образом не повлияет на её функционал и принцип работы. Кастомную версию прикрепляю сразу, также полный архив будет в конце статьи:

simplevk-master.zip


Итак, теперь переходим к делу. Создаём php-файл, в котором сразу подключаем библиотечку и прописываем три константы:

<?php

require_once 'simplevk-master/autoload.php';


const TOKEN = 'токен';
const API_VERSION = '5.131';
const CONFIRM_KEY = 'ключ подтверждения callback-сервера';


Создаём экземпляр класса vk_api, инициализируем переменные:

$vk = \DigitalStar\vk_api\vk_api::create( TOKEN, API_VERSION )->setConfirm( CONFIRM_KEY );
$vk->initVars( $peer_id, $message, $payload, $user_id, $type, $data );


Добавляем конструкцию для обработки команды:

if ( $type == 'message_new' )
{


    if ( $message == '/' )
    {

        // Тут продолжим делать карусели

    }


}


В класс vk_api я добавил метод carousel() для инициализации нового элемента карусели, который возвращает экземпляр также добавленного класса Carousel:

public function carousel()
{
    $config = [];
    $this->config['carousel'][] = &$config;

    return Carousel::create( $config );
}


А вот класс Carousel переехал из третьей ветки без существенных изменений, поэтому дальше структура кода будет такой же, как и в прошлый раз. В качестве образца сделаю карусель с некими товарами. Например, с телефонами. Выглядеть это будет +/- так:

$vk->carousel()
    // ->action( 'https://yandex.ru' ) // Ссылка, на которую перекинет пользователя при клике
    ->title( 'iPhone 14 Pro Max 114.999 ₽' ) // Заголовок элемента карусели
    ->description( 'Три камеры, экран диагональю 6,7 дюйма, <...>, с Dynamic Island' ) // Описание элемента карусели
    ->img( '-214118756_457239032' ) // Изображение
    ->kbd( [ $vk->buttonOpenLink( 'https://kotoff.net', 'Купить' ) ] ); // Кнопка/кнопки


Чтобы добавить в карусель ещё несколько элементов - дублируем этот кусок кода нужное количество раз:

$vk->carousel()
    // ->action( 'https://yandex.ru' )
    ->title( 'iPhone 14 Pro 109.999 ₽' )
    ->description( 'Три камеры, экран диагональю 6,1 дюйма, <...>, с Dynamic Island' )
    ->img( '-214118756_457239031' )
    ->kbd( [ $vk->buttonOpenLink( 'https://kotoff.net', 'Купить' ) ] );

$vk->carousel()
    // ->action( 'https://yandex.ru' )
    ->title( 'iPhone 14 Plus 94.999 ₽' )
    ->description( 'Две камеры, экран диагональю 6,7 дюйма, <...>, без Dynamic Island' )
    ->img( '-214118756_457239030' )
    ->kbd( [ $vk->buttonOpenLink( 'https://kotoff.net', 'Купить' ) ] );

$vk->carousel()
    // ->action( 'https://yandex.ru' )
    ->title( 'iPhone 14 84.999 ₽' )
    ->description( 'Две камеры, экран диагональю 6,1 дюйма, <...> без Dynamic Island' )
    ->img( '-214118756_457239029' )
    ->kbd( [ $vk->buttonOpenLink( 'https://kotoff.net', 'Купить' ) ] );


Осталось только отправить карусель пользователю. Для этого используем добавленный метод sendCarousel():

$vk->sendCarousel( $peer_id, 'Карусель' );


Выглядит метод, кстати, вот так:

public function sendCarousel( $peer_id, $message, $params = [] )
{
    $carousel = $this->generateCarousel();
    
    return $this->request( 'messages.send',
        [ 'message' => $message, 'peer_id' => $peer_id, 'template' => $carousel ] + $params );
}


Теперь проверим, как работает наш мини-бот:


Весь код:

<?php

require_once 'simplevk-master/autoload.php';


const TOKEN = 'токен';
const API_VERSION = '5.131';
const CONFIRM_KEY = 'ключ подтверждения callback-сервера';


$vk = \DigitalStar\vk_api\vk_api::create( TOKEN, API_VERSION )->setConfirm( CONFIRM_KEY );
$vk->initVars( $peer_id, $message, $payload, $user_id, $type, $data );



if ( $type == 'message_new' )
{


    if ( $message == '/' )
    {

        $vk->carousel()
            // ->action( 'https://yandex.ru' ) // Ссылка, на которую перекинет пользователя при клике
            ->title( 'iPhone 14 Pro Max 114.999 ₽' ) // Заголовок жлемента карусели
            ->description( 'Три камеры, экран диагональю 6,7 дюйма, <...>, с Dynamic Island' ) // Описание элемента карусели
            ->img( '-214118756_457239032' ) // Изоюражение
            ->kbd( [ $vk->buttonOpenLink( 'https://kotoff.net', 'Купить' ) ] ); // Кнопка/кнопки

        $vk->carousel()
            // ->action( 'https://yandex.ru' )
            ->title( 'iPhone 14 Pro 109.999 ₽' )
            ->description( 'Три камеры, экран диагональю 6,1 дюйма, <...>, с Dynamic Island' )
            ->img( '-214118756_457239031' )
            ->kbd( [ $vk->buttonOpenLink( 'https://kotoff.net', 'Купить' ) ] );

        $vk->carousel()
            // ->action( 'https://yandex.ru' )
            ->title( 'iPhone 14 Plus 94.999 ₽' )
            ->description( 'Две камеры, экран диагональю 6,7 дюйма, <...>, без Dynamic Island' )
            ->img( '-214118756_457239030' )
            ->kbd( [ $vk->buttonOpenLink( 'https://kotoff.net', 'Купить' ) ] );

        $vk->carousel()
            // ->action( 'https://yandex.ru' )
            ->title( 'iPhone 14 84.999 ₽' )
            ->description( 'Две камеры, экран диагональю 6,1 дюйма, <...> без Dynamic Island' )
            ->img( '-214118756_457239029' )
            ->kbd( [ $vk->buttonOpenLink( 'https://kotoff.net', 'Купить' ) ] );


        $vk->sendCarousel( $peer_id, 'Карусель' );

    }


}


Надеюсь, было полезно 😏 

Архив с исходниками:

bot.zip

  • 5id15
  • 14.09.2022
  • 8 973
  • 13
Карусели для бота ВК
Карусели для бота ВК
24-07-2022, 15:48, PHP
Создаем бота VK на библиотеке SimpleVK 3.x [Часть 1]
Создаем бота VK на библиотеке SimpleVK 3.x [Часть 1]
26-07-2022, 17:01, PHP
Callback-кнопки для бота ВК
Callback-кнопки для бота ВК
22-07-2022, 20:20, PHP
BOT VK — Использование хранилища (Store) на библиотеке SimpleVK 3.x [Часть 3]
BOT VK — Использование хранилища (Store) на библиотеке SimpleVK 3.x [Часть 3]
22-08-2022, 00:49, PHP
BOT VK — Скрипт бана и мута пользователей в беседе (PHP)
BOT VK — Скрипт бана и мута пользователей в беседе (PHP)
29-06-2022, 18:06, PHP
  1. Марк Черникин

    Марк Черникин@Марк Черникин 25 января 2023 18:51

    Спасибо за статью! Не подскажите, как несколько кнопок добавить?

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

      Сергей Котов@Сергей Котов 26 января 2023 01:56

      Вроде только 1 можно, уже точно не помню

    2. 5id15

      5id15@Константин Дорофеев 5 февраля 2023 23:13

      В метод kbd() передаётся массив кнопок, через запятую можно прописать их. Максимум три кнопки.

      ->kbd( [ $vk->buttonOpenLink( 'https://kotoff.net', 'Купить' ), $vk->buttonOpenLink( 'https://kotoff.net', 'Не покупать' ) ] );


  2. Гость Алексей

    Гость Алексей Гость 5 февраля 2023 16:55

    а что скопировать мне и заменить в этой версии? у меня бот уже функцианальный там vk_api.php и index.php я так понял надо часть кода в vk.api вписать для вызова в функцию а исполнить в index.php?

    1. 5id15

      5id15@Константин Дорофеев 5 февраля 2023 23:17

      Немного не понял, вы имеете в виду заменить что-то внутри библиотеки? 

      1. Гость Алексей

        Гость Алексей Гость 12 февраля 2023 21:09

        я имею ввиду что мне скопировать и вставить добавив в файл vk.api

        1. 5id15

          5id15@Константин Дорофеев 12 февраля 2023 23:29

          vk_api.php вы можете полностью скопировать и перенести себе. Там нет никаких изменений, кроме добавленных методов для каруселей.

  3. Гость Алексей

    Гость Алексей Гость 12 сентября 2023 12:44

    Вот я сделал под себя и не работает на старом vk_api.php. Бота собрал еще из первой вашей статьи без симплвк.

    Внедрил этот кусок кода в vk__api.php


       public function carousel()
        {
            $config = [];
            $this->config['carousel'][] = &$config;

            return Carousel::create( $config, $this );
        }

        public function sendCarousel( $peer_id, $message, $params = [] )
        {
            $random_id = mt_rand(20, 99999999);
            $carousel = $this->generateCarousel();

            return $this->request( 'messages.send', [ 'message' => $message, 'peer_id' => $peer_id, 'template' => $carousel, 'random_id'=>$random_id  ] + $params );
        }

        private function parseKeyboard( $keyboard_raw = [] )
        {
            $keyboard = [];

            foreach ( $keyboard_raw as $row => $button_str )
            {

                foreach ( $button_str as $col => $button )
                {

                    $keyboard[$row][$col]['action']['type'] = $button[0];


    1. Гость Алексей

      Гость Алексей Гость 12 сентября 2023 12:45

                      if ( $button[1] != null )
                          $keyboard[$row][$col]['action']['payload'] = json_encode( $button[1],
                              JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES );

                      switch ( $button[0] )
                      {

                          case 'callback':
                          case 'text':
                          {
                              $keyboard[$row][$col]['color'] = $button[3];
                              $keyboard[$row][$col]['action']['label'] = $button[2];
                              break;
                          }
                          case 'vkpay':
                          {
                              $keyboard[$row][$col]['action']['hash'] = "action={$button[2]}";
                              $keyboard[$row][$col]['action']['hash'] .= ( $button[3] < 0 ) ? "&group_id=" . $button[3] * -1 :
                                  "&user_id={$button[3]}";
                              $keyboard[$row][$col]['action']['hash'] .= ( isset( $button[4] ) ) ? "&amount={$button[4]}" :
                                  '';
                              $keyboard[$row][$col]['action']['hash'] .= ( isset( $button[5] ) ) ?
                                  "&description={$button[5]}" : '';
                              $keyboard[$row][$col]['action']['hash'] .= ( isset( $button[6] ) ) ? "&data={$button[6]}" : '';
                              $keyboard[$row][$col]['action']['hash'] .= '&aid=1';
                              break;
                          }
                          case 'open_app':
                          {
                              $keyboard[$row][$col]['action']['label'] = $button[2];
                              $keyboard[$row][$col]['action']['app_id'] = $button[3];
                              if ( isset( $button[4] ) )
                                  $keyboard[$row][$col]['action']['owner_id'] = $button[4];
                              if ( isset( $button[5] ) )
                                  $keyboard[$row][$col]['action']['hash'] = $button[5];
                              break;
                          }
                          case 'open_link':
                          {
                              $keyboard[$row][$col]['action']['link'] = $button[2];
                              $keyboard[$row][$col]['action']['label'] = $button[3];
                              break;
                          }

                      }

                  }

              }



         

      1. Гость Алексей

        Гость Алексей Гость 12 сентября 2023 12:46

            return $keyboard;
            }

            private function generateCarousel()
            {
                $template = [ 'type' => 'carousel', 'elements' => [] ];

                foreach ( $this->config['carousel'] as $carousel )
                {
                    $element['action'] = $carousel['action'];

                    if ( isset( $carousel['kbd'] ) )
                        $element['buttons'] = $this->parseKeyboard( [ $carousel['kbd'] ] )[0];
                    if ( isset( $carousel['title'] ) )
                        $element['title'] = $carousel['title'];
                    if ( isset( $carousel['description'] ) )
                        $element['description'] = $carousel['description'];
                    if ( isset( $carousel['img'] ) )
                        $element['photo_id'] = $carousel['img'];

                    $template['elements'][] = $element;
                }


                return json_encode( $template, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES );
            }
            

        1. Гость Алексей

          Гость Алексей Гость 12 сентября 2023 12:47

          В основном файле команда такая:

                  if ($cmd == 'кар')
              {

                  $vk->carousel()
                      // ->action( 'https://yandex.ru' ) // Ссылка, на которую перекинет пользователя при клике
                      ->title( 'iPhone 14 Pro Max 114.999 ₽' ) // Заголовок жлемента карусели
                      ->description( 'Три камеры, экран диагональю 6,7 дюйма, <...>, с Dynamic Island' ) // Описание элемента карусели
                      ->img( '-214118756_457239032' ) // Изоюражение
                      ->kbd( [ $vk->buttonOpenLink( 'https://kotoff.net', 'Купить' ) ] ); // Кнопка/кнопки

                  $vk->carousel()
                      // ->action( 'https://yandex.ru' )
                      ->title( 'iPhone 14 Pro 109.999 ₽' )
                      ->description( 'Три камеры, экран диагональю 6,1 дюйма, <...>, с Dynamic Island' )
                      ->img( '-214118756_457239031' )
                      ->kbd( [ $vk->buttonOpenLink( 'https://kotoff.net', 'Купить' ) ] );

                  $vk->carousel()
                      // ->action( 'https://yandex.ru' )
                      ->title( 'iPhone 14 Plus 94.999 ₽' )
                      ->description( 'Две камеры, экран диагональю 6,7 дюйма, <...>, без Dynamic Island' )
                      ->img( '-214118756_457239030' )
                      ->kbd( [ $vk->buttonOpenLink( 'https://kotoff.net', 'Купить' ) ] );

                  $vk->carousel()
                      // ->action( 'https://yandex.ru' )
                      ->title( 'iPhone 14 84.999 ₽' )
                      ->description( 'Две камеры, экран диагональю 6,1 дюйма, <...> без Dynamic Island' )
                      ->img( '-214118756_457239029' )
                      ->kbd( [ $vk->buttonOpenLink( 'https://kotoff.net', 'Купить' ) ] );
            
          if($chat_id < 0) { //Это в группе
                  $vk->sendCarousel( $peer_id, 'Карусель', 1 );
                }else{
              $vk->sendCarousel( $peer_id, 'Карусель', 1 );
            }

          }



          Проверял на ошибки кода их нету, ах да я вырезал try одно т.к. иза него ошибка была  учитывая что метода не было создано в старой версии. В итоге бот тупо молчит не реагирует на комнады, а на другие реагирует. Что еще я упустил и куда вставить?

  4. Fruit

    Fruit 20 января 2024 21:26

    На данный момент, библиотека вообще работает? 

    1. kenny

      kenny 29 января 2024 15:12

      Да, все работает

{login}

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

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

Рекламный блок
  • Новости
  • Платная категория
  • Блог
  • Игры
  • Обновления
  • Программы
  • Статьи
    • PHP
    • Python
    • JS
  • Дизайн
    • PSD исходники
  • DLE
    • Шаблоны
    • Модули
    • Хаки
  • Магазин
    • Скрипты
Комментарии
Система комментариев на PHP
<Script>Alert("hello");</Script>
Генерация всевозможных комбинаций из набора символов — комбинаторика в Python (itertools)
Qwertyuiopasdfghjklzxcvbnm 1234567890
Система комментариев на PHP
Полезная статья
Создание простого Telegram-бота с клавиатурой и inline-кнопками [Часть 2]
Класс, хорошая тема
Динамическая обложка для группы ВК, последний подписчик, топ комментатор и прочее
Как отключить вывод результата cron в папку modules/cron в Open Server? Крон запускает несколько
Все комментарии..
Полный список последних комментариев
Лучшие новости
Всего публикаций: 115
Добавлено за сутки: +0
Записей в блоге: 1
Добавлено за сутки: +0
Комментариев: 938
Добавлено за сутки: +0
Пользователей: 4125
Добавлено за сутки: +0
Полная статистика..
Подробная статистика сайта
Loading...

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

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

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

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

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

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