Pisanje telegram bota u R (1. dio): Stvaranje bota i njegova upotreba za slanje poruka u telegramu

Publika Telegrama eksponencijalno raste svakim danom, što je olakšano pogodnošću glasnika, prisutnošću kanala, chatova i, naravno, mogućnošću stvaranja botova.

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

U osnovi, telegram možete koristiti za obavljanje bilo kakvih operacija putem bota: slanje ili traženje podataka, pokretanje zadataka na poslužitelju, prikupljanje informacija u bazu podataka, slanje e-pošte itd.

Planiram napisati niz članaka o tome kako raditi s API za telegram boti pišite botove koji odgovaraju vašim potrebama.

Pisanje telegram bota u R (1. dio): Stvaranje bota i njegova upotreba za slanje poruka u telegramu

U ovom prvom članku otkrit ćemo kako stvoriti telegram bota i koristiti ga za slanje obavijesti u telegramu.

Kao rezultat, imat ćemo bota koji će provjeravati status zadnjeg izvršenja svih zadataka u Windows Task Scheduleru, te vam slati obavijesti ako neki od njih nije uspio.

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

sadržaj

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

  1. Izrada telegram bota
  2. Instalacija paketa za rad s telegram botom u R
  3. Slanje poruka s R na Telegram
  4. Postavljanje rasporeda za pokretanje skeniranja zadataka
  5. Zaključak

Izrada telegram bota

Prvo moramo napraviti bota. To se radi pomoću posebnog bota BotOtac, ići link i piši botu /start.

Nakon čega ćete dobiti poruku s popisom 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

Za izradu 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 bilo koje ime, ali prijava mora završavati s bot.

Ako ste sve napravili kako treba, dobit ćete sljedeć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 jest 123456789:abcdefghijklmnopqrstuvwxyz.

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

Instalacija paketa za rad s telegram botom u R

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

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

Instaliranje paketa u R vrši se pomoću funkcije install.packages(), tako da instaliramo paket koji nam je potreban, upotrijebimo naredbu install.packages("telegram.bot").

Više o instaliranju različitih paketa možete saznati na ovaj video.

Nakon instaliranja paketa potrebno ga je spojiti:

library(telegram.bot)

Slanje poruka s R na Telegram

Bot koji ste izradili možete pronaći u Telegramu koristeći prijavu navedenu tijekom izrade, u mom slučaju to i jest @my_test_bot.

Pošaljite botu bilo koju poruku, poput "Hej, bot." Ovo nam je trenutno potrebno kako bismo dobili ID vašeg razgovora s botom.

Sada pišemo sljedeći kod u R.

library(telegram.bot)

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

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

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

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

U početku stvaramo instancu našeg bota s funkcijom Bot(), prethodno primljeni token mora biti proslijeđen u njega kao argument.

Ne smatra se najboljom praksom pohranjivanje tokena u kodu, tako da ga možete pohraniti u varijablu okruženja i čitati ga iz nje. Standardno u paketu telegram.bot Implementirana je podrška za varijable okruženja sljedećih naziva: R_TELEGRAM_BOT_ИМЯ_ВАШЕГО_БОТА, Umjesto ИМЯ_ВАШЕГО_БОТА zamijenite ime koje ste naveli prilikom kreiranja, u mom slučaju to će biti varijabla R_TELEGRAM_BOT_My Test Bot.

Postoji nekoliko načina za stvaranje varijable okruženja; reći ću vam o najuniverzalnijem i međuplatformskom. Stvorite u svom matičnom imeniku (možete ga pronaći pomoću naredbe path.expand("~")) tekstualna datoteka s nazivom .Renviron. To možete učiniti i pomoću naredbe file.edit(path.expand(file.path("~", ".Renviron"))).

I dodajte mu sljedeći redak.

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

Zatim možete koristiti token spremljen u varijabli okruženja pomoću funkcije bot_token(), tj. kao ovo:

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

način getUpdates()omogućuje nam dobivanje ažuriranja bota, tj. poruke koje su mu poslane. metoda from_chat_id(), omogućuje vam da dobijete ID chata iz kojeg je poruka poslana. Potreban nam je ovaj ID za slanje poruka s bota.

Osim chat id-a iz objekta dobivenog metodom getUpdates() dobit ć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 nam je potrebno za slanje poruke s bota na Telegram. Iskoristimo metodu sendMessage(), u koji trebate proslijediti ID chata, tekst poruke i vrstu označavanja teksta poruke. Vrsta oznake može biti Markdown ili HTML i postavlja se argumentom parse_mode.

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

Osnove oblikovanja oznake:

  • Podebljani font je označen sa *:
    • primjer: *жирный шритф*
    • proizlaziti: podebljani font
  • Kurziv je označen podvlakom:
    • primjer: _курсив_
    • proizlaziti: kurziv
  • Monospace font, koji se obično koristi za označavanje programskog koda, naveden je pomoću apostrofa - `:
    • primjer: `monospace font`
    • proizlaziti: моноширинный шрифт

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

  • <tag> - otvarajući tag
  • - završna oznaka

HTML markup oznake

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

Osim teksta, možete poslati i druge sadržaje koristeći posebne 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"
)

Oni. primjerice pomoću metode sendPhoto() možete poslati grafikon koji ste izradili pomoću paketa, spremljen kao sliku ggplot2.

Provjera Windows planera zadataka i slanje obavijesti o zadacima koji su prekinuti neuobičajeno

Za rad s Windows Task Scheduler morate instalirati paket taskscheduleR, a za udobnost rada s podacima instalirajte paket dplyr.

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

Zatim, korištenje funkcije taskscheduler_ls() tražimo informacije o zadacima od našeg planera. Korištenje funkcije filter() iz paketa dplyr S liste zadataka brišemo one koji su uspješno završeni i imaju status zadnjeg rezultata 0, te one koji nikada nisu pokrenuti i imaju status 267011, onesposobljene zadatke i zadatke koji se trenutno izvode.

# запрашиваем список задач
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 popis zadataka koji nisu uspjeli, moramo ga poslati Telegramu.

Ako pogledamo svaku naredbu detaljnije, onda:

  • filter() — filtrira popis zadataka prema gore opisanim uvjetima
  • select() — ostavlja samo jedno polje u tablici s nazivom zadataka
  • unique() - uklanja duple nazive
  • unlist() — pretvara odabrani stupac tablice u vektor
  • paste0() — povezuje nazive zadataka u jedan red, a kao razdjelnik stavlja prelazak na red, tj. n.

Ostaje nam samo da ovaj rezultat pošaljemo telegramom.

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

Dakle, kod bota u ovom trenutku izgleda ovako:

Kod bota za pregled zadatka

# Подключение пакета
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 chata u kod.

Možete dodati uvjete za filtriranje zadataka, na primjer, provjera samo onih zadataka koje ste izradili, isključujući sistemske.

Također možete staviti različite postavke u zasebnu konfiguracijsku datoteku i u nju pohraniti ID chata i token. Možete pročitati konfiguraciju, na primjer, pomoću paketa configr.

Primjer ini config

[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 za pokretanje skeniranja zadataka

Postupak postavljanja pokretanja skripti po rasporedu detaljnije je opisan u ovome članak. Ovdje ću samo opisati korake koje je potrebno slijediti za to. Ako vam neki od koraka nije jasan, pogledajte članak na koji sam dao poveznicu.

Pretpostavimo da smo naš kod bota spremili u datoteku check_bot.R. Da biste zakazali redovito pokretanje ove datoteke, slijedite ove korake:

  1. U sistemsku varijablu Path upišite put do mape u kojoj je instaliran R; u Windowsima će put biti otprilike ovaj: C:Program FilesRR-4.0.2bin.
  2. Napravite izvršnu bat datoteku sa samo jednim retkom R CMD BATCH C:rscriptscheck_botcheck_bot.R. Zamijeniti C:rscriptscheck_botcheck_bot.R do pune staze do vaše R datoteke.
  3. Zatim upotrijebite Windows Task Scheduler za postavljanje rasporeda pokretanja, na primjer, svakih pola sata.

Zaključak

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

Opisao sam zadatak nadziranja Windows Task Schedulera, ali materijal u ovom članku možete koristiti za slanje bilo kakvih obavijesti, od vremenske prognoze do kotacija dionica na burzi, jer R vam omogućuje povezivanje s velikim brojem izvora podataka.

U sljedećem ćemo članku otkriti kako dodati naredbe i tipkovnicu botu tako da ne samo da može slati obavijesti, već i izvoditi složenije radnje.

Izvor: www.habr.com

Dodajte komentar