Buon pomeriggio.
Ci sono molti articoli sull'argomento dei bot di Telegram, ma poche persone scrivono sulle abilità di Alice e non ho trovato alcuna informazione su come creare un singolo bot, quindi ho deciso di condividere la mia esperienza su come creare un semplice bot di Telegram e la skill Yandex.Alice per il sito con la stessa funzionalità.
Quindi, non ti dirò come creare un server web e ottenere un certificato SSL, è stato scritto abbastanza al riguardo.
Creazione di un bot di Telegram
Per prima cosa, creiamo un bot di Telegram, per questo andiamo su Telegram e lì troviamo il bot BotFather.
Scegli /newbot
Inseriamo il nome del bot con cui risponderà, quindi inseriamo il nome del bot, in risposta otteniamo un token per controllare il bot, annotiamo questa chiave, ci sarà utile in futuro.
Il passo successivo è dire ai server di Telegram a quale server inviare i dati dal bot. Per fare ciò, creiamo un collegamento del modulo:
https: //api.telegram.org/bot___ТОКЕН___/setWebhook?url=https://____ПУТЬ_ДО_СКРПИТА___
___TOKEN___ sostituiamo con il nostro token dal bot, ricevuto in precedenza
____PATH_TO_SCRIPT____ sostituiamo con l'indirizzo dello script sul nostro server in cui verranno elaborati i dati (ad esempio,
C'è un problema qui, il server api.telegram.org è in fase di blocco, ma puoi farlo: noleggia il server più economico dove non ci sono restrizioni e dai il comando dalla console di questo server
wget ___ПОЛУЧИВШИЙСЯ_АДРЕС___
Ecco fatto, il bot di Telegram viene creato e connesso al tuo server.
Creazione di una competenza per Yandex.Alisa
Passiamo alla creazione di un'abilità per Yandex.Alice.
Per creare un'abilità, devi andare alla pagina degli sviluppatori di Yandex.Dialogues
Si aprirà la finestra di dialogo delle impostazioni delle abilità.
Iniziamo a inserire le impostazioni delle abilità.
Inserisci il nome della tua abilità.
Il nome dell'attivazione dovrebbe essere scelto con molta attenzione in modo che Alice lo capisca correttamente, dalle sfumature: un'applicazione mobile con Alice e colonne come Yandex.Station o Irbis A può percepire le parole in modo diverso.
Inseriamo il percorso dello script sul nostro server allo stesso modo di Telegram, ma sarà uno script specifico per Alice, ad esempio
Scegliamo la voce con cui parlerà l'abilità, mi piace di più la voce di Alice.
Se prevedi di lavorare solo su dispositivi mobili o in un browser, seleziona "Hai bisogno di un dispositivo con uno schermo".
Successivamente, inserisci le impostazioni per il catalogo delle competenze di Alice. Se prevedi di utilizzare la parola "marchio" per l'attivazione, devi verificare il sito Web del marchio nel servizio webmaster.yandex.ru.
Questo è tutto con le impostazioni, passiamo agli script.
Script del bot di Telegram
Iniziamo con uno script per Telegram.
Colleghiamo la libreria in cui verranno elaborati i messaggi dal bot e da Alice:
include_once 'webhook_parse.php';
Impostiamo il token del nostro bot:
$tg_bot_token = "_____YOUR_BOT_TOKEN_____";
Riceviamo dati:
$request = file_get_contents('php://input');
$request = json_decode($request, TRUE);
Analisi dei dati in variabili:
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);
}
Ora puoi lavorare con le variabili:
$tokens - qui ci sono ora tutte le parole che l'utente ha inserito
$user_id - ID utente qui
$msg_chat_id - chat in cui il bot ha ricevuto il comando
$ msg_user_name - nome utente
Successivamente, chiamiamo la funzione Parse_Tokens per l'elaborazione:
$Out_Str = Parse_Tokens($tokens);
E invia una risposta:
Send_Out($user_id, $Out_Str);
la funzione Send_Out è semplice e si presenta così:
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 di abilità per Yandex.Alisa
Ora passiamo alla sceneggiatura di Alice, è quasi la stessa di Telegram.
Colleghiamo anche la libreria in cui verranno elaborati i messaggi dal bot e da Alice, oltre a una libreria con classi per Alice:
include_once 'classes_alice.php';
include_once 'webhook_parse.php';
Riceviamo dati:
$data = json_decode(trim(file_get_contents('php://input')), true);
Analisi dei dati in variabili:
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'];}
}
}
Ci sono alcune variabili in meno qui:
$tokens - qui ci sono ora tutte le parole che l'utente ha inserito
$user_id - ID utente qui
Yandex esegue costantemente il ping delle competenze pubblicate e ho aggiunto una riga per uscire immediatamente dallo script senza avviare l'elaborazione completa del messaggio:
if (strpos($tokens[0], "ping") > -1) {Send_Out("pong", "", true);}
Chiamiamo la funzione Parse_Tokens per l'elaborazione, è la stessa di Telegram:
$Out_Str = Parse_Tokens($tokens);
E invia una risposta:
Send_Out($user_id, $Out_Str);
La funzione Send_Out è più complicata qui:
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();
}
Finito il copione per Alice.
Lo stesso script di elaborazione Parse_Tokens è stato creato esclusivamente per un esempio, è possibile eseguire qualsiasi controllo ed elaborazione lì.
function Parse_Tokens($tokens)
{
$out = "";
// do something with tokens //
$out = "Your eneter " . count($tokens) . " words: " . implode($tokens, " ");
return $out;
}
Se devi comunicare con un utente in una forma più complessa di una domanda-risposta, dovrai salvare lo $user_id dell'utente e i dati già ricevuti dall'utente nel database (ad esempio, mysql) e analizzarli in la funzione Parse_Tokens.
In realtà, questo è quasi tutto, se tutto è fatto correttamente, allora il bot di Telegram è già disponibile, l'abilità di Alice può essere verificata
Se tutto funziona correttamente, puoi inviare la skill per moderazione facendo clic sul pulsante "Per moderazione".
Ora hai due bot per piattaforme diverse contemporaneamente, che funzionano allo stesso modo.
Documentazione per il servizio Yandex.Dialogues
Script completi pubblicati su github
Fonte: habr.com