Яндекс.Аліса та бот Telegram на PHP з єдиним функціоналом

Добрий день.

На тему Telegram-ботів статей дуже багато, а ось про навички для Аліси мало хто пише, а інформації, як зробити єдиного бота, я взагалі не знайшов, тому вирішив поділитися своїм досвідом про те, як зробити простого бота Telegram і навик Яндекс.Аліса для сайту , що мають єдиний функціонал.

Отже, як піднімати веб-сервер і отримати ssl-сертифікат я не розповідатиму, про це написано достатньо.

Створення Telegram-бота

Спочатку створимо Telegram-бота, для цього йдемо в Telegram і знаходимо там бота BotFather.

Яндекс.Аліса та бот Telegram на PHP з єдиним функціоналом

Яндекс.Аліса та бот Telegram на PHP з єдиним функціоналом

Вибираємо /newbot

Яндекс.Аліса та бот Telegram на PHP з єдиним функціоналом

Вводимо назву бота, яким він буде відгукуватися, потім вводимо ім'я бота, у відповідь отримуємо токен для керування ботом, записуємо цей ключ, він нам знадобиться надалі.

Яндекс.Аліса та бот Telegram на PHP з єдиним функціоналом

Наступний крок – це повідомити сервери Telegram, на який сервер надсилати дані від бота. Для цього робимо посилання на вид:

https: //api.telegram.org/bot___ТОКЕН___/setWebhook?url=https://____ПУТЬ_ДО_СКРПИТА___

___ТОКЕН___ замінюємо на наш токен від бота, отриманий раніше

____ШЛЯХ_ДО_СКРПИТУ___ замінюємо на адресу скрипта на нашому сервері, де відбуватиметься обробка даних (наприклад, www.my_server.ru/webhook_telegram.php).

Тут є проблема, сервер api.telegram.org знаходиться під блокуванням, але можна зробити так: орендувати найдешевший сервер там, де немає обмежень і дати з консолі цього сервера команду

wget ___ПОЛУЧИВШИЙСЯ_АДРЕС___

Все, Telegram-бот створений та пов'язаний з вашим сервером.

Створення навички для Яндекс.Аліса

Перейдемо до створення досвіду для Яндекс.Аліса.

Для створення досвіду необхідно перейти на сторінку розробників Яндекс.Діалоги сторінку розробників Яндекс.Діалоги, натиснути там «Створити діалог» та вибрати «Навичка в Алісі».

Яндекс.Аліса та бот Telegram на PHP з єдиним функціоналом

Відкриється діалог налаштувань навички.

Яндекс.Аліса та бот Telegram на PHP з єдиним функціоналом

Починаємо вводити налаштування навички.

Вводимо ім'я вашої навички.

Яндекс.Аліса та бот Telegram на PHP з єдиним функціоналом

Активаційне ім'я слід підбирати дуже уважно, щоб Аліса правильно його розуміла, з нюансів – мобільний додаток з Алісою та колонки типу Яндекс.Станція або Irbis A можуть сприймати слова по-різному.

Вводимо шлях до скрипту на нашому сервері так само, як і для Telegram, але це буде скрипт саме для Аліси, наприклад www.my_server.ru/webhook_alice.php.

Яндекс.Аліса та бот Telegram на PHP з єдиним функціоналом

Вибираємо голос, яким говоритиме навичка, мені більше подобається саме голос Аліси.

Яндекс.Аліса та бот Telegram на PHP з єдиним функціоналом

Якщо планується робота тільки на мобільних пристроях або в браузері, вибираємо «Потрібний пристрій з екраном».

Далі вводимо налаштування для каталогу навичок Аліси. Якщо ви плануєте використовувати для активації слово бренд, потрібно пройти верифікацію сайту бренду в сервісі webmaster.yandex.ru.

Яндекс.Аліса та бот Telegram на PHP з єдиним функціоналом

З налаштуваннями все переходимо до скриптів.

Скрипт 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-бот вже доступний, навик Аліси можна перевірити dialogs.yandex.ru/developer, перейшовши в свою нову навичку на закладку тестування.

Яндекс.Аліса та бот Telegram на PHP з єдиним функціоналом

Якщо все правильно працює, можна відправити навичку на модерацію, натиснувши кнопку «На модерацію».

Тепер у вас є одразу два боти для різних платформ, які працюють однаково.

Документація з сервісу Яндекс.Діалоги тут

Повні скрипти викладені на github завантажити.

Джерело: habr.com

Додати коментар або відгук