Pisanje bota za telegram v R (1. del): Ustvarjanje bota in njegova uporaba za pošiljanje sporočil v telegramu

Občinstvo Telegrama vsak dan eksponentno narašča, to olajšujejo priročnost messengerja, prisotnost kanalov, klepetov in seveda možnost ustvarjanja botov.

Bote lahko uporabljate za povsem različne namene, od avtomatizacije komunikacije z vašimi strankami do upravljanja lastnih nalog.

V bistvu lahko s telegramom izvajate poljubne operacije prek bota: pošiljate ali zahtevate podatke, izvajate naloge na strežniku, zbirate informacije v bazo podatkov, pošiljate e-pošto in tako naprej.

Načrtujem, da bom napisal vrsto člankov o tem, kako delati z API za telegram bot, in pišite bote, ki ustrezajo vašim potrebam.

Pisanje bota za telegram v R (1. del): Ustvarjanje bota in njegova uporaba za pošiljanje sporočil v telegramu

V tem prvem članku bomo ugotovili, kako ustvariti bota za telegram in ga uporabiti za pošiljanje obvestil v telegramu.

Posledično bomo imeli bota, ki bo preveril stanje zadnje izvedbe vseh nalog v Windows Task Schedulerju in vam poslal obvestilo, če katera od njih ni uspela.

Toda namen te serije člankov ni naučiti vas, kako napisati bota za določeno, ozko nalogo, temveč vas na splošno seznaniti s sintakso paketa telegram.botin primere kod, s katerimi lahko pišete robote za reševanje lastnih težav.

Vsebina

Če vas zanima analiza podatkov, vas bo morda zanimal moj telegram и youtube kanalov. Večina vsebine je posvečena jeziku R.

  1. Ustvarjanje telegram bota
  2. Namestitev paketa za delo s telegram botom v R
  3. Pošiljanje sporočil iz R v Telegram
  4. Nastavitev urnika za izvajanje pregledov opravil
  5. Zaključek

Ustvarjanje telegram bota

Najprej moramo ustvariti bota. To se naredi s pomočjo posebnega bota BotOče, Pojdi do povezava in piši botu /start.

Po tem boste prejeli sporočilo s seznamom ukazov:

Sporočilo BotFatherja

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

Če želite ustvariti novega bota, pošljite ukaz /newbot.

BotFather vas bo prosil, da vnesete ime in prijavo 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

Vnesete lahko poljubno ime, vendar se mora prijava končati z bot.

Če ste vse naredili pravilno, boste prejeli naslednje sporočilo:

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

Nato boste potrebovali prejeti žeton API, v mojem primeru je 123456789:abcdefghijklmnopqrstuvwxyz.

Na tem koraku je pripravljalno delo za ustvarjanje bota končano.

Namestitev paketa za delo s telegram botom v R

Predvidevam, da že imate nameščen jezik R in razvojno okolje RStudio. Če temu ni tako, si lahko ogledate to video lekcijo kako jih namestiti.

Za delo z API-jem Telegram Bot bomo uporabili paket R telegram.bot.

Namestitev paketov v R poteka s funkcijo install.packages(), zato za namestitev paketa, ki ga potrebujemo, uporabite ukaz install.packages("telegram.bot").

Več o namestitvi različnih paketov lahko izveste iz ta video.

Po namestitvi paketa ga morate povezati:

library(telegram.bot)

Pošiljanje sporočil iz R v Telegram

Bota, ki ste ga ustvarili, je mogoče najti v Telegramu s prijavo, določeno med ustvarjanjem, v mojem primeru je @my_test_bot.

Pošljite botu poljubno sporočilo, na primer "Hej, bot." Trenutno to potrebujemo, da dobimo ID vašega klepeta z botom.

Zdaj v R napišemo naslednjo kodo.

library(telegram.bot)

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

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

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

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

Na začetku ustvarimo primerek našega bota s funkcijo Bot(), je treba predhodno prejeti žeton posredovati vanj kot argument.

Shranjevanje žetona v kodo ni najboljša praksa, zato ga lahko shranite v spremenljivko okolja in ga preberete iz nje. Privzeto v paketu telegram.bot Izvedena je bila podpora za spremenljivke okolja z naslednjimi imeni: R_TELEGRAM_BOT_ИМЯ_ВАШЕГО_БОТА. Namesto ИМЯ_ВАШЕГО_БОТА nadomestite ime, ki ste ga določili pri ustvarjanju, v mojem primeru bo to spremenljivka R_TELEGRAM_BOT_My Test Bot.

Obstaja več načinov za ustvarjanje spremenljivke okolja; povedal vam bom o najbolj univerzalnem in medplatformskem. Ustvarite v domačem imeniku (najdete ga z ukazom path.expand("~")) besedilna datoteka z imenom .Renviron. To lahko storite tudi z ukazom file.edit(path.expand(file.path("~", ".Renviron"))).

In ji dodajte naslednjo vrstico.

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

Nato lahko s funkcijo uporabite žeton, shranjen v spremenljivki okolja bot_token(), tj. Všečkaj to:

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

Metoda getUpdates()nam omogoča pridobivanje posodobitev botov, tj. sporočila, ki so mu bila poslana. Metoda from_chat_id(), vam omogoča, da dobite ID klepeta, iz katerega je bilo sporočilo poslano. Ta ID potrebujemo za pošiljanje sporočil iz bota.

Poleg ID-ja klepeta iz predmeta, pridobljenega z metodo getUpdates() prejmete tudi druge koristne informacije. Na primer informacije o uporabniku, ki je poslal sporočilo.

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"

Torej, na tej stopnji že imamo vse, kar potrebujemo za pošiljanje sporočila iz bota v Telegram. Uporabimo metodo sendMessage(), v katerega morate posredovati ID klepeta, besedilo sporočila in vrsto oznake besedila sporočila. Vrsta oznake je lahko Markdown ali HTML in je nastavljena z argumentom parse_mode.

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

Osnove oblikovanja oznake:

  • Krepka pisava je označena z *:
    • primer: *жирный шритф*
    • rezultat: krepko pisavo
  • Poševni tisk je označen s podčrtajem:
    • primer: _курсив_
    • rezultat: ležeče
  • Enoprostorna pisava, ki se običajno uporablja za označevanje programske kode, je navedena z apostrofi - `:
    • primer: `monospace font`
    • rezultat: моноширинный шрифт

Osnove oblikovanja oznak HTML:
V HTML del besedila, ki ga je treba označiti, zavijete v oznake, na primer <тег>текст</тег>.

  • <tag> - začetna oznaka
  • - zaključna oznaka

Označevalne oznake HTML

  • <b> - krepka pisava
    • primer: <b>жирный шрифт</b>
    • Rezultat krepko pisavo
  • <i> - poševno
    • primer: <i>курсив</i>
    • rezultat: ležeče
  • — моноширинный шрифт
    • primer: моноширинный шрифт
    • rezultat: моноширинный шрифт

Poleg besedila lahko pošiljate tudi drugo vsebino s posebnimi metodami:

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

Tisti. na primer z uporabo metode sendPhoto() lahko pošljete graf, shranjen kot sliko, ki ste jo ustvarili s paketom ggplot2.

Preverjanje razporejevalnika opravil Windows in pošiljanje obvestil o opravilih, ki so se nenormalno končala

Za delo z Windows Task Scheduler morate namestiti paket taskscheduleR, in za udobje dela s podatki namestite paket dplyr.

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

Nato uporabite funkcijo taskscheduler_ls() informacije o opravilih zahtevamo od našega urnika. Uporaba funkcije filter() iz paketa dplyr Iz seznama nalog odstranimo tiste, ki so bile uspešno zaključene in imajo status zadnjega rezultata 0, ter tiste, ki niso bile nikoli zažene in imajo status 267011, onemogočene naloge in naloge, ki se trenutno izvajajo.

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

V objektu task Zdaj imamo seznam nalog, ki niso uspele, ta seznam moramo poslati Telegramu.

Če pogledamo vsak ukaz podrobneje, potem:

  • filter() — filtrira seznam opravil glede na zgoraj opisane pogoje
  • select() — pusti samo eno polje v tabeli z imenom nalog
  • unique() - odstrani podvojena imena
  • unlist() — pretvori izbrani stolpec tabele v vektor
  • paste0() — poveže imena opravil v eno vrstico, za ločilo pa postavi premik vrstice, tj. n.

Vse kar nam preostane je, da pošljemo ta rezultat preko telegrama.

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

Torej, trenutno koda bota izgleda takole:

Koda bota za pregled nalog

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

}

Pri uporabi zgornjega primera v kodo zamenjajte žeton bota in ID klepeta.

Dodate lahko pogoje za filtriranje opravil, na primer preverjanje samo tistih opravil, ki ste jih ustvarili, brez sistemskih.

Različne nastavitve lahko shranite tudi v ločeno konfiguracijsko datoteko ter vanjo shranite ID klepeta in žeton. Konfiguracijo lahko na primer preberete s paketom configr.

Primer ini config

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

Primer branja spremenljivk iz konfiguracije v 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

Nastavitev urnika za izvajanje pregledov opravil

Postopek nastavitve zagona skriptov po urniku je podrobneje opisan v tem članek. Tukaj bom opisal le korake, ki jih je treba upoštevati pri tem. Če vam kateri od korakov ni jasen, si oglejte članek, do katerega sem dal povezavo.

Predpostavimo, da smo našo kodo bota shranili v datoteko check_bot.R. Če želite načrtovati redno izvajanje te datoteke, sledite tem korakom:

  1. V sistemsko spremenljivko Path zapišite pot do mape, v kateri je nameščen R; v sistemu Windows bo pot približno takšna: C:Program FilesRR-4.0.2bin.
  2. Ustvarite izvršljivo datoteko bat s samo eno vrstico R CMD BATCH C:rscriptscheck_botcheck_bot.R. Zamenjati C:rscriptscheck_botcheck_bot.R na celotno pot do vaše datoteke R.
  3. Nato uporabite Windows Task Scheduler, da nastavite urnik zagona, na primer vsake pol ure.

Zaključek

V tem članku smo ugotovili, kako ustvariti bota in ga uporabiti za pošiljanje različnih obvestil v telegramu.

Opisal sem nalogo spremljanja Windows Task Schedulerja, lahko pa gradivo v tem članku uporabite za pošiljanje kakršnihkoli obvestil, od vremenske napovedi do borznih kotacij, saj R vam omogoča povezavo z ogromnim številom virov podatkov.

V naslednjem članku bomo ugotovili, kako botu dodati ukaze in tipkovnico, da bo lahko ne samo pošiljal obvestila, ampak tudi izvajal bolj zapletena dejanja.

Vir: www.habr.com

Dodaj komentar