Dobrý den.
O Telegram-botech je spousta článků, ale o dovednostech pro Alisu mnoho informací není. Informací o tom, jak vytvořit jednoho bota, jsem vůbec nenašel, proto se podělím o své zkušenosti s vytvářením jednoduchého Telegram-bota a dovednosti Yandex.Alice pro web, které mají jednotnou funkcionalitu.
Tak začneme, jak zprovoznit webový server a získat ssl-certifikát. O tom nebudu mluvit, je o tom napsáno dost.
Vytvoření Telegram-bota
Nejdříve vytvoříme Telegram-bota, k tomu přejdeme do Telegramu a najdeme tam bota BotFather.


Zvolíme /newbot.

Zadáme název bota, na který bude reagovat, poté zadáme jméno bota, jako odpověď dostaneme token pro správu bota, tenhle klíč si zapíšeme, bude se nám později hodit.

Dalším krokem je informovat servery Telegramu, na jaký server posílat data od bota. K tomu vytvoříme odkaz ve formátu:
https://api.telegram.org/bot___TOKEN___/setWebhook?url=https://____CESTA_K_SKRIPTU___
___TOKEN___ nahradíme naším tokenem od bota, který jsme dostali dříve.
____CESTA_K_SKRIPTU___ nahradíme adresou skriptu na našem serveru, kde bude probíhat zpracování dat (například www.my_server.ru/webhook_telegram.php).
Je tu problém, server api.telegram.org je blokován, ale lze to vyřešit takto: pronajmout si nejlevnější server tam, kde nejsou žádná omezení, a zadat z konzole tohoto serveru příkaz
wget ___ZÍSKANÁ_ADRESA___
Hotovo, Telegram-bot je vytvořen a spojen s vaším serverem.
Vytvoření dovednosti pro Yandex.Alici
Přejdeme k vytvoření dovednosti pro Yandex.Alici.
Pro vytvoření dovednosti je třeba přejít na stránku vývojářů Yandex.Dialogy. stránku vývojářů Yandex.Dialogy, kliknout na "Vytvořit dialog" a vybrat "Dovednost v Alici".

Otevře se dialog s nastavením dovednosti.

Začneme provádět nastavení dovednosti.
Zadáme název vaší dovednosti.

Aktivační jméno je potřeba vybírat velmi pečlivě, aby ho Alisa správně chápala. Z pohledu nuance - mobilní aplikace s Alisou a reproduktory jako Yandex.Stanice nebo Irbis A mohou vnímat slova různě.
Zadáme cestu ke skriptu na našem serveru stejně jako pro Telegram, ale bude to skript právě pro Alisu, například www.my_server.ru/webhook_alice.php.

Vybereme hlas, kterým bude dovednost mluvit, mě se více líbí hlas Alisy.

Pokud se plánuje provoz pouze na mobilních zařízeních nebo v prohlížeči, pak vybereme „Je třeba zařízení s obrazovkou“.
Nyní nastavíme parametry pro katalog dovedností Alice. Pokud plánujete používat slovo značky pro aktivaci, je nutné ověřit webové stránky značky na webovém servisu webmaster.yandex.ru.

Se všemi nastaveními je to hotové, přecházíme ke skriptům.
Skript Telegram bota
Začněme se skriptem pro Telegram.
Připojujeme knihovnu, která bude zpracovávat zprávy od bota a Alice:
include_once 'webhook_parse.php';
Nastavujeme token našeho bota:
$tg_bot_token = "_____YOUR_BOT_TOKEN_____";
Získáváme data:
$request = file_get_contents('php://input');
$request = json_decode($request, TRUE);
Rozdělujeme data na proměnné:
if (!$request)
{
die();
// Nějaký chybový výstup (žádost není platný JSON)
}
else if (!isset($request['update_id']) || !isset($request['message']))
{
die();
// Nějaký chybový výstup (žádost nemá zprá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);
}
Nyní můžeme pracovat s proměnnými:
$tokens — zde jsou všechna slova, která uživatel zadal
$user_id — zde je id uživatele
$msg_chat_id — chat, ve kterém bot obdržel příkaz
$msg_user_name — jméno uživatele
Dále voláme funkci Parse_Tokens pro zpracování:
$Out_Str = Parse_Tokens($tokens);
A posíláme odpověď:
Send_Out($user_id, $Out_Str);
funkce Send_Out je jednoduchá a vypadá 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 dovednosti pro Yandex.Alice
Nyní přejdeme ke skriptu pro Alici, je téměř stejný jako pro Telegram.
Také připojujeme knihovnu, kde budou zpracovávány zprávy od bota a Alice, plus knihovnu s třídami pro Alici:
include_once 'classes_alice.php';
include_once 'webhook_parse.php';
Získáváme data:
$data = json_decode(trim(file_get_contents('php://input')), true);
Rozdělujeme data na proměnné:
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'];}
}
}
Zde je potřeba o něco méně proměnných:
$tokens — zde jsou všechna slova, která uživatel zadal
$user_id — zde je id uživatele
Yandex neustále pingá zveřejněné dovednosti, a přidal jsem řádek, abych okamžitě opustil skript, aniž bych spouštěl úplné zpracování zprávy:
if (strpos($tokens[0], "ping") > -1) {Send_Out("pong", "", true);}
Voláme pro zpracování funkci Parse_Tokens, která je stejná jako pro Telegram:
$Out_Str = Parse_Tokens($tokens);
A posíláme odpověď:
Send_Out($user_id, $Out_Str);
Funkce Send_Out je zde složitější:
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) 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();
}
Skript pro Alisu je dokončen.
Samotný skript zpracování Parse_Tokens jsem udělal čistě pro příklad, můžete tam provést jakékoli kontroly a zpracování.
function Parse_Tokens($tokens)
{
$out = "";
// proveďte něco s tokeny //
$out = "Zadali jste " . count($tokens) . " slova: " . implode($tokens, " ");
return $out;
}
Pokud potřebujete komplikovanější interakci s uživateli než otázka-odpověď, bude nutné uložit do databáze (například mysql) $user_id uživatele a již získané údaje od uživatele a analyzovat je v funkci Parse_Tokens.
To je vlastně skoro všechno, pokud je vše správně provedeno, bot pro Telegram je již dostupný, dovednost Alisy můžete ověřit dialogs.yandex.ru/developer, přechodem na svou novou dovednost na záložce testování.

Pokud vše správně funguje, můžete dovednost odeslat na moderaci stisknutím tlačítka „Na moderaci“.
Nyní máte hned dva boty pro různé platformy, které fungují stejně.
Dokumentace k službě Yandex.Dialogy tady
Úplné skripty jsou dostupné na githubu stáhnout.
Zdroj: habr.com
