Dobar dan.
Postoji mnogo članaka na temu Telegram botova, ali malo ljudi piše o vještinama za Alice, a nisam pronašao nikakvu informaciju o tome kako napraviti niti jednog bota, pa sam odlučio podijeliti svoje iskustvo o tome kako napraviti jednostavan Telegram bot i vještina Yandex.Alice za stranicu koja ima istu funkcionalnost.
Dakle, neću vam govoriti kako da podignete web server i dobijete ssl certifikat, dovoljno je o tome napisano.
Kreiranje Telegram bota
Prvo, napravimo Telegram bot, za to idemo na Telegram i tamo pronalazimo bota BotFather.
Odaberite /newbot
Upisujemo ime bota kojim će odgovoriti, zatim unosimo ime bota, kao odgovor dobijamo token za kontrolu bota, zapisujemo ovaj ključ, biće nam koristan u budućnosti.
Sledeći korak je da kažete Telegram serverima na koji server da pošalju podatke od bota. Da bismo to učinili, pravimo vezu obrasca:
https: //api.telegram.org/bot___ТОКЕН___/setWebhook?url=https://____ПУТЬ_ДО_СКРПИТА___
___TOKEN___ zamjenjujemo našim tokenom od bota, primljenim ranije
____PATH_TO_SCRIPT____ zamjenjujemo sa adresom skripte na našem serveru gdje će se podaci obrađivati (npr.
Ovde postoji problem, server api.telegram.org je u blokadi, ali ovo možete učiniti: iznajmite najjeftiniji server gde nema ograničenja i dajte komandu sa konzole ovog servera
wget ___ПОЛУЧИВШИЙСЯ_АДРЕС___
To je to, Telegram bot je kreiran i povezan sa vašim serverom.
Kreiranje vještine za Yandex.Alisa
Pređimo na kreiranje vještine za Yandex.Alice.
Da biste kreirali vještinu, trebate otići na stranicu programera Yandex.Dialogues
Otvoriće se dijalog postavki vještine.
Počinjemo unositi postavke vještina.
Unesite naziv svoje vještine.
Naziv za aktivaciju treba odabrati vrlo pažljivo kako bi ga Alice ispravno razumjela, iz nijansi - mobilna aplikacija s Alice i stupcima poput Yandex.Station ili Irbis A mogu drugačije percipirati riječi.
Put do skripte unosimo na naš server na isti način kao i za Telegram, ali to će biti skripta posebno za Alice, na primjer
Mi biramo glas kojim će veština govoriti, meni se više sviđa Alisin glas.
Ako planirate raditi samo na mobilnim uređajima ili u pretraživaču, odaberite "Potreban vam je uređaj sa ekranom".
Zatim unesite postavke za Alisin katalog vještina. Ako planirate koristiti riječ "brend" za aktivaciju, morate provjeriti web stranicu brenda u usluzi webmaster.yandex.ru.
To je sve sa postavkama, idemo na skripte.
Telegram bot skripta
Počnimo sa skriptom za Telegram.
Povezujemo biblioteku u kojoj će se obrađivati poruke od bota i Alice:
include_once 'webhook_parse.php';
Postavili smo token našeg bota:
$tg_bot_token = "_____YOUR_BOT_TOKEN_____";
Primamo podatke:
$request = file_get_contents('php://input');
$request = json_decode($request, TRUE);
Rastavljanje podataka u varijable:
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);
}
Sada možete raditi sa varijablama:
$tokeni - ovdje su sada sve riječi koje je korisnik unio
$user_id - korisnički ID ovdje
$msg_chat_id - chat u kojem je bot primio komandu
$msg_user_name - korisničko ime
Zatim pozivamo funkciju Parse_Tokens za obradu:
$Out_Str = Parse_Tokens($tokens);
I pošaljite odgovor:
Send_Out($user_id, $Out_Str);
funkcija Send_Out je jednostavna i izgleda ovako:
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);
}
Skripta vještina za Yandex.Alisa
Pređimo sada na skriptu za Alice, skoro je ista kao i za Telegram.
Povezujemo i biblioteku u kojoj će se obrađivati poruke od bota i Alice, plus biblioteku sa klasama za Alice:
include_once 'classes_alice.php';
include_once 'webhook_parse.php';
Primamo podatke:
$data = json_decode(trim(file_get_contents('php://input')), true);
Rastavljanje podataka u varijable:
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'];}
}
}
Ovdje je nekoliko varijabli manje:
$tokeni - ovdje su sada sve riječi koje je korisnik unio
$user_id - korisnički ID ovdje
Yandex konstantno pinguje objavljene vještine, a ja sam dodao redak da odmah izađem iz skripte bez pokretanja pune obrade poruke:
if (strpos($tokens[0], "ping") > -1) {Send_Out("pong", "", true);}
Pozivamo funkciju Parse_Tokens za obradu, ista je kao i za Telegram:
$Out_Str = Parse_Tokens($tokens);
I pošaljite odgovor:
Send_Out($user_id, $Out_Str);
Funkcija Send_Out je ovdje složenija:
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();
}
Završio scenario za Alice.
Sama skripta za obradu Parse_Tokens je napravljena samo kao primjer, tamo možete obaviti sve provjere i obradu.
function Parse_Tokens($tokens)
{
$out = "";
// do something with tokens //
$out = "Your eneter " . count($tokens) . " words: " . implode($tokens, " ");
return $out;
}
Ako trebate komunicirati s korisnikom složenijeg oblika od pitanja-odgovora, tada ćete morati sačuvati korisnikov $user_id i podatke koji su već primljeni od korisnika u bazu podataka (na primjer, mysql) i analizirati ih u funkcija Parse_Tokens.
Zapravo, ovo je skoro sve, ako je sve urađeno kako treba, onda je Telegram bot već dostupan, Alisina vještina se može provjeriti
Ako sve radi kako treba, možete poslati vještinu na moderiranje klikom na dugme "Za moderiranje".
Sada imate dva bota za različite platforme odjednom, koji rade na isti način.
Dokumentacija za uslugu Yandex.Dialogues
Kompletne skripte objavljene na githubu
izvor: www.habr.com