Skip to end of metadata
Go to start of metadata

Также вы можете форматировать текст, для Viber доступно Markdown.

https://developers.viber.com/docs/tools/text-formatting/

Пример простой кнопки без стейт машины
package Viber::buttons::Button_name;

use strict;
use warnings FATAL => 'all';

#**********************************************************
=head2 new()

=cut
#**********************************************************
sub new {
  my $class = shift;
  my ($conf, $bot, $bot_db, $APILayer, $user_config) = @_;
  
  my $self = {
    conf  		=> $conf,
    bot   		=> $bot,
    bot_db 		=> $bot_db,
    api   		=> $APILayer
    user_config => $user_config
  };
  
  bless($self, $class);
  
  return $self;
}

#**********************************************************
=head2 enable()

=cut
#**********************************************************
sub enable {
  my $self = shift;
  # Здесь вы определяете, ли кнопка может быть включена.
  # Вы в своём распоряжении имеете доступ к ответу /user/config
  # Например, кнопка оплат:
  # return $self->{user_config}{paysys_payment};
  return 1;
}

#**********************************************************
=head2 btn_name()

=cut
#**********************************************************
sub btn_name {
  my $self = shift;
  # Также, вы имеете доступ до словаря бота.
  # $self->{bot}{lang}{BUTTON_NAME}
  return "Название кнопки";
}

#**********************************************************
=head2 click()

=cut
#**********************************************************
sub click {
  my $self = shift;
  my ($attr) = @_;


  # Что-то делаем по нажатию кнопки. Например отправляем "Привет".
  $self->{bot}->send_message({
    text => "Привет, напишите как к вам обращаться",
  });

  # Возвращаем 0, так как операция завершена, и нужно показать пользователю меню.
  return 0;
}

1;
Отправка сообщения
#Создаем текст сообщения, для кавычек обязательно тройное экранирование
my $message = "Пример сообщения\n";
$message .= "*Жирный текст*\n";

#Отправляем сообщение
$self->{bot}->send_message({
  text       => $message,
});


Отправка сообщения с встроеной кнопкой
my @keyboard = ();

my $button = {
  ActionType => 'reply',
  ActionBody => 'fn:Button_name&fn_name',
  Text       => 'Кнопка в сообщении',
  BgColor    => '#FF0000',
  TextSize   => 'regular'
};

push (@keyboard, $button);

$self->{bot}->send_message({
  text => "Текст сообщения",
  keyboard => {
    Type          => 'keyboard',
    DefaultHeight => "true",
    Buttons       => \@keyboard
  },
});

# После нажатия этой кнопки бот запустит функцию fn_name из кнопки Button_name.



Отправка сообщения с заменой клавиатуры (многоуровневая операция/FSM)
# Внимание! Для использование многоуровневых операций (FSM) необходимо понимать что это такое.
# Иначе вы рискуете сделать бота полностью неработоспособным.

use Encode qw/encode_utf8/;

sub click {
  my $self = shift;
  my ($attr) = @_;

  my $cancel_button = {
    ActionType => 'reply',
    # в Viber есть возможность для кнопок клавиатуры отмечать функцию.
    # Это позволяет иметь меньше работы с FSM: меньше хранить состояний.
    # На практике, в Telegram боте у нас работают 6 кнопок с состоянием, когда в Viber только 2.
    ActionBody => 'fn:Button_name&cancel_msg',
    Text       => $self->{bot}{lang}{CANCEL_TEXT},
    BgColor    => '#FF0000',
    TextSize   => 'regular'
  };

  $self->{bot}->send_message({
    text         => 'Отправьте текст или нажмите <b>Отменить</b>',
    keyboard => {
      Type          => 'keyboard',
      DefaultHeight => "true",
      Buttons       => \@keyboard
    },
  });

  # Запоминаем состояние.
  $self->{bot_db}->add({
    SENDER_ID => $self->{bot}->{receiver},
    BUTTON    => "Button_name",
    FN        => "fn:Button_name&second_step",
    # Можете хранить и не JSON, но базово рекомендуем так.
    ARGS      => '{"message":{"text":""}}',
  });

  # Сообщаем, что операция не закончилась, и юзеру не нужно показывать меню.
  return 1;
}

sub second_step {
  my $self = shift;
  my ($attr) = @_;

  my $text = $attr->{message}->{text};
  
  # ...
  
  return 1;
}

sub cancel_msg {
  my $self = shift;
  $self->{bot_db}->del($self->{bot}->{receiver});
  $self->{bot}->send_message({ text => "$self->{bot}{lang}{SEND_CANCEL}" });

  # Операция завершилась, показываем меню.
  return 0;
}

# Запись в базу о том, что пользователь находится на втором шаге операции.
# При любом его действии будет вызываться &Button_name::fn_name
# Не забудьте удалить после завершения операции.

$self->{bot_db}->add({
  SENDER_ID => $self->{bot}->{receiver},
  BUTTON => "Button_name",
  FN     => "fn_name",
  ARGS   => "дополнительные аргументы",
});

# вы сможете иметь доступ к данной информации сразу же по вызову.
my $info = $attr->{step_info};
$info->{FN} = "execute_with_argument";
$self->{bot_db}->change($info);
Пример вызова через API
# Пример вызова API за авторизацией USERBOT.
my ($res) = $self->{api}->fetch_api({
  # если это GET, то использование METHOD не обязательно.
  METHOD => 'GET',
  PATH   => '/user/pi/'
}); 

if ($res->{errno}) {
  $self->{bot}->send_message({
    text => "Случилась ошибка, вы не авторизованы." 
  });
  return 0;
}

$self->{bot}->send_message({
  text => "Здравствуйте, " . $res->{FIO} . "!"
});
  • No labels