Dobré odpoledne.
Na téma telegramových botů je spousta článků, ale málokdo píše o dovednostech pro Alici a já jsem nenašel žádné informace o tom, jak vyrobit jediného bota, tak jsem se rozhodl podělit se o své zkušenosti, jak vyrobit jednoduchý telegramový bot a dovednost Yandex.Alice pro web se stejnou funkčností.
Takže, jak nastavit webový server a získat SSL certifikát To vám neprozradím, o tom už bylo napsáno dost.
Vytvoření telegramového robota
Nejprve si vytvořte telegramového bota, za tímto účelem přejdeme do Telegramu a najdeme tam bota BotFather.


Vyberte /newbot

Zadáme jméno robota, kterým bude reagovat, poté zadáme jméno robota, jako odpověď získáme token pro ovládání robota, tento klíč si zapíšeme, bude se nám hodit v budoucnu.

Dalším krokem je sdělit telegramovým serverům, na který server mají odeslat data z robota. Za tímto účelem vytvoříme odkaz na formulář:
https: //api.telegram.org/bot___ТОКЕН___/setWebhook?url=https://____ПУТЬ_ДО_СКРПИТА___
___TOKEN___ nahrazujeme naším tokenem od robota, který jsme obdrželi dříve
____CESTA_K_SKRIPTU___ se nahrazuje 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 blokovaný, ale můžete to udělat takto: pronajmout si ten nejlevnější serveru kde neexistují žádná omezení a zadejte příkaz z konzole tohoto serveru
wget ___ПОЛУЧИВШИЙСЯ_АДРЕС___
To je vše, Telegram bot je vytvořen a propojen s vaším. server.
Vytvoření dovednosti pro Yandex.Alisa
Pojďme k vytvoření dovednosti pro Yandex.Alice.
Chcete-li vytvořit dovednost, musíte přejít na stránku vývojáře Yandex.Dialogues Stránka vývojáře Yandex.Dialogs, klikněte tam na "Vytvořit dialog" a vyberte "Skill in Alice".

Otevře se dialog nastavení dovedností.

Začneme vstupovat do nastavení dovedností.
Zadejte název své dovednosti.

Aktivační jméno by mělo být vybráno velmi pečlivě, aby mu Alice správně rozuměla, z nuancí - mobilní aplikace s Alicí a sloupce jako Yandex.Station nebo Irbis A mohou slova vnímat jinak.
Cestu ke skriptu na našem serveru zadáme stejným způsobem jako u Telegramu, ale bude se jednat o skript speciálně pro Alici, například www.my_server.ru/webhook_alice.php.

Volíme hlas, kterým bude dovednost hovořit, mně se více líbí hlas Alice.

Pokud plánujete pracovat pouze na mobilních zařízeních nebo v prohlížeči, vyberte možnost „Potřebujete zařízení s obrazovkou“.
Dále zadejte nastavení pro katalog dovedností Alice. Pokud plánujete pro aktivaci použít slovo „značka“, musíte ověřit web značky ve službě webmaster.yandex.ru.

To je s nastavením vše, přejděme ke skriptům.
Skript telegramového bota
Začněme skriptem pro Telegram.
Připojujeme knihovnu, kde se budou zpracovávat zprávy od robota a Alice:
include_once 'webhook_parse.php';
Nastavili jsme token našeho robota:
$tg_bot_token = "_____YOUR_BOT_TOKEN_____";
Přijímáme údaje:
$request = file_get_contents('php://input');
$request = json_decode($request, TRUE);
Analýza dat do proměnný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);
}
Nyní můžete pracovat s proměnnými:
$tokens - zde jsou nyní všechna slova, která uživatel zadal
$user_id – zde ID uživatele
$msg_chat_id - chat, ve kterém bot obdržel příkaz
$msg_user_name – uživatelské jméno
Dále zavoláme funkci Parse_Tokens pro zpracování:
$Out_Str = Parse_Tokens($tokens);
A pošlete 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);
}
Dovednostní skript pro Yandex.Alisa
Nyní přejděme ke scénáři pro Alici, je téměř stejný jako u Telegramu.
Připojujeme také knihovnu, kde se budou zpracovávat zprávy od robota a Alice, plus knihovnu s třídami pro Alice:
include_once 'classes_alice.php';
include_once 'webhook_parse.php';
Přijímáme údaje:
$data = json_decode(trim(file_get_contents('php://input')), true);
Analýza dat do proměnný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'];}
}
}
Zde je o něco méně proměnných:
$tokens - zde jsou nyní všechna slova, která uživatel zadal
$user_id – zde ID uživatele
Yandex neustále pinguje publikované dovednosti a přidal jsem řádek pro okamžité ukončení skriptu bez zahájení úplného zpracování zprávy:
if (strpos($tokens[0], "ping") > -1) {Send_Out("pong", "", true);}
Pro zpracování voláme funkci Parse_Tokens, je to stejné jako u telegramu:
$Out_Str = Parse_Tokens($tokens);
A pošlete 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) < 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 jsme scénář pro Alici.
Samotný zpracovatelský skript Parse_Tokens byl vytvořen čistě pro příklad, můžete tam provádět libovolné kontroly a zpracování.
function Parse_Tokens($tokens)
{
$out = "";
// do something with tokens //
$out = "Your eneter " . count($tokens) . " words: " . implode($tokens, " ");
return $out;
}
Pokud potřebujete komunikovat s uživatelem složitějšího tvaru, než je otázka-odpověď, budete muset uložit $user_id uživatele a data již přijatá od uživatele do databáze (například mysql) a analyzovat je v funkce Parse_Tokens.
Ve skutečnosti je to téměř vše, pokud je vše provedeno správně, pak je robot Telegram již k dispozici, lze zkontrolovat Alicinu dovednost dialogs.yandex.ru/developerpřejdete na svou novou dovednost na kartě testování.

Pokud vše funguje správně, můžete dovednost odeslat k moderování kliknutím na tlačítko „Pro moderování“.
Nyní máte dva roboty pro různé platformy najednou, kteří fungují stejným způsobem.
Dokumentace pro službu Yandex.Dialogues zde
Úplné skripty zveřejněné na githubu ke stažení.
Zdroj: www.habr.com
