Bună ziua.
Există o mulțime de articole pe tema roboților Telegram, dar puțini oameni scriu despre abilități pentru Alice și nu am găsit nicio informație despre cum să creez un singur bot, așa că am decis să împărtășesc experiența mea despre cum să creez un singur bot. bot simplu Telegram și o abilitate Yandex.Alice pentru site-ul având aceeași funcționalitate.
Deci, nu vă voi spune cum să configurați un server web și să obțineți un certificat SSL; s-a scris destul despre asta.
Crearea unui bot Telegram
Mai întâi, să creăm un bot Telegram. Pentru a face acest lucru, accesați Telegram și găsiți botul BotFather acolo.
Selectați /newbot
Introducem numele botului prin care va raspunde, apoi introducem numele botului, ca raspuns primim un token pentru controlul botului, notam aceasta cheie, ne va fi de folos pe viitor.
Următorul pas este să spuneți serverelor Telegram către ce server să trimită datele de la bot. Pentru a face acest lucru, facem un link de genul:
https: //api.telegram.org/bot___ТОКЕН___/setWebhook?url=https://____ПУТЬ_ДО_СКРПИТА___
___TOKEN___ este înlocuit cu jetonul nostru de la botul primit mai devreme
____PATH_TO_SCRPIT___ este înlocuită cu adresa script-ului de pe serverul nostru unde vor fi procesate datele (de exemplu,
Aici este o problemă, serverul api.telegram.org este blocat, dar puteți face acest lucru: închiriați cel mai ieftin server unde nu există restricții și lansați o comandă din consola acestui server
wget ___ПОЛУЧИВШИЙСЯ_АДРЕС___
Gata, botul Telegram a fost creat și conectat la serverul tău.
Crearea unei aptitudini pentru Yandex.Alice
Să trecem la crearea unei abilități pentru Yandex.Alice.
Pentru a crea o abilitate, trebuie să accesați pagina pentru dezvoltatori Yandex.Dialogs
Se va deschide caseta de dialog pentru setările abilităților.
Începem să introducem setările de abilități.
Introduceți numele aptitudinii dvs.
Numele de activare trebuie selectat cu mare atenție, astfel încât Alice să-l înțeleagă corect, din nuanțe - o aplicație mobilă cu Alice și difuzoare precum Yandex.Station sau Irbis A pot percepe cuvintele diferit.
Introducem calea către script pe serverul nostru în același mod ca și pentru Telegram, dar acesta va fi un script special pentru Alice, de exemplu
Alegem vocea cu care va vorbi talentul; îmi place mai mult vocea lui Alice.
Dacă intenționați să lucrați numai pe dispozitive mobile sau într-un browser, atunci selectați „Solicitați un dispozitiv cu ecran”.
Apoi, introduceți setările pentru catalogul de abilități al lui Alice. Dacă intenționați să utilizați cuvântul „brand” pentru activare, trebuie să treceți prin verificarea site-ului web al mărcii în serviciul webmaster.yandex.ru.
Cu setările finalizate, să trecem la scripturi.
Scriptul bot Telegram
Să începem cu un script pentru Telegram.
Conectăm biblioteca în care vor fi procesate mesajele de la bot și Alice:
include_once 'webhook_parse.php';
Setați simbolul botului nostru:
$tg_bot_token = "_____YOUR_BOT_TOKEN_____";
Primim date:
$request = file_get_contents('php://input');
$request = json_decode($request, TRUE);
Să analizăm datele în variabile:
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);
}
Acum puteți lucra cu variabile:
$tokens - acum iată toate cuvintele pe care le-a introdus utilizatorul
$user_id - aici este ID-ul utilizatorului
$msg_chat_id — chat în care botul a primit comanda
$msg_user_name - nume de utilizator
Apoi, numim funcția Parse_Tokens pentru procesare:
$Out_Str = Parse_Tokens($tokens);
Și trimiteți răspunsul:
Send_Out($user_id, $Out_Str);
Funcția Send_Out este simplă și arată astfel:
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);
}
Script de calificare pentru Yandex.Alice
Acum să trecem la scenariul pentru Alice, este aproape la fel ca pentru Telegram.
De asemenea, conectăm biblioteca în care vor fi procesate mesajele de la bot și Alice, plus o bibliotecă cu clase pentru Alice:
include_once 'classes_alice.php';
include_once 'webhook_parse.php';
Primim date:
$data = json_decode(trim(file_get_contents('php://input')), true);
Să analizăm datele în variabile:
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'];}
}
}
Există puțin mai puține variabile necesare aici:
$tokens - acum iată toate cuvintele pe care le-a introdus utilizatorul
$user_id - aici este ID-ul utilizatorului
Yandex dă ping în mod constant la abilitățile publicate și am adăugat o linie pentru a ieși imediat din script fără a începe procesarea completă a mesajului:
if (strpos($tokens[0], "ping") > -1) {Send_Out("pong", "", true);}
Numim funcția Parse_Tokens pentru procesare, este la fel ca și pentru Telegram:
$Out_Str = Parse_Tokens($tokens);
Și trimiteți răspunsul:
Send_Out($user_id, $Out_Str);
Funcția Send_Out este mai complicată aici:
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();
}
Am terminat scenariul pentru Alice.
Scriptul de procesare Parse_Tokens în sine a fost realizat doar de exemplu; puteți face orice verificări și procesări acolo.
function Parse_Tokens($tokens)
{
$out = "";
// do something with tokens //
$out = "Your eneter " . count($tokens) . " words: " . implode($tokens, " ");
return $out;
}
Dacă aveți nevoie de comunicare cu un utilizator de un tip mai complex decât întrebare-răspuns, atunci va trebui să salvați $user_id al utilizatorului și datele deja primite de la utilizator într-o bază de date (de exemplu, mysql) și să le analizați în Parse_Tokens funcţie.
De fapt, asta este aproape tot, dacă totul este făcut corect, atunci botul Telegram este deja disponibil, abilitățile lui Alice pot fi verificate
Dacă totul funcționează corect, puteți trimite abilitățile pentru moderare făcând clic pe butonul „Pentru moderare”.
Acum aveți doi roboți pentru platforme diferite care funcționează în același mod.
Documentație pentru serviciul Yandex.Dialogs
Scripturile complete sunt postate pe github
Sursa: www.habr.com