Escribir un bot de telegrama en R (parte 2): engadindo soporte de comandos e filtros de mensaxes ao bot

В publicación anterior descubrimos como crear un bot, inicializamos unha instancia da clase Bot e familiarizouse cos métodos de envío de mensaxes que o utilizan.

Neste artigo continuo este tema, polo que recomendo comezar a ler este artigo só despois de ler a primeira parte.

Esta vez descubriremos como revivir o noso bot e engadirlle soporte de comandos, e tamén familiarizarnos coa clase Updater.

Durante o curso do artigo, escribiremos varios bots sinxelos, estes últimos, en función dunha data e código de país determinados, determinarán se un día nun determinado país é un fin de semana ou un día laborable segundo o calendario de produción. Pero, como antes, o obxectivo do artigo é familiarizarte coa interface do paquete telegram.bot para resolver os seus propios problemas.

Escribir un bot de telegrama en R (parte 2): engadindo soporte de comandos e filtros de mensaxes ao bot

Todos os artigos da serie "Escribindo un bot de telegrama en R"

  1. Creamos un bot e usámolo para enviar mensaxes en telegram
  2. Engade soporte de comandos e filtros de mensaxes ao bot

Contido

Se estás interesado na análise de datos, podes estar interesado no meu telegrama и youtube canles. A maior parte do contido está dedicado á linguaxe R.

  1. Clase de actualización
  2. Manipuladores - manipuladores
  3. Engade o primeiro comando ao bot, o controlador de comandos
  4. Procesador de mensaxes de texto e filtros
  5. Engadir comandos con parámetros
  6. Executar o bot en segundo plano
  7. Conclusión

Clase de actualización

Updater é unha clase que facilita o desenvolvemento dun bot de telegram e usa a clase baixo o capó Dispetcher. Asignación de clase Updater é recibir actualizacións do bot (no artigo anterior usamos o método para este fin getUpdates()), e transfiéraos máis adiante Dispetcher.

Á súa vez Dispetcher contén os controladores que creaches, é dicir. obxectos de clase Handler.

Manipuladores - manipuladores

Con controladores aos que engades Dispetcher reaccións do bot a varios eventos. No momento de escribir este artigo en telegram.bot Engadíronse os seguintes tipos de manipuladores:

  • MessageHandler — Manexador de mensaxes
  • CommandHandler — Manexador de comandos
  • CallbackQueryHandler — Manexador de datos para teclados enviados desde Inline
  • ErrorHandler — Xestor de erros ao solicitar actualizacións do bot

Engade o primeiro comando ao bot, o controlador de comandos

Se nunca usou bots antes e non sabe o que é un comando, entón os comandos ao bot deben enviarse usando unha barra inclinada. / como prefixo.

Comezaremos con comandos sinxelos, é dicir. imos ensinar ao noso bot a saludar por orde /hi.

Código 1: ensinarlle ao 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()

Execute o exemplo de código anterior, despois de substituír "O TEU TOKEN DE BOT" polo token real que recibiu ao crear o bot mediante Pai Bot (Falei sobre a creación dun bot en primeiro artigo).

Método start_polling() clase Updater, que se usa ao final do código, inicia un ciclo interminable de solicitudes e procesamentos de actualizacións do bot.

Agora imos abrir Telegram e escribir o primeiro comando no noso bot /hi.

Escribir un bot de telegrama en R (parte 2): engadindo soporte de comandos e filtros de mensaxes ao bot

Agora o noso bot entende o comando /hi, e sabe como saudarnos.

Esquemáticamente, o proceso de construción dun bot tan sinxelo pódese representar do seguinte xeito.

Escribir un bot de telegrama en R (parte 2): engadindo soporte de comandos e filtros de mensaxes ao bot

  1. Crea unha instancia da clase Updater;
  2. Creamos métodos, i.e. funcións que realizará o noso bot. No exemplo de código esta é unha función say_hello(). As funcións que utilizará como métodos bot deben ter dous argumentos obrigatorios: bot и actualizar, e unha opcional - argumentos. Argumento bot, este é o teu bot, coa súa axuda podes responder mensaxes, enviar mensaxes ou usar calquera outro método dispoñible para o bot. Argumento actualizar isto é o que recibiu o bot do usuario, de feito, o que recibimos no primeiro artigo usando o método getUpdates(). Argumento argumentos permite procesar datos adicionais enviados polo usuario xunto co comando, volveremos sobre este tema un pouco máis tarde;
  3. Creamos controladores, é dicir. Asociamos algunhas accións do usuario cos métodos creados no paso anterior. Esencialmente, un controlador é un disparador, un evento que chama a algunha función de bot. No noso exemplo, tal disparador é enviar un comando /hi, e é implementado polo equipo hi_hendler <- CommandHandler('hi', say_hello). Primeiro argumento da función CommandHandler() permítelle especificar un comando, no noso caso hi, ao que responderá o bot. O segundo argumento permítelle especificar o método bot, chamaremos ao método say_hello, que se executará se o usuario chamou ao comando especificado no primeiro argumento;
  4. A continuación, engadimos o controlador creado ao despachador da nosa instancia de clase Updater. Podes engadir controladores de varias maneiras; no exemplo anterior, usei o máis sinxelo, usando o signo +, é dicir updater <- updater + hi_hendler. O mesmo pódese facer usando o método add_handler(), que pertence á clase Dispatcher, podes atopar este método así: updater$dispatcher$add_handler();
  5. Inicie o bot usando o comando start_polling().

Procesador de mensaxes de texto e filtros

Descubrimos como enviar comandos ao bot, pero ás veces necesitamos que o bot responda non só aos comandos, senón tamén a algunhas mensaxes de texto habituais. Para iso cómpre empregar controladores de mensaxes − Manexador de mensaxes.

Normal Manexador de mensaxes responderá a absolutamente todas as mensaxes entrantes. Polo tanto, os controladores de mensaxes úsanse a miúdo xunto cos filtros. Imos ensinarlle ao bot a saludar non só por orde /hi, pero tamén sempre que na mensaxe enviada ao bot apareza unha das seguintes palabras: ola, ola, saúdo, hai, bonjour.

Polo momento non escribiremos ningún método novo, porque... Xa temos un método polo que o bot nos recibe. Todo o que temos que facer é crear o filtro necesario e o controlador de mensaxes.

Código 2: engade un controlador e un filtro de mensaxes de texto

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()

Execute o exemplo de código anterior, despois de substituír "O TEU TOKEN DE BOT" polo token real que recibiu ao crear o bot mediante Pai Bot (Falei sobre a creación dun bot en primeiro artigo).

Agora imos tentar enviarlle ao bot varias mensaxes que conteñan as palabras de saúdo listadas anteriormente:
Escribir un bot de telegrama en R (parte 2): engadindo soporte de comandos e filtros de mensaxes ao bot

Entón, en primeiro lugar, ensinámoslle ao bot non só a saudar, senón a responder a un saúdo. Fixémolo usando o argumento reply_to_message_id, que está dispoñible no método sendMessage(), no que cómpre transferir o ID da mensaxe á que quere responder. Podes obter o ID da mensaxe así: update$message$message_id.

Pero o principal que fixemos foi engadir un filtro ao bot usando a función BaseFilter():

# создаём фильтры
MessageFilters$hi <- BaseFilter( 

  # анонимная фильтрующая функция
  function(message) {

    # проверяем, встречается ли в тексте сообщения слова приветствия
    grepl(x           = message$text, 
          pattern     = 'привет|здравствуй|салют|хай|бонжур',
          ignore.case = TRUE)
  }

)

Como podes ter notado, hai que engadir filtros ao obxecto Filtros de mensaxes, que inicialmente xa contén un pequeno conxunto de filtros preparados. No noso exemplo, ao obxecto Filtros de mensaxes engadimos un elemento hi, este é un novo filtro.

Para funcionar BaseFilter() cómpre pasar a función de filtro. Esencialmente, un filtro é só unha función que recibe unha instancia de mensaxe e devolve TRUE ou FALSE. No noso exemplo, escribimos unha función simple que, usando a función básica grepl() comproba o texto da mensaxe e se coincide coa expresión regular привет|здравствуй|салют|хай|бонжур volve TRUE.

A continuación creamos un manejador de mensaxes hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi). Primeiro argumento da función MessageHandler() é o método que chamará ao manejador e o segundo argumento é o filtro polo que se chamará. No noso caso, este é o filtro que creamos MessageFilters$hi.

Ben, ao final, engadimos ao despachador o controlador creado ola_txt_hnd.

updater <- updater + 
             hi_hendler +
             hi_txt_hnd

Como escribín arriba, no paquete telegram.bot e obxecto Filtros de mensaxes Xa hai un conxunto de filtros integrados que podes usar:

  • todas — Todas as mensaxes
  • texto — Mensaxes de texto
  • comando — Comandos, i.e. mensaxes que comezan por /
  • responder — Mensaxes que son unha resposta a outra mensaxe
  • audio — Mensaxes que conteñen un ficheiro de audio
  • documento — Mensaxes cun documento enviado
  • foto - Mensaxes con imaxes enviadas
  • adhesivo — Mensaxes cun adhesivo enviado
  • vídeo — Mensaxes con vídeo
  • voz - Mensaxes de voz
  • contacto — Mensaxes que conteñen o contido do telegrama do usuario
  • localización — Mensaxes con xeolocalización
  • lugar — Mensaxes reenviadas
  • xogo — Xogos

Se queres combinar algúns filtros nun manejador só tes que usar o signo | - como lóxico Ou, e asinar & como lóxico И. Por exemplo, se queres que o bot chame ao mesmo método cando recibe un vídeo, imaxe ou documento, utiliza o seguinte exemplo para crear un controlador de mensaxes:

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

Engadir comandos con parámetros

Xa sabemos que son os comandos, como crealos e como forzar o bot a executar o comando desexado. Pero nalgúns casos, ademais do nome do comando, necesitamos pasar algúns datos para executalo.

A continuación móstrase un exemplo dun bot que, dada unha data e un país determinados, devolveche o tipo de día do calendario de produción.

O bot que aparece a continuación usa a API do calendario de produción isdayoff.ru.

Código 3: Bot que informa por data e 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()

Execute o exemplo de código anterior, despois de substituír "O TEU TOKEN DE BOT" polo token real que recibiu ao crear o bot mediante Pai Bot (Falei sobre a creación dun bot en primeiro artigo).

Creamos un bot que só ten un método no seu arsenal check_date, este método chámase polo comando do mesmo nome.

Pero, ademais do nome do comando, este método require que introduza dous parámetros, o código do país e a data. A continuación, o bot verifica se un día determinado no país especificado é un fin de semana, un día reducido ou un día laborable segundo o calendario de produción oficial.

Para que o método que creamos acepte parámetros adicionais xunto co comando, use o argumento pass_args = TRUE en función CommandHandler(), e ao crear un método, ademais dos argumentos necesarios bot, actualizar crear un opcional - argumentos. O método creado deste xeito aceptará os parámetros que pasa ao bot despois do nome do comando. Os parámetros deben estar separados por un espazo; enviaranse ao método como un vector de texto.

Imos lanzar e probar o noso bot.

Escribir un bot de telegrama en R (parte 2): engadindo soporte de comandos e filtros de mensaxes ao bot

Executar o bot en segundo plano

O último paso que debemos completar é lanzar o bot en segundo plano.

Para iso, siga o algoritmo descrito a continuación:

  1. Garda o código do bot nun ficheiro coa extensión R. Cando se traballa en RStudio, isto faise a través do menú Arquivo, equipo Gardar como ....
  2. Engade o camiño ao cartafol bin, que á súa vez está situado no cartafol no que instalou o idioma R, á variable Path, instrucións aquí.
  3. Crea un ficheiro de texto normal no que escriba 1 liña: R CMD BATCH C:UsersAlseyDocumentsmy_bot.R... Pola contra C:UsuariosAlseyDocumentsmy_bot.R escriba o camiño ao seu script de bot. Ao mesmo tempo, é importante que non haxa caracteres cirílicos nin espazos no camiño, porque isto pode causar problemas ao executar o bot. Gárdao e substitúe a súa extensión por txt en bat.
  4. Abre o Programador de tarefas de Windows, hai moitas formas de facelo, por exemplo, abra calquera cartafol e introduza o enderezo %windir%system32taskschd.msc /s. Pódense atopar outros métodos de lanzamento aquí.
  5. No menú superior dereito do planificador, faga clic en "Crear tarefa...".
  6. Na pestana "Xeral", dálle un nome personalizado á túa tarefa e cambia o interruptor ao estado "Executar para todos os usuarios".
  7. Vaia á pestana "Accións", fai clic en "Crear". No campo "Programa ou script", fai clic en "Examinar", busca o creado no segundo paso bat ficheiro e prema en Aceptar.
  8. Faga clic en Aceptar e, se é necesario, introduza o contrasinal da súa conta do sistema operativo.
  9. Busca a tarefa creada no programador, selecciónaa e fai clic no botón "Executar" na esquina inferior dereita.

O noso bot execútase en segundo plano e funcionará ata que deteñas a tarefa ou apagues o teu PC ou servidor no que se iniciou.

Conclusión

Neste artigo, descubrimos como escribir un bot completo que non só pode enviar mensaxes, senón tamén responder ás mensaxes e comandos entrantes. Os coñecementos adquiridos xa son suficientes para resolver a maioría dos teus problemas.

O seguinte artigo falarase de como engadir un teclado ao bot para un traballo máis cómodo.

Subscríbete ao meu telegrama и youtube canles.

Fonte: www.habr.com

Engadir un comentario