Escrevendo um bot de telegrama em R (parte 2): Adicionando suporte a comandos e filtros de mensagens ao bot

В publicação anterior descobrimos como criar um bot, inicializamos uma instância da classe Bot e me familiarizei com os métodos de envio de mensagens por meio dele.

Neste artigo continuo este tópico, por isso recomendo começar a ler este artigo somente depois de ler a primeira parte.

Desta vez vamos descobrir como reviver nosso bot e adicionar suporte de comando a ele, além de conhecer a classe Updater.

No decorrer do artigo, escreveremos vários bots simples, estes últimos irão, com base em uma determinada data e código de país, determinar se um dia em um determinado país é um fim de semana ou um dia útil de acordo com o calendário de produção. Mas, como antes, o objetivo do artigo é familiarizá-lo com a interface do pacote telegram.bot para resolver seus próprios problemas.

Escrevendo um bot de telegrama em R (parte 2): Adicionando suporte a comandos e filtros de mensagens ao bot

Todos os artigos da série “Escrevendo um bot de telegrama em R”

  1. Criamos um bot e o utilizamos para enviar mensagens no telegrama
  2. Adicione suporte a comandos e filtros de mensagens ao bot

Conteúdo

Se você estiver interessado em análise de dados, talvez esteja interessado em meu telegrama и Youtube canais. A maior parte do conteúdo é dedicada à linguagem R.

  1. Classe atualizadora
  2. Manipuladores - manipuladores
  3. Adicione o primeiro comando ao bot, manipulador de comandos
  4. Processador e filtros de mensagens de texto
  5. Adicionando Comandos com Parâmetros
  6. Execute o bot em segundo plano
  7. Conclusão

Classe atualizadora

Updater é uma classe que torna mais fácil para você desenvolver um bot de telegrama e usa a classe nos bastidores Dispetcher. Tarefa de aula Updater é receber atualizações do bot (no artigo anterior usamos o método para esse fim getUpdates()) e transferi-los posteriormente para Dispetcher.

Por sua vez Dispetcher contém os manipuladores que você criou, ou seja, objetos de classe Handler.

Manipuladores - manipuladores

Com manipuladores você adiciona Dispetcher reações do bot a vários eventos. No momento em que escrevo este artigo em telegram.bot Os seguintes tipos de manipuladores foram adicionados:

  • MessageHandler — Manipulador de mensagens
  • CommandHandler — Manipulador de comandos
  • CallbackQueryHandler — Manipulador de dados para teclados enviados do Inline
  • ErrorHandler — Manipulador de erros ao solicitar atualizações do bot

Adicione o primeiro comando ao bot, manipulador de comandos

Se você nunca usou bots antes e não sabe o que é um comando, os comandos para o bot devem ser enviados usando uma barra / como prefixo.

Começaremos com comandos simples, ou seja. vamos ensinar nosso bot a dizer olá sob comando /hi.

Código 1: Ensinando o bot a dizer olá

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 acima, após substituir 'YOUR BOT TOKEN' pelo token real que você recebeu ao criar o bot via BotPai (Falei sobre a criação de um bot em primeiro artigo).

método start_polling() classe Updater, que é usado no final do código, inicia um loop infinito de solicitação e processamento de atualizações do bot.

Agora vamos abrir o Telegram e escrever o primeiro comando para o nosso bot /hi.

Escrevendo um bot de telegrama em R (parte 2): Adicionando suporte a comandos e filtros de mensagens ao bot

Agora nosso bot entende o comando /hi, e sabe como nos cumprimentar.

Esquematicamente, o processo de construção de um bot tão simples pode ser representado da seguinte forma.

Escrevendo um bot de telegrama em R (parte 2): Adicionando suporte a comandos e filtros de mensagens ao bot

  1. Crie uma instância da classe Updater;
  2. Criamos métodos, ou seja, funções que nosso bot irá executar. No exemplo de código, esta é uma função say_hello(). As funções que você usará como métodos bot devem ter dois argumentos obrigatórios - focinho и atualizare um opcional - args. Argumento focinho, este é o seu bot, com sua ajuda você pode responder mensagens, enviar mensagens ou usar qualquer outro método disponível para o bot. Argumento atualizar foi isso que o bot recebeu do usuário, na verdade, o que recebemos no primeiro artigo usando o método getUpdates(). Argumento args permite processar dados adicionais enviados pelo usuário junto com o comando, voltaremos a este tópico um pouco mais tarde;
  3. Criamos manipuladores, ou seja, Associamos algumas ações do usuário aos métodos criados na etapa anterior. Essencialmente, um manipulador é um gatilho, um evento que chama alguma função de bot. No nosso exemplo, tal gatilho está enviando um comando /hi, e é implementado pela equipe hi_hendler <- CommandHandler('hi', say_hello). Primeiro argumento de função CommandHandler() permite que você especifique um comando, no nosso caso hi, ao qual o bot responderá. O segundo argumento permite que você especifique o método bot, chamaremos o método say_hello, que será executado se o usuário chamar o comando especificado no primeiro argumento;
  4. A seguir, adicionamos o manipulador criado ao despachante da nossa instância de classe Updater. Você pode adicionar manipuladores de diversas maneiras; no exemplo acima, usei a mais simples, usando o sinal +Ie updater <- updater + hi_hendler. O mesmo pode ser feito usando o método add_handler(), que pertence à classe Dispatcher, você pode encontrar este método assim: updater$dispatcher$add_handler();
  5. Inicie o bot usando o comando start_polling().

Processador e filtros de mensagens de texto

Descobrimos como enviar comandos para o bot, mas às vezes precisamos que o bot responda não apenas aos comandos, mas também a algumas mensagens de texto normais. Para fazer isso, você precisa usar manipuladores de mensagens - Manipulador de mensagens.

Normal Manipulador de mensagens responderá a absolutamente todas as mensagens recebidas. Portanto, os manipuladores de mensagens são frequentemente usados ​​junto com filtros. Vamos ensinar o bot a dizer olá não apenas sob comando /hi, mas também sempre que uma das seguintes palavras aparecer na mensagem enviada ao bot: olá, olá, saudação, hai, bonjour.

Por enquanto não escreveremos nenhum método novo, porque... Já temos um método pelo qual o bot nos cumprimenta. Tudo o que precisamos fazer é criar o filtro e o manipulador de mensagens necessários.

Código 2: adicione um gerenciador e filtro de mensagens 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 acima, após substituir 'YOUR BOT TOKEN' pelo token real que você recebeu ao criar o bot via BotPai (Falei sobre a criação de um bot em primeiro artigo).

Agora vamos tentar enviar ao bot várias mensagens contendo as palavras de saudação listadas anteriormente:
Escrevendo um bot de telegrama em R (parte 2): Adicionando suporte a comandos e filtros de mensagens ao bot

Então, em primeiro lugar, ensinamos o bot não apenas a dizer olá, mas a responder a uma saudação. Fizemos isso usando o argumento resposta_para_message_id, que está disponível no método sendMessage(), para o qual você precisa transferir o id da mensagem à qual deseja responder. Você pode obter o ID da mensagem assim: update$message$message_id.

Mas a principal coisa que fizemos foi adicionar um filtro ao bot usando a função BaseFilter():

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

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

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

)

Como você deve ter notado, filtros precisam ser adicionados ao objeto Filtros de mensagens, que inicialmente já contém um pequeno conjunto de filtros prontos. No nosso exemplo, para o objeto Filtros de mensagens adicionamos um elemento hi, este é um novo filtro.

Em função BaseFilter() você precisa passar pela função de filtro. Essencialmente, um filtro é apenas uma função que recebe uma instância de mensagem e retorna VERDADEIRO ou FALSE. No nosso exemplo, escrevemos uma função simples que, usando a função básica grepl() verifica o texto da mensagem e se corresponde à expressão regular привет|здравствуй|салют|хай|бонжур devolve VERDADEIRO.

Em seguida, criamos um manipulador de mensagens hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi). Primeiro argumento de função MessageHandler() é o método que chamará o manipulador e o segundo argumento é o filtro pelo qual ele será chamado. No nosso caso, este é o filtro que criamos MessageFilters$hi.

Bem, no final, adicionamos ao despachante o manipulador criado oi_txt_hnd.

updater <- updater + 
             hi_hendler +
             hi_txt_hnd

Como escrevi acima, no pacote telegram.bot e objeto Filtros de mensagens Já existe um conjunto de filtros integrados que você pode usar:

  • todas — Todas as mensagens
  • texto – mensagens de texto
  • comando - Comandos, ou seja, mensagens que começam com /
  • responder – Mensagens que são uma resposta a outra mensagem
  • audio — Mensagens contendo um arquivo de áudio
  • document — Mensagens com um documento enviado
  • foto - Mensagens com imagens enviadas
  • adesivo — Mensagens com adesivo enviado
  • vídeo — Mensagens com vídeo
  • voz - mensagens de voz
  • contato – Mensagens contendo o conteúdo do telegrama do usuário
  • localização — Mensagens com geolocalização
  • local – Mensagens encaminhadas
  • jogo - Jogos

Se você quiser combinar alguns filtros em um manipulador basta usar o sinal | - como uma lógica Oue assine & tão lógico И. Por exemplo, se você deseja que o bot chame o mesmo método ao receber um vídeo, imagem ou documento, use o exemplo a seguir para criar um manipulador de mensagens:

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

Adicionando Comandos com Parâmetros

Já sabemos o que são comandos, como criá-los e como forçar o bot a executar o comando desejado. Mas em alguns casos, além do nome do comando, precisamos passar alguns dados para executá-lo.

Abaixo está um exemplo de bot que, dada uma determinada data e país, retorna o tipo de dia do calendário de produção.

O bot abaixo usa a API do calendário de produção isdayoff.ru.

Código 3: Bot que reporta 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 acima, após substituir 'YOUR BOT TOKEN' pelo token real que você recebeu ao criar o bot via BotPai (Falei sobre a criação de um bot em primeiro artigo).

Criamos um bot que possui apenas um método em seu arsenal check_date, este método é chamado pelo comando de mesmo nome.

Mas, além do nome do comando, este método exige que você insira dois parâmetros, o código do país e a data. Em seguida, o bot verifica se um determinado dia no país especificado é um fim de semana, um dia abreviado ou um dia útil de acordo com o calendário oficial de produção.

Para que o método que criamos aceite parâmetros adicionais junto com o comando, use o argumento pass_args = TRUE em função CommandHandler(), e ao criar um método, além dos argumentos necessários focinho, atualizar crie um opcional - args. O método criado desta forma aceitará os parâmetros que você passa ao bot após o nome do comando. Os parâmetros devem ser separados por um espaço; serão enviados ao método como um vetor de texto.

Vamos lançar e testar nosso bot.

Escrevendo um bot de telegrama em R (parte 2): Adicionando suporte a comandos e filtros de mensagens ao bot

Execute o bot em segundo plano

A última etapa que precisamos concluir é iniciar o bot em segundo plano.

Para fazer isso, siga o algoritmo descrito abaixo:

  1. Salve o código do bot em um arquivo com extensão R. Ao trabalhar no RStudio, isso é feito através do menu Envie o, equipe Salvar como….
  2. Adicione o caminho para a pasta bin, que por sua vez está localizada na pasta em que você instalou a linguagem R, na variável Path, instruções aqui.
  3. Crie um arquivo de texto normal no qual escreva 1 linha: R CMD BATCH C:UsersAlseyDocumentsmy_bot.R... Ao invés de C: UsuáriosAlseyDocumentsmy_bot.R escreva o caminho para o script do seu bot. Ao mesmo tempo, é importante que não haja caracteres cirílicos ou espaços ao longo do caminho, pois isso pode causar problemas ao executar o bot. Salve-o e substitua sua extensão por txt em bat.
  4. Abra o Agendador de Tarefas do Windows, há várias maneiras de fazer isso, por exemplo, abra qualquer pasta e digite o endereço %windir%system32taskschd.msc /s. Outros métodos de lançamento podem ser encontrados aqui.
  5. No menu superior direito do agendador, clique em "Criar tarefa...".
  6. Na guia "Geral", dê um nome personalizado à sua tarefa e mude a chave para o estado "Executar para todos os usuários".
  7. Vá para a guia "Ações", clique em "Criar". No campo “Programa ou script”, clique em “Navegar”, encontre aquele criado na segunda etapa bat arquivo e clique em OK.
  8. Clique em OK e, se necessário, digite a senha da sua conta do sistema operacional.
  9. Encontre a tarefa criada no agendador, selecione-a e clique no botão “Executar” no canto inferior direito.

Nosso bot é executado em segundo plano e funcionará até você interromper a tarefa ou desligar o PC ou servidor no qual foi iniciado.

Conclusão

Neste artigo, descobrimos como escrever um bot completo que pode não apenas enviar mensagens, mas também responder a mensagens e comandos recebidos. O conhecimento adquirido já é suficiente para resolver a maioria dos seus problemas.

O próximo artigo falará sobre como adicionar um teclado ao bot para um trabalho mais conveniente.

Inscreva-se no meu telegrama и Youtube canais.

Fonte: habr.com

Adicionar um comentário