Добрий день.
На тему Telegram-ботів статей дуже багато, а ось про навички для Аліси мало хто пише, а інформації, як зробити єдиного бота, я взагалі не знайшов, тому вирішив поділитися своїм досвідом про те, як зробити простого бота Telegram і навик Яндекс.Аліса для сайту , що мають єдиний функціонал.
Отже, як піднімати веб-сервер і отримати ssl-сертифікат я не розповідатиму, про це написано достатньо.
Створення Telegram-бота
Спочатку створимо Telegram-бота, для цього йдемо в Telegram і знаходимо там бота BotFather.
Вибираємо /newbot
Вводимо назву бота, яким він буде відгукуватися, потім вводимо ім'я бота, у відповідь отримуємо токен для керування ботом, записуємо цей ключ, він нам знадобиться надалі.
Наступний крок – це повідомити сервери Telegram, на який сервер надсилати дані від бота. Для цього робимо посилання на вид:
https: //api.telegram.org/bot___ТОКЕН___/setWebhook?url=https://____ПУТЬ_ДО_СКРПИТА___
___ТОКЕН___ замінюємо на наш токен від бота, отриманий раніше
____ШЛЯХ_ДО_СКРПИТУ___ замінюємо на адресу скрипта на нашому сервері, де відбуватиметься обробка даних (наприклад,
Тут є проблема, сервер api.telegram.org знаходиться під блокуванням, але можна зробити так: орендувати найдешевший сервер там, де немає обмежень і дати з консолі цього сервера команду
wget ___ПОЛУЧИВШИЙСЯ_АДРЕС___
Все, Telegram-бот створений та пов'язаний з вашим сервером.
Створення навички для Яндекс.Аліса
Перейдемо до створення досвіду для Яндекс.Аліса.
Для створення досвіду необхідно перейти на сторінку розробників Яндекс.Діалоги
Відкриється діалог налаштувань навички.
Починаємо вводити налаштування навички.
Вводимо ім'я вашої навички.
Активаційне ім'я слід підбирати дуже уважно, щоб Аліса правильно його розуміла, з нюансів – мобільний додаток з Алісою та колонки типу Яндекс.Станція або Irbis A можуть сприймати слова по-різному.
Вводимо шлях до скрипту на нашому сервері так само, як і для Telegram, але це буде скрипт саме для Аліси, наприклад
Вибираємо голос, яким говоритиме навичка, мені більше подобається саме голос Аліси.
Якщо планується робота тільки на мобільних пристроях або в браузері, вибираємо «Потрібний пристрій з екраном».
Далі вводимо налаштування для каталогу навичок Аліси. Якщо ви плануєте використовувати для активації слово бренд, потрібно пройти верифікацію сайту бренду в сервісі webmaster.yandex.ru.
З налаштуваннями все переходимо до скриптів.
Скрипт Telegram-бота
Почнемо зі скрипту для Telegram.
Підключаємо бібліотеку, де оброблятимуться повідомлення від бота та Аліси:
include_once 'webhook_parse.php';
Задаємо token нашого бота:
$tg_bot_token = "_____YOUR_BOT_TOKEN_____";
Отримуємо дані:
$request = file_get_contents('php://input');
$request = json_decode($request, TRUE);
Розбираємо дані на змінні:
if (!$request)
{
die();
// Some Error output (request is not valid JSON)
}
else if (!isset($request['update_id']) || !isset($request['message']))
{
die();
// Some Error output (request has not message)
}
else
{
$user_id = $request['message']['from']['id'];
$msg_user_name = $request['message']['from']['first_name'];
$msg_user_last_name = $request['message']['from']['last_name'];
$msg_user_nick_name = $request['message']['from']['username'];
$msg_chat_id = $request['message']['chat']['id'];
$msg_text = $request['message']['text'];
$msg_text = mb_strtolower($msg_text, 'UTF-8');
$tokens = explode(" ", $msg_text);
}
Тепер можна працювати зі змінними:
$tokens - тут тепер усі слова, які користувач ввів
$user_id - тут id користувача
$msg_chat_id - чат, в якому бот отримав команду
$msg_user_name - ім'я користувача
Далі, викликаємо для обробки функцію Parse_Tokens:
$Out_Str = Parse_Tokens($tokens);
І відправляємо відповідь:
Send_Out($user_id, $Out_Str);
функція Send_Out проста і виглядає так:
function Send_Out($user_id, $text, $is_end = true)
{
global $tg_bot_token;
if (strlen($user_id) < 1 || strlen($text) < 1) {return;}
$json = file_get_contents('https://api.telegram.org/bot' . $tg_bot_token . '/sendMessage?chat_id=' . $user_id . '&text=' . $text);
}
Скрипт навички для Яндекс.Аліса
Тепер перейдемо до скрипту для Аліси, він майже такий самий, як і для Telegram.
Також підключаємо бібліотеку, де оброблятимуться повідомлення від бота та Аліси, плюс бібліотеку з класами для Аліси:
include_once 'classes_alice.php';
include_once 'webhook_parse.php';
Отримуємо дані:
$data = json_decode(trim(file_get_contents('php://input')), true);
Розбираємо дані на змінні:
if (isset($data['request']))
{
//original_utterance
if (isset($data['meta']))
{
$data_meta = $data['meta'];
if (isset($data_meta['client_id'])) {$client_id = $data_meta['client_id'];}
}
if (isset($data['request']))
{
$data_req = $data['request'];
if (isset($data_req['original_utterance']))
{
$original_utterance = $data_req['original_utterance'];
}
if (isset($data_req['command'])) {$data_msg = $data_req['command'];}
if (isset($data_req['nlu']))
{
$data_nlu = $data_req['nlu'];
if (isset($data_nlu['tokens'])) {$tokens = $data_nlu['tokens'];}
// $data_token_count = count($data_tokens);
}
}
if (isset($data['session']))
{
$data_session = $data['session'];
if (isset($data_session['new'])) {$data_msg_new = $data_session['new'];}
if (isset($data_session['message_id'])) {$data_msg_id = $data_session['message_id'];}
if (isset($data_session['session_id'])) {$data_msg_sess_id = $data_session['session_id'];}
if (isset($data_session['skill_id'])) {$skill_id = $data_session['skill_id'];}
if (isset($data_session['user_id'])) {$user_id = $data_session['user_id'];}
}
}
Тут необхідних змінних трохи менше:
$tokens - тут тепер усі слова, які користувач ввів
$user_id - тут id користувача
Яндекс постійно пінгує опубліковані навички, і я додав рядок, щоб одразу виходити зі скрипту, не запускаючи повної обробки повідомлення:
if (strpos($tokens[0], "ping") > -1) {Send_Out("pong", "", true);}
Викликаємо для обробки функцію Parse_Tokens, він той самий, що і для Telegram:
$Out_Str = Parse_Tokens($tokens);
І відправляємо відповідь:
Send_Out($user_id, $Out_Str);
Функція Send_Out тут складніше:
function Send_Out($user_id, $out_text, $out_tts = "", $is_end = false)
{
global $data_msg_sess_id, $user_id;
///// GENERATE BASE OF OUT //////
$Data_Out = new Alice_Data_Out();
$Data_Out->response = new Alice_Response();
$Data_Out->session = new Alice_Session();
///// GENERATE BASE OF OUT End //////
///// OUT MSG GENERATE /////
$Data_Out->session->session_id = $data_msg_sess_id;;
$Data_Out->session->user_id = $user_id;
$Data_Out->response->text = $out_text;
$Data_Out->response->tts = $out_tts;
if (strlen($out_tts) < 1) {$Data_Out->response->tts = $out_text;}
$Data_Out->response->end_session = $is_end;
header('Content-Type: application/json');
print(json_encode($Data_Out, JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT));
die();
}
Закінчили скрипт для Аліси.
Сам скрипт обробки Parse_Tokens зробив чисто для прикладу, ви зможете зробити там будь-які перевірки та обробки.
function Parse_Tokens($tokens)
{
$out = "";
// do something with tokens //
$out = "Your eneter " . count($tokens) . " words: " . implode($tokens, " ");
return $out;
}
Якщо вам потрібно спілкування з користувачем складнішого виду, ніж запитання-відповідь, то потрібно буде зберігати в базі (наприклад, mysql) $user_id користувача та вже отримані від користувача дані та аналізувати їх у функції Parse_Tokens.
Власне це майже все, якщо все зроблено правильно, то Telegram-бот вже доступний, навик Аліси можна перевірити
Якщо все правильно працює, можна відправити навичку на модерацію, натиснувши кнопку «На модерацію».
Тепер у вас є одразу два боти для різних платформ, які працюють однаково.
Документація з сервісу Яндекс.Діалоги
Повні скрипти викладені на github
Джерело: habr.com