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.

Escribir un bot de Telegram en R (parte 2): agregar soporte de comandos y filtros de mensajes al bot

Todos los artículos de la serie "Escribir un bot de Telegram en R"

  1. Creamos un bot y lo usamos para enviar mensajes en Telegram.
  2. Agregue soporte de comandos y filtros de mensajes al bot

contenido

Si te interesa el análisis de datos, quizás te interese mi Telegram. и Youtube canales La mayor parte del contenido está dedicado al lenguaje R.

  1. Clase de actualización
  2. Manipuladores - manipuladores
  3. Agregue el primer comando al bot, controlador de comandos
  4. Procesador y filtros de mensajes de texto.
  5. Agregar comandos con parámetros
  6. Ejecute el bot en segundo plano.
  7. Conclusión

Clase de actualización

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.

Escribir un bot de Telegram en R (parte 2): agregar soporte de comandos y filtros de mensajes al bot

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.

Escribir un bot de Telegram en R (parte 2): agregar soporte de comandos y filtros de mensajes al bot

  1. Crear una instancia de la clase. Updater;
  2. 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;
  3. 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;
  4. 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();
  5. 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:
Escribir un bot de Telegram en R (parte 2): agregar soporte de comandos y filtros de mensajes al bot

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:

handler <- MessageHandler(callback, 
  MessageFilters$video | MessageFilters$photo | MessageFilters$document
)

Agregar comandos con parámetros

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.

Escribir un bot de Telegram en R (parte 2): agregar soporte de comandos y filtros de mensajes al 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:

  1. 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….
  2. 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í.
  3. 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.
  4. 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í.
  5. En el menú superior derecho del programador, haga clic en "Crear tarea...".
  6. En la pestaña "General", asigne a su tarea un nombre personalizado y cambie el interruptor al estado "Ejecutar para todos los usuarios".
  7. 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.
  8. Haga clic en Aceptar y, si es necesario, ingrese la contraseña de su cuenta del sistema operativo.
  9. 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.

Suscríbete a mi Telegram. и Youtube canales.

Fuente: habr.com

Añadir un comentario