Yandex.Alisa и Telegram бот в PHP със същата функционалност

Добър ден.

Има много статии по темата за ботовете на Telegram, но малко хора пишат за умения за Alice и не намерих информация как да направя нито един бот, затова реших да споделя опита си как да направя прост Telegram бот и умението Yandex.Alice за сайта със същата функционалност.

Така че, няма да ви казвам как да издигнете уеб сървър и да получите ssl сертификат, достатъчно е писано за това.

Създаване на Telegram бот

Първо, нека създадем бот на Telegram, за това отиваме в Telegram и намираме бота BotFather там.

Yandex.Alisa и Telegram бот в PHP със същата функционалност

Yandex.Alisa и Telegram бот в PHP със същата функционалност

Изберете /newbot

Yandex.Alisa и Telegram бот в PHP със същата функционалност

Въвеждаме името на бота, с което ще отговори, след това въвеждаме името на бота, в отговор получаваме токен за управление на бота, записваме този ключ, той ще ни бъде полезен в бъдеще.

Yandex.Alisa и Telegram бот в PHP със същата функционалност

Следващата стъпка е да кажете на сървърите на Telegram към кой сървър да изпращат данни от бота. За да направите това, ние правим връзка от формата:

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

___TOKEN___ заместваме с нашия токен от бота, получен по-рано

____PATH_TO_SCRIPT____ заместваме с адреса на скрипта на нашия сървър, където ще се обработват данните (напр. www.my_server.ru/webhook_telegram.php).

Тук има проблем, сървърът api.telegram.org е блокиран, но можете да направите това: наемете най-евтиния сървър, където няма ограничения и дайте командата от конзолата на този сървър

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

Това е всичко, ботът на Telegram е създаден и свързан към вашия сървър.

Създаване на умение за Yandex.Alisa

Нека да преминем към създаването на умение за Yandex.Alice.

За да създадете умение, трябва да отидете на страницата за разработчици на Yandex.Dialogues Страница за разработчици на Yandex.Dialogs, щракнете там върху „Създаване на диалог“ и изберете „Умение в Алиса“.

Yandex.Alisa и Telegram бот в PHP със същата функционалност

Ще се отвори диалоговият прозорец за настройки на уменията.

Yandex.Alisa и Telegram бот в PHP със същата функционалност

Започваме да въвеждаме настройките на уменията.

Въведете името на вашето умение.

Yandex.Alisa и Telegram бот в PHP със същата функционалност

Името за активиране трябва да бъде избрано много внимателно, така че Алис да го разбере правилно, от нюансите - мобилно приложение с Алис и колони като Yandex.Station или Irbis A може да възприема думите по различен начин.

Въвеждаме пътя до скрипта на нашия сървър по същия начин, както за Telegram, но това ще бъде скрипт специално за Alice, например www.my_server.ru/webhook_alice.php.

Yandex.Alisa и Telegram бот в PHP със същата функционалност

Избираме гласа, с който умението ще говори, повече ми харесва гласът на Алис.

Yandex.Alisa и Telegram бот в PHP със същата функционалност

Ако планирате да работите само на мобилни устройства или в браузър, изберете „Имате нужда от устройство с екран“.

След това въведете настройките за каталога с умения на Алис. Ако планирате да използвате думата „марка“ за активиране, трябва да потвърдите уебсайта на марката в услугата webmaster.yandex.ru.

Yandex.Alisa и Telegram бот в PHP със същата функционалност

Това е всичко с настройките, нека да преминем към скриптовете.

Скрипт за бот на Telegram

Нека започнем със скрипт за Telegram.

Свързваме библиотеката, където ще се обработват съобщения от бота и Alice:

include_once 'webhook_parse.php';

Задаваме токена на нашия бот:

$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);
}

Сега можете да работите с променливи:

$токени - тук вече са всички думи, въведени от потребителя

$user_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);
}

Скрипт за умения за Yandex.Alisa

Сега да преминем към скрипта за Alice, той е почти същият като за Telegram.

Също така свързваме библиотеката, където ще се обработват съобщения от бота и Alice, плюс библиотека с класове за Alice:

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'];}
  }
}

Тук има няколко променливи по-малко:

$токени - тук вече са всички думи, въведени от потребителя

$user_id - потребителско име тук

Yandex постоянно пингва публикуваните умения и добавих ред за незабавно излизане от скрипта, без да започва пълната обработка на съобщението:

  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;
}

Ако трябва да комуникирате с потребител с по-сложна форма от въпрос-отговор, тогава ще трябва да запазите $user_id на потребителя и вече получените данни от потребителя в базата данни (например mysql) и да ги анализирате в функцията Parse_Tokens.

Всъщност това е почти всичко, ако всичко е направено правилно, тогава ботът на Telegram вече е наличен, умението на Алис може да бъде проверено dialogs.yandex.ru/developerкато отидете на новото си умение в раздела за тестване.

Yandex.Alisa и Telegram бот в PHP със същата функционалност

Ако всичко работи правилно, можете да изпратите умението за модериране, като щракнете върху бутона „За модериране“.

Сега имате два бота за различни платформи наведнъж, които работят по един и същи начин.

Документация за услугата Yandex.Dialogues тук

Пълните скриптове са публикувани в github изтеглите.

Източник: www.habr.com

Добавяне на нов коментар