Yandex.Alice e bot Telegram su PHP con funzionalità unite

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.

Yandex.Alice e bot Telegram su PHP con funzionalità unite

Yandex.Alice e bot Telegram su PHP con funzionalità unite

Selezioniamo /newbot

Yandex.Alice e bot Telegram su PHP con funzionalità unite

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.

Yandex.Alice e bot Telegram su PHP con funzionalità unite

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".

Yandex.Alice e bot Telegram su PHP con funzionalità unite

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

Yandex.Alice e bot Telegram su PHP con funzionalità unite

Iniziamo a inserire le impostazioni dell'abilità.

Inseriamo il nome della tua abilità.

Yandex.Alice e bot Telegram su PHP con funzionalità unite

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.

Yandex.Alice e bot Telegram su PHP con funzionalità unite

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

Yandex.Alice e bot Telegram su PHP con funzionalità unite

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.

Yandex.Alice e bot Telegram su PHP con funzionalità unite

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.

Yandex.Alice e bot Telegram su PHP con funzionalità unite

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

Acquista un hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista un hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster