Yandex.Alice a Telegram bot na PHP s jednotnou funkčnosťou

Dobrý deň.

O Telegram-botoch existuje mnoho článkov, ale o zručnostiach pre Alisu sa píše len málo. Informácie o vytvorení jedného bota som vôbec nenašiel, a preto sa chcem podeliť o svoje skúsenosti o tom, ako vytvoriť jednoduchého Telegram-bota a zručnosť pre Yandex.Alisa pre webovú stránku, ktoré majú jednotnú funkčnosť.

Takže, ako spustiť webový server a získať ssl-certifikát o tom nebudem rozprávať, o tom je už dosť napísané.

Vytvorenie Telegram-bota

Najprv vytvoríme Telegram-bota, na to ideme do Telegramu a nájdeme tam bota BotFather.

Yandex.Alice a Telegram bot na PHP s jednotnou funkčnosťou

Yandex.Alice a Telegram bot na PHP s jednotnou funkčnosťou

Vyberáme /newbot

Yandex.Alice a Telegram bot na PHP s jednotnou funkčnosťou

Zadáme názov bota, na ktorý bude reagovať, potom zadáme meno bota a v odpovedi dostaneme token na správu bota. Uložíme si tento kľúč, bude nám nielen užitočný.

Yandex.Alice a Telegram bot na PHP s jednotnou funkčnosťou

Nasledujúci krok je oznámiť serverom Telegram, na ktorý server posielať dáta od bota. Na to použijeme odkaz vo forme:

https://api.telegram.org/bot___TOKEN___/setWebhook?url=https://____Cesta_K_SKRIPTU___

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

____Cesta_K_SKRIPTU___ nahradíme adresou skriptu na našom serveri, kde sa budú spracovávať dáta (napríklad www.my_server.ru/webhook_telegram.php).

Tu je problém, server api.telegram.org je pod blokádou, ale môžeme to urobiť takto: prenajmite si ten najlacnejší server kde nie sú obmedzenia a z konzoly tohto servera zadajte príkaz

wget ___ZÍSKANÁ_ADRESA___

Všetko, Telegram-bot je vytvorený a prepojený s vaším serverom.

Vytvorenie zručnosti pre Yandex.Alisa

Prejdeme k vytvoreniu zručnosti pre Yandex.Alisa.

Na vytvorenie zručnosti je potrebné prejsť na stránku vývojárov Yandex.Dialogy stránku vývojárov Yandex.Dialogy, tam kliknite na „Vytvoriť dialog“ a vyberte „Zručnosť v Alise“.

Yandex.Alice a Telegram bot na PHP s jednotnou funkčnosťou

Otvorí sa dialóg nastavení zručnosti.

Yandex.Alice a Telegram bot na PHP s jednotnou funkčnosťou

Začneme zadávať nastavenia zručnosti.

Zadáme meno vašej zručnosti.

Yandex.Alice a Telegram bot na PHP s jednotnou funkčnosťou

Aktivačné meno treba starostlivo vyberať, aby Alisa správne rozumela, pričom mobilné aplikácie s Alisou a reproduktory ako Yandex.Stanica alebo Irbis A môžu slová vnímať rôzne.

Zadáme cestu k skriptu na našom serveri rovnako ako pre Telegram, ale to bude skript presne pre Alisu, napríklad www.my_server.ru/webhook_alice.php.

Yandex.Alice a Telegram bot na PHP s jednotnou funkčnosťou

Vyberieme hlas, ktorým bude zručnosť hovoriť, mne sa najviac páči hlas Alisy.

Yandex.Alice a Telegram bot na PHP s jednotnou funkčnosťou

Ak sa plánuje práca iba na mobilných zariadeniach alebo v prehliadači, vyberieme „Potrebné zariadenie s obrazovkou“.

Ďalej zadáme nastavenia pre katalóg zručností Alisy. Ak plánujete použiť na aktiváciu slovo — značka, musíte prejsť verifikáciou webovej stránky značky v službe webmaster.yandex.ru.

Yandex.Alice a Telegram bot na PHP s jednotnou funkčnosťou

So nastaveniami je všetko, prechádzame k skriptom.

Skript Telegram-bota

Začneme so skriptom pre Telegram.

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

include_once 'webhook_parse.php';

Určíme token nášho bota:

$tg_bot_token = "_____YOUR_BOT_TOKEN_____";

Získavame údaje:

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

Rozoberáme údaje na premenné:

if (!$request)
{
  die();
    \/\/ Nejaká chyba (žiadosť nie je platný JSON)
}
else if (!isset($request['update_id']) || !isset($request['message']))
{
  die();
    \/\/ Nejaká chyba (žiadosť nemá správu)
}
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ôžeme 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 bot dostal príkaz

$msg_user_name — meno používateľa

Ďalej voláme funkciu na spracovanie Parse_Tokens:

$Out_Str = Parse_Tokens($tokens);

A posielame 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.Alica

Teraz prejdeme k skriptu pre Alisu, je takmer rovnaký ako pre Telegram.

Rovnako pripojíme knižnicu, kde sa budú spracovávať správy od bota a Alisy, plus knižnicu s triedami pre Alisu:

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

Získavame údaje:

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

Rozoberáme údaje na premenné:

ak (isset($data['request']))
{

//original_utterance


  ak (isset($data['meta']))
  {
    $data_meta = $data['meta'];
    ak (isset($data_meta['client_id'])) {$client_id = $data_meta['client_id'];}
  }

  ak (isset($data['request']))
  {
    $data_req = $data['request'];

    ak (isset($data_req['original_utterance']))
    {
      $original_utterance = $data_req['original_utterance'];
    }


    ak (isset($data_req['command'])) {$data_msg = $data_req['command'];}
    ak (isset($data_req['nlu']))
    {
      $data_nlu = $data_req['nlu'];
      ak (isset($data_nlu['tokens'])) {$tokens = $data_nlu['tokens'];}
//      $data_token_count = count($data_tokens);
    }
  }
  ak (isset($data['session']))
  {
    $data_session = $data['session'];
    ak (isset($data_session['new'])) {$data_msg_new = $data_session['new'];}
    ak (isset($data_session['message_id'])) {$data_msg_id = $data_session['message_id'];}
    ak (isset($data_session['session_id'])) {$data_msg_sess_id = $data_session['session_id'];}
    ak (isset($data_session['skill_id'])) {$skill_id = $data_session['skill_id'];}
    ak (isset($data_session['user_id'])) {$user_id = $data_session['user_id'];}
  }
}

Tu je trošku menej potrebných premenných:

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

$user_id — tu je id používateľa

Yandex neustále ping-uje publikované zručnosti, a pridal som riadok, aby som hneď opustil skript bez spustenia plného spracovania správy:

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

Voláme na spracovanie funkciu Parse_Tokens, je to tá istá funkcia ako pre Telegram:

$Out_Str = Parse_Tokens($tokens);

A posielame odpoveď:

Send_Out($user_id, $Out_Str);

Funkcia Send_Out je tu trochu zložitejšia:

funkcia Send_Out($user_id, $out_text, $out_tts = "", $is_end = false)
{
  globálne $data_msg_sess_id, $user_id;

  ////////// GENERUJEME ZÁKLAD VÝSTUPU ///////////
    $Data_Out = new Alice_Data_Out();
    $Data_Out->response = new Alice_Response();
    $Data_Out->session = new Alice_Session();
  ////////// GENERUJEME ZÁKLAD VÝSTUPU KONEC ///////////

  ////////// GENERUJEME VÝSTUPNÚ SPRÁVU //////////
  $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;

  ak (strlen($out_tts) 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));

  zomri();
}

Skripty pre Alisu sú hotové.

Skripty na spracovanie Parse_Tokens sú spravené čisto na príklad, vy si môžete urobiť akékoľvek kontroly a spracovania.

funkcia Parse_Tokens($tokens)
{
  $out = "";
  // urob niečo s tokenmi //
  $out =  "Zadali ste " . count($tokens) . " slová: " . implode($tokens, " ");
  return $out;
}

Ak potrebujete komplexnejšie interakcie s užívateľom ako otázka-odpoveď, potom by ste mali uložiť v databáze (napríklad mysql) $user_id používateľa a už získané dáta od užívateľa a analyzovať ich vo funkcii Parse_Tokens.

Vlastne, to je takmer všetko, ak je všetko spravené správne, tak Telegram-bot by už mal byť dostupný, zručnosť Alisy môže byť skontrolovaná dialogs.yandex.ru/developer, prechodom do svojej novej zručnosti na karte testovanie.

Yandex.Alice a Telegram bot na PHP s jednotnou funkčnosťou

Ak všetko správne funguje, môžete poslať zručnosť na moderáciu, stlačením tlačidla „Na moderáciu“.

Teraz máte hneď dva chatboty pre rôzne platformy, ktoré fungujú rovnako.

Dokumentácia k službe Yandex.Dialogy tu

Úplné skripty sú zverejnené na github stiahnuť.

Zdroj: habr.com

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster