ProHoster > Blog > administração > Escrevendo um bot de telegrama em R (parte 2): Adicionando suporte a comandos e filtros de mensagens ao bot
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.
Todos os artigos da série “Escrevendo um bot de telegrama em R”
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.
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.
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.
Crie uma instância da classe Updater;
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;
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;
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();
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:
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:
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.
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:
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….
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.
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.
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.
No menu superior direito do agendador, clique em "Criar tarefa...".
Na guia "Geral", dê um nome personalizado à sua tarefa e mude a chave para o estado "Executar para todos os usuários".
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.
Clique em OK e, se necessário, digite a senha da sua conta do sistema operacional.
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.