Dobar dan.
O Telegram botovima postoji mnogo članaka, dok se o vještinama za Alisa malo piše, a informacije o tome kako napraviti jednog bota nisam mogao naći, pa sam odlučio podijeliti svoje iskustvo o tome kako napraviti jednostavnog Telegram bota i vještinu Yandex.Alice za web stranicu koja će imati jedinstvenu funkcionalnost.
Dakle, kako podići web poslužitelj i dobiti ssl certifikat neću pričati, o tome je već dovoljno napisano.
Izrada Telegram bota
Prvo ćemo izraditi Telegram bota, za to idemo u Telegram i tamo pronalazimo bota BotFather.


Biramo /newbot

Unosimo ime bota na kojem će se on odazivati, zatim unosimo korisničko ime bota, a u odgovoru dobivamo token za upravljanje botom, zapišemo ovu ključ, bit će nam potrebna kasnije.

Sljedeći korak je obavijestiti Telegram poslužitelje na koji poslužitelj slati podatke od bota. Za to pravimo link u obliku:
https://api.telegram.org/bot___TOKEN___/setWebhook?url=https://____PUT_DO_SKRIPTE___
___TOKEN___ zamijenimo našim tokenom od bota, koji smo ranije dobili
____PUT_DO_SKRIPTE___ zamijenimo adresom skripte na našem poslužitelju, gdje će se obraditi podaci (na primjer, www.my_server.ru/webhook_telegram.php).
Tu nastaje problem, poslužitelj api.telegram.org je pod blokadom, ali možemo učiniti sljedeće: iznajmiti najjeftiniji server gdje nema ograničenja i dati iz konzole tog poslužitelja naredbu
wget ___DOBIVENA_ADRESA___
Sve, Telegram bot je stvoren i povezan s vašim serverom.
Izrada vještine za Yandex.Alicu
Prelazimo na izradu vještine za Yandex.Alicu.
Za izradu vještine potrebno je otići na stranicu programera Yandex.Dialogs stranicu programera Yandex.Dialogs, kliknuti na "Kreiraj dijalog" i odabrati "Vještina u Alisi".

Otvorit će se dijalog za postavke vještine.

Počinjemo unositi postavke vještine.
Unosimo naziv vaše vještine.

Aktivacijsko ime treba pažljivo birati, da bi ga Alisa ispravno razumjela, od pojedinosti – mobilna aplikacija s Alisom i zvučnici kao što su Yandex.Stanica ili Irbis A mogu različito interpretirati riječi.
Unosimo put do skripte na našem poslužitelju baš kao i za Telegram, ali to će biti skripta namijenjena isključivo Alisi, na primjer www.my_server.ru/webhook_alice.php.

Biramo glas kojim će vještina govoriti, više mi se sviđa glas Alise.

Ako je planirano da radite samo na mobilnim uređajima ili u pregledniku, odabiremo "Potrebno je uređaj s ekranom".
Dalje unosimo postavke za katalog vještina Alise. Ako planirate koristiti riječ - marka za aktivaciju, potrebno je proći verifikaciju web stranice brenda u servisu webmaster.yandex.ru.

S postavkama smo gotovi, prelazimo na skripte.
Skripta Telegram bota
Započnimo sa skriptom za Telegram.
Priključujemo biblioteku koja će obrađivati poruke od bota i Alise:
include_once 'webhook_parse.php';
Postavljamo token našeg bota:
$tg_bot_token = "_____YOUR_BOT_TOKEN_____";
Primamo podatke:
$request = file_get_contents('php://input');
$request = json_decode($request, TRUE);
Raspoređujemo podatke u varijable:
if (!$request)
{
die();
\/\/ Neka greška (zahtev nije validan JSON)
}
else if (!isset($request['update_id']) || !isset($request['message']))
{
die();
\/\/ Neka greška (zahtev nema poruku)
}
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žemo raditi s varijablama:
$tokens - ovdje su sve riječi koje je korisnik unio
$user_id - ovdje je id korisnika
$msg_chat_id - chat u kojem je bot dobio komandu
$msg_user_name - ime korisnika
Dalje, pozivamo funkciju Parse_Tokens za obradu:
$Out_Str = Parse_Tokens($tokens);
I šaljemo 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štine za Yandex.Ališu
Sada prelazimo na skriptu za Alisu, ona je gotovo ista kao i za Telegram.
Također priključujemo biblioteku koja će obrađivati poruke od bota i Alise, plus biblioteku s klasama za Alisu:
include_once 'classes_alice.php';
include_once 'webhook_parse.php';
Primamo podatke:
$data = json_decode(trim(file_get_contents('php://input')), true);
Raspoređujemo podatke 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 nešto manje potrebnih varijabli:
$tokens - ovdje su sve riječi koje je korisnik unio
$user_id - ovdje je id korisnika
Yandex neprestano provjerava objavljene vještine, dodao sam liniju kako bih odmah izašao iz skripte, ne pokrećući cjelovitu obradu poruke:
if (strpos($tokens[0], "ping") > -1) {Send_Out("pong", "", true);}
Pozivamo funkciju Parse_Tokens za obradu, ona je ista kao za Telegram:
$Out_Str = Parse_Tokens($tokens);
I šaljemo odgovor:
Send_Out($user_id, $Out_Str);
Funkcija Send_Out ovdje je složenija:
function Send_Out($user_id, $out_text, $out_tts = "", $is_end = false)
{
global $data_msg_sess_id, $user_id;
//////////// GENERIRANJE OSNOVE IZLAZA ////////////
$Data_Out = new Alice_Data_Out();
$Data_Out->response = new Alice_Response();
$Data_Out->session = new Alice_Session();
//////////// GENERIRANJE OSNOVE IZLAZA Kraj ////////////
//////////// GENERIRANJE PORUKE IZLAZA ////////////
$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();
}
Završili smo skriptu za Alisu.
Sama skripta za obradu Parse_Tokens napravljena je samo kao primjer, vi možete dodati bilo kakve provjere i obrade.
function Parse_Tokens($tokens)
{
$out = "";
// učinite nešto s tokenima //
$out = "Vaš unosi " . count($tokens) . " riječi: " . implode($tokens, " ");
return $out;
}
Ako vam je potrebna složenija interakcija s korisnikom od pitanje-odgovor, trebate pohraniti u bazi (npr. mysql) $user_id korisnika i već primljene podatke od korisnika i analizirati ih u funkciji Parse_Tokens.
U biti, to je skoro sve, ako je sve ispravno napravljeno, Telegram-bot je već dostupan, vještinu Alise možete provjeriti dialogs.yandex.ru/developer, odlaskom u svoju novu vještinu na kartici testiranje.

Ako sve ispravno funkcionira, možete poslati vještinu na moderaciju pritiskom na gumb "Na moderaciju".
Sada imate dva bota za različite platforme koji rade na isti način.
Dokumentacija za servis Yandex.Dialogs ovdje
Cijeli skripti su objavljeni na githubu preuzimanje.
Izvor: habr.com
