Yandex.Alice y Telegram bot en PHP con una sola funcionalidad

Buenas tardes

Hay muchos artículos sobre el tema de los bots de Telegram, pero pocos escriben sobre habilidades para 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 bot simple de Telegram y Yandex. teniendo un solo funcional.

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

Crear un bot de Telegram


Primero, crea un bot de Telegram, para esto, ve a Telegram y encuentra el bot BotFather allí.





Elegir / newbot



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.



El siguiente paso es decirle a los servidores de Telegram a qué servidor enviar datos desde el bot. Para hacer esto, haga un enlace del formulario:

https: //api.telegram.org/bot______/setWebhook?url=https://_________ 

___ TOKEN ___ reemplaza con nuestro token bot recibido anteriormente

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

Hay un problema, el servidor api.telegram.org está bloqueado, pero puede hacer esto: alquilar el servidor más barato donde no hay restricciones y dar el comando desde la consola de este servidor

 wget _______ 

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

Creando una habilidad para Yandex.Alice


Pasemos a crear la habilidad para Yandex.Alice.

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



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



Comenzamos a ingresar a la configuración de habilidades.

Ingrese el nombre de su habilidad.



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

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



Elegimos la voz que hablará la habilidad, prefiero la voz de Alice.



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 pasar por la verificación del sitio web de la marca en el servicio webmaster.yandex.ru.



Con la configuración, vaya a los scripts.

Telegram bot script


Comencemos con el guión de 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_____"; 

Obtenemos los datos:

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

Analizamos 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 - ahora todas las palabras que el usuario ingresó aquí

$ user_id: aquí está el ID de usuario

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

$ msg_user_name - nombre de usuario

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

 $Out_Str = Parse_Tokens($tokens); 

Y enviamos la 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); } 

Script de habilidad para Yandex.Alice


Ahora pasemos al guión de Alice, es casi lo mismo que para 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'; 

Obtenemos los datos:

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

Analizamos 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í las variables necesarias son un poco menos:

$ tokens - ahora todas las palabras que el usuario ingresó aquí

$ user_id: aquí está el ID de usuario

Yandex constantemente muestra habilidades publicadas, y agregué una línea para salir inmediatamente del script sin comenzar el procesamiento completo del mensaje:

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

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

 $Out_Str = Parse_Tokens($tokens); 

Y enviamos la 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.

La secuencia de comandos de procesamiento Parse_Tokens se realizó solo, por ejemplo, puede hacer 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 y respuesta, deberá guardar en la base de datos (por ejemplo mysql) $ user_id del usuario y los datos que ya recibió del usuario 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, la habilidad de Alice se puede verificar mediante dialogs.yandex.ru/developer , yendo a su nueva habilidad en la pestaña de prueba.



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

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

Documentación del servicio Yandex.Dialog aquí

Los scripts completos se publican en la descarga de github.

Actualización: envolvió todo en clases y actualizó el repositorio en github

Source: https://habr.com/ru/post/446174/


All Articles