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.


Vyberáme /newbot

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ý.

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“.

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

Začneme zadávať nastavenia zručnosti.
Zadáme meno vašej zručnosti.

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.

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

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.

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.

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
