Escribimos un bot de telegram na linguaxe R (parte 1): crea un bot e envía mensaxes a telegram usándoo

A audiencia de Telegram crece exponencialmente cada día, isto vese facilitado pola comodidade do messenger, a presenza de canles, chats e, por suposto, a posibilidade de crear bots.

Os bots pódense usar para propósitos completamente diferentes, desde automatizar as comunicacións cos seus clientes ata xestionar as súas propias tarefas.

Esencialmente, pode usar Telegram para realizar calquera operación a través dun bot: enviar ou solicitar datos, executar tarefas no servidor, recoller información nunha base de datos, enviar correos electrónicos, etc.

Penso escribir unha serie de artigos sobre como traballar API de telegram bot, e escribe bots para satisfacer as túas necesidades.

Escribimos un bot de telegram na linguaxe R (parte 1): crea un bot e envía mensaxes a telegram usándoo

Neste primeiro artigo descubriremos como crear un bot de telegram e usalo para enviar notificacións en telegram.

Como resultado, teremos un bot que comprobará o estado da última execución de todas as tarefas no Programador de tarefas de Windows e enviará notificacións se algunha delas falla.

Pero o propósito desta serie de artigos non é ensinarche a escribir un bot para unha tarefa específica e restrinxida, senón presentarche en xeral a sintaxe do paquete. telegram.bot, e exemplos de código cos que podes escribir bots para resolver os teus propios problemas.

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. Creando un bot de telegram
  2. Instalando un paquete para traballar cun bot de telegram en R
  3. Enviando mensaxes de R a Telegram
  4. Configurar unha programación para executar análises de tarefas
  5. Conclusión

Creando un bot de telegram

En primeiro lugar, necesitamos crear un bot. Isto faise usando un bot especial Pai Bot, Ir a Ligazón e escribir ao bot /start.

Despois diso, recibirá unha mensaxe cunha lista de comandos:

Mensaxe de 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 crear un novo bot, envía o comando /newbot.

BotFather pedirache que introduzas o nome e o inicio de sesión 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

Podes introducir calquera nome, pero o inicio de sesión debe rematar con bot.

Se fixeches todo correctamente, recibirás a seguinte mensaxe:

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

A continuación, necesitará o token da API recibido, no meu exemplo é 123456789:abcdefghijklmnopqrstuvwxyz.

Neste paso, complétase o traballo preparatorio para a creación do bot.

Instalando un paquete para traballar cun bot de telegram en R

Supoño que xa tes a linguaxe R e o ambiente de desenvolvemento RStudio instalados. Se este non é o caso, podes mirar isto vídeo titorial sobre como instalalos.

Para traballar coa API de Telegram Bot usaremos o paquete R telegrama.bot.

A instalación de paquetes en R realízase mediante a función install.packages(), polo que para instalar o paquete que necesitamos, use o comando install.packages("telegram.bot").

Podes obter máis información sobre a instalación de varios paquetes desde este vídeo.

Despois de instalar o paquete, cómpre conectalo:

library(telegram.bot)

Enviando mensaxes de R a Telegram

O bot que creaches pódese atopar en Telegram usando o inicio de sesión especificado durante a creación, no meu caso é @my_test_bot.

Envíalle ao bot calquera mensaxe, como "Ola bot". Polo momento, necesitamos isto para obter o identificador do teu chat co bot.

Agora escribimos o seguinte código en R.

library(telegram.bot)

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

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

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

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

Inicialmente, creamos unha instancia do noso bot coa función Bot(), o token recibido previamente debe pasarse a el como argumento.

Non se considera a mellor práctica almacenar o token en código, polo que podes almacenalo nunha variable de ambiente e lelo desde ela. Por defecto no paquete telegram.bot Implementouse o soporte para as variables de ambiente dos seguintes nomes: R_TELEGRAM_BOT_ИМЯ_ВАШЕГО_БОТА... Pola contra ИМЯ_ВАШЕГО_БОТА substitúe o nome que especificaches ao crear, no meu caso será unha variable R_TELEGRAM_BOT_My Test Bot.

Hai varias formas de crear unha variable de ambiente; vouche falar da máis universal e multiplataforma. Crea no teu directorio de inicio (podes atopalo usando o comando path.expand("~")) ficheiro de texto co nome .Retorno. Tamén podes facelo usando o comando file.edit(path.expand(file.path("~", ".Renviron"))).

E engade a seguinte liña.

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

A continuación, pode usar o token gardado na variable de ambiente usando a función bot_token(), é dicir. como isto:

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

Método getUpdates()permítenos obter actualizacións de bots, é dicir. mensaxes que lle foron enviadas. Método from_chat_id(), permítelle obter o ID do chat desde o que se enviou a mensaxe. Necesitamos este ID para enviar mensaxes desde o bot.

Ademais do identificador do chat do obxecto obtido polo método getUpdates() tamén recibe algunha outra información útil. Por exemplo, información sobre o usuario que enviou a mensaxe.

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ón, neste momento xa temos todo o que necesitamos para enviar unha mensaxe desde un bot a Telegram. Usemos o método sendMessage(), no que debes pasar o ID de chat, o texto da mensaxe e o tipo de marcado de texto da mensaxe. O tipo de marcado pode ser Markdown ou HTML e establécese polo argumento parse_mode.

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

Conceptos básicos do formato Markdown:

  • O tipo de letra en negra está resaltado con *:
    • exemplo: *жирный шритф*
    • resultado: tipo de letra en negra
  • As cursivas indícanse mediante guións baixos:
    • exemplo: _курсив_
    • resultado: cursiva
  • O tipo de letra monoespazo, que normalmente se usa para resaltar o código do programa, especifícase mediante apóstrofos - `:
    • exemplo: `fonte monoespazo`
    • resultado: моноширинный шрифт

Conceptos básicos de formateo de marcas HTML:
En HTML, envolve a parte do texto que se debe resaltar en etiquetas, por exemplo <тег>текст</тег>.

  • <tag> - etiqueta de apertura
  • - etiqueta de peche

Etiquetas de marcado HTML

  • <b> - fonte negra
    • exemplo: <b>жирный шрифт</b>
    • resultado tipo de letra en negra
  • <i> - cursiva
    • exemplo: <i>курсив</i>
    • resultado: cursiva
  • — моноширинный шрифт
    • exemplo: моноширинный шрифт
    • resultado: моноширинный шрифт

Ademais do texto, podes enviar outro contido mediante 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"
)

Eses. por exemplo usando o método sendPhoto() podes enviar un gráfico gardado como imaxe que creaches usando o paquete ggplot2.

Comprobando o Programador de tarefas de Windows e enviando notificacións sobre tarefas que finalizaron de forma anormal

Para traballar co Programador de tarefas de Windows, cómpre instalar o paquete taskscheduleR, e para a comodidade de traballar con datos, instale o paquete dplyr.

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

A continuación, usando a función taskscheduler_ls() solicitamos información sobre tarefas do noso planificador. Usando a función filter() do paquete dplyr Eliminamos da lista de tarefas as que se completaron con éxito e teñen un estado de último resultado de 0, e as que nunca se iniciaron e teñen un estado de 267011, tarefas desactivadas e tarefas que se están executando actualmente.

# запрашиваем список задач
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 obxecto task Agora temos unha lista de tarefas que fallaron, necesitamos enviar esta lista a Telegram.

Se observamos cada comando con máis detalle, entón:

  • filter() — filtra a lista de tarefas segundo as condicións descritas anteriormente
  • select() — deixa só un campo na táboa co nome das tarefas
  • unique() - elimina os nomes duplicados
  • unlist() — converte a columna da táboa seleccionada nun vector
  • paste0() — conecta os nomes das tarefas nunha soa liña e pon un avance de liña como separador, é dicir. n.

Só nos queda enviar este resultado vía telegrama.

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

Polo tanto, neste momento o código do bot ten o seguinte aspecto:

Código de bot de revisión 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"
  )

}

Cando uses o exemplo anterior, substitúe o teu token de bot e o teu ID de chat no código.

Podes engadir condicións para filtrar tarefas, por exemplo, comprobando só as tarefas que creaches, excluídas as do sistema.

Tamén podes poñer varias opcións nun ficheiro de configuración separado e almacenar nel o identificador de chat e o token. Podes ler a configuración, por exemplo, usando o paquete configr.

Exemplo ini config

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

Un exemplo de lectura de variables desde unha configuración en 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

Configurar unha programación para executar análises de tarefas

O proceso de configuración do lanzamento de scripts nunha programación descríbese con máis detalle neste Artigo. Aquí só describirei os pasos que hai que seguir para iso. Se algún dos pasos non está claro para vostede, consulte o artigo ao que proporcionei unha ligazón.

Supoñamos que gardamos o noso código de bot nun ficheiro check_bot.R. Para programar este ficheiro para que se execute regularmente, siga estes pasos:

  1. Escriba o camiño ao cartafol no que está instalado R na variable do sistema Path; en Windows, o camiño será algo así: C:Program FilesRR-4.0.2bin.
  2. Crea un ficheiro bate executable cunha soa liña R CMD BATCH C:rscriptscheck_botcheck_bot.R. Substituír C:rscriptscheck_botcheck_bot.R á ruta completa do ficheiro R.
  3. A continuación, use o Programador de tarefas de Windows para configurar un calendario de lanzamento, por exemplo, cada media hora.

Conclusión

Neste artigo, descubrimos como crear un bot e usalo para enviar varias notificacións en telegram.

Describín a tarefa de supervisar o Programador de tarefas de Windows, pero pode usar o material deste artigo para enviar calquera notificación, desde a previsión meteorolóxica ata as cotizacións en bolsa, porque R permítelle conectarse a unha gran cantidade de fontes de datos.

No seguinte artigo, descubriremos como engadir comandos e un teclado ao bot para que non só poida enviar notificacións, senón tamén realizar accións máis complexas.

Fonte: www.habr.com

Engadir un comentario