Также вы можете форматировать текст, для 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} . "!" });