Escribimos un bot de Telegram en lenguaje R (parte 1): Crea un bot y envía mensajes a Telegram usándolo

La audiencia de Telegram está creciendo exponencialmente todos los días, esto se ve facilitado por la comodidad del mensajero, la disponibilidad de canales, chats y, por supuesto, la capacidad de crear bots.

Los bots se pueden usar para una amplia variedad de propósitos, desde automatizar la comunicación con sus clientes hasta administrar sus propias tareas.

De hecho, a través del bot, puedes usar Telegram para realizar cualquier operación: enviar o solicitar datos, ejecutar tareas en el servidor, recopilar información en una base de datos, enviar correos electrónicos, etc.

Planeo escribir una serie de artículos sobre cómo trabajar con R en R. API de bots de telegramasy escriba bots para sus necesidades.

Escribimos un bot de Telegram en lenguaje R (parte 1): Crea un bot y envía mensajes a Telegram usándolo

En este primer artículo, descubriremos cómo crear un bot de Telegram y enviar notificaciones a Telegram usándolo.

Como resultado, tendremos un bot que verificará el estado de la última ejecución de todas las tareas en el Programador de tareas de Windows y le enviará notificaciones si alguna falla.

Pero el propósito de esta serie de artículos no es enseñarle cómo escribir un bot para una tarea específica y estrecha, sino presentarle la sintaxis del paquete en general. telegram.boty ejemplos de código con los que puedes escribir bots para resolver tus propios problemas.

contenido

Si te interesa el análisis de datos, quizás te interese mi Telegram. и Youtube canales La mayor parte del contenido está dedicado al lenguaje R.

  1. Creación de un bot de telegramas
  2. Instalar un paquete para trabajar con un bot de Telegram en R
  3. Envío de mensajes de R a Telegram
  4. Configuración de la programación de inicio del análisis de tareas
  5. Conclusión

Creación de un bot de telegramas

Primero, necesitamos crear un bot. Esto se hace usando un bot especial. BotPadre, ir a enlace y escribir al bot /start.

Luego recibirá un mensaje con una lista de comandos:

Mensaje 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 nuevo bot, envíe el comando /newbot.

BotFather le pedirá que ingrese el nombre y el inicio de sesión del 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

Puede ingresar un nombre arbitrario y el inicio de sesión debe terminar con bot.

Si hiciste todo correctamente, recibirás el siguiente mensaje:

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á el token API recibido, en mi ejemplo es 123456789:abcdefghijklmnopqrstuvwxyz.

En este paso, se completa el trabajo preparatorio para crear el bot.

Instalar un paquete para trabajar con un bot de Telegram en R

Supongo que ya tiene instalado el lenguaje R y el entorno de desarrollo RStudio. Si este no es el caso, entonces puedes mirar esto video tutorial sobre cómo instalarlos.

Para trabajar con la API de Telegram Bot, usaremos el paquete R telegrama.bot.

La instalación de paquetes en R se realiza mediante la función install.packages(), entonces para instalar el paquete que necesitamos, use el comando install.packages("telegram.bot").

Para obtener más información sobre la instalación de varios paquetes, consulte este video.

Después de instalar el paquete, debe conectarlo:

library(telegram.bot)

Envío de mensajes de R a Telegram

El bot que creaste se puede encontrar en Telegram usando el inicio de sesión especificado durante la creación, en mi caso es @my_test_bot.

Envíe cualquier mensaje al bot, como "Hola, bot". Por el momento, necesitamos esto para obtener la identificación de su chat con el bot.

Ahora en R escribimos el siguiente código.

library(telegram.bot)

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

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

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

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

Inicialmente, creamos una instancia de nuestro bot con la función Bot(), como argumento, debe pasarle el token recibido anteriormente.

Almacenar el token en el código se considera una mala práctica, por lo que puede almacenarlo en una variable de entorno y leerlo. Por defecto en el paquete telegram.bot Soporte implementado para variables de entorno con el siguiente nombre: R_TELEGRAM_BOT_ИМЯ_ВАШЕГО_БОТА... En lugar de ИМЯ_ВАШЕГО_БОТА sustituya el nombre que estableció al crear, en mi caso será una variable R_TELEGRAM_BOT_My Test Bot.

Puede crear una variable de entorno de varias maneras, hablaré de la más universal y multiplataforma. Cree en su directorio de inicio (puede encontrarlo con el comando path.expand("~")) archivo de texto con el nombre .Renviron. También puedes hacer esto con el comando file.edit(path.expand(file.path("~", ".Renviron"))).

Y añádele la siguiente línea.

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

Luego puede usar el token almacenado en la variable de entorno con la función bot_token(), es decir. como esto:

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

método getUpdates()nos permite obtener actualizaciones de bot, es decir mensajes enviados a él. Método from_chat_id(), te permite obtener el ID del chat desde el que se envió el mensaje. Necesitamos este identificador para enviar mensajes desde el bot.

Además de la identificación de chat del objeto recibido por el método getUpdates() también obtienes otra información útil. Por ejemplo, información sobre el usuario que envió el mensaje.

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"

Entonces, en esta etapa, ya tenemos todo lo que se necesita para enviar un mensaje desde el bot a Telegram. Usemos el método sendMessage(), al que debe pasar el ID de chat, el texto del mensaje y el tipo de marcado del texto del mensaje. El tipo de marcado puede ser Markdown o HTML y lo establece el argumento parse_mode.

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

Conceptos básicos de formato de Markdown:

  • La fuente en negrita está marcada con *:
    • ejemplo: *жирный шритф*
    • resultado: guión en negrita
  • Las cursivas se dan mediante guiones bajos:
    • ejemplo: _курсив_
    • resultado: cursiva
  • La fuente de espacio fijo, que generalmente se usa para resaltar el código del programa, se especifica usando apóstrofes - `:
    • ejemplo: `fuente monoespaciada`
    • resultado: моноширинный шрифт

Conceptos básicos de formato de marcado HTML:
En HTML, envuelve la parte del texto que desea resaltar en etiquetas, ejemplo <тег>текст</тег>.

  • <etiqueta> — etiqueta de apertura
  • - etiqueta de cierre

Etiquetas de marcado HTML

  • <b> - negrita
    • ejemplo: <b>жирный шрифт</b>
    • resultar negrita
  • <i> - cursiva
    • ejemplo: <i>курсив</i>
    • resultado: cursiva
  • — моноширинный шрифт
    • ejemplo: моноширинный шрифт
    • resultado: моноширинный шрифт

Además del texto, puede enviar otro contenido utilizando métodos especiales:

# Отправить изображение
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"
)

Aquellos. por ejemplo usando el método sendPhoto() puede enviar una trama guardada como una imagen que construyó con el paquete ggplot2.

Comprobación del Programador de tareas de Windows y envío de notificaciones de tareas que se han bloqueado

Para trabajar con el Programador de tareas de Windows, debe instalar el paquete taskscheduleR, y para la conveniencia de trabajar con datos, instale el paquete dplyr.

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

A continuación, usando la función taskscheduler_ls() solicitamos información sobre las tareas de nuestro programador. Usando la función filter() del paquete dplyr eliminamos de la lista de tareas aquellas que se completaron con éxito y tienen un estado de último resultado de 0, y aquellas que nunca se han ejecutado todavía y tienen un estado de 267011, tareas deshabilitadas y tareas que se están ejecutando 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")

en el objeto task ahora tenemos una lista de tareas cuyo trabajo terminó con un error, necesitamos enviar esta lista a Telegram.

Si consideramos cada comando con más detalle, entonces:

  • filter() — filtra la lista de tareas según las condiciones descritas anteriormente
  • select() - deja solo un campo con el nombre de las tareas en la tabla
  • unique() - elimina nombres duplicados
  • unlist() - traduce la columna de la tabla seleccionada en un vector
  • paste0() - conecta los nombres de las tareas en una línea y pone un carácter de nueva línea como separador, es decir n.

Todo lo que nos queda es enviar este resultado a Telegram.

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

Entonces, en este momento, el código del bot se ve así:

Código de bot que verifica la tarea

# Подключение пакета
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"
  )

}

Cuando use el ejemplo anterior, sustituya su token de bot y su ID de chat en el código.

Puede agregar condiciones de filtrado de tareas, por ejemplo, verificar solo aquellas tareas que usted creó, excluyendo las del sistema.

También puede colocar varias configuraciones en un archivo de configuración separado y almacenar la identificación del chat y el token en él. Puede leer la configuración, por ejemplo, usando el paquete configr.

Ejemplo de configuración ini

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

Ejemplo de lectura de variables de config 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

Configuración de un calendario de inicio de análisis de tareas

El proceso de configuración del inicio programado del script se describe con más detalle en este статье. Aquí solo describiré los pasos que se deben seguir para ello. Si alguno de los pasos no está claro para usted, consulte el artículo al que proporcioné un enlace.

Digamos que guardamos nuestro código de bot en un archivo check_bot.R. Para programar este archivo para que se ejecute regularmente, siga estos pasos:

  1. Escriba la ruta a la carpeta en la que está instalado R en la variable de sistema Ruta, en Windows la ruta será algo como esto: C:Program FilesRR-4.0.2bin.
  2. Cree un archivo bat ejecutable con solo una línea R CMD BATCH C:rscriptscheck_botcheck_bot.R. Reemplazar C:rscriptscheck_botcheck_bot.R a la ruta completa a su archivo R.
  3. Luego, use el Programador de tareas de Windows para establecer un horario de inicio, por ejemplo, cada media hora.

Conclusión

En este artículo, descubrimos cómo crear un bot y usarlo para enviar varias notificaciones a Telegram.

Describí la tarea de monitorear el Programador de tareas de Windows, pero puede usar el material de este artículo para enviar cualquier notificación, desde el pronóstico del tiempo hasta las cotizaciones bursátiles en la bolsa de valores, porque. R le permite conectarse a una gran cantidad de fuentes de datos.

En el próximo artículo, descubriremos cómo agregar comandos y un teclado al bot para que no solo pueda enviar notificaciones, sino también realizar acciones más complejas.

Fuente: habr.com

Añadir un comentario