Pisanje telegram bota na jeziku R (dio 1): Kreiramo bota i šaljemo poruke putem njega u telegram

Publika na Telegramu svakodnevno raste geometrijskom progresijom, što olakšava korištenje aplikacije, kao i prisutnost kanala, chatova, i naravno mogućnost stvaranja botova.

Botovi se mogu koristiti u različite svrhe, od automatizacije komunikacije s vašim klijentima do upravljanja vlastitim zadacima.

U suštini, preko bota možete pomoću Telegrama izvršavati razne operacije: slati ili tražiti podatke, pokretati zadatke na serveru, prikupljati informacije u bazi podataka, slati e-mailove i slično.

Planiram napisati seriju članaka o tome kako raditi s telegram bot API, i pisati botove prema vlastitim potrebama.

Pisanje telegram bota na jeziku R (dio 1): Kreiramo bota i šaljemo poruke putem njega u telegram

U ovom, prvom članku razmotrit ćemo kako stvoriti Telegram bota i slati obavijesti putem njega.

Kao rezultat, dobit ćemo bota koji će provjeravati status posljednjeg izvršenja svih zadataka u Windows rasporedu i slati vam obavijesti ako neki završe s greškom.

No cilj ove serije članaka nije poučiti vas kako napisati bota za određenu, usku svrhu, već vas sveukupno upoznati sa sintaksom paketa telegram.bot, i primjerima koda pomoću kojih ćete moći pisati botove za rješavanje vlastitih zadataka.

Sadržaj

Ako vas zanima analitika podataka, možda će vas zanimati moji telegram i youtube kanali. Velik dio sadržaja je posvećen jeziku R.

  1. Stvaranje Telegram bota
  2. Instalacija paketa za rad s Telegram botom na R
  3. Slanje poruka iz R u Telegram
  4. Postavljanje rasporeda za provjeru zadataka
  5. Zaključak

Stvaranje Telegram bota

Prvo, potrebno je stvoriti bota. To se radi pomoću posebnog bota BotFather, idemo na vezi i šaljemo poruku botu /start.

Nakon toga dobit ćete poruku s popisom naredbi:

Poruka od BotFather

Mogu vam pomoći u stvaranju i upravljanju Telegram botovima. Ako ste novi u Bot API-ju, molimo pogledajte priručnik (https://core.telegram.org/bots).

Možete me kontrolirati slanjem ovih naredbi:

/newbot - stvorite novog bota
/mybots - uredite svoje botove [beta]

Uredi botove
/setname - promijenite ime bota
/setdescription - promijenite opis bota
/setabouttext - promijenite informacije o botu
/setuserpic - promijenite profilnu sliku bota
/setcommands - promijenite popis naredbi
/deletebot - obrišite bota

Postavke bota
/token - generirajte autorizacijski token
/revoke - povucite pristupni token bota
/setinline - uključite inline način (https://core.telegram.org/bots/inline)
/setinlinegeo - uključite zahtjeve za inline lokaciju (https://core.telegram.org/bots/inline#location-based-results)
/setinlinefeedback - promijenite inline povratne informacije (https://core.telegram.org/bots/inline#collecting-feedback) postavke
/setjoingroups - može li vaš bot biti dodan u grupe?
/setprivacy - uključite način privatnosti (https://core.telegram.org/bots#privacy-mode) u grupama

Igre
/mygames - uredite svoje igre (https://core.telegram.org/bots/games) [beta]
/newgame - stvorite novu igru (https://core.telegram.org/bots/games)
/listgames - dobijte popis svojih igara
/editgame - uredite igru
/deletegame - obrišite postojeću igru

Za stvaranje novog bota pošaljite naredbu /newbot.

BotFather će vas zamoliti da unesete ime i korisničko ime bota.

BotFather, [25.07.20 09:39]
U redu, novi bot. Kako ćemo ga nazvati? Molim odaberite ime za svoj bot.

Alexey Seleznev, [25.07.20 09:40]
Moj test bot

BotFather, [25.07.20 09:40]
Dobro. Sada odaberimo korisničko ime za vaš bot. Mora završavati s `bot`. Na primjer: TetrisBot ili tetris_bot.

Alexey Seleznev, [25.07.20 09:40]
@my_test_bot

Ime možete unijeti proizvoljno, ali korisničko ime mora završavati na bot.

Ako ste sve uradili ispravno, dobit ćete sljedeću poruku:

Završeno! Čestitamo na vašem novom botu. Naći ćete ga na t.me/my_test_bot. Sada možete dodati opis, odjeljak o botu i profilnu sliku za vaš bot, pogledajte /help za popis naredbi. Usput, kada završite s kreiranjem svog cool bota, kontaktirajte našu Bot podršku ako želite bolje korisničko ime za njega. Samo se pobrinite da je bot potpuno operativan prije nego to učinite.

Koristite ovaj token za pristup HTTP API-ju:
123456789:abcdefghijklmnopqrstuvwxyz

Za opis Bot API-ja, pogledajte ovu stranicu: https://core.telegram.org/bots/api

Zatim će vam trebati dobiveni API token, u mojem primjeru to je 123456789:abcdefghijklmnopqrstuvwxyz.

Na ovoj fazi pripremni radovi za stvaranje bota su završeni.

Instalacija paketa za rad s Telegram botom na R

Pretpostavljam da već imate instaliran jezik R i razvojno okruženje RStudio. Ako nije, možete pogledati ovaj video lekciju o tome kako ih instalirati.

Za rad s Telegram Bot API-jem koristit ćemo R paket telegram.bot.

Instalacija paketa u R vrši se funkcijom install.packages(), stoga za instalaciju potrebnog paketa koristite naredbu install.packages("telegram.bot").

Detaljnije informacije o instalaciji različitih paketa možete pronaći u ovom videu.

Nakon instalacije paketa, potrebno ga je povezati:

library(telegram.bot)

Slanje poruka iz R u Telegram

Vašeg bota možete pronaći na Telegramu prema korisničkom imenu koje ste odredili prilikom stvaranja, u mom slučaju to je @my_test_bot.

Pošaljite botu bilo koju poruku, na primjer "Pozdrav bode". To nam trenutno treba da bismo dobili ID vašeg čata s botom.

Sada u R-u pišemo sljedeći kod.

library(telegram.bot)

# kreiramo instancu bota
bot <- Bot(token = "123456789:abcdefghijklmnopqrstuvwxyz")

# Tražimo informacije o botu
print(bot$getMe())

# Dobivamo ažuriranja bota, tj. popis poruka koje su mu poslane
updates <- bot$getUpdates()

# Tražimo identifikator čata
# Napomena: prije nego što pretražujete ažuriranja, morate poslati poruku botu
chat_id <- updates[[1L]]$from_chat_id()

Isprva kreiramo instancu našeg bota funkcijom Bot(), kao argument u nju treba prenijeti ranije dobiveni token.

Čuvanje tokena u kodu smatra se lošom praksom, pa ga možete čuvati u varijabli okruženja i čitati ga iz nje. Po defaultu, paket telegram.bot podržava varijable okruženja sljedećeg imena: R_TELEGRAM_BOT_IME_VAŠEG_BOTA. Umjesto IME_VAŠEG_BOTA stavite ime koje ste zadao prilikom kreiranja, u mom slučaju bit će varijabla R_TELEGRAM_BOT_My Test Bot.

Varijablu okruženja možete stvoriti na nekoliko načina, reći ću o najuniverzalnijem i višepolanom. Kreirajte u vašem domaćem direktoriju (možete ga saznati pomoću komande path.expand("~")) tekstualnu datoteku s nazivom .Renviron. To se može učiniti i pomoću komande file.edit(path.expand(file.path("~", ".Renviron"))).

I dodajte u nju sljedeći redak.

R_TELEGRAM_BOT_IME_VAŠEG_BOTA=123456789:abcdefghijklmnopqrstuvwxyz

Nakon toga možete koristiti spremljeni token iz varijable okruženja pomoću funkcije bot_token(), tj. ovako:

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

Metoda getUpdates()nam omogućava da dobijemo ažuriranja bota, tj. poruke koje su mu poslane. Metoda from_chat_id(), omogućava dobivanje identifikatora čata iz kojeg je poruka poslana. Ovaj identifikator potrebujemo za slanje poruka od bota.

Osim ID-a chata iz objekta dobivenog metodom getUpdates() dobivate i neke druge korisne informacije. Na primjer, informacije o korisniku koji je poslao poruku.

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"

Dakle, u ovoj fazi već imamo sve što je potrebno za slanje poruke od bota na Telegram. Iskoristimo metodu sendMessage(), koji mora uključivati identifikator chata, tekst poruke, i tip formatiranja teksta poruke. Tip formatiranja može biti Markdown ili HTML i postavlja se argumentom parse_mode.

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

Osnove formatiranja Markdown-a:

  • Podebljan tekst se ističe sa znakom *:
    • primjer: *podebljan tekst*
    • rezultat: podebljan tekst
  • Kursiv se postavlja donjim crticama:
    • primjer: _kursiv_
    • rezultat: kursiv
  • Monospace font, koji se obično koristi za naglašavanje programskog koda, postavlja se sa apostrofima — `:
    • primjer: `monospace font`
    • rezultat: monospace font

Osnove formatiranja HTML-a:
U HTML-u obavijate deo teksta koji treba istaknuti u oznake, primjer tekst.

  • — otvarajuća oznaka
  • — zatvarajuća oznaka

HTML oznake

  • <b> — podebljan tekst
    • primjer: <b>smanjeni font</b>
    • rezultat smanjeni font
  • — kursiv
    • primjer: kursiv
    • rezultat: kursiv
  • — monospace font
    • primjer: monospace font
    • rezultat: monospace font

Pored teksta, možete slati i drugi sadržaj koristeći specijalne metode:

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

Tj. na primjer, pomoću metode sendPhoto() možete poslati grafikon sačuvan kao sliku, koji ste izradili pomoću paketa ggplot2.

Provjera Windows Task Scheduler-a i slanje obavijesti o zadacima čija je izvedba završena s greškom

Za rad sa Windows Task Scheduler-om morate instalirati paket taskscheduleR, i radi lakšeg upravljanja podacima, instalirajmo paket dplyr.

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

Nakon toga, pomoću funkcije taskscheduler_ls() pitamo za informacije o zadacima iz našeg planer. Pomoću funkcije filter() iz paketa dplyr uklanjamo iz liste zadatke koji su uspešno izvršeni i imaju status poslednjeg rezultata 0, kao i one koji još nikad nisu pokrenuti i imaju status 267011, isključene zadatke, i zadatke koji se trenutno izvršavaju.

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

U objektu task sada imamo listu zadataka čija je izvedba završena greškom, tu listu treba poslati u Telegram.

Ako detaljnije pogledamo svaku komandu, onda:

  • filter() — filtrira listu zadataka prema gore opisanim uslovima
  • select() — ostavlja u tabeli samo jedno polje sa nazivima zadataka
  • unique() — uklanja duplikate naziva
  • unlist() — pretvara odabrani stupac tabele u vektor
  • paste0() — spaja nazive zadataka u jedan string, koristeći kao delimiter znak za prelaz u novi red, tj. n.

Sve što nam preostaje je poslati ovaj rezultat u Telegram.

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

Dakle, trenutno kod bota izgleda ovako:

Kod bota koji provjerava zadatke

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

}

Kada koristite gornji primjer, umetnite token svog bota i svoj identifikator chata u kod.

Možete dodavati uvjete filtriranja zadataka, na primjer provjerom samo onih zadataka koji su stvoreni od vas, isključujući sistemske.

Također možete izdvojiti različite postavke u zasebnu konfiguracijsku datoteku, i čuvati u njoj id chata i token. Konfiguraciju možete čitati, na primjer, pomoću paketa configr.

Primjer ini konfiguracije

[telegram_bot]
;postavke telegram bota i chata u kojem će dolaziti obavijesti
chat_id=12345678
bot_token=123456789:abcdefghijklmnopqrstuvwxyz"

Primjer čitanja varijabli iz konfiguracije u R

library(configr)

# čitanje konfiguracije
config <- read.config('C:/put_do_konfiguracije/config.cfg', rcmd.parse = TRUE)

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

Postavljamo raspored pokretanja provjere zadataka

NajDetaljnije je proces postavljanja skripti za pokretanje prema rasporedu opisan u ovoj članku. Ovdje ću samo opisati korake koje je potrebno poduzeti. Ako neki od koraka nije jasan, obratite se članku na koji sam dao poveznicu.

Pretpostavimo da smo sačuvali kod našeg bota u datoteku check_bot.R. Da biste planirali redovito pokretanje ove datoteke, učinite sljedeće korake:

  1. Dodajte putanju do foldere u kojem je instaliran R u sustavnu varijablu Path, u Windows putanja će biti otprilike ovakva: C:Program FilesRR-4.0.2bin.
  2. Stvorite izvršni bat datoteku koja će sadržavati samo jedan redak R CMD BATCH C:rscriptscheck_botcheck_bot.R. Zamijenite C:rscriptscheck_botcheck_bot.R s punom putanjom do vašeg R datoteke.
  3. Zatim postavite raspored pokretanja pomoću Windows planera zadataka, na primjer svake pola sata.

Zaključak

U ovom članku smo se razumjeli kako stvoriti bota i slati razne obavijesti putem njega u telegram.

Opisao sam zadatak kontrole Windows planera zadataka, ali možete koristiti materijal ovog članka za slanje bilo kakvih obavijesti, od vremenske prognoze do tečajeva dionica na burzi, budući da R omogućuje povezivanje s brojnim izvorima podataka.

U sljedećem članku ćemo razmotriti kako dodati naredbe i tipkovnicu botu, kako bi mogao ne samo slati obavijesti, nego i izvršavati složenije radnje.

Izvor: habr.com

Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere 🔥 Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere | ProHoster