ProHoster > Blog > administración > Escribir un bot de Telegram en R (parte 2): agregar soporte de comandos y filtros de mensajes al bot
Escribir un bot de Telegram en R (parte 2): agregar soporte de comandos y filtros de mensajes al bot
В publicacion anterior descubrimos cómo crear un bot, inicializamos una instancia de la clase Bot y se familiarizó con los métodos de envío de mensajes usándolo.
En este artículo continúo con este tema, por lo que recomiendo comenzar a leer este artículo solo después de leerlo. la primera parte.
Esta vez descubriremos cómo revivir nuestro bot y agregarle soporte de comando, y también nos familiarizaremos con la clase. Updater.
A lo largo del artículo, escribiremos varios bots simples, estos últimos, según una fecha y un código de país determinados, determinarán si un día en un país determinado es fin de semana o día laborable según el calendario de producción. Pero, como antes, el propósito del artículo es familiarizarlo con la interfaz del paquete. telegram.bot para resolver tus propios problemas.
Todos los artículos de la serie "Escribir un bot de Telegram en R"
Updater es una clase que le facilita el desarrollo de un bot de Telegram y utiliza la clase bajo el capó Dispetcher. tarea de clase Updater es recibir actualizaciones del bot (en el artículo anterior utilizamos el método para este propósito getUpdates()), y transferirlos más a Dispetcher.
A su vez Dispetcher contiene los controladores que creó, es decir objetos de clase Handler.
Manipuladores - manipuladores
Con controladores que agregas Dispetcher reacciones del bot a varios eventos. Al momento de escribir este artículo en telegram.bot Se han agregado los siguientes tipos de controladores:
MessageHandler — Controlador de mensajes
CommandHandler: controlador de comandos
CallbackQueryHandler: controlador de datos para teclados enviados desde Inline
ErrorHandler: controlador de errores al solicitar actualizaciones del bot
Agregue el primer comando al bot, controlador de comandos
Si nunca ha usado bots antes y no sabe qué es un comando, entonces los comandos al bot deben enviarse mediante una barra diagonal. / como prefijo.
Comenzaremos con comandos simples, es decir. enseñemos a nuestro robot a saludar cuando se le ordene /hi.
Código 1: Enseñar al bot a saludar
library(telegram.bot)
# создаём экземпляр класса Updater
updater <- Updater('ТОКЕН ВАШЕГО БОТА')
# Пишем метод для приветсвия
say_hello <- function(bot, update) {
# Имя пользователя с которым надо поздароваться
user_name <- update$message$from$first_name
# Отправка приветственного сообщения
bot$sendMessage(update$message$chat_id,
text = paste0("Моё почтение, ", user_name, "!"),
parse_mode = "Markdown")
}
# создаём обработчик
hi_hendler <- CommandHandler('hi', say_hello)
# добаляем обработчик в диспетчер
updater <- updater + hi_hendler
# запускаем бота
updater$start_polling()
Ejecute el código de ejemplo anterior, después de reemplazar 'SU TOKEN DE BOT' con el token real que recibió al crear el bot a través de BotPadre (Hablé sobre la creación de un bot en primer artículo).
método start_polling() clase Updater, que se utiliza al final del código, inicia un ciclo interminable de solicitud y procesamiento de actualizaciones del bot.
Ahora abramos Telegram y escribamos el primer comando a nuestro bot. /hi.
Ahora nuestro bot entiende el comando. /hi, y sabe saludarnos.
Esquemáticamente, el proceso de construcción de un bot tan simple se puede representar de la siguiente manera.
Crear una instancia de la clase. Updater;
Creamos métodos, es decir. Funciones que realizará nuestro bot. En el ejemplo de código, esta es una función. say_hello(). Las funciones que utilizará como métodos de bot deben tener dos argumentos obligatorios: bot и actualización, y uno opcional - args. Argumento bot, este es tu bot, con su ayuda puedes responder mensajes, enviar mensajes o utilizar cualquier otro método disponible para el bot. Argumento actualización esto es lo que el bot recibió del usuario, de hecho, lo que recibimos en el primer artículo usando el método getUpdates(). Argumento args le permite procesar datos adicionales enviados por el usuario junto con el comando, volveremos a este tema un poco más adelante;
Creamos controladores, es decir. Asociamos algunas acciones del usuario con los métodos creados en el paso anterior. Básicamente, un controlador es un desencadenante, un evento que llama a alguna función del bot. En nuestro ejemplo, un disparador de este tipo envía un comando /hi, y es implementado por el equipo hi_hendler <- CommandHandler('hi', say_hello). Primer argumento de función CommandHandler() le permite especificar un comando, en nuestro caso hi, a lo que el bot responderá. El segundo argumento le permite especificar el método del bot, llamaremos al método say_hello, que se ejecutará si el usuario llamó al comando especificado en el primer argumento;
A continuación, agregamos el controlador creado al despachador de nuestra instancia de clase. Updater. Puedes agregar controladores de varias maneras; en el ejemplo anterior, usé la más simple, usando el signo +es decir, updater <- updater + hi_hendler. Lo mismo se puede hacer usando el método. add_handler(), que pertenece a la clase Dispatcher, puedes encontrar este método así: updater$dispatcher$add_handler();
Inicie el bot usando el comando start_polling().
Procesador y filtros de mensajes de texto.
Descubrimos cómo enviar comandos al bot, pero a veces necesitamos que el bot responda no solo a los comandos, sino también a algunos mensajes de texto normales. Para hacer esto, necesita utilizar controladores de mensajes: Manejador de mensajes.
Normal Manejador de mensajes responderá absolutamente a todos los mensajes entrantes. Por lo tanto, los controladores de mensajes se utilizan a menudo junto con filtros. Enseñemos al robot a saludar no solo cuando se lo ordene. /hi, pero también siempre que en el mensaje enviado al bot aparezca una de las siguientes palabras: hola, hola, saludo, hai, bonjour.
Por ahora no escribiremos ningún método nuevo, porque... Ya tenemos un método por el cual el bot nos saluda. Todo lo que necesitamos hacer es crear el filtro y el controlador de mensajes necesarios.
Código 2: agregar un controlador de mensajes de texto y filtrar
library(telegram.bot)
# создаём экземпляр класса Updater
updater <- Updater('ТОКЕН ВАШЕГО БОТА')
# Пишем метод для приветсвия
## команда приветвия
say_hello <- function(bot, update) {
# Имя пользователя с которым надо поздароваться
user_name <- update$message$from$first_name
# Отправляем приветсвенное сообщение
bot$sendMessage(update$message$chat_id,
text = paste0("Моё почтение, ", user_name, "!"),
parse_mode = "Markdown",
reply_to_message_id = update$message$message_id)
}
# создаём фильтры
MessageFilters$hi <- BaseFilter(function(message) {
# проверяем, встречается ли в тексте сообщения слова: привет, здравствуй, салют, хай, бонжур
grepl(x = message$text,
pattern = 'привет|здравствуй|салют|хай|бонжур',
ignore.case = TRUE)
}
)
# создаём обработчик
hi_hendler <- CommandHandler('hi', say_hello) # обработчик команды hi
hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi)
# добаляем обработчики в диспетчер
updater <- updater +
hi_hendler +
hi_txt_hnd
# запускаем бота
updater$start_polling()
Ejecute el código de ejemplo anterior, después de reemplazar 'SU TOKEN DE BOT' con el token real que recibió al crear el bot a través de BotPadre (Hablé sobre la creación de un bot en primer artículo).
Ahora intentemos enviarle al bot varios mensajes que contengan las palabras de saludo enumeradas anteriormente:
Entonces, en primer lugar, le enseñamos al robot no solo a saludar, sino a responder a un saludo. Hicimos esto usando el argumento. respuesta_al_mensaje_id, que está disponible en el método sendMessage(), al que debe transferir la identificación del mensaje al que desea responder. Puede obtener la identificación del mensaje de esta manera: update$message$message_id.
Pero lo principal que hicimos fue agregar un filtro al bot usando la función BaseFilter():
# создаём фильтры
MessageFilters$hi <- BaseFilter(
# анонимная фильтрующая функция
function(message) {
# проверяем, встречается ли в тексте сообщения слова приветствия
grepl(x = message$text,
pattern = 'привет|здравствуй|салют|хай|бонжур',
ignore.case = TRUE)
}
)
Como habrás notado, es necesario agregar filtros al objeto. Filtros de mensajes, que inicialmente ya contiene un pequeño conjunto de filtros ya preparados. En nuestro ejemplo, al objeto Filtros de mensajes agregamos un elemento hi, este es un filtro nuevo.
En función BaseFilter() necesitas pasar la función de filtro. Básicamente, un filtro es solo una función que recibe una instancia de mensaje y devuelve VERDADERO o FALSO. En nuestro ejemplo, escribimos una función simple que, usando la función básica grepl() comprueba el texto del mensaje y si coincide con la expresión regular привет|здравствуй|салют|хай|бонжур devuelve VERDADERO.
A continuación creamos un controlador de mensajes. hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi). Primer argumento de función MessageHandler() es el método que llamará al controlador y el segundo argumento es el filtro mediante el cual será llamado. En nuestro caso, este es el filtro que creamos. MessageFilters$hi.
Bueno, al final agregamos al despachador el controlador creado. hola_txt_hnd.
updater <- updater +
hi_hendler +
hi_txt_hnd
Como escribí arriba, en el paquete telegram.bot y objeto Filtros de mensajes Ya existe un conjunto de filtros integrados que puedes usar:
todos: todos los mensajes
texto — Mensajes de texto
comando: comandos, es decir mensajes que comienzan con /
responder: mensajes que son una respuesta a otro mensaje
audio: mensajes que contienen un archivo de audio
documento — Mensajes con un documento enviado
foto - Mensajes con imágenes enviadas
pegatina — Mensajes con una pegatina enviada
vídeo — Mensajes con vídeo
voz - mensajes de voz
contacto: mensajes que contienen el contenido de Telegram del usuario
ubicación — Mensajes con geolocalización
lugar — Mensajes reenviados
juego — Juegos
Si desea combinar algunos filtros en un controlador, simplemente use el signo | - como lógico Oregóny firmar & como lógico И. Por ejemplo, si desea que el bot llame al mismo método cuando reciba un video, imagen o documento, use el siguiente ejemplo para crear un controlador de mensajes:
Ya sabemos qué son los comandos, cómo crearlos y cómo obligar al bot a ejecutar el comando deseado. Pero en algunos casos, además del nombre del comando, necesitamos pasar algunos datos para ejecutarlo.
A continuación se muestra un ejemplo de un bot que, dada una fecha y un país determinados, le devuelve el tipo de día del calendario de producción.
El siguiente bot utiliza la API del calendario de producción. isdayoff.ru.
Código 3: Bot que informa por fecha y país
library(telegram.bot)
# создаём экземпляр класса Updater
updater <- Updater('1165649194:AAFkDqIzQ6Wq5GV0YU7PmEZcv1gmWIFIB_8')
# Пишем метод для приветсвия
## команда приветвия
check_date <- function(bot, update, args) {
# входящие данные
day <- args[1] # дата
country <- args[2] # страна
# проверка введённых параметров
if ( !grepl('\d{4}-\d{2}-\d{2}', day) ) {
# Send Custom Keyboard
bot$sendMessage(update$message$chat_id,
text = paste0(day, " - некорреткная дата, введите дату в формате ГГГГ-ММ-ДД"),
parse_mode = "Markdown")
} else {
day <- as.Date(day)
# переводим в формат POSIXtl
y <- format(day, "%Y")
m <- format(day, "%m")
d <- format(day, "%d")
}
# страна для проверки
## проверяем задана ли страна
## если не задана устанавливаем ru
if ( ! country %in% c('ru', 'ua', 'by', 'kz', 'us') ) {
# Send Custom Keyboard
bot$sendMessage(update$message$chat_id,
text = paste0(country, " - некорретктный код страны, возможнные значения: ru, by, kz, ua, us. Запрошены данные по России."),
parse_mode = "Markdown")
country <- 'ru'
}
# запрос данных из API
# компоновка HTTP запроса
url <- paste0("https://isdayoff.ru/api/getdata?",
"year=", y, "&",
"month=", m, "&",
"day=", d, "&",
"cc=", country, "&",
"pre=1&",
"covid=1")
# получаем ответ
res <- readLines(url)
# интрепретация ответа
out <- switch(res,
"0" = "Рабочий день",
"1" = "Нерабочий день",
"2" = "Сокращённый рабочий день",
"4" = "covid-19",
"100" = "Ошибка в дате",
"101" = "Данные не найдены",
"199" = "Ошибка сервиса")
# отправляем сообщение
bot$sendMessage(update$message$chat_id,
text = paste0(day, " - ", out),
parse_mode = "Markdown")
}
# создаём обработчик
date_hendler <- CommandHandler('check_date', check_date, pass_args = TRUE)
# добаляем обработчик в диспетчер
updater <- updater + date_hendler
# запускаем бота
updater$start_polling()
Ejecute el código de ejemplo anterior, después de reemplazar 'SU TOKEN DE BOT' con el token real que recibió al crear el bot a través de BotPadre (Hablé sobre la creación de un bot en primer artículo).
Creamos un bot que tiene un solo método en su arsenal. check_date, este método es llamado por el comando del mismo nombre.
Pero, además del nombre del comando, este método requiere que ingreses dos parámetros, el código del país y la fecha. A continuación, el robot comprueba si un día determinado en el país especificado es fin de semana, día acortado o día laborable según el calendario de producción oficial.
Para que el método que creamos acepte parámetros adicionales junto con el comando, use el argumento pass_args = TRUE en función CommandHandler(), y al crear un método, además de los argumentos requeridos bot, actualización crear uno opcional - args. El método creado de esta manera aceptará los parámetros que le pase al bot después del nombre del comando. Los parámetros deben estar separados por un espacio, se enviarán al método como un vector de texto.
Lancemos y probemos nuestro bot.
Ejecute el bot en segundo plano.
El último paso que debemos completar es iniciar el bot en segundo plano.
Para hacer esto, siga el algoritmo que se describe a continuación:
Guarde el código del bot en un archivo con la extensión R. Cuando se trabaja en RStudio, esto se hace a través del menú Archive, equipo Guardar como….
Agregue la ruta a la carpeta bin, que a su vez se encuentra en la carpeta en la que instaló el lenguaje R, a la variable Ruta, instrucciones aquí.
Cree un archivo de texto normal en el que escriba 1 línea: R CMD BATCH C:UsersAlseyDocumentsmy_bot.R... En lugar de C: UsuariosAlseyDocumentosmy_bot.R escriba la ruta al script de su bot. Al mismo tiempo, es importante que no haya caracteres cirílicos ni espacios en el camino, porque esto puede causar problemas al ejecutar el bot. Guárdelo y reemplace su extensión con txt en bate.
Abra el Programador de tareas de Windows, hay muchas formas de hacerlo, por ejemplo, abra cualquier carpeta e ingrese la dirección %windir%system32taskschd.msc /s. Se pueden encontrar otros métodos de lanzamiento. aquí.
En el menú superior derecho del programador, haga clic en "Crear tarea...".
En la pestaña "General", asigne a su tarea un nombre personalizado y cambie el interruptor al estado "Ejecutar para todos los usuarios".
Vaya a la pestaña "Acciones", haga clic en "Crear". En el campo "Programa o script", haga clic en "Examinar", busque el creado en el segundo paso bate archivo y haga clic en Aceptar.
Haga clic en Aceptar y, si es necesario, ingrese la contraseña de su cuenta del sistema operativo.
Busque la tarea creada en el programador, selecciónela y haga clic en el botón "Ejecutar" en la esquina inferior derecha.
Nuestro bot se ejecuta en segundo plano y funcionará hasta que detenga la tarea o apague su PC o servidor en el que se inició.
Conclusión
En este artículo, descubrimos cómo escribir un bot completo que no solo pueda enviar mensajes, sino también responder a mensajes y comandos entrantes. El conocimiento adquirido ya es suficiente para resolver la mayoría de sus problemas.
El próximo artículo hablará sobre cómo agregar un teclado al bot para un trabajo más conveniente.