Vi skriver en telegram-bot i R (del 1): Opretter botten og sender med hjælp af den beskeder til telegram

Telegram-publikummet vokser dagligt i geometrisk progression, hvilket skyldes bekvemmeligheden ved messenger, tilstedeværelsen af kanaler, chats, og selvfølgelig muligheden for at oprette bots.

Bots kan anvendes til vidt forskellige formål, fra automatisering af kommunikationen med dine kunder til styring af dine egne opgaver.

I princippet kan du bruge en bot til at udføre enhver operation gennem telegram: sende eller anmode om data, starte opgaver på serveren, samle information i databaser, sende e-mails og så videre.

Jeg planlægger at skrive en række artikler om, hvordan man arbejder med telegram bot API, og lave bots til egne behov.

Vi skriver en telegram-bot i R (del 1): Opretter botten og sender med hjælp af den beskeder til telegram

I denne første artikel vil vi finde ud af, hvordan man opretter en telegram-bot, og sender meddelelser via den til telegram.

Som resultat vil vi få en bot, der tjekker status for den seneste udførelse af alle opgaver i Windows Task Scheduler, og sender dig meddelelser, hvis nogen fejler.

Men formålet med denne artikelserie er ikke blot at lære dig at lave en bot til en bestemt, snæver opgave, men generelt at introducere dig til syntaksen af pakken telegram.bot, samt kodeeksempler, som du kan bruge til at skrive bots til at løse dine egne opgaver.

Indhold

Hvis du er interesseret i dataanalyse, kan mine telegram og youtube kanaler være interessante. Størstedelen af indholdet er dedikeret til R-sprog.

  1. Oprettelse af telegram-bot
  2. Installation af pakken til at arbejde med telegram-bot på R
  3. Send beskeder fra R til Telegram
  4. Konfiguration af tidsplan til at kontrollere opgaver
  5. Konklusion

Oprettelse af telegram-bot

For at starte skal vi oprette en bot. Dette gøres ved hjælp af en speciel bot BotFather, gå til linket og skriv til botten /start.

Herefter vil du modtage en besked med en liste over kommandoer:

Besked fra BotFather

Jeg kan hjælpe dig med at oprette og administrere Telegram-bots. Hvis du er ny i Bot API, skal du se manualen (https://core.telegram.org/bots). Du kan styre mig ved at sende disse kommandoer: /newbot - opret en ny bot /mybots - rediger dine bots [beta] Rediger Bots /setname - ændre en bots navn /setdescription - ændre botbeskrivelse /setabouttext - ændre botens om-info /setuserpic - ændre botens profilbillede /setcommands - ændre listen over kommandoer /deletebot - slet en bot Botindstillinger /token - generere autorisationstoken /revoke - tilbagekalde botadgangstoken /setinline - skift inline-tilstand (https://core.telegram.org/bots/inline) /setinlinegeo - skift inline-lokalitetsanmodninger (https://core.telegram.org/bots/inline#location-based-results) /setinlinefeedback - ændre inline-feedback (https://core.telegram.org/bots/inline#collecting-feedback) indstillinger /setjoingroups - kan din bot tilføjes til grupper? /setprivacy - skift privatlivsindstillingen (https://core.telegram.org/bots#privacy-mode) i grupper Spil /mygames - rediger dine spil (https://core.telegram.org/bots/games) [beta] /newgame - opret et nyt spil (https://core.telegram.org/bots/games) /listgames - få en liste over dine spil /editgame - rediger et spil /deletegame - slet et eksisterende spil

For at oprette en ny bot skal vi sende kommandoen /newbot.

BotFather vil bede dig om at indtaste navnet og brugernavnet på botten.

BotFather, [25.07.20 09:39] Nå, en ny bot. Hvad skal vi kalde den? Vælg venligst et navn til din bot. Alexey Seleznev, [25.07.20 09:40] Min Test Bot BotFather, [25.07.20 09:40] Godt. Lad os nu vælge et brugernavn til din bot. Det skal slutte på `bot`. For eksempel: TetrisBot eller tetris_bot. Alexey Seleznev, [25.07.20 09:40] @my_test_bot

Navnet kan du vælge frit, men brugernavnet skal slutte på bot.

Hvis du har gjort alt korrekt, vil du modtage følgende besked:

Færdig! Tillykke med din nye bot. Du vil finde den på t.me/my_test_bot. Du kan nu tilføje en beskrivelse, om-section og profilbillede til din bot, se /help for en liste over kommandoer. For resten, når du har afsluttet oprettelsen af din fede bot, så kontakt vores Bot Support, hvis du ønsker et bedre brugernavn til den. Sørg bare for, at botten er helt operativ, før du gør dette. Brug denne token til at få adgang til HTTP API: 123456789:abcdefghijklmnopqrstuvwxyz For en beskrivelse af Bot API, se denne side: https://core.telegram.org/bots/api

Derefter vil du få brug for den modtagne API-token, i mit eksempel er det 123456789:abcdefghijklmnopqrstuvwxyz.

På dette trin er forberedelserne til oprettelsen af botten afsluttet.

Installation af pakken til at arbejde med telegram-bot på R

Jeg forudsætter, at du allerede har installeret R-sproget og udviklingsmiljøet RStudio. Hvis ikke, kan du se denne video tutorial om, hvordan man installerer dem.

For at arbejde med Telegram Bot API vil vi bruge R-pakken telegram.bot.

Pakkernes installation i R foregår med funktionen install.packages(), så for at installere den pakke, vi har brug for, skal du bruge kommandoen install.packages("telegram.bot").

Du kan finde mere information om installation af forskellige pakker i denne video.

Efter installation af pakken skal du tilslutte den:

library(telegram.bot)

Send beskeder fra R til Telegram

Den bot, du har oprettet, kan findes i Telegram ved hjælp af det brugernavn, der blev fastsat ved oprettelsen, i mit tilfælde er det @my_test_bot.

Send the bot any message, for example, "Hello bot". For now, we need this to get the ID of your chat with the bot.

Now, we write the following code in R.

library(telegram.bot)

# create a bot instance
bot <- Bot(token = "123456789:abcdefghijklmnopqrstuvwxyz")

# Request information about the bot
print(bot$getMe())

# Get the bot updates, i.e., list of messages sent to it
updates <- bot$getUpdates()

# Request the chat ID
# Note: before requesting updates, you must send a message to the bot
chat_id <- updates[[1L]]$from_chat_id()

Initially, we create an instance of our bot using the function Bot(), for which you need to pass the previously obtained token as an argument.

Storing the token in the code is not considered best practice, so you can store it in an environment variable and read it from there. By default, the package telegram.bot supports environment variables of the following name: R_TELEGRAM_BOT_YOUR_BOT_NAME. I stedet for YOUR_BOT_NAME replace it with the name you specified when creating, in my case, the variable will be R_TELEGRAM_BOT_My Test Bot.

You can create an environment variable in several ways, I will tell you about the most universal and cross-platform way. Create a text file named in your home directory (you can find out its path using the command path.expand("~")) with the name .Renviron. You can also do this using the command file.edit(path.expand(file.path("~", ".Renviron"))).

And add the following line to it.

R_TELEGRAM_BOT_YOUR_BOT_NAME=123456789:abcdefghijklmnopqrstuvwxyz

Next, you can use the token stored in the environment variable with the function bot_token(), that is, like this:

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

Metoden getUpdates()allows us to get the bot updates, i.e., the messages that were sent to it. The method from_chat_id(), allows you to get the chat ID from which the message was sent. This ID is necessary for sending messages from the bot.

In addition to the chat ID from the object obtained by the method getUpdates() you also get some other useful information. For example, information about the user who sent the message.

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"

So, at this stage, we already have everything necessary to send a message from the bot in Telegram. We'll use the method sendMessage(), som skal have chat-ID, meddelelsesteksten og tekstformateringsmetoden. Formateringsmetoden kan være Markdown eller HTML, og den indstilles med argumentet parse_mode.

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

Grundlæggende om Markdown-formatering:

  • Fed tekst fremhæves med tegnet *:
    • eksempel: *fed tekst*
    • resultat: fed tekst
  • Kursiv angives med understregning:
    • eksempel: _kursiv_
    • resultat: kursiv
  • Monospace-skrift, som normalt bruges til programkode, angives med backticks — `:
    • eksempel: `monospace-skrift`
    • resultat: monospace-skrift

Grundlæggende om HTML-formatering:
I HTML indkapsler du den del af teksten, der skal fremhæves, i tags, eksempel tekst.

  • — åbnende tag
  • — lukkende tag

HTML-formateringstags

  • <b> — fed skrift
    • eksempel: <b>fed tekst</b>
    • resultatet fed tekst
  • — kursiv
    • eksempel: kursiv
    • resultat: kursiv
  • — monospace-skrift
    • eksempel: monospace-skrift
    • resultat: monospace-skrift

Udover tekst kan du sende andet indhold ved hjælp af specielle metoder:

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

Dvs. for eksempel ved hjælp af metoden sendPhoto() kan du sende et gemt billede af den graf, du har lavet ved hjælp af pakken ggplot2.

Kontrol af Windows Opgaveplanlægger og udsendelse af meddelelser om opgaver, der er afsluttet med fejl

For at arbejde med Windows Opgaveplanlægger skal du installere pakken taskscheduleR, og for at gøre arbejdet lettere med data, skal vi installere pakken dplyr.

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

Derefter bruger vi funktionen taskscheduler_ls() til at anmode om information om opgaver fra vores planlægger. Med funktionen filter() fra pakken dplyr fjerner vi opgaverne, der blev gennemført med succes og har status for det sidste resultat 0, samt dem der aldrig har kørt og har status 267011, lukkede opgaver og opgaver, der aktuelt kører.

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

I objektet task har vi nu en liste over opgaver, der er afsluttet med fejl, som vi skal sende til Telegram.

Hvis vi ser nærmere på hver kommando, så:

  • filter() — filtrerer listen over opgaver i henhold til ovenstående betingelser
  • select() — efterlader kun ét felt med opgavenavnet i tabellen
  • unique() — fjerner dubletter af navne
  • unlist() — konverterer den valgte kolonne i tabellen til en vektor
  • paste0() — samler opgavenavne i én streng og sætter et linjeskifttegn som separator, dvs. n.

Alt hvad vi skal gøre, er at sende dette resultat til Telegram.

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

Således ser koden til botten i øjeblikket sådan ud:

Koden til botten, der kontrollerer opgaver

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

}

Når du bruger det ovenstående eksempel, skal du indsætte din bots token og din chat-id i koden.

Du kan tilføje betingelser for filtrering af opgaver, for eksempel kun at kontrollere de opgaver, der er oprettet af dig, og udelukke systemopgaver.

Du kan også flytte forskellige indstillinger til en separat konfigurationsfil og gemme chat-id og token der. Du kan læse konfigurationen med et bibliotek som configr.

Eksempel på ini-konfiguration

[telegram_bot]
;indstillinger til telegrambot og chat, hvor notifikationer vil blive sendt
chat_id=12345678
bot_token=123456789:abcdefghijklmnopqrstuvwxyz"

Eksempel på at læse variabler fra konfigurationen i R

library(configr)

# læs konfigurationen
config <- read.config('C:/sti_til_konfiguration/config.cfg', rcmd.parse = TRUE)

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

Vi konfigurerer tidsplanen for kontrol af opgaver

Processen til at planlægge scriptkørsler er beskrevet mest detaljeret i denne artikel. Her vil jeg kun beskrive de trin, der er nødvendige for at gøre det. Hvis du ikke forstår et af trinene, så se artiklen, jeg har henvist til.

Antag, at vi har gemt koden til vores bot i filen check_bot.R. For at planlægge regelmæssig kørsel af denne fil skal du følge disse trin:

  1. Skriv stien til mappen, hvor R er installeret, i systemvariablen Path. I Windows vil stien være cirka sådan her: C:Program FilesRR-4.0.2bin.
  2. Opret en udførbar bat-fil, der kun indeholder én linje R CMD BATCH C:rscriptscheck_botcheck_bot.R. Erstat C:rscriptscheck_botcheck_bot.R med den fulde sti til din R-fil.
  3. Derefter skal du ved hjælp af Windows Task Scheduler konfigurere tidsplanen for kørsel, for eksempel hver halve time.

Konklusion

I denne artikel har vi set på, hvordan man opretter en bot og sender forskellige notifikationer via den i telegram.

Jeg har beskrevet opgaven med at overvåge Windows Task Scheduler, men du kan bruge materialet i denne artikel til at sende alle slags notifikationer, fra vejrudsigter til aktiekurser på børsen, da R giver dig mulighed for at tilslutte dig et væld af datakilder.

I den næste artikel vil vi se på, hvordan man tilføjer kommandoer og et tastatur til botten, så den ikke kun kan sende notifikationer, men også udføre mere komplekse handlinger.

Kilde: habr.com

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster