Escrivim un bot de telegram en llenguatge R (part 1): creeu un bot i envieu missatges a telegram utilitzant-lo

L'audiència de telegram creix de manera exponencial cada dia, això es veu facilitat per la comoditat del missatger, la disponibilitat de canals, xats i, per descomptat, la possibilitat de crear bots.

Els bots es poden utilitzar per a una gran varietat de propòsits, des d'automatitzar la comunicació amb els vostres clients fins a gestionar les vostres pròpies tasques.

De fet, a través del bot, podeu utilitzar telegram per realitzar qualsevol operació: enviar o demanar dades, executar tasques al servidor, recopilar informació en una base de dades, enviar correus electrònics, etc.

Tinc la intenció d'escriure una sèrie d'articles sobre com treballar amb R a R. API de telegram bot, i escriu robots segons les teves necessitats.

Escrivim un bot de telegram en llenguatge R (part 1): creeu un bot i envieu missatges a telegram utilitzant-lo

En aquest primer article, descobrirem com crear un bot de Telegram i enviar notificacions a Telegram utilitzant-lo.

Com a resultat, tindrem un bot que comprovarà l'estat de l'última execució de totes les tasques al Programador de tasques de Windows i us enviarà notificacions si alguna falla.

Però l'objectiu d'aquesta sèrie d'articles no és ensenyar-vos a escriure un bot per a una tasca específica i limitada, sinó introduir-vos en la sintaxi del paquet en general. telegram.bot, i exemples de codi amb els quals podeu escriure bots per resoldre els vostres propis problemes.

Contingut

Si esteu interessats en l'anàlisi de dades, potser us interessa el meu telegram и youtube canals. La major part del contingut està dedicat al llenguatge R.

  1. Creació d'un bot de telegram
  2. Instal·lant un paquet per treballar amb un bot de telegram a R
  3. Enviament de missatges de R a Telegram
  4. Configuració del programa d'inici de l'exploració de tasques
  5. Conclusió

Creació d'un bot de telegram

Primer, hem de crear un bot. Això es fa amb un bot especial Pare Bot, anar a enllaç i escriu al bot /start.

Aleshores rebràs un missatge amb una llista d'ordres:

Missatge 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

Per crear un bot nou, envieu l'ordre /newbot.

BotFather us demanarà que introduïu el nom i l'inici de sessió 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

Podeu introduir un nom arbitrari i l'inici de sessió ha d'acabar amb bot.

Si ho has fet tot correctament, rebràs el missatge següent:

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ó, necessitareu el testimoni API rebut, en el meu exemple ho és 123456789:abcdefghijklmnopqrstuvwxyz.

En aquest pas, s'ha completat el treball preparatori per a la creació del bot.

Instal·lant un paquet per treballar amb un bot de telegram a R

Suposo que ja teniu el llenguatge R instal·lat i l'entorn de desenvolupament RStudio. Si aquest no és el cas, podeu mirar-ho vídeo tutorial sobre com instal·lar-los.

Per treballar amb l'API de Telegram Bot, utilitzarem el paquet R telegram.bot.

La instal·lació de paquets a R es fa mitjançant la funció install.packages(), així que per instal·lar el paquet que necessitem, utilitzeu l'ordre install.packages("telegram.bot").

Per obtenir més informació sobre la instal·lació de diversos paquets, vegeu aquest vídeo.

Després d'instal·lar el paquet, cal connectar-lo:

library(telegram.bot)

Enviament de missatges de R a Telegram

El bot que heu creat el podeu trobar a Telegram mitjançant l'inici de sessió especificat durant la creació, en el meu cas ho és @my_test_bot.

Envieu qualsevol missatge al bot, com ara "Hola bot". De moment, ho necessitem per obtenir l'identificador del vostre xat amb el bot.

Ara a R escrivim el codi següent.

library(telegram.bot)

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

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

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

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

Inicialment, creem una instància del nostre bot amb la funció Bot(), com a argument, heu de passar-li el testimoni rebut prèviament.

Emmagatzemar el testimoni al codi es considera una mala pràctica, de manera que podeu emmagatzemar-lo en una variable d'entorn i llegir-lo. Per defecte al paquet telegram.bot suport implementat per a variables d'entorn amb el nom següent: R_TELEGRAM_BOT_ИМЯ_ВАШЕГО_БОТА... En el seu lloc ИМЯ_ВАШЕГО_БОТА substituïu el nom que heu establert en crear, en el meu cas serà una variable R_TELEGRAM_BOT_My Test Bot.

Podeu crear una variable d'entorn de diverses maneres, us parlaré de la més universal i multiplataforma. Creeu al vostre directori d'inici (el podeu trobar amb l'ordre path.expand("~")) fitxer de text amb el nom .Renvironment. També podeu fer-ho amb l'ordre file.edit(path.expand(file.path("~", ".Renviron"))).

I afegiu-hi la línia següent.

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

A continuació, podeu utilitzar el testimoni emmagatzemat a la variable d'entorn amb la funció bot_token(), és a dir com això:

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

Mètode getUpdates()ens permet obtenir actualitzacions de bot, és a dir. missatges que li van enviar. Mètode from_chat_id(), us permet obtenir l'identificador del xat des del qual s'ha enviat el missatge. Necessitem aquest identificador per enviar missatges des del bot.

A més de l'identificador de xat de l'objecte rebut pel mètode getUpdates() també obtindreu una altra informació útil. Per exemple, informació sobre l'usuari que ha enviat el missatge.

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"

Així doncs, en aquesta fase, ja tenim tot el necessari per enviar un missatge des del bot a telegrama. Utilitzem el mètode sendMessage(), al qual heu de passar l'identificador de xat, el text del missatge i el tipus de marcatge del text del missatge. El tipus de marcatge pot ser Markdown o HTML i es defineix per l'argument parse_mode.

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

Conceptes bàsics del format de Markdown:

  • La lletra en negreta està marcada amb *:
    • exemple: *жирный шритф*
    • resultat: guió en negreta
  • La cursiva està donada per guions baixos:
    • exemple: _курсив_
    • resultat: cursiva
  • El tipus de lletra d'espai fix, que s'utilitza normalment per ressaltar el codi del programa, s'especifica mitjançant apòstrofes - `:
    • exemple: `titra monoespacial`
    • resultat: моноширинный шрифт

Conceptes bàsics del format del marcatge HTML:
En HTML, emboliqueu la part del text que voleu ressaltar en etiquetes, per exemple <тег>текст</тег>.

  • <etiqueta> — etiqueta d'obertura
  • - Etiqueta de tancament

Etiquetes de marcatge HTML

  • <b> - lletra en negreta
    • exemple: <b>жирный шрифт</b>
    • resultar font en negreta
  • <i> - cursiva
    • exemple: <i>курсив</i>
    • resultat: cursiva
  • — моноширинный шрифт
    • exemple: моноширинный шрифт
    • resultat: моноширинный шрифт

A més del text, podeu enviar altres continguts mitjançant mètodes especials:

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

Aquells. per exemple utilitzant el mètode sendPhoto() podeu enviar una trama desada com a imatge que heu creat amb el paquet ggplot2.

Comprovació del Programador de tasques de Windows i enviament de notificacions de les tasques que s'han bloquejat

Per treballar amb el Programador de tasques de Windows, heu d'instal·lar el paquet taskscheduleR, i per a la comoditat de treballar amb dades, instal·leu el paquet dplyr.

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

A continuació, utilitzant la funció taskscheduler_ls() demanem informació sobre tasques al nostre planificador. Utilitzant la funció filter() del paquet dplyr eliminem de la llista de tasques les que s'han completat correctament i tenen un estat de darrer resultat de 0, i les que encara no s'han executat mai i tenen un estat de 267011, les tasques desactivades i les que s'estan executant actualment.

# запрашиваем список задач
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 l'objecte task Ara tenim una llista de tasques el treball de les quals va acabar amb un error, hem d'enviar aquesta llista a Telegram.

Si considerem cada comanda amb més detall, aleshores:

  • filter() — filtra la llista de tasques segons les condicions descrites anteriorment
  • select() - només deixa un camp amb el nom de les tasques de la taula
  • unique() - elimina els noms duplicats
  • unlist() - tradueix la columna de taula seleccionada a un vector
  • paste0() - connecta els noms de les tasques en una línia i posa un caràcter de nova línia com a separador, és a dir. n.

Només ens queda enviar aquest resultat a telegram.

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

Per tant, de moment el codi del bot té aquest aspecte:

Codi bot que verifica la tasca

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

}

Quan utilitzeu l'exemple anterior, substituïu el vostre testimoni de bot i el vostre identificador de xat al codi.

Podeu afegir condicions de filtratge de tasques, per exemple, comprovant només les tasques que heu creat, excloent les del sistema.

També podeu posar diverses configuracions en un fitxer de configuració independent i emmagatzemar-hi l'identificador de xat i el testimoni. Podeu llegir la configuració, per exemple, utilitzant el paquet configr.

Exemple ini config

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

Exemple de lectura de variables de config a 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ó d'un programa de llançament d'exploració de tasques

El procés de configuració del llançament programat de l'script es descriu amb més detall en això article. Aquí només descriuré els passos que s'han de seguir per a això. Si algun dels passos no us queda clar, consulteu l'article al qual he proporcionat un enllaç.

Suposem que desem el nostre codi de bot en un fitxer check_bot.R. Per programar que aquest fitxer s'executi amb regularitat, seguiu aquests passos:

  1. Escriviu el camí a la carpeta on s'instal·la R a la variable del sistema Path, a Windows el camí serà com aquest: C:Program FilesRR-4.0.2bin.
  2. Creeu un fitxer bat executable amb una sola línia R CMD BATCH C:rscriptscheck_botcheck_bot.R. Substitueix C:rscriptscheck_botcheck_bot.R al camí complet del vostre fitxer R.
  3. A continuació, utilitzeu el Programador de tasques de Windows per establir un programa d'inici, per exemple, cada mitja hora.

Conclusió

En aquest article, vam descobrir com crear un bot i utilitzar-lo per enviar diverses notificacions a Telegram.

Vaig descriure la tasca de supervisar el Programador de tasques de Windows, però podeu utilitzar el material d'aquest article per enviar qualsevol notificació, des de la previsió meteorològica fins a les cotitzacions a la borsa, perquè. R us permet connectar-vos a un gran nombre de fonts de dades.

En el següent article, descobrirem com afegir ordres i un teclat al bot perquè no només pugui enviar notificacions, sinó també realitzar accions més complexes.

Font: www.habr.com

Afegeix comentari