Escrevemos um bot de telegram na linguagem R (parte 1): Crie um bot e envie mensagens para o telegram usando-o

A audiência do Telegram cresce exponencialmente a cada dia, isso é facilitado pela comodidade do messenger, pela presença de canais, chats e claro pela possibilidade de criação de bots.

Os bots podem ser usados ​​para finalidades completamente diferentes, desde automatizar as comunicações com seus clientes até gerenciar suas próprias tarefas.

Essencialmente, você pode usar o telegrama para realizar qualquer operação por meio de um bot: enviar ou solicitar dados, executar tarefas no servidor, coletar informações em um banco de dados, enviar e-mails e assim por diante.

Pretendo escrever uma série de artigos sobre como trabalhar com API de bot de telegramae escreva bots para atender às suas necessidades.

Escrevemos um bot de telegram na linguagem R (parte 1): Crie um bot e envie mensagens para o telegram usando-o

Neste primeiro artigo vamos descobrir como criar um bot de telegrama e utilizá-lo para enviar notificações em telegrama.

Como resultado, teremos um bot que verificará o status da última execução de todas as tarefas no Agendador de Tarefas do Windows e enviará notificações caso alguma delas falhe.

Mas o objetivo desta série de artigos não é ensinar como escrever um bot para uma tarefa específica e restrita, mas apresentar a sintaxe do pacote de maneira geral. telegram.bote exemplos de código com os quais você pode escrever bots para resolver seus próprios problemas.

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. Criando um bot de telegrama
  2. Instalando um pacote para trabalhar com um bot de telegrama em R
  3. Enviando mensagens de R para Telegram
  4. Configurando um agendamento para execução de verificações de tarefas
  5. Conclusão

Criando um bot de telegrama

Primeiro, precisamos criar um bot. Isso é feito usando um bot especial BotPai, Vá para link e escreva para o bot /start.

Depois disso você receberá uma mensagem com uma lista de comandos:

Mensagem do BotFather

I can help you create and manage Telegram bots. If you're new to the Bot API, please see the manual (https://core.telegram.org/bots).

You can control me by sending these commands:

/newbot - create a new bot
/mybots - edit your bots [beta]

Edit Bots
/setname - change a bot's name
/setdescription - change bot description
/setabouttext - change bot about info
/setuserpic - change bot profile photo
/setcommands - change the list of commands
/deletebot - delete a bot

Bot Settings
/token - generate authorization token
/revoke - revoke bot access token
/setinline - toggle inline mode (https://core.telegram.org/bots/inline)
/setinlinegeo - toggle inline location requests (https://core.telegram.org/bots/inline#location-based-results)
/setinlinefeedback - change inline feedback (https://core.telegram.org/bots/inline#collecting-feedback) settings
/setjoingroups - can your bot be added to groups?
/setprivacy - toggle privacy mode (https://core.telegram.org/bots#privacy-mode) in groups

Games
/mygames - edit your games (https://core.telegram.org/bots/games) [beta]
/newgame - create a new game (https://core.telegram.org/bots/games)
/listgames - get a list of your games
/editgame - edit a game
/deletegame - delete an existing game

Para criar um novo bot, envie o comando /newbot.

O BotFather solicitará que você insira o nome e o login do bot.

BotFather, [25.07.20 09:39]
Alright, a new bot. How are we going to call it? Please choose a name for your bot.

Alexey Seleznev, [25.07.20 09:40]
My Test Bot

BotFather, [25.07.20 09:40]
Good. Now let's choose a username for your bot. It must end in `bot`. Like this, for example: TetrisBot or tetris_bot.

Alexey Seleznev, [25.07.20 09:40]
@my_test_bot

Você pode inserir qualquer nome, mas o login deve terminar com bot.

Se você fez tudo corretamente, receberá a seguinte mensagem:

Done! Congratulations on your new bot. You will find it at t.me/my_test_bot. You can now add a description, about section and profile picture for your bot, see /help for a list of commands. By the way, when you've finished creating your cool bot, ping our Bot Support if you want a better username for it. Just make sure the bot is fully operational before you do this.

Use this token to access the HTTP API:
123456789:abcdefghijklmnopqrstuvwxyz

For a description of the Bot API, see this page: https://core.telegram.org/bots/api

Em seguida, você precisará do token da API recebido, no meu exemplo é 123456789:abcdefghijklmnopqrstuvwxyz.

Nesta etapa, o trabalho preparatório para a criação do bot está concluído.

Instalando um pacote para trabalhar com um bot de telegrama em R

Presumo que você já tenha a linguagem R e o ambiente de desenvolvimento RStudio instalados. Se este não for o caso, então você pode dar uma olhada nisso vídeo tutorial sobre como instalá-los.

Para trabalhar com a API Telegram Bot usaremos o pacote R telegrama.bot.

A instalação de pacotes em R é feita usando a função install.packages(), então para instalar o pacote que precisamos, use o comando install.packages("telegram.bot").

Você pode aprender mais sobre como instalar vários pacotes em esse vídeo.

Depois de instalar o pacote, você precisa conectá-lo:

library(telegram.bot)

Enviando mensagens de R para Telegram

O bot que você criou pode ser encontrado no Telegram usando o login especificado durante a criação, no meu caso é @my_test_bot.

Envie ao bot qualquer mensagem, como "Ei, bot". No momento, precisamos disso para obter o id do seu chat com o bot.

Agora escrevemos o seguinte código em R.

library(telegram.bot)

# создаём экземпляр бота
bot <- Bot(token = "123456789:abcdefghijklmnopqrstuvwxyz")

# Запрашиваем информацию о боте
print(bot$getMe())

# Получаем обновления бота, т.е. список отправленных ему сообщений
updates <- bot$getUpdates()

# Запрашиваем идентификатор чата
# Примечание: перед запросом обновлений вы должны отправить боту сообщение
chat_id <- updates[[1L]]$from_chat_id()

Inicialmente, criamos uma instância do nosso bot com a função Bot(), o token recebido anteriormente deve ser passado para ele como argumento.

Não é considerada prática recomendada armazenar o token no código, portanto, você pode armazená-lo em uma variável de ambiente e lê-lo. Por padrão no pacote telegram.bot O suporte para variáveis ​​de ambiente com os seguintes nomes foi implementado: R_TELEGRAM_BOT_ИМЯ_ВАШЕГО_БОТА... Ao invés de ИМЯ_ВАШЕГО_БОТА substitua o nome que você especificou ao criar, no meu caso será uma variável R_TELEGRAM_BOT_My Test Bot.

Existem várias maneiras de criar uma variável de ambiente, vou falar sobre a mais universal e multiplataforma. Crie em seu diretório inicial (você pode encontrá-lo usando o comando path.expand("~")) arquivo de texto com o nome .Renviron. Você também pode fazer isso usando o comando file.edit(path.expand(file.path("~", ".Renviron"))).

E adicione a seguinte linha a ele.

R_TELEGRAM_BOT_ИМЯ_ВАШЕГО_БОТА=123456789:abcdefghijklmnopqrstuvwxyz

A seguir, você pode usar o token salvo na variável de ambiente usando a função bot_token(), ou seja assim:

bot <- Bot(token = bot_token("My Test Bot"))

método getUpdates()nos permite obter atualizações de bot, ou seja, mensagens que lhe foram enviadas. Método from_chat_id(), permite obter o ID do chat do qual a mensagem foi enviada. Precisamos desse ID para enviar mensagens do bot.

Além do id do chat do objeto obtido pelo método getUpdates() você também recebe algumas outras informações úteis. Por exemplo, informações sobre o usuário que enviou a mensagem.

updates[[1L]]$message$from

$id
[1] 000000000

$is_bot
[1] FALSE

$first_name
[1] "Alexey"

$last_name
[1] "Seleznev"

$username
[1] "AlexeySeleznev"

$language_code
[1] "ru"

Então, nesta fase já temos tudo o que precisamos para enviar uma mensagem de um bot para o Telegram. Vamos usar o método sendMessage(), para o qual você precisa passar o ID do bate-papo, o texto da mensagem e o tipo de marcação do texto da mensagem. O tipo de marcação pode ser Markdown ou HTML e é definido pelo argumento parse_mode.

# Отправка сообщения
bot$sendMessage(chat_id,
                text = "Привет, *жирный текст* _курсив_",
                parse_mode = "Markdown"
)

Noções básicas de formatação de Markdown:

  • A fonte em negrito é destacada com *:
    • exemplo: *жирный шритф*
    • resultado: negrito
  • Itálico é indicado por sublinhados:
    • exemplo: _курсив_
    • resultado: itálico
  • A fonte monoespaçada, que geralmente é usada para destacar o código do programa, é especificada usando apóstrofos - `:
    • exemplo: `fonte monoespaçada`
    • resultado: моноширинный шрифт

Noções básicas de formatação de marcação HTML:
Em HTML, você envolve a parte do texto que precisa ser destacada em tags, exemplo <тег>текст</тег>.

  • <tag> - tag de abertura
  • - etiqueta de fechamento

Tags de marcação HTML

  • <b> - negrito
    • exemplo: <b>жирный шрифт</b>
    • resultar negrito
  • <i> - itálico
    • exemplo: <i>курсив</i>
    • resultado: itálico
  • — моноширинный шрифт
    • exemplo: моноширинный шрифт
    • resultado: моноширинный шрифт

Além do texto, você pode enviar outros conteúdos usando métodos especiais:

# Отправить изображение
bot$sendPhoto(chat_id,
  photo = "https://telegram.org/img/t_logo.png"
)

# Отправка голосового сообщения
bot$sendAudio(chat_id,
  audio = "http://www.largesound.com/ashborytour/sound/brobob.mp3"
)

# Отправить документ
bot$sendDocument(chat_id,
  document = "https://github.com/ebeneditos/telegram.bot/raw/gh-pages/docs/telegram.bot.pdf"
)

# Отправить стикер
bot$sendSticker(chat_id,
  sticker = "https://www.gstatic.com/webp/gallery/1.webp"
)

# Отправить видео
bot$sendVideo(chat_id,
  video = "http://techslides.com/demos/sample-videos/small.mp4"
)

# Отправить gif анимацию
bot$sendAnimation(chat_id,
  animation = "https://media.giphy.com/media/sIIhZliB2McAo/giphy.gif"
)

# Отправить локацию
bot$sendLocation(chat_id,
  latitude = 51.521727,
  longitude = -0.117255
)

# Имитация действия в чате
bot$sendChatAction(chat_id,
  action = "typing"
)

Aqueles. por exemplo usando o método sendPhoto() você pode enviar um gráfico salvo como uma imagem que você criou usando o pacote ggplot2.

Verificando o Agendador de Tarefas do Windows e enviando notificações sobre tarefas que foram encerradas de forma anormal

Para trabalhar com o Agendador de Tarefas do Windows você precisa instalar o pacote taskscheduleR, e para maior comodidade de trabalhar com dados, instale o pacote dplyr.

# Установка пакетов
install.packages(c('taskscheduleR', 'dplyr'))
# Подключение пакетов
library(taskscheduleR)
library(dplyr)

A seguir, usando a função taskscheduler_ls() solicitamos informações sobre tarefas de nosso agendador. Usando a função filter() do pacote dplyr Removemos da lista de tarefas aquelas que foram concluídas com sucesso e têm status de último resultado 0, e aquelas que nunca foram iniciadas e têm status 267011, tarefas desabilitadas e tarefas que estão em execução no momento.

# запрашиваем список задач
task <- task <- taskscheduler_ls() %>%
        filter(! `Last Result`  %in% c("0", "267011") & 
               `Scheduled Task State` == "Enabled" & 
               Status != "Running") %>%
        select(TaskName) %>%
        unique() %>%
        unlist() %>%
        paste0(., collapse = "n")

No objeto task Agora temos uma lista de tarefas que falharam, precisamos enviar essa lista para o Telegram.

Se observarmos cada comando com mais detalhes, então:

  • filter() — filtra a lista de tarefas de acordo com as condições descritas acima
  • select() — deixa apenas um campo na tabela com o nome das tarefas
  • unique() - remove nomes duplicados
  • unlist() — converte a coluna da tabela selecionada em um vetor
  • paste0() — conecta os nomes das tarefas em uma linha e coloca um feed de linha como separador, ou seja, n.

Resta-nos enviar este resultado por telegrama.

bot$sendMessage(chat_id,
                text = task,
                parse_mode = "Markdown"
)

Então, no momento o código do bot está assim:

Código do bot de revisão de tarefas

# Подключение пакета
library(telegram.bot)
library(taskscheduleR)
library(dplyr)

# инициализируем бота
bot <- Bot(token = "123456789:abcdefghijklmnopqrstuvwxyz")

# идентификатор чата
chat_id <- 123456789

# запрашиваем список задач
task <- taskscheduler_ls() %>%
        filter(! `Last Result`  %in% c("0", "267011")  &
               `Scheduled Task State` == "Enabled" & 
               Status != "Running") %>%
        select(TaskName) %>%
        unique() %>%
        unlist() %>%
        paste0(., collapse = "n")

# если есть проблемные задачи отправляем сообщение
if ( task != "" ) {

  bot$sendMessage(chat_id,
                  text = task,
                  parse_mode = "Markdown"
  )

}

Ao usar o exemplo acima, substitua seu token de bot e seu ID de chat no código.

Você pode adicionar condições para filtrar tarefas, por exemplo, verificando apenas as tarefas que você criou, excluindo as do sistema.

Você também pode colocar várias configurações em um arquivo de configuração separado e armazenar o ID e o token do bate-papo nele. Você pode ler a configuração, por exemplo, usando o pacote configr.

Exemplo de configuração ini

[telegram_bot]
;настройки телеграм бота и чата, в который будут приходить уведомления
chat_id=12345678
bot_token=123456789:abcdefghijklmnopqrstuvwxyz"

Um exemplo de leitura de variáveis ​​de uma configuração em R

library(configr)

# чтение конфина
config <- read.config('C:/путь_к_конфигу/config.cfg', rcmd.parse = TRUE)

bot_token <- config$telegram_bot$bot_token
chat_id     <- config$telegram_bot$chat_id

Configurando um agendamento para execução de verificações de tarefas

O processo de configuração do lançamento de scripts de acordo com uma programação é descrito com mais detalhes neste статье. Aqui descreverei apenas as etapas que precisam ser seguidas para isso. Se alguma das etapas não estiver clara para você, consulte o artigo para o qual forneci um link.

Vamos supor que salvamos nosso código do bot em um arquivo check_bot.R. Para agendar a execução regular deste arquivo, siga estas etapas:

  1. Escreva o caminho para a pasta na qual o R está instalado na variável de sistema Path; no Windows, o caminho será mais ou menos assim: C:Program FilesRR-4.0.2bin.
  2. Crie um arquivo bat executável com apenas uma linha R CMD BATCH C:rscriptscheck_botcheck_bot.R. Substituir C:rscriptscheck_botcheck_bot.R para o caminho completo para o seu arquivo R.
  3. Em seguida, use o Agendador de Tarefas do Windows para configurar um cronograma de inicialização, por exemplo, a cada meia hora.

Conclusão

Neste artigo, descobrimos como criar um bot e utilizá-lo para enviar diversas notificações por telegrama.

Descrevi a tarefa de monitorar o Agendador de Tarefas do Windows, mas você pode utilizar o material deste artigo para enviar quaisquer notificações, desde previsão do tempo até cotações de ações na bolsa, pois R permite que você se conecte a um grande número de fontes de dados.

No próximo artigo, descobriremos como adicionar comandos e um teclado ao bot para que ele possa não apenas enviar notificações, mas também realizar ações mais complexas.

Fonte: habr.com

Adicionar um comentário