Creamos un bot de telegram en el lenguaje R (parte 1): Creamos el bot y enviamos mensajes a través de él en telegram

La audiencia de telegram crece diariamente de manera geométrica, gracias a la facilidad del mensajero, la existencia de canales, chats y, por supuesto, la posibilidad de crear bots.

Los bots pueden utilizarse para diferentes fines, desde automatizar la comunicación con sus clientes hasta gestionar sus propias tareas.

En esencia, a través de un bot se pueden realizar cualquier operación utilizando telegram: enviar o solicitar datos, ejecutar tareas en el servidor, recopilar información en una base de datos, enviar correos electrónicos, y más.

Planeo escribir una serie de artículos sobre cómo trabajar con el telegram bot API, y crear bots para sus necesidades.

Creamos un bot de telegram en el lenguaje R (parte 1): Creamos el bot y enviamos mensajes a través de él en telegram

En este primer artículo, vamos a ver cómo crear un bot de telegram y enviar notificaciones a través de él.

Al final, 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 ha fallado.

Pero el objetivo de esta serie de artículos no es enseñarle a escribir un bot para una tarea específica y limitada, sino en general familiarizarse con la sintaxis del paquete telegram.bot, y ejemplos de código que le permitirán crear bots para resolver sus propias tareas.

Contenido

canales de youtube. La mayor parte del contenido está dedicado al lenguaje R. telegram y Proceso de construcción del bot Estructura del proyecto del bot

  1. Creación de un bot de telegram
  2. Instalación del 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 para verificar tareas
  5. Conclusión

Creación de un bot de telegram

Primero, necesitamos crear un bot. Esto se hace a través de un bot especial BotFather, accedemos a el enlace y escribimos al bot /start.

Después de lo cual recibirá un mensaje con la lista de comandos:

Mensaje de BotFather

Puedo ayudarte a crear y gestionar bots de Telegram. Si eres nuevo en la API de Bots, por favor consulta el manual (https://core.telegram.org/bots).

Puedes controlarme enviando estos comandos:

/newbot - crear un nuevo bot
/mybots - editar tus bots [beta]

Editar Bots
/setname - cambiar el nombre de un bot
/setdescription - cambiar la descripción del bot
/setabouttext - cambiar la información sobre el bot
/setuserpic - cambiar la foto de perfil del bot
/setcommands - cambiar la lista de comandos
/deletebot - eliminar un bot

Configuraciones del Bot
/token - generar un token de autorización
/revoke - revocar el token de acceso del bot
/setinline - alternar el modo inline (https://core.telegram.org/bots/inline)
/setinlinegeo - alternar las solicitudes de ubicación inline (https://core.telegram.org/bots/inline#location-based-results)
/setinlinefeedback - cambiar los ajustes de feedback inline (https://core.telegram.org/bots/inline#collecting-feedback)
/setjoingroups - ¿puede tu bot ser añadido a grupos?
/setprivacy - alternar el modo de privacidad (https://core.telegram.org/bots#privacy-mode) en grupos

Juegos
/mygames - editar tus juegos (https://core.telegram.org/bots/games) [beta]
/newgame - crear un nuevo juego (https://core.telegram.org/bots/games)
/listgames - obtener una lista de tus juegos
/editgame - editar un juego
/deletegame - eliminar un juego existente

Para crear un nuevo bot, envía el comando /newbot.

BotFather te pedirá que ingreses el nombre y el nombre de usuario del bot.

BotFather, [25.07.20 09:39]
Bien, un nuevo bot. ¿Cómo lo llamaremos? Por favor, elige un nombre para tu bot.

Alexey Seleznev, [25.07.20 09:40]
Mi Bot de Prueba

BotFather, [25.07.20 09:40]
Bien. Ahora elijamos un nombre de usuario para tu bot. Debe terminar en `bot`. Así, por ejemplo: TetrisBot o tetris_bot.

Alexey Seleznev, [25.07.20 09:40]
@mi_bot_de_prueba

Puedes ingresar un nombre cualquiera, pero el nombre de usuario debe terminar con ) de todos los bots de Telegram deben terminar con la palabra.

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

¡Hecho! Felicitaciones por tu nuevo bot. Lo encontrarás en t.me/my_test_bot. Ahora puedes añadir una descripción, una sección acerca de y una foto de perfil para tu bot, consulta /help para una lista de comandos. Por cierto, cuando termines de crear tu genial bot, contacta a nuestro Soporte de Bots si deseas un mejor nombre de usuario para él. Solo asegúrate de que el bot esté completamente operativo antes de hacerlo.

Usa este token para acceder a la API HTTP:
123456789:abcdefghijklmnopqrstuvwxyz

Para una descripción de la API de Bots, consulta esta página: https://core.telegram.org/bots/api

A continuación, necesitarás el token de API recibido, en mi ejemplo es 123456789:abcdefghijklmnopqrstuvwxyz.

En este paso, los trabajos preparatorios para crear el bot están completos.

Instalación del paquete para trabajar con un bot de telegram en R

Supongo que ya tienes instalado el lenguaje R y el entorno de desarrollo RStudio. Si no es así, puedes ver este video tutorial sobre cómo instalarlos.

Para trabajar con la API de Telegram Bot utilizaremos el paquete R telegram.bot.

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

Para saber más sobre la instalación de varios paquetes, puedes consultar este video.

Después de instalar el paquete, es necesario cargarlo:

library(telegram.bot)

Envío de mensajes de R a Telegram

Puedes encontrar el bot que creaste en Telegram utilizando el nombre de usuario establecido al crearlo, en mi caso es @mi_bot_de_prueba.

Envía cualquier mensaje al bot, como "Hola bot". Por ahora, esto lo necesitamos para obtener el id de tu chat con el bot.

Ahora en R escribimos el siguiente código.

library(telegram.bot)

# creamos una instancia del bot
bot <- Bot(token = "123456789:abcdefghijklmnopqrstuvwxyz")

# Solicitamos información sobre el bot
print(bot$getMe())

# Obtenemos las actualizaciones del bot, es decir, la lista de mensajes enviados a él
updates <- bot$getUpdates()

# Solicitamos el identificador del chat
# Nota: antes de solicitar actualizaciones, debes enviar un mensaje al bot
chat_id <- updates[[1L]]$from_chat_id()

Inicialmente, creamos una instancia de nuestro bot mediante la función Bot(), como argumento es necesario pasar el token obtenido anteriormente.

Almacenar el token en el código no se considera una buena práctica, por lo que puedes almacenarlo en una variable de entorno y leerlo desde allí. Por defecto, el paquete telegram.bot implementa el soporte para variables de entorno con el siguiente nombre: R_TELEGRAM_BOT_NOMBRE_DE_TU_BOT. En lugar de NOMBRE_DE_TU_BOT sustituye por el nombre que asignaste al crearlo, en mi caso será la variable R_TELEGRAM_BOT_My Test Bot.

Puedes crear una variable de entorno de varias maneras; te contaré sobre la más universal y multiplataforma. Crea en tu directorio personal (puedes averiguarlo usando el comando path.expand("~")) un archivo de texto llamado .Renviron. Esto también se puede hacer usando el comando file.edit(path.expand(file.path("~", ".Renviron"))).

Y añade la siguiente línea en él.

R_TELEGRAM_BOT_NOMBRE_DE_TU_BOT=123456789:abcdefghijklmnopqrstuvwxyz

Luego puedes usar el token guardado en la variable de entorno mediante la función bot_token(), es decir, así:

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

El método getUpdates()nos permite obtener actualizaciones del bot, es decir, los mensajes que le han sido enviados. El método from_chat_id(), permite obtener el identificador del chat desde el cual se envió el mensaje. Este identificador es necesario para enviar mensajes desde el bot.

Además del id del chat del objeto obtenido mediante el método getUpdates() también obtienes otra información útil. Por ejemplo, la 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"

Así que, en este punto, ya tenemos todo lo necesario para enviar un mensaje desde el bot en Telegram. Usaremos el método sendMessage(), que debe transmitir el identificador del chat, el texto del mensaje y el tipo de formato del texto del mensaje. El tipo de formato puede ser Markdown o HTML y se establece mediante un argumento modo_de_análisis.

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

Conceptos básicos de formato Markdown:

  • El texto en negrita se destaca con el signo *:
    • ejemplo: *texto en negrita*
    • resultado: texto en negrita
  • La cursiva se establece con guiones bajos:
    • ejemplo: _cursiva_
    • resultado: cursiva
  • El texto en monoespaciado, que generalmente se usa para resaltar código, se establece con acentos graves `:
    • ejemplo: `texto en monoespaciado`
    • resultado: texto en monoespaciado

Conceptos básicos de formato HTML:
En HTML, envuelves parte del texto que debe destacarse en etiquetas, por ejemplo, texto.

  • — etiqueta de apertura
  • — etiqueta de cierre

Etiquetas de formato HTML

  • <b> — texto en negrita
    • ejemplo: <b>negrita</b>
    • resultado negrita
  • — cursiva
    • ejemplo: cursiva
    • resultado: cursiva
  • — texto en monoespaciado
    • ejemplo: texto en monoespaciado
    • resultado: texto en monoespaciado

Además del texto, también puedes 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"
)

Es decir, por ejemplo, mediante el método sendPhoto() puedes enviar una gráfica guardada como imagen, que has creado utilizando el paquete ggplot2.

Comprobación del programador de tareas de Windows y envío de notificaciones sobre tareas cuya ejecución ha fallado

Para trabajar con el programador de tareas de Windows, necesitas instalar el paquete taskscheduleR, y para facilitar el trabajo con los datos, instalaremos el paquete dplyr.

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

Luego, mediante 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 han completado satisfactoriamente y tienen un estado de resultado final 0, así como las que nunca se han ejecutado y tienen un estado 267011, las tareas desactivadas y las tareas que se están ejecutando en ese 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")

En el objeto tarea ahora tenemos una lista de tareas cuya ejecución ha fallado, esta lista debe enviarse a Telegram.

Si examinamos cada comando con más detalle, podemos ver que:

  • filter() — filtra la lista de tareas según las condiciones descritas anteriormente
  • select() — deja en la tabla solo un campo con el nombre de la tarea
  • unique() — elimina las repeticiones de los nombres
  • unlist() — convierte la columna seleccionada de la tabla en un vector
  • paste0() — une los nombres de las tareas en una sola cadena, usando como separador el carácter de nueva línea, es decir, n.

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

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

Así que, actualmente el código del bot se ve así:

Código del bot que verifica tareas

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

}

Al usar el ejemplo anterior, inserte en el código el token de su bot y su identificador de chat.

Puede agregar condiciones de filtrado de tareas, por ejemplo, verificando solo aquellas tareas que usted ha creado, excluyendo las del sistema.

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

Ejemplo de archivo de configuración ini

[telegram_bot]
; configuraciones del bot de telegram y del chat al que se enviarán las notificaciones
chat_id=12345678
bot_token=123456789:abcdefghijklmnopqrstuvwxyz"

Ejemplo de lectura de variables de la configuración en R

library(configr)

# lectura de la configuración
config <- read.config('C:/ruta_a_la_configuracion/config.cfg', rcmd.parse = TRUE)

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

Configuramos el horario para la verificación de tareas

El proceso de configuración de la ejecución de scripts programados está descrito con más detalle en este artículo. el artículoAquí solo describiré los pasos que es necesario seguir. Si alguno de los pasos no le queda claro, consulte el artículo al que mencioné.

Supongamos que hemos guardado el código de nuestro bot en el archivo check_bot.R. Para programar la ejecución regular de este archivo, realice los siguientes pasos:

  1. Escriba en la variable de sistema Path la ruta a la carpeta en la que está instalado R, en Windows la ruta sería aproximadamente así: C:Program FilesRR-4.0.2bin.
  2. Cree un archivo bat ejecutable, el cual tendrá solo una línea R CMD BATCH C:rscriptscheck_botcheck_bot.R. Reemplace C:rscriptscheck_botcheck_bot.R al camino completo hacia su archivo R.
  3. Luego configure mediante el programador de tareas de Windows el horario de ejecución, por ejemplo, cada media hora.

Conclusión

En este artículo hemos entendido cómo crear un bot y enviar diversas notificaciones a través de él en Telegram.

He descrito la tarea de controlar el programador de tareas de Windows, pero puede utilizar el material de este artículo para enviar cualquier tipo de notificaciones, desde pronósticos del clima hasta cotizaciones de acciones en la bolsa, dado que R le permite conectarse a una gran cantidad de fuentes de datos.

En el siguiente artículo examinaremos 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

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster