Bună ziua.
Despre boturile Telegram există foarte multe articole, dar puțini scriu despre abilitățile pentru Alice, iar informații despre cum să faci un bot unic nu am găsit deloc, așa că am decis să îmi împărtășesc experiența despre cum să creezi un bot simplu Telegram și o abilitate pentru Yandex.Alice pentru un site, având funcționalitate comună.
Deci, cum să ridici un server web și să obții certificat ssl nu voi povesti despre asta, s-au scris destule.
Crearea unui bot Telegram
Mai întâi, vom crea un bot Telegram, pentru aceasta mergem în Telegram și căutăm botul BotFather.


Alegem /newbot

Introduci numele botului, la care va răspunde, apoi introduci numele botului și, în răspuns, primim un token pentru gestionarea botului, notăm acest cheie, ne va fi util mai departe.

Pasul următor este să comunicăm serverelor Telegram pe ce server să trimită datele de la bot. Pentru asta facem un link de tip:
https://api.telegram.org/bot___TOKEN___/setWebhook?url=https://____PATH_TO_SCRIPT___
___TOKEN___ înlocuim cu tokenul nostru de la bot, obținut anterior
____PATH_TO_SCRIPT___ înlocuim cu adresa scriptului de pe serverul nostru, unde va avea loc procesarea datelor (de exemplu, www.my_server.ru/webhook_telegram.php).
Aici este o problemă, serverul api.telegram.org este sub blocaj, dar putem face așa: închiriem cel mai ieftin serverul unde nu sunt restricții și dăm din consola acestui server comanda
wget ___GET_ADDRESS___
Totul, botul Telegram a fost creat și asociat cu serverul.
Crearea unei abilități pentru Yandex.Alice
Să trecem la crearea unei abilități pentru Yandex.Alice.
Pentru a crea o abilitate, trebuie să accesați pagina dezvoltatorilor Yandex.Dialogs pagina dezvoltatorilor Yandex.Dialogs, apăsați acolo „Creează dialog” și alegeți „Abilitate în Alice”.

Se va deschide dialogul de setări ale abilității.

Începem să introducem setările abilității.
Introduci numele abilității tale.

Numele de activare trebuie ales cu foarte multă atenție, pentru ca Alice să îl înțeleagă corect, un aspect important – aplicația mobilă cu Alice și difuzoarele de tip Yandex.Station sau Irbis A pot percepe cuvintele diferit.
Introduci calea către scriptul de pe serverul nostru exact ca pentru Telegram, dar acesta va fi un script dedicat pentru Alice, de exemplu www.my_server.ru/webhook_alice.php.

Alegem vocea cu care va vorbi abilitatea, mie îmi place mai mult vocea lui Alice.

Dacă se planifică să funcționeze doar pe dispozitive mobile sau în browser, atunci alegem „Este nevoie de un dispozitiv cu ecran”.
Apoi introducem setările pentru catalogul abilităților Alisei. Dacă plănuiți să folosiți cuvântul - brand pentru activare, trebuie să treceți prin verificarea site-ului brandului în serviciul webmaster.yandex.ru.

Cu setările e totul, trecem la scripturi.
Scriptul botului Telegram
Să începem cu scriptul pentru Telegram.
Conectăm biblioteca în care vor fi procesate mesajele de la bot și de la Alisa:
include_once 'webhook_parse.php';
Setăm tokenul botului nostru:
$tg_bot_token = "_____YOUR_BOT_TOKEN_____";
Primim datele:
$request = file_get_contents('php://input');
$request = json_decode($request, TRUE);
Descompunem 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 putem lucra cu variabilele:
$tokens — aici sunt toate cuvintele pe care utilizatorul le-a introdus
$user_id — aici este id-ul utilizatorului
$msg_chat_id — chat-ul în care botul a primit comanda
$msg_user_name — numele utilizatorului
Apoi, apelăm funcția Parse_Tokens pentru procesare:
$Out_Str = Parse_Tokens($tokens);
Și trimitem 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);
}
Scriptul abilității pentru Yandex.Alice
Acum să trecem la scriptul pentru Alisa, care este aproape identic cu cel pentru Telegram.
De asemenea, conectăm biblioteca în care vor fi procesate mesajele de la bot și de la Alisa, plus biblioteca cu clasele pentru Alisa:
include_once 'classes_alice.php';
include_once 'webhook_parse.php';
Primim datele:
$data = json_decode(trim(file_get_contents('php://input')), true);
Descompunem 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'];}
}
}
Aici sunt puținele variabile necesare:
$tokens — aici sunt toate cuvintele pe care utilizatorul le-a introdus
$user_id — aici este id-ul utilizatorului
Yandex monitorizează constant abilitățile publicate, iar eu am adăugat o linie pentru a ieși imediat din script, fără a rula procesarea completă a mesajului:
if (strpos($tokens[0], "ping") > -1) {Send_Out("pong", "", true);}
Apelăm pentru procesare funcția Parse_Tokens, care este aceeași ca și pentru Telegram:
$Out_Str = Parse_Tokens($tokens);
Și trimitem răspunsul:
Send_Out($user_id, $Out_Str);
Funcția Send_Out aici este un pic mai complexă:
function Send_Out($user_id, $out_text, $out_tts = "", $is_end = false)
{
global $data_msg_sess_id, $user_id;
////////// GENERAȚI BAZA DE IEȘIRE //////////
$Data_Out = new Alice_Data_Out();
$Data_Out->response = new Alice_Response();
$Data_Out->session = new Alice_Session();
////////// GENERAȚI BAZA DE IEȘIRE End //////////
////////// GENERAȚI MESAJUL DE IEȘIRE //////////
$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();
}
Am terminat scriptul pentru Alice.
Scriptul de procesare Parse_Tokens a fost creat doar ca exemplu; veți putea face orice verificări și procesări acolo.
function Parse_Tokens($tokens)
{
$out = "";
// facți ceva cu tokenii //
$out = "Ați introdus " . count($tokens) . " cuvinte: " . implode($tokens, " ");
return $out;
}
Dacă aveți nevoie de interacțiuni mai complexe cu utilizatorul decât o întrebare-răspuns, va trebui să salvați în baza de date (de exemplu, mysql) $user_id al utilizatorului și datele deja primite de la utilizator și să le analizați în funcția Parse_Tokens.
Aceasta este aproape tot, dacă totul a fost realizat corect, botul Telegram este deja disponibil, abilitățile Alice pot fi verificate dialogs.yandex.ru/developer, trecând la noua dvs. abilitate în tab-ul de testare.

Dacă totul funcționează corect, puteți trimite abilitatea la moderare, apăsând butonul „Pentru moderare”.
Acum aveți două boți pentru platforme diferite, care funcționează în mod identic.
Documentația pentru serviciul Yandex.Dialogs aici
Scripturile complete sunt disponibile pe github descărcați.
Sursa: habr.com
