Yandex.Alisa y Telegram bot en PHP con la misma funcionalidad

Buen día.

Hay muchos artículos sobre el tema de los bots de Telegram, pero pocas personas escriben sobre las habilidades de Alice, y no encontré ninguna información sobre cómo hacer un solo bot, así que decidí compartir mi experiencia sobre cómo hacer un simple bot de Telegram y la habilidad Yandex.Alice para el sitio que tiene la misma funcionalidad.

Por lo tanto, no le diré cómo crear un servidor web y obtener un certificado SSL, ya se ha escrito suficiente al respecto.

Crear un bot de Telegram

Primero vamos a crear un bot de Telegram, para ello vamos a Telegram y encontramos allí el bot BotFather.

Yandex.Alisa y Telegram bot en PHP con la misma funcionalidad

Yandex.Alisa y Telegram bot en PHP con la misma funcionalidad

Elija /nuevobot

Yandex.Alisa y Telegram bot en PHP con la misma funcionalidad

Ingresamos el nombre del bot por el cual responderá, luego ingresamos el nombre del bot, en respuesta obtenemos un token para controlar el bot, escribimos esta clave, nos será útil en el futuro.

Yandex.Alisa y Telegram bot en PHP con la misma funcionalidad

El siguiente paso es decirle a los servidores de Telegram a qué servidor enviar los datos del bot. Para ello, hacemos un enlace del formulario:

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

___TOKEN___ reemplazamos con nuestro token del bot, recibido anteriormente

____PATH_TO_SCRIPT____ reemplazamos con la dirección del script en nuestro servidor donde se procesarán los datos (por ejemplo, www.mi_servidor.ru/webhook_telegram.php).

Aquí hay un problema, el servidor api.telegram.org está bloqueado, pero puede hacer esto: alquile el servidor más barato donde no haya restricciones y dé el comando desde la consola de este servidor

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

Eso es todo, el bot de Telegram se crea y se conecta a su servidor.

Creando una habilidad para Yandex.Alisa

Pasemos a crear una habilidad para Yandex.Alice.

Para crear una habilidad, debe ir a la página de desarrolladores de Yandex.Dialogues Página del desarrollador de Yandex.Dialogs, haga clic allí "Crear diálogo" y seleccione "Habilidad en Alice".

Yandex.Alisa y Telegram bot en PHP con la misma funcionalidad

Se abrirá el cuadro de diálogo de configuración de habilidades.

Yandex.Alisa y Telegram bot en PHP con la misma funcionalidad

Comenzamos a ingresar a la configuración de habilidades.

Introduzca el nombre de su habilidad.

Yandex.Alisa y Telegram bot en PHP con la misma funcionalidad

El nombre de activación debe elegirse con mucho cuidado para que Alice lo entienda correctamente, a partir de los matices: una aplicación móvil con Alice y columnas como Yandex.Station o Irbis A pueden percibir las palabras de manera diferente.

Ingresamos la ruta al script en nuestro servidor de la misma manera que para Telegram, pero será un script específico para Alice, por ejemplo. www.mi_servidor.ru/webhook_alice.php.

Yandex.Alisa y Telegram bot en PHP con la misma funcionalidad

Elegimos la voz con la que hablará la habilidad, a mí me gusta más la voz de Alice.

Yandex.Alisa y Telegram bot en PHP con la misma funcionalidad

Si planea trabajar solo en dispositivos móviles o en un navegador, seleccione "Necesita un dispositivo con pantalla".

Luego, ingrese la configuración para el catálogo de habilidades de Alice. Si planea usar la palabra "marca" para la activación, debe verificar el sitio web de la marca en el servicio webmaster.yandex.ru.

Yandex.Alisa y Telegram bot en PHP con la misma funcionalidad

Eso es todo con la configuración, pasemos a los scripts.

Guión de bot de Telegram

Comencemos con un guión para Telegram.

Conectamos la biblioteca donde se procesarán los mensajes del bot y Alice:

include_once 'webhook_parse.php';

Configuramos el token de nuestro bot:

$tg_bot_token = "_____YOUR_BOT_TOKEN_____";

Recibimos datos:

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

Analizando los datos 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);
}

Ahora puedes trabajar con variables:

$tokens: aquí están ahora todas las palabras que el usuario ingresó

$user_id - ID de usuario aquí

$msg_chat_id - chat en el que el bot recibió el comando

$msg_user_name - nombre de usuario

A continuación, llamamos a la función Parse_Tokens para su procesamiento:

$Out_Str = Parse_Tokens($tokens);

Y enviar una respuesta:

Send_Out($user_id, $Out_Str);

la función Send_Out es simple y se ve así:

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

Guión de habilidades para Yandex.Alisa

Ahora pasemos al guión de Alice, es casi el mismo que el de Telegram.

También conectamos la biblioteca donde se procesarán los mensajes del bot y Alice, además de una biblioteca con clases para Alice:

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

Recibimos datos:

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

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

Hay algunas variables menos aquí:

$tokens: aquí están ahora todas las palabras que el usuario ingresó

$user_id - ID de usuario aquí

Yandex hace ping constantemente a las habilidades publicadas, y agregué una línea para salir inmediatamente del script sin iniciar el procesamiento completo del mensaje:

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

Llamamos a la función Parse_Tokens para procesamiento, es lo mismo que para Telegram:

$Out_Str = Parse_Tokens($tokens);

Y enviar una respuesta:

Send_Out($user_id, $Out_Str);

La función Send_Out es 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();
}

Terminado el guión de Alice.

El script de procesamiento de Parse_Tokens en sí se creó únicamente como ejemplo, puede realizar cualquier verificación y procesamiento allí.

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

Si necesita comunicarse con un usuario de una forma más compleja que una pregunta-respuesta, deberá guardar el $user_id del usuario y los datos ya recibidos del usuario en la base de datos (por ejemplo, mysql) y analizarlos en la función Parse_Tokens.

En realidad, esto es casi todo, si todo se hace correctamente, entonces el bot de Telegram ya está disponible, se puede verificar la habilidad de Alice diálogos.yandex.ru/developeryendo a su nueva habilidad en la pestaña de prueba.

Yandex.Alisa y Telegram bot en PHP con la misma funcionalidad

Si todo funciona correctamente, puede enviar la habilidad para moderación haciendo clic en el botón "Para moderación".

Ahora tienes dos bots para diferentes plataformas a la vez, que funcionan de la misma manera.

Documentación para el servicio Yandex.Dialogues aquí

Guiones completos publicados en github descargar.

Fuente: habr.com

Añadir un comentario