Skrive en telegram-bot i R (del 1): Opprette en bot og bruke den til å sende meldinger i telegram

Telegram-publikummet vokser eksponentielt hver dag, dette tilrettelegges av messengerens bekvemmelighet, tilstedeværelsen av kanaler, chatter og selvfølgelig muligheten til å lage bots.

Bots kan brukes til helt andre formål, fra automatisering av kommunikasjon med kundene dine til å administrere dine egne oppgaver.

I hovedsak kan du bruke telegram til å utføre alle operasjoner gjennom en bot: sende eller be om data, kjøre oppgaver på serveren, samle informasjon inn i en database, sende e-poster og så videre.

Jeg planlegger å skrive en serie artikler om hvordan jeg kan jobbe med telegram bot API, og skriv roboter som passer dine behov.

Skrive en telegram-bot i R (del 1): Opprette en bot og bruke den til å sende meldinger i telegram

I denne første artikkelen vil vi finne ut hvordan du lager en telegram-bot og bruker den til å sende varsler i telegram.

Som et resultat vil vi ha en bot som vil sjekke statusen for siste utførelse av alle oppgaver i Windows Task Scheduler, og sende deg varsler hvis noen av dem mislyktes.

Men formålet med denne artikkelserien er ikke å lære deg hvordan du skriver en bot for en spesifikk, smal oppgave, men å generelt introdusere deg til syntaksen til pakken telegram.bot, og kodeeksempler som du kan skrive bots med for å løse dine egne problemer.

Innhold

Hvis du er interessert i dataanalyse, kan du være interessert i min telegram и youtube kanaler. Det meste av innholdet er dedikert til R-språket.

  1. Opprette en telegram-bot
  2. Installere en pakke for å jobbe med en telegram-bot i R
  3. Sender meldinger fra R til Telegram
  4. Sette opp en tidsplan for å kjøre oppgaveskanninger
  5. Konklusjon

Opprette en telegram-bot

Først må vi lage en bot. Dette gjøres ved hjelp av en spesiell bot BotFader, gå til link og skriv til boten /start.

Deretter vil du motta en melding med en liste over kommandoer:

Melding 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

For å opprette en ny bot, send kommandoen /newbot.

BotFather vil be deg om å skrive inn botens navn og pålogging.

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 skrive inn hvilket som helst navn, men påloggingen må slutte med bot.

Hvis du gjorde alt riktig, vil du motta følgende melding:

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

Deretter trenger du det mottatte API-tokenet, i mitt eksempel er det det 123456789:abcdefghijklmnopqrstuvwxyz.

På dette trinnet er det forberedende arbeidet for å lage boten fullført.

Installere en pakke for å jobbe med en telegram-bot i R

Jeg antar at du allerede har R-språket og RStudio-utviklingsmiljøet installert. Hvis dette ikke er tilfelle, så kan du se på dette videoopplæring hvordan du installerer dem.

For å jobbe med Telegram Bot API vil vi bruke R-pakken telegram.bot.

Installering av pakker i R gjøres ved å bruke funksjonen install.packages(), så for å installere pakken vi trenger, bruk kommandoen install.packages("telegram.bot").

Du kan lære mer om å installere ulike pakker fra denne videoen.

Etter å ha installert pakken, må du koble den til:

library(telegram.bot)

Sender meldinger fra R til Telegram

Boten du opprettet finner du i Telegram ved å bruke påloggingen som ble spesifisert under opprettelsen, i mitt tilfelle er det det @my_test_bot.

Send boten hvilken som helst melding, for eksempel "Hei bot." For øyeblikket trenger vi dette for å få ID-en til chatten din med boten.

Nå skriver vi følgende kode i R.

library(telegram.bot)

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

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

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

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

Til å begynne med oppretter vi en forekomst av boten vår med funksjonen Bot(), må det tidligere mottatte tokenet overføres til det som et argument.

Det anses ikke som beste praksis å lagre tokenet i kode, så du kan lagre det i en miljøvariabel og lese det fra det. Som standard i pakken telegram.bot Støtte for miljøvariabler med følgende navn er implementert: R_TELEGRAM_BOT_ИМЯ_ВАШЕГО_БОТА... I stedet ИМЯ_ВАШЕГО_БОТА erstatte navnet du spesifiserte da du opprettet, i mitt tilfelle vil det være en variabel R_TELEGRAM_BOT_My Test Bot.

Det er flere måter å lage en miljøvariabel på; Jeg vil fortelle deg om den mest universelle og tverrplattformen. Opprett i hjemmekatalogen din (du kan finne den ved å bruke kommandoen path.expand("~")) tekstfil med navnet .Renviron. Du kan også gjøre dette ved å bruke kommandoen file.edit(path.expand(file.path("~", ".Renviron"))).

Og legg til følgende linje.

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

Deretter kan du bruke tokenet som er lagret i miljøvariabelen ved å bruke funksjonen bot_token(), dvs. som dette:

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

metode getUpdates()lar oss få botoppdateringer, dvs. meldinger som ble sendt til ham. Metode from_chat_id(), lar deg få IDen til chatten som meldingen ble sendt fra. Vi trenger denne ID-en for å sende meldinger fra boten.

I tillegg til chat-ID-en fra objektet oppnådd med metoden getUpdates() du får også annen nyttig informasjon. For eksempel informasjon om brukeren som sendte meldingen.

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 stadiet har vi allerede alt vi trenger for å sende en melding fra en bot til Telegram. La oss bruke metoden sendMessage(), der du må sende chat-ID, meldingstekst og meldingstekstmarkeringstype. Markup-typen kan være Markdown eller HTML og settes av argumentet parse_mode.

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

Grunnleggende om Markdown-formatering:

  • Fet skrift er uthevet med *:
    • Eksempel: *жирный шритф*
    • resultat: Fet skrift
  • Kursiv er indikert med understrek:
    • Eksempel: _курсив_
    • resultat: kursiv
  • Monospace-fonten, som vanligvis brukes til å markere programkode, er spesifisert ved å bruke apostrof - `:
    • eksempel: "monospace font".
    • resultat: моноширинный шрифт

Grunnleggende om formatering av HTML-markering:
I HTML pakker du den delen av teksten som skal utheves inn i tagger, for eksempel <тег>текст</тег>.

  • <tag> - åpningstagg
  • - avsluttende tag

HTML-merkekoder

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

I tillegg til tekst kan du sende annet innhold ved hjelp av spesielle 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. for eksempel ved hjelp av metoden sendPhoto() du kan sende grafen du opprettet ved hjelp av pakken, lagret som et bilde ggplot2.

Sjekke Windows Task Scheduler og sende varsler om oppgaver som har avsluttet unormalt

For å jobbe med Windows Task Scheduler må du installere pakken taskscheduleR, og for å gjøre det enklere å jobbe med data, installer pakken dplyr.

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

Deretter bruker du funksjonen taskscheduler_ls() vi ber om informasjon om oppgaver fra planleggeren vår. Bruker funksjonen filter() fra pakken dplyr Vi fjerner fra listen over oppgaver de som ble fullført og har en siste resultatstatus på 0, og de som aldri har blitt lansert og har statusen 267011, deaktiverte oppgaver og oppgaver som kjører for øyeblikket.

# запрашиваем список задач
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 nå en liste over oppgaver som mislyktes, vi må sende denne listen til Telegram.

Hvis vi ser på hver kommando mer detaljert, så:

  • filter() — filtrerer listen over oppgaver i henhold til betingelsene beskrevet ovenfor
  • select() — etterlater bare ett felt i tabellen med navnet på oppgavene
  • unique() - fjerner dupliserte navn
  • unlist() — konverterer den valgte tabellkolonnen til en vektor
  • paste0() — kobler navnene på oppgaver til én linje, og setter en linjemating som skilletegn, dvs. n.

Alt som gjenstår for oss er å sende dette resultatet via telegram.

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

Så for øyeblikket ser bot-koden slik ut:

Oppgavegjennomgang bot-kode

# Подключение пакета
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 bruker eksempelet ovenfor, bytt inn bot-tokenet og chat-ID-en din med koden.

Du kan legge til betingelser for filtrering av oppgaver, for eksempel sjekke bare de oppgavene du har opprettet, unntatt systemoppgaver.

Du kan også legge inn ulike innstillinger i en egen konfigurasjonsfil, og lagre chat-ID og token i den. Du kan lese konfigurasjonen, for eksempel ved å bruke pakken configr.

Eksempel ini config

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

Et eksempel på lesing av variabler fra en konfigurasjon 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

Sette opp en tidsplan for å kjøre oppgaveskanning

Prosessen med å sette opp lansering av script på en tidsplan er beskrevet mer detaljert i denne artikkel. Her vil jeg kun beskrive trinnene som må følges for dette. Hvis noen av trinnene ikke er klare for deg, kan du se artikkelen som jeg ga en lenke til.

La oss anta at vi har lagret bot-koden vår i en fil check_bot.R. Følg disse trinnene for å planlegge at denne filen skal kjøres regelmessig:

  1. Skriv banen til mappen der R er installert i Path-systemvariabelen; i Windows vil banen være omtrent slik: C:Program FilesRR-4.0.2bin.
  2. Lag en kjørbar bat-fil med bare én linje R CMD BATCH C:rscriptscheck_botcheck_bot.R. Erstatte C:rscriptscheck_botcheck_bot.R til den fullstendige banen til R-filen.
  3. Deretter bruker du Windows Task Scheduler til å sette opp en lanseringsplan, for eksempel hver halve time.

Konklusjon

I denne artikkelen fant vi ut hvordan du oppretter en bot og bruker den til å sende forskjellige varsler i telegram.

Jeg beskrev oppgaven med å overvåke Windows Task Scheduler, men du kan bruke materialet i denne artikkelen til å sende eventuelle varsler, fra værmeldingen til aksjekurser på børsen, fordi R lar deg koble til et stort antall datakilder.

I den neste artikkelen vil vi finne ut hvordan du legger til kommandoer og et tastatur til boten slik at den ikke bare kan sende varsler, men også utføre mer komplekse handlinger.

Kilde: www.habr.com

Legg til en kommentar