Yandex.Alisa e Telegram bot in PHP con la stessa funzionalità

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.

Yandex.Alisa e Telegram bot in PHP con la stessa funzionalità

Yandex.Alisa e Telegram bot in PHP con la stessa funzionalità

Scegli /newbot

Yandex.Alisa e Telegram bot in PHP con la stessa funzionalità

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.

Yandex.Alisa e Telegram bot in PHP con la stessa funzionalità

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, www.my_server.ru/webhook_telegram.php).

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 Pagina degli sviluppatori di Yandex.Dialogs, fai clic su "Crea dialogo" e seleziona "Abilità in Alice".

Yandex.Alisa e Telegram bot in PHP con la stessa funzionalità

Si aprirà la finestra di dialogo delle impostazioni delle abilità.

Yandex.Alisa e Telegram bot in PHP con la stessa funzionalità

Iniziamo a inserire le impostazioni delle abilità.

Inserisci il nome della tua abilità.

Yandex.Alisa e Telegram bot in PHP con la stessa funzionalità

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 www.my_server.ru/webhook_alice.php.

Yandex.Alisa e Telegram bot in PHP con la stessa funzionalità

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

Yandex.Alisa e Telegram bot in PHP con la stessa funzionalità

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.

Yandex.Alisa e Telegram bot in PHP con la stessa funzionalità

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 dialogs.yandex.ru/developerandando alla tua nuova abilità nella scheda test.

Yandex.Alisa e Telegram bot in PHP con la stessa funzionalità

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 qui

Script completi pubblicati su github scaricare.

Fonte: habr.com

Aggiungi un commento