Yandex.Alice y bot de Telegram en PHP con funcionalidad unificada

Hola.

Hay muchos artículos sobre bots de Telegram, pero pocos hablan sobre las habilidades para Alice, y no encontré información sobre cómo hacer un solo bot, así que decidí compartir mi experiencia sobre cómo crear un bot sencillo de Telegram y una habilidad para Yandex.Alice para un sitio web, que tiene una funcionalidad unificada.

Así que, cómo levantar un servidor web y obtener un certificado SSL no lo explicaré, ya hay suficiente escrito sobre eso.

Creación de un bot de Telegram

Primero vamos a crear un bot de Telegram, para ello entramos en Telegram y buscamos el bot BotFather.

Yandex.Alice y bot de Telegram en PHP con funcionalidad unificada

Yandex.Alice y bot de Telegram en PHP con funcionalidad unificada

Seleccionamos /newbot

Yandex.Alice y bot de Telegram en PHP con funcionalidad unificada

Ingresamos el nombre del bot, por el cual responderá, luego ingresamos el nombre del bot y recibimos un token para controlar el bot, anotamos esta clave, nos será útil más adelante.

Yandex.Alice y bot de Telegram en PHP con funcionalidad unificada

El siguiente paso es informar a los servidores de Telegram a qué servidor enviar los datos del bot. Para ello, creamos un enlace de la siguiente manera:

https://api.telegram.org/bot___TOKEN___/setWebhook?url=https://____RUTA_DEL_SCRIPT___

___TOKEN___ se reemplaza con nuestro token del bot, obtenido anteriormente.

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

Aquí hay un problema, el servidor api.telegram.org está bloqueado, pero se puede solucionar: alquilar el más barato servidor donde no hay restricciones y dar desde la consola de ese servidor el comando

wget ___DIRECCIÓN_OBTENIDA___

Listo, el bot de Telegram ha sido creado y vinculado a tu el servidor.

Creación de una habilidad para Yandex.Alice

Pasemos a la creación de una habilidad para Yandex.Alice.

Para crear la habilidad, debes ir a la página de desarrolladores de Yandex.Dialogs página de desarrolladores de Yandex.Dialogs, hacer clic en 'Crear diálogo' y seleccionar 'Habilidad en Alice'.

Yandex.Alice y bot de Telegram en PHP con funcionalidad unificada

Se abrirá el diálogo de configuración de la habilidad.

Yandex.Alice y bot de Telegram en PHP con funcionalidad unificada

Comenzamos a ingresar la configuración de la habilidad.

Ingresamos el nombre de tu habilidad.

Yandex.Alice y bot de Telegram en PHP con funcionalidad unificada

El nombre de activación debe elegirse con mucho cuidado, para que Alice lo entienda correctamente; un detalle es que la aplicación móvil con Alice y los altavoces como Yandex.Station o Irbis A pueden interpretar las palabras de manera diferente.

Ingresamos la ruta del script en nuestro servidor igual que para Telegram, pero este será el script para Alice, por ejemplo www.my_server.ru/webhook_alice.php.

Yandex.Alice y bot de Telegram en PHP con funcionalidad unificada

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

Yandex.Alice y bot de Telegram en PHP con funcionalidad unificada

Si se planea operar solo en dispositivos móviles o en el navegador, elegimos 'Necesito un dispositivo con pantalla'.

A continuación, ingresamos la configuración para el directorio de habilidades de Alice. Si planea usar la palabra — marca, es necesario verificar el sitio de marca en el servicio webmaster.yandex.ru.

Yandex.Alice y bot de Telegram en PHP con funcionalidad unificada

Con la configuración lista, pasamos a los scripts.

Script del bot de Telegram

Comencemos con el script para Telegram.

Conectamos la biblioteca que procesará los mensajes del bot y de Alice:

include_once 'webhook_parse.php';

Establecemos el token de nuestro bot:

$tg_bot_token = "_____YOUR_BOT_TOKEN_____";

Recibimos los datos:

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

Desglosamos los datos en variables:

if (!$request)
{
  die();
    // Algún error de salida (la solicitud no es un JSON válido)
}
else if (!isset($request['update_id']) || !isset($request['message']))
{
  die();
    // Algún error de salida (la solicitud no contiene mensaje)
}
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 se pueden usar las variables:

$tokens — aquí están todas las palabras que el usuario ha ingresado

$user_id — aquí está el id del usuario

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

$msg_user_name — el nombre del usuario

Ahora llamamos a la función Parse_Tokens para el procesamiento:

$Out_Str = Parse_Tokens($tokens);

Y enviamos la respuesta:

Send_Out($user_id, $Out_Str);

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

 

Script de habilidad para Yandex.Alice

Ahora pasemos al script para Alice, que es casi el mismo que el de Telegram.

También conectamos la biblioteca que procesará los mensajes del bot y de Alice, más la biblioteca de clases para Alice:

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

Recibimos los datos:

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

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

Aquí hay un poco menos de variables necesarias:

$tokens — aquí están todas las palabras que el usuario ha ingresado

$user_id — aquí está el id del usuario

Yandex está constantemente enviando pings a las habilidades publicadas, y he añadido una línea para salir inmediatamente del script sin ejecutar el proceso completo del mensaje:

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

Llamamos a la función Parse_Tokens para su procesamiento, es la misma que para Telegram:

$Out_Str = Parse_Tokens($tokens);

Y enviamos la respuesta:

Send_Out($user_id, $Out_Str);

La función Send_Out aquí es un poco más complicada:

function Send_Out($user_id, $out_text, $out_tts = "", $is_end = false)
{
  global $data_msg_sess_id, $user_id;

  ////////// GENERAR BASE DE SALIDA ///////////
    $Data_Out = new Alice_Data_Out();
    $Data_Out->response = new Alice_Response();
    $Data_Out->session = new Alice_Session();
  ////////// GENERAR BASE DE SALIDA Fin ///////////

  ////////// GENERAR MENSAJE DE SALIDA ///////////
  $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) 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();
}

Hemos terminado el script para Alice.

El script de procesamiento Parse_Tokens se hizo solo como ejemplo, usted podrá hacer cualquier verificación y procesamiento allí.

function Parse_Tokens($tokens)
{
  $out = "";
  // hacer algo con los tokens //
  $out =  "Has ingresado " . count($tokens) . " palabras: " . implode($tokens, " ");
  return $out;
}

Si necesita una comunicación con el usuario de un tipo más complejo que pregunta-respuesta, entonces necesitará guardar en la base de datos (por ejemplo, mysql) $user_id del usuario y los datos ya obtenidos del usuario y analizarlos en la función Parse_Tokens.

Eso es casi todo, si todo se ha hecho correctamente, el bot de Telegram ya está disponible, puede verificar la habilidad de Alice. dialogs.yandex.ru/developer, accediendo a su nueva habilidad en la pestaña de prueba.

Yandex.Alice y bot de Telegram en PHP con funcionalidad unificada

Si todo funciona correctamente, puede enviar la habilidad a moderación pulsando el botón "Enviar a moderación".

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

Documentación del servicio Yandex.Dialogues aquí

Los scripts completos están disponibles en github descargar.

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster