Vi skriver en telegram-bot på R-sproget (del 1): Opret en bot og send beskeder til telegram ved hjælp af den

Telegrampublikummet vokser eksponentielt hver dag, dette lettes af messengerens bekvemmelighed, tilgængeligheden af ​​kanaler, chats og selvfølgelig evnen til at oprette bots.

Bots kan bruges til en lang række formål, lige fra automatisering af kommunikation med dine kunder til styring af dine egne opgaver.

Faktisk kan du gennem botten bruge telegram til at udføre enhver handling: sende eller anmode om data, køre opgaver på serveren, indsamle oplysninger i en database, sende e-mails og så videre.

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

Vi skriver en telegram-bot på R-sproget (del 1): Opret en bot og send beskeder til telegram ved hjælp af den

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

Som et resultat vil vi have en bot, der kontrollerer status for den sidste udførelse af alle opgaver i Windows Task Scheduler og sender dig meddelelser, hvis nogen mislykkes.

Men formålet med denne serie af artikler er ikke at lære dig, hvordan du skriver en bot til en specifik, snæver opgave, men at introducere dig til pakkens syntaks generelt. telegram.bot, og kodeeksempler, som du kan skrive bots med for at løse dine egne problemer.

Indhold

Hvis du er interesseret i dataanalyse, er du måske interesseret i min telegram и youtube kanaler. Det meste af indholdet er afsat til R-sproget.

  1. Oprettelse af en telegram-bot
  2. Installation af en pakke til at arbejde med en telegram-bot på R
  3. Sender beskeder fra R til Telegram
  4. Konfiguration af startplanen for opgavescanning
  5. Konklusion

Oprettelse af en telegram-bot

Først skal vi oprette en bot. Dette gøres ved hjælp af en speciel bot BotFader, gå til link og skriv til botten /start.

Så vil du modtage en besked med en liste over kommandoer:

Besked fra 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

Send kommandoen for at oprette en ny bot /newbot.

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

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

Du kan indtaste et vilkårligt navn, og login skal slutte med bot.

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

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

Dernæst skal du bruge det modtagne API-token, i mit eksempel er det det 123456789:abcdefghijklmnopqrstuvwxyz.

På dette trin er det forberedende arbejde til oprettelse af botten afsluttet.

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

Jeg går ud fra, at du allerede har R-sproget installeret og RStudio-udviklingsmiljøet. Hvis dette ikke er tilfældet, så kan du se på dette video lektion hvordan man installerer dem.

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

Installation af pakker i R udføres af funktionen install.packages(), så for at installere den pakke, vi har brug for, skal du bruge kommandoen install.packages("telegram.bot").

For mere information om installation af forskellige pakker, se denne video.

Efter installation af pakken skal du tilslutte den:

library(telegram.bot)

Sender beskeder fra R til Telegram

Den bot, du oprettede, kan findes i Telegram ved hjælp af det login, der blev angivet under oprettelsen, i mit tilfælde er det det @my_test_bot.

Send enhver besked til botten, såsom "Hej bot". I øjeblikket har vi brug for dette for at få id'et for din chat med botten.

Nu i R skriver vi følgende kode.

library(telegram.bot)

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

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

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

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

I første omgang opretter vi en instans af vores bot med funktionen Bot(), som et argument skal du videregive den tidligere modtagne token til den.

At gemme tokenet i kode betragtes som dårlig praksis, så du kan gemme det i en miljøvariabel og læse det fra det. Som standard i pakken telegram.bot implementeret understøttelse af miljøvariabler med følgende navn: R_TELEGRAM_BOT_ИМЯ_ВАШЕГО_БОТА. I stedet for ИМЯ_ВАШЕГО_БОТА erstatte det navn, du angiver ved oprettelse, i mit tilfælde vil det være en variabel R_TELEGRAM_BOT_My Test Bot.

Du kan oprette en miljøvariabel på flere måder, jeg vil tale om den mest universelle og tværplatform. Opret i din hjemmemappe (du kan finde den med kommandoen path.expand("~")) tekstfil med navnet .Renviron. Du kan også gøre dette med kommandoen file.edit(path.expand(file.path("~", ".Renviron"))).

Og tilføje følgende linje til det.

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

Du kan derefter bruge tokenet gemt i miljøvariablen med funktionen bot_token(), dvs. sådan her:

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

fremgangsmåde getUpdates()giver os mulighed for at få bot-opdateringer, dvs. beskeder sendt til ham. Metode from_chat_id(), giver dig mulighed for at få ID'et for den chat, hvorfra beskeden blev sendt. Vi har brug for denne identifikator for at sende beskeder fra botten.

Ud over chat-id'et fra objektet modtaget af metoden getUpdates() du får også nogle andre nyttige oplysninger. For eksempel oplysninger om den bruger, der har sendt beskeden.

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"

Så på dette tidspunkt har vi allerede alt, hvad der er nødvendigt for at sende en besked fra botten til telegram. Lad os bruge metoden sendMessage(), hvortil du skal videregive chat-id'et, beskedteksten og opmærkningstypen for beskedteksten. Markup-typen kan være Markdown eller HTML og indstilles af argumentet parse_mode.

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

Grundlæggende om Markdown-formatering:

  • Fed skrift er markeret med *:
    • eksempel: *жирный шритф*
    • resultat: fed skrift
  • Kursiv er angivet med understregninger:
    • eksempel: _курсив_
    • resultat: kursiv
  • Fonten med fast mellemrum, som normalt bruges til at fremhæve programkode, er angivet ved hjælp af apostrof - `:
    • eksempel: `monospace font`
    • resultat: моноширинный шрифт

Grundlæggende om HTML markup formatering:
I HTML pakker du den del af teksten, du vil fremhæve, ind i f.eks. tags <тег>текст</тег>.

  • <tag> — åbningsmærke
  • - lukkemærke

HTML markup tags

  • <b> - fed skrift
    • eksempel: <b>жирный шрифт</b>
    • resultere fed skrift
  • <i> - kursiv
    • eksempel: <i>курсив</i>
    • resultat: kursiv
  • — моноширинный шрифт
    • eksempel: моноширинный шрифт
    • resultat: моноширинный шрифт

Ud over tekst kan du sende andet indhold ved hjælp af særlige 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"
)

De der. for eksempel ved hjælp af metoden sendPhoto() du kan sende et plot gemt som et billede, som du har bygget med pakken ggplot2.

Kontrollerer Windows Task Scheduler og sender besked om opgaver, der er gået ned

For at arbejde med Windows Task Scheduler skal du installere pakken taskscheduleR, og for at gøre det nemmere at arbejde med data, skal du installere pakken dplyr.

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

Dernæst ved hjælp af funktionen taskscheduler_ls() vi beder om oplysninger om opgaver fra vores planlægger. Brug af funktionen filter() fra pakken dplyr vi fjerner fra listen over opgaver dem, der blev gennemført med succes og har en sidste resultatstatus på 0, og dem, der aldrig er blevet kørt endnu og har en status på 267011, deaktiverede opgaver og opgaver, der kører i øjeblikket.

# запрашиваем список задач
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 vi har nu en liste over opgaver, hvis arbejde endte med en fejl, vi skal sende denne liste til Telegram.

Hvis vi overvejer hver kommando mere detaljeret, så:

  • filter() — filtrerer listen over opgaver i henhold til betingelserne beskrevet ovenfor
  • select() - efterlader kun ét felt med navnet på opgaverne i tabellen
  • unique() - fjerner duplikerede navne
  • unlist() - oversætter den valgte tabelkolonne til en vektor
  • paste0() - forbinder navnene på opgaver i én linje, og sætter et nylinjetegn som separator, dvs. n.

Det eneste, der er tilbage for os, er at sende dette resultat til telegram.

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

Så i øjeblikket ser botkoden sådan ud:

Bot-kode, der kontrollerer opgaven

# Подключение пакета
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 eksemplet ovenfor, skal du erstatte dit bot-token og dit chat-id med koden.

Du kan tilføje betingelser for opgavefiltrering, for eksempel ved kun at kontrollere de opgaver, der er oprettet af dig, undtagen systemopgaver.

Du kan også lægge forskellige indstillinger i en separat konfigurationsfil og gemme chat-id'et og tokenet i den. Du kan læse konfigurationen, for eksempel ved hjælp af pakken configr.

Eksempel ini config

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

Eksempel på læsning af variabler fra config i 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

Opsætning af en startplan for opgavescanning

Processen med at konfigurere planlagt scriptlancering er beskrevet mere detaljeret i dette artiklen. Her vil jeg kun beskrive de trin, der skal følges for dette. Hvis nogen af ​​trinene ikke er klare for dig, så se artiklen, som jeg har givet et link til.

Lad os sige, at vi gemmer vores bot-kode i en fil check_bot.R. Følg disse trin for at planlægge denne fil til at køre regelmæssigt:

  1. Skriv stien til mappen, hvori R er installeret i Path-systemvariablen, på Windows vil stien være sådan her: C:Program FilesRR-4.0.2bin.
  2. Opret en eksekverbar bat-fil med kun én linje R CMD BATCH C:rscriptscheck_botcheck_bot.R. Erstatte C:rscriptscheck_botcheck_bot.R til den fulde sti til din R-fil.
  3. Brug derefter Windows Task Scheduler til at indstille en opstartsplan, for eksempel hver halve time.

Konklusion

I denne artikel fandt vi ud af, hvordan man opretter en bot og bruger den til at sende forskellige meddelelser til telegram.

Jeg beskrev opgaven med at overvåge Windows Task Scheduler, men du kan bruge materialet i denne artikel til at sende enhver notifikation, fra vejrudsigten til aktiekurser på børsen, fordi. R giver dig mulighed for at oprette forbindelse til et stort antal datakilder.

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

Kilde: www.habr.com

Tilføj en kommentar