Dober dan.
Obstaja veliko člankov na temo Telegram botov, vendar le malo ljudi piše o veščinah za Alice in nisem našel nobenih informacij o tem, kako narediti enega samega bota, zato sem se odločil deliti svojo izkušnjo o tem, kako narediti preprost Telegram bot in spretnost Yandex.Alice za spletno mesto z enako funkcionalnostjo.
Torej, ne bom vam povedal, kako dvigniti spletni strežnik in pridobiti ssl certifikat, o tem je bilo že dovolj napisanega.
Ustvarjanje Telegram bota
Najprej ustvarimo bota Telegram, za to gremo v Telegram in tam poiščemo bota BotFather.
Izberite /newbot
Vnesemo ime bota, s katerim se bo odzval, nato vnesemo ime bota, v odgovor dobimo žeton za nadzor bota, zapišemo ta ključ, koristil nam bo v prihodnosti.
Naslednji korak je, da strežnikom Telegram poveste, na kateri strežnik naj pošljejo podatke iz bota. Če želite to narediti, naredimo povezavo obrazca:
https: //api.telegram.org/bot___ТОКЕН___/setWebhook?url=https://____ПУТЬ_ДО_СКРПИТА___
___TOKEN___ zamenjamo z našim žetonom iz bota, prejetim prej
____PATH_TO_SCRIPT____ zamenjamo z naslovom skripte na našem strežniku, kjer bodo podatki obdelani (npr.
Tukaj je problem, strežnik api.telegram.org je v blokadi, vendar lahko naredite tole: najemite najcenejši strežnik, kjer ni omejitev in dajte ukaz s konzole tega strežnika
wget ___ПОЛУЧИВШИЙСЯ_АДРЕС___
To je to, bot Telegram je ustvarjen in povezan z vašim strežnikom.
Ustvarjanje spretnosti za Yandex.Alisa
Preidimo na ustvarjanje spretnosti za Yandex.Alice.
Če želite ustvariti veščino, morate iti na stran za razvijalce Yandex.Dialogues
Odpre se pogovorno okno z nastavitvami spretnosti.
Začnemo vnašati nastavitve spretnosti.
Vnesite ime svoje spretnosti.
Aktivacijsko ime je treba izbrati zelo previdno, tako da ga Alice pravilno razume, glede na nianse - mobilna aplikacija z Alice in stolpci, kot sta Yandex.Station ali Irbis A, lahko besede zaznavajo drugače.
Pot do skripte na našem strežniku vnesemo na enak način kot za Telegram, vendar bo to skript posebej za Alice, npr.
Izberemo glas, s katerim bo spretnost govorila, bolj mi je všeč Alicin glas.
Če nameravate delati samo na mobilnih napravah ali v brskalniku, izberite "Potrebujete napravo z zaslonom."
Nato vnesite nastavitve za Alicein katalog spretnosti. Če nameravate za aktivacijo uporabiti besedo "blagovna znamka", morate preveriti spletno mesto blagovne znamke v storitvi webmaster.yandex.ru.
To je vse z nastavitvami, pojdimo na skripte.
Telegram bot skript
Začnimo s skriptom za Telegram.
Povezujemo knjižnico, kjer bodo obdelana sporočila bota in Alice:
include_once 'webhook_parse.php';
Nastavili smo žeton našega bota:
$tg_bot_token = "_____YOUR_BOT_TOKEN_____";
Prejemamo podatke:
$request = file_get_contents('php://input');
$request = json_decode($request, TRUE);
Razčlenitev podatkov v spremenljivke:
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);
}
Zdaj lahko delate s spremenljivkami:
$tokens - tukaj so zdaj vse besede, ki jih je uporabnik vnesel
$user_id - ID uporabnika tukaj
$msg_chat_id - klepet, v katerem je bot prejel ukaz
$msg_user_name - uporabniško ime
Nato pokličemo funkcijo Parse_Tokens za obdelavo:
$Out_Str = Parse_Tokens($tokens);
In pošlji odgovor:
Send_Out($user_id, $Out_Str);
funkcija Send_Out je preprosta in izgleda takole:
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);
}
Skill skript za Yandex.Alisa
Zdaj pa preidimo na scenarij za Alice, je skoraj enak kot za Telegram.
Povezujemo tudi knjižnico, kjer bodo obdelana sporočila bota in Alice, ter knjižnico z razredi za Alice:
include_once 'classes_alice.php';
include_once 'webhook_parse.php';
Prejemamo podatke:
$data = json_decode(trim(file_get_contents('php://input')), true);
Razčlenitev podatkov v spremenljivke:
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'];}
}
}
Tukaj je nekaj manj spremenljivk:
$tokens - tukaj so zdaj vse besede, ki jih je uporabnik vnesel
$user_id - ID uporabnika tukaj
Yandex nenehno pinga objavljene spretnosti in dodal sem vrstico za takojšen izhod iz skripta, ne da bi začel celotno obdelavo sporočila:
if (strpos($tokens[0], "ping") > -1) {Send_Out("pong", "", true);}
Za obdelavo pokličemo funkcijo Parse_Tokens, je enaka kot pri Telegramu:
$Out_Str = Parse_Tokens($tokens);
In pošlji odgovor:
Send_Out($user_id, $Out_Str);
Funkcija Send_Out je tukaj bolj zapletena:
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();
}
Končal scenarij za Alice.
Sama skripta za obdelavo Parse_Tokens je bila narejena zgolj za primer, tam lahko izvajate poljubna preverjanja in obdelave.
function Parse_Tokens($tokens)
{
$out = "";
// do something with tokens //
$out = "Your eneter " . count($tokens) . " words: " . implode($tokens, " ");
return $out;
}
Če morate komunicirati z uporabnikom bolj zapletene oblike kot je vprašanje-odgovor, boste morali shraniti $user_id uporabnika in podatke, ki ste jih že prejeli od uporabnika, v bazo podatkov (na primer mysql) in jih analizirati v funkcijo Parse_Tokens.
Pravzaprav je to skoraj vse, če je vse narejeno pravilno, potem je Telegram bot že na voljo, Alicino spretnost je mogoče preveriti
Če vse deluje pravilno, lahko spretnost pošljete v moderacijo s klikom na gumb "Za moderiranje".
Sedaj imate naenkrat dva robota za različne platforme, ki delujeta na enak način.
Dokumentacija za storitev Yandex.Dialogi
Celotni skripti so objavljeni na githubu
Vir: www.habr.com