Buongiorno.
Ci sono molte articoli sui bot di Telegram, ma poche informazioni sui skills per Alice; inoltre, non ho trovato informazioni su come creare un bot unico, quindi ho deciso di condividere la mia esperienza su come realizzare un semplice bot Telegram e un skill Yandex.Alice per un sito, con funzionalità unite.
Quindi, non parlerò di come avviare un server web e ottenere un certificato ssl su questo ci sono già molte informazioni disponibili.
Creazione di un bot Telegram
Iniziamo creando un bot Telegram, per farlo apriamo Telegram e cerchiamo il bot BotFather.


Selezioniamo /newbot

Inseriamo il nome del bot, quello con cui risponderà, poi immettiamo il nome del bot e riceviamo un token per gestire il bot; annotiamo questa chiave, ci servirà più avanti.

Il passo successivo è comunicare ai server di Telegram dove inviare i dati dal bot. A tal fine, creiamo un link del tipo:
https://api.telegram.org/bot___TOKEN___/setWebhook?url=https://____PERCORSO_ALLO_SCRIPT___
Sostituiamo ___TOKEN___ con il nostro token del bot ottenuto in precedenza
Sostituiamo ____PERCORSO_ALLO_SCRIPT___ con l'indirizzo dello script sul nostro server, dove avverrà l'elaborazione dei dati (per esempio, www.mio_server.ru/webhook_telegram.php).
C'è un problema, il server api.telegram.org è bloccato, ma si può fare così: affittare il più economico un server là dove non ci sono restrizioni e dare dal terminale di quel server il comando
wget ___INDIRIZZO_RICEVUTO___
Tutto è fatto, il bot di Telegram è stato creato e collegato al tuo server.
Creazione di un'abilità per Yandex.Alice
Passiamo alla creazione di un'abilità per Yandex.Alice.
Per creare un'abilità, è necessario andare alla pagina degli sviluppatori Yandex.Dialoghi pagina degli sviluppatori Yandex.Dialoghi, cliccare su "Crea dialogo" e scegliere "Abilità in Alice".

Si aprirà un dialogo per le impostazioni dell'abilità.

Iniziamo a inserire le impostazioni dell'abilità.
Inseriamo il nome della tua abilità.

Il nome di attivazione deve essere scelto con molta attenzione, affinché Alice lo comprenda correttamente, poiché le app mobili con Alice e gli altoparlanti come Yandex.Station o Irbis A possono percepire le parole in modo diverso.
Inseriamo il percorso dello script sul nostro server proprio come per Telegram, ma questo sarà uno script specifico per Alice, ad esempio www.my_server.ru/webhook_alice.php.

Scegliamo la voce con cui parlerà l'abilità, a me piace di più proprio la voce di Alice.

Se si prevede di lavorare solo su dispositivi mobili o nel browser, si seleziona "Serve un dispositivo con schermo".
Successivamente, inseriamo le impostazioni per il catalogo delle abilità di Alice. Se prevedi di utilizzare la parola per l'attivazione — brand, è necessario completare la verifica del sito del brand sul servizio webmaster.yandex.ru.

Con le impostazioni è tutto, passiamo agli script.
Script del bot Telegram
Iniziamo con lo script per Telegram.
Colleghiamo la libreria che gestirà 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 i dati:
$request = file_get_contents('php://input');
$request = json_decode($request, TRUE);
Analizziamo i dati in variabili:
if (!$request)
{
die();
// Errore (la richiesta non è un JSON valido)
}
else if (!isset($request['update_id']) || !isset($request['message']))
{
die();
// Errore (la richiesta non ha messaggi)
}
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 possiamo lavorare con le variabili:
$tokens — qui ci sono tutte le parole che l'utente ha inserito
$user_id — qui c'è l'id dell'utente
$msg_chat_id — chat in cui il bot ha ricevuto il comando
$msg_user_name — nome utente
Adesso, chiamiamo la funzione Parse_Tokens per l'elaborazione:
$Out_Str = Parse_Tokens($tokens);
E inviamo la risposta:
Send_Out($user_id, $Out_Str);
La funzione Send_Out è semplice e appare 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 per la skill di Yandex.Alice
Ora passiamo allo script per Alice, è quasi lo stesso che per Telegram.
Includiamo anche la libreria che gestirà i messaggi dal bot e da Alice, oltre alla libreria con le classi per Alice:
include_once 'classes_alice.php';
include_once 'webhook_parse.php';
Riceviamo i dati:
$data = json_decode(trim(file_get_contents('php://input')), true);
Analizziamo i 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'];}
}
}
Qui ci sono un po' meno variabili:
$tokens — qui ci sono tutte le parole che l'utente ha inserito
$user_id — qui c'è l'id dell'utente
Yandex controlla costantemente le skill 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 per Telegram:
$Out_Str = Parse_Tokens($tokens);
E inviamo la risposta:
Send_Out($user_id, $Out_Str);
La funzione Send_Out è qui un po' più complessa:
function Send_Out($user_id, $out_text, $out_tts = "", $is_end = false)
{
global $data_msg_sess_id, $user_id;
///// GENERARE BASE DELLA RISPOSTA //////
$Data_Out = new Alice_Data_Out();
$Data_Out->response = new Alice_Response();
$Data_Out->session = new Alice_Session();
///// FINE GENERAZIONE BASE DELLA RISPOSTA //////
///// GENERAZIONE DEL MESSAGGIO /////
$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();
}
Script per Alice completato.
Il proprio script di elaborazione Parse_Tokens è stato fatto solo come esempio; si possono fare tutte le verifiche e le elaborazioni necessarie.
function Parse_Tokens($tokens)
{
$out = "";
// fare qualcosa con i token //
$out = "Hai inserito " . count($tokens) . " parole: " . implode($tokens, " ");
return $out;
}
Se hai bisogno di un'interazione con l'utente più complessa rispetto a domande e risposte, sarà necessario memorizzare nel database (ad esempio, mysql) $user_id dell'utente e i dati già ricevuti dall'utente per analizzarli nella funzione Parse_Tokens.
Fondamentalmente è tutto; se tutto è stato fatto correttamente, il bot di Telegram è già disponibile, puoi verificare l'abilità di Alice. dialogs.yandex.ru/developer, passando al tuo nuovo skill nella scheda di test.

Se tutto funziona correttamente, puoi inviare l'abilità per la moderazione cliccando sul pulsante «In moderazione».
Ora hai subito due bot per piattaforme diverse che funzionano allo stesso modo.
Documentazione del servizio Yandex.Dialoghi qui
Gli script completi sono disponibili su github скачать.
Fonte: habr.com
