Яндэкс.Аліса і бот 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

Дадаць каментар