Yandex.Alisa i Telegram bot en PHP amb la mateixa funcionalitat

Bona tarda.

Hi ha molts articles sobre el tema dels robots de Telegram, però poca gent escriu sobre habilitats per a l'Alice, i no vaig trobar cap informació sobre com fer un únic bot, així que vaig decidir compartir la meva experiència sobre com fer un bot. bot de Telegram senzill i l'habilitat Yandex.Alice per al lloc amb la mateixa funcionalitat.

Per tant, no us diré com crear un servidor web i obtenir un certificat ssl, ja s'ha escrit prou sobre això.

Creació d'un bot de Telegram

Primer, creem un bot de Telegram, per a això anem a Telegram i hi trobem el bot BotFather.

Yandex.Alisa i Telegram bot en PHP amb la mateixa funcionalitat

Yandex.Alisa i Telegram bot en PHP amb la mateixa funcionalitat

Trieu /newbot

Yandex.Alisa i Telegram bot en PHP amb la mateixa funcionalitat

Introduïm el nom del bot pel qual respondrà, després introduïm el nom del bot, en resposta obtenim un token per controlar el bot, anotem aquesta clau, ens serà útil en el futur.

Yandex.Alisa i Telegram bot en PHP amb la mateixa funcionalitat

El següent pas és indicar als servidors de Telegram a quin servidor enviar les dades del bot. Per fer-ho, fem un enllaç del formulari:

https: //api.telegram.org/bot___ТОКЕН___/setWebhook?url=https://____ПУТЬ_ДО_СКРПИТА___

___TOKEN___ substituïm amb el nostre testimoni del bot, rebut abans

____PATH_TO_SCRIPT____ substituïm per l'adreça de l'script al nostre servidor on es processaran les dades (per exemple, www.my_server.ru/webhook_telegram.php).

Aquí hi ha un problema, el servidor api.telegram.org està bloquejat, però pots fer això: lloga el servidor més barat on no hi ha restriccions i dóna l'ordre des de la consola d'aquest servidor

wget ___ПОЛУЧИВШИЙСЯ_АДРЕС___

Això és tot, es crea el bot de Telegram i es connecta al teu servidor.

Creació d'una habilitat per a Yandex.Alisa

Passem a crear una habilitat per a Yandex.Alice.

Per crear una habilitat, heu d'anar a la pàgina de desenvolupadors de Yandex.Dialogues Pàgina de desenvolupadors de Yandex.Dialogs, feu clic allà "Crea diàleg" i seleccioneu "Habilitat en Alice".

Yandex.Alisa i Telegram bot en PHP amb la mateixa funcionalitat

S'obrirà el diàleg de configuració d'habilitats.

Yandex.Alisa i Telegram bot en PHP amb la mateixa funcionalitat

Comencem a introduir la configuració d'habilitats.

Introduïu el nom de la vostra habilitat.

Yandex.Alisa i Telegram bot en PHP amb la mateixa funcionalitat

El nom d'activació s'ha de triar amb molta cura perquè l'Alice l'entengui correctament, des dels matisos: una aplicació mòbil amb Alice i columnes com Yandex.Station o Irbis A poden percebre les paraules de manera diferent.

Introduïm el camí de l'script al nostre servidor de la mateixa manera que per a Telegram, però serà un script específic per a l'Alice, per exemple www.my_server.ru/webhook_alice.php.

Yandex.Alisa i Telegram bot en PHP amb la mateixa funcionalitat

Triem la veu amb la qual parlarà l'habilitat, m'agrada més la veu de l'Alícia.

Yandex.Alisa i Telegram bot en PHP amb la mateixa funcionalitat

Si teniu previst treballar només en dispositius mòbils o en un navegador, seleccioneu "Necessites un dispositiu amb pantalla".

A continuació, introduïu la configuració del catàleg d'habilitats d'Alice. Si teniu previst utilitzar la paraula "marca" per a l'activació, heu de verificar el lloc web de la marca al servei webmaster.yandex.ru.

Yandex.Alisa i Telegram bot en PHP amb la mateixa funcionalitat

Això és tot amb la configuració, passem als guions.

Script del bot de Telegram

Comencem amb un script per a Telegram.

Connectem la biblioteca on es processaran els missatges del bot i l'Alice:

include_once 'webhook_parse.php';

Hem establert el testimoni del nostre bot:

$tg_bot_token = "_____YOUR_BOT_TOKEN_____";

Rebem dades:

$request = file_get_contents('php://input');
$request = json_decode($request, TRUE);

Analitzar les dades en variables:

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);
}

Ara podeu treballar amb variables:

$tokens: aquí hi ha ara totes les paraules que va introduir l'usuari

$user_id - identificació d'usuari aquí

$msg_chat_id - xat en què el bot va rebre l'ordre

$msg_user_name - nom d'usuari

A continuació, anomenem la funció Parse_Tokens per al processament:

$Out_Str = Parse_Tokens($tokens);

I envia una resposta:

Send_Out($user_id, $Out_Str);

la funció Send_Out és senzilla i té aquest aspecte:

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 d'habilitats per a Yandex.Alisa

Ara passem al guió de l'Alice, és gairebé el mateix que el de Telegram.

També connectem la biblioteca on es processaran els missatges del bot i l'Alice, a més d'una biblioteca amb classes per a Alice:

include_once 'classes_alice.php';
include_once 'webhook_parse.php';

Rebem dades:

$data = json_decode(trim(file_get_contents('php://input')), true);

Analitzar les dades en variables:

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'];}
  }
}

Aquí hi ha algunes variables menys:

$tokens: aquí hi ha ara totes les paraules que va introduir l'usuari

$user_id - identificació d'usuari aquí

Yandex fa ping constantment a les habilitats publicades i he afegit una línia per sortir immediatament de l'script sense iniciar el processament complet del missatge:

  if (strpos($tokens[0], "ping") > -1)     {Send_Out("pong", "", true);}

Anomenem la funció Parse_Tokens per al processament, és el mateix que per a Telegram:

$Out_Str = Parse_Tokens($tokens);

I envia una resposta:

Send_Out($user_id, $Out_Str);

La funció Send_Out és més complicada aquí:

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();
}

S'ha acabat el guió d'Alice.

El propi script de processament de Parse_Tokens es va fer només com a exemple, podeu fer qualsevol comprovació i processament allà.

function Parse_Tokens($tokens)
{
  $out = "";
  // do something with tokens //
  $out =  "Your eneter " . count($tokens) . " words: " . implode($tokens, " ");
  return $out;
}

Si necessiteu comunicar-vos amb un usuari d'una forma més complexa que una pregunta-resposta, haureu de desar el $user_id de l'usuari i les dades ja rebudes de l'usuari a la base de dades (per exemple, mysql) i analitzar-les en la funció Parse_Tokens.

De fet, això és gairebé tot, si tot es fa correctament, llavors el bot de Telegram ja està disponible, l'habilitat d'Alice es pot comprovar dialogs.yandex.ru/developeranant a la teva nova habilitat a la pestanya de proves.

Yandex.Alisa i Telegram bot en PHP amb la mateixa funcionalitat

Si tot funciona correctament, podeu enviar l'habilitat per a la moderació fent clic al botó "Per a la moderació".

Ara teniu dos bots per a plataformes diferents alhora, que funcionen de la mateixa manera.

Documentació per al servei Yandex.Dialogues aquí

Scripts complets publicats a github descarregar.

Font: www.habr.com

Afegeix comentari