Robot Yandex.Alisa a Telegram v PHP s rovnakou funkcionalitou

Dobré popoludnie.

Na tému telegramových botov je veľa článkov, ale málokto píše o schopnostiach pre Alicu a nenašiel som žiadne informácie o tom, ako vyrobiť jedného robota, tak som sa rozhodol podeliť o svoje skúsenosti, ako vyrobiť robota jednoduchý telegramový robot a zručnosť Yandex.Alice pre stránku s rovnakou funkcionalitou.

Takže vám nepoviem, ako vytvoriť webový server a získať certifikát ssl, o tom už bolo napísané dosť.

Vytvorenie telegramového robota

Najprv si vytvorte telegramového robota, prejdeme na telegram a nájdeme tam robota BotFather.

Robot Yandex.Alisa a Telegram v PHP s rovnakou funkcionalitou

Robot Yandex.Alisa a Telegram v PHP s rovnakou funkcionalitou

Vyberte /newbot

Robot Yandex.Alisa a Telegram v PHP s rovnakou funkcionalitou

Zadáme meno robota, ktorým bude reagovať, potom zadáme meno robota, ako odpoveď dostaneme token na ovládanie robota, tento kľúč si zapíšeme, bude sa nám hodiť v budúcnosti.

Robot Yandex.Alisa a Telegram v PHP s rovnakou funkcionalitou

Ďalším krokom je oznámiť telegramovým serverom, na ktorý server majú odosielať údaje z robota. Na tento účel vytvoríme odkaz na formulár:

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

___TOKEN___ nahradíme naším tokenom od robota, ktorý sme dostali skôr

____PATH_TO_SCRIPT____ nahradíme adresou skriptu na našom serveri, kde budú údaje spracované (napr. www.my_server.ru/webhook_telegram.php).

Tu je problém, server api.telegram.org je blokovaný, ale môžete to urobiť: prenajmite si najlacnejší server, kde neexistujú žiadne obmedzenia, a zadajte príkaz z konzoly tohto servera

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

To je všetko, telegramový bot je vytvorený a pripojený k vášmu serveru.

Vytvorenie zručnosti pre Yandex.Alisa

Prejdime k vytvoreniu zručnosti pre Yandex.Alice.

Ak chcete vytvoriť zručnosť, musíte prejsť na stránku vývojárov Yandex.Dialogues Stránka vývojára Yandex.Dialogs, kliknite tam "Vytvoriť dialóg" a vyberte "Skill in Alice".

Robot Yandex.Alisa a Telegram v PHP s rovnakou funkcionalitou

Otvorí sa dialógové okno s nastaveniami zručností.

Robot Yandex.Alisa a Telegram v PHP s rovnakou funkcionalitou

Začneme zadávať nastavenia zručností.

Zadajte názov svojej zručnosti.

Robot Yandex.Alisa a Telegram v PHP s rovnakou funkcionalitou

Názov aktivácie by mal byť vybraný veľmi opatrne, aby ho Alice správne pochopila, od nuancií - mobilná aplikácia s Alice a stĺpce ako Yandex.Station alebo Irbis A môžu vnímať slová inak.

Cestu k skriptu na našom serveri zadávame rovnako ako pri Telegrame, ale bude to skript špeciálne pre Alicu, napr. www.my_server.ru/webhook_alice.php.

Robot Yandex.Alisa a Telegram v PHP s rovnakou funkcionalitou

Vyberáme hlas, ktorým bude zručnosť rozprávať, mne sa viac páči hlas Alice.

Robot Yandex.Alisa a Telegram v PHP s rovnakou funkcionalitou

Ak plánujete pracovať iba na mobilných zariadeniach alebo v prehliadači, vyberte možnosť „Potrebujete zariadenie s obrazovkou“.

Ďalej zadajte nastavenia pre Alicin katalóg zručností. Ak plánujete na aktiváciu použiť slovo „značka“, musíte si overiť webovú stránku značky v službe webmaster.yandex.ru.

Robot Yandex.Alisa a Telegram v PHP s rovnakou funkcionalitou

To je s nastaveniami všetko, prejdime k skriptom.

Skript telegramového bota

Začnime so skriptom pre Telegram.

Pripojíme knižnicu, kde sa budú spracovávať správy od robota a Alice:

include_once 'webhook_parse.php';

Nastavili sme token nášho robota:

$tg_bot_token = "_____YOUR_BOT_TOKEN_____";

Prijímame údaje:

$request = file_get_contents('php://input');
$request = json_decode($request, TRUE);

Analýza údajov do premenných:

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

Teraz môžete pracovať s premennými:

$tokens – tu sú teraz všetky slová, ktoré používateľ zadal

$user_id – tu je ID používateľa

$msg_chat_id - chat, v ktorom robot dostal príkaz

$msg_user_name – používateľské meno

Ďalej zavoláme funkciu Parse_Tokens na spracovanie:

$Out_Str = Parse_Tokens($tokens);

A pošlite odpoveď:

Send_Out($user_id, $Out_Str);

funkcia Send_Out je jednoduchá a vyzerá takto:

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

Skript zručnosti pre Yandex.Alisa

Teraz prejdime k scenáru pre Alice, je takmer rovnaký ako pre Telegram.

Pripájame tiež knižnicu, kde sa budú spracovávať správy od robota a Alice, plus knižnicu s triedami pre Alice:

include_once 'classes_alice.php';
include_once 'webhook_parse.php';

Prijímame údaje:

$data = json_decode(trim(file_get_contents('php://input')), true);

Analýza údajov do premenných:

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

Tu je o niečo menej premenných:

$tokens – tu sú teraz všetky slová, ktoré používateľ zadal

$user_id – tu je ID používateľa

Yandex neustále pinguje publikované zručnosti a pridal som riadok na okamžité ukončenie skriptu bez spustenia úplného spracovania správy:

  if (strpos($tokens[0], "ping") > -1)     {Send_Out("pong", "", true);}

Na spracovanie voláme funkciu Parse_Tokens, je to rovnaké ako pre telegram:

$Out_Str = Parse_Tokens($tokens);

A pošlite odpoveď:

Send_Out($user_id, $Out_Str);

Funkcia Send_Out je tu komplikovanejšia:

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

Dokončili sme scenár pre Alice.

Samotný skript spracovania Parse_Tokens bol vytvorený čisto pre príklad, môžete tam vykonávať akékoľvek kontroly a spracovanie.

function Parse_Tokens($tokens)
{
  $out = "";
  // do something with tokens //
  $out =  "Your eneter " . count($tokens) . " words: " . implode($tokens, " ");
  return $out;
}

Ak potrebujete komunikovať s používateľom zložitejšou formou, než je otázka-odpoveď, potom budete musieť uložiť $user_id používateľa a údaje, ktoré už používateľ dostal, do databázy (napríklad mysql) a analyzovať ich v funkcia Parse_Tokens.

V skutočnosti je to takmer všetko, ak je všetko vykonané správne, potom je telegramový robot už k dispozícii, je možné skontrolovať Alicinu zručnosť dialogs.yandex.ru/developertak, že prejdete na svoju novú zručnosť na karte testovania.

Robot Yandex.Alisa a Telegram v PHP s rovnakou funkcionalitou

Ak všetko funguje správne, môžete zručnosť odoslať na moderovanie kliknutím na tlačidlo „Na moderovanie“.

Teraz máte dvoch robotov pre rôzne platformy naraz, ktorí fungujú rovnakým spôsobom.

Dokumentácia pre službu Yandex.Dialogues tu

Úplné skripty zverejnené na github k stiahnutiu.

Zdroj: hab.com

Pridať komentár