Pišemo telegram bota na jeziku R (1. dio): Kreirajte bota i pomoću njega šaljite poruke telegramu

Publika telegrama svakim danom eksponencijalno raste, čemu doprinosi praktičnost messengera, dostupnost kanala, chatova i naravno mogućnost kreiranja botova.

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

U stvari, putem bota možete koristiti telegram za obavljanje bilo koje operacije: slanje ili traženje podataka, pokretanje zadataka na serveru, prikupljanje informacija u bazi podataka, slanje e-pošte itd.

Planiram napisati seriju članaka o tome kako raditi s R u R. telegram bot API, i pisati botove za svoje potrebe.

Pišemo telegram bota na jeziku R (1. dio): Kreirajte bota i pomoću njega šaljite poruke telegramu

U ovom prvom članku ćemo shvatiti kako kreirati telegram bot i slati obavijesti telegramu pomoću njega.

Kao rezultat toga, imaćemo bota koji će provjeriti status posljednjeg izvršenja svih zadataka u Windows Task Scheduleru i poslati vam obavještenja ako neki ne uspije.

Ali svrha ove serije članaka nije da vas nauči kako da napišete bota za određeni, uski zadatak, već da vas upozna sa sintaksom paketa općenito. telegram.bot, i primjere koda pomoću kojih možete pisati botove za rješavanje vlastitih problema.

Sadržaj

Ako ste zainteresovani za analizu podataka, možda će vas zanimati moja telegram и youtube kanala. Većina sadržaja je posvećena R jeziku.

  1. Kreiranje telegram bota
  2. Instaliranje paketa za rad sa telegram botom na R
  3. Slanje poruka sa R ​​na Telegram
  4. Konfiguriranje rasporeda pokretanja skeniranja zadataka
  5. zaključak

Kreiranje telegram bota

Prvo treba da kreiramo bota. To se radi pomoću posebnog bota BotFather, idi link i pišite botu /start.

Tada ćete dobiti poruku sa listom naredbi:

Poruka od BotFathera

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

Da kreirate novog bota, pošaljite naredbu /newbot.

BotFather će od vas tražiti da unesete ime i prijavu bota.

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

Možete unijeti proizvoljno ime, a prijava mora završiti sa bot.

Ako ste sve uradili ispravno, dobićete sledeću poruku:

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

Zatim će vam trebati primljeni API token, u mom primjeru jeste 123456789:abcdefghijklmnopqrstuvwxyz.

U ovom koraku pripremni rad za kreiranje bota je završen.

Instaliranje paketa za rad sa telegram botom na R

Pretpostavljam da već imate instaliran R jezik i razvojno okruženje RStudio. Ako to nije slučaj, onda možete pogledati ovo video tutorial o tome kako ih instalirati.

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

Instaliranje paketa u R vrši se funkcijom install.packages(), tako da za instaliranje paketa koji nam treba, koristite naredbu install.packages("telegram.bot").

Za više informacija o instaliranju različitih paketa, pogledajte ovaj video.

Nakon instaliranja paketa, potrebno ga je povezati:

library(telegram.bot)

Slanje poruka sa R ​​na Telegram

Bot koji ste kreirali može se pronaći u Telegramu koristeći login koji je naveden prilikom kreiranja, u mom slučaju jeste @my_test_bot.

Pošaljite bilo koju poruku botu, kao što je "Zdravo, bot". Trenutno nam je ovo potrebno da bismo dobili ID vašeg ćaskanja sa botom.

Sada u R pišemo sljedeći kod.

library(telegram.bot)

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

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

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

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

U početku kreiramo instancu našeg bota sa funkcijom Bot(), kao argument, morate mu proslijediti prethodno primljeni token.

Čuvanje tokena u kodu smatra se lošom praksom, tako da ga možete pohraniti u varijablu okruženja i čitati iz nje. Standardno u paketu telegram.bot implementirana podrška za varijable okruženja sljedećeg imena: R_TELEGRAM_BOT_ИМЯ_ВАШЕГО_БОТА... Umjesto toga ИМЯ_ВАШЕГО_БОТА zamijenite ime koje ste postavili prilikom kreiranja, u mom slučaju će to biti varijabla R_TELEGRAM_BOT_My Test Bot.

Varijablu okruženja možete kreirati na nekoliko načina, govorit ću o najuniverzalnijem i višeplatformskom. Kreirajte u svom početnom direktoriju (možete ga pronaći pomoću naredbe path.expand("~")) tekstualni fajl sa imenom .Renviron. To možete učiniti i pomoću naredbe file.edit(path.expand(file.path("~", ".Renviron"))).

I dodajte mu sljedeći red.

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

Zatim možete koristiti token pohranjen u varijablu okruženja s funkcijom bot_token(), tj. Volim ovo:

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

Metoda getUpdates()nam omogućava da dobijamo ažuriranja bota, tj. poruke koje su mu poslate. Metoda from_chat_id(), omogućava vam da dobijete ID chata sa kojeg je poruka poslana. Ovaj identifikator nam je potreban za slanje poruka od bota.

Pored ID-a ćaskanja od objekta primljenog metodom getUpdates() dobićete 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 do telegrama. Koristimo metodu sendMessage(), na koji trebate proslijediti ID ćaskanja, tekst poruke i tip oznake teksta poruke. Tip markupa može biti Markdown ili HTML i postavljen je argumentom parse_mode.

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

Osnove formatiranja Markdown:

  • Podebljani font je označen sa *:
    • primer: *жирный шритф*
    • rezultat: bold script
  • Kurziv je dat podvlakama:
    • primer: _курсив_
    • rezultat: kurziv
  • Font fiksnog razmaka, koji se obično koristi za isticanje programskog koda, naveden je pomoću apostrofa - `:
    • primjer: `monospace font`
    • rezultat: моноширинный шрифт

Osnove oblikovanja HTML oznaka:
U HTML-u dio teksta koji želite istaknuti umotavate u oznake, na primjer <тег>текст</тег>.

  • <tag> — početna oznaka
  • - završnu oznaku

HTML oznake za označavanje

  • <b> - podebljani font
    • primer: <b>жирный шрифт</b>
    • efekat bold font
  • <i> - kurziv
    • primer: <i>курсив</i>
    • rezultat: kurziv
  • — моноширинный шрифт
    • primjer: моноширинный шрифт
    • rezultat: моноширинный шрифт

Osim teksta, možete slati i drugi sadržaj posebnim metodama:

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

One. na primjer korištenjem metode sendPhoto() možete poslati plan sačuvan kao sliku koju ste napravili sa paketom ggplot2.

Provjera Windows Task Scheduler i slanje obavijesti o zadacima koji su pali

Da biste radili sa Windows Task Schedulerom, morate instalirati paket taskscheduleR, a radi praktičnosti rada sa podacima, instalirajte paket dplyr.

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

Zatim, koristeći funkciju taskscheduler_ls() tražimo informacije o zadacima od našeg planera. Korištenje funkcije filter() iz paketa dplyr uklanjamo sa liste zadataka one koji su uspješno završeni i imaju status posljednjeg rezultata 0, i one koji još nikada nisu pokrenuti i imaju status 267011, onemogućene zadatke i zadatke koji su trenutno pokrenuti.

# запрашиваем список задач
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 čiji je rad završio sa greškom, ovu listu treba da pošaljemo u Telegram.

Ako svaku naredbu razmotrimo detaljnije, onda:

  • filter() — filtrira listu zadataka prema gore opisanim uslovima
  • select() - ostavlja samo jedno polje sa nazivom zadataka u tabeli
  • unique() - uklanja duple nazive
  • unlist() - prevodi odabranu kolonu tabele u vektor
  • paste0() - povezuje nazive zadataka u jedan red, a kao separator stavlja znak za novi red, tj. n.

Sve što nam preostaje je da ovaj rezultat pošaljemo u telegram.

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

Dakle, u ovom trenutku kod bota izgleda ovako:

Bot kod koji provjerava zadatak

# Подключение пакета
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, zamijenite svoj bot token i svoj ID za ćaskanje u kodu.

Možete dodati uvjete filtriranja zadataka, na primjer, provjeravajući samo one zadatke koje ste kreirali, isključujući sistemske.

Također možete staviti različite postavke u zasebnu konfiguracijsku datoteku i pohraniti ID za ćaskanje i token u njega. Možete pročitati konfiguraciju, na primjer, koristeći paket configr.

Primjer ini konfiguracije

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

Primjer čitanja varijabli iz konfiguracije u 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

Postavljanje rasporeda pokretanja skeniranja zadataka

Proces konfiguracije planiranog pokretanja skripte je detaljnije opisan u ovome članak. Ovdje ću samo opisati korake koji se moraju slijediti za ovo. Ako vam bilo koji od koraka nije jasan, pogledajte članak na koji sam dao link.

Recimo da sačuvamo naš bot kod u datoteku check_bot.R. Za planiranje redovnog pokretanja ove datoteke slijedite ove korake:

  1. Napišite putanju do fascikle u kojoj je R instaliran u sistemsku varijablu Putanja, na Windowsu će put biti otprilike ovako: C:Program FilesRR-4.0.2bin.
  2. Kreirajte izvršnu bat datoteku sa samo jednom linijom R CMD BATCH C:rscriptscheck_botcheck_bot.R. Zamijenite C:rscriptscheck_botcheck_bot.R na punu putanju do vaše R datoteke.
  3. Zatim koristite Windows Task Scheduler da postavite raspored pokretanja, na primjer, svakih pola sata.

zaključak

U ovom članku smo shvatili kako kreirati bota i koristiti ga za slanje raznih obavijesti telegramu.

Opisao sam zadatak praćenja Windows Task Scheduler-a, ali materijal iz ovog članka možete koristiti za slanje bilo kakvog obavještenja, od vremenske prognoze do kotacija dionica na berzi, jer. R vam omogućava povezivanje s velikim brojem izvora podataka.

U sljedećem članku ćemo shvatiti kako dodati komande i tipkovnicu botu kako bi mogao ne samo slati obavijesti, već i obavljati složenije radnje.

izvor: www.habr.com

Dodajte komentar