Písanie telegramového robota v R (časť 1): Vytvorenie robota a jeho použitie na odosielanie správ v telegrame

Publikum telegramu rastie exponenciálne každý deň, čo je uľahčené pohodlím messengeru, prítomnosťou kanálov, chatov a samozrejme schopnosťou vytvárať roboty.

Roboty možno použiť na úplne iné účely, od automatizácie komunikácie so zákazníkmi až po správu vašich vlastných úloh.

V podstate môžete použiť telegram na vykonávanie akýchkoľvek operácií prostredníctvom robota: odosielanie alebo vyžiadanie údajov, spúšťanie úloh na serveri, zhromažďovanie informácií do databázy, odosielanie e-mailov atď.

Plánujem napísať sériu článkov o tom, ako s tým pracovať API telegramového robotaa píšte roboty podľa vašich potrieb.

Písanie telegramového robota v R (časť 1): Vytvorenie robota a jeho použitie na odosielanie správ v telegrame

V tomto prvom článku zistíme, ako vytvoriť telegramového robota a použiť ho na odosielanie upozornení v telegrame.

V dôsledku toho budeme mať robota, ktorý bude kontrolovať stav posledného vykonania všetkých úloh v Plánovači úloh systému Windows a v prípade zlyhania niektorej z nich vám pošle upozornenia.

Účelom tejto série článkov však nie je naučiť vás, ako napísať robota pre konkrétnu, úzku úlohu, ale vo všeobecnosti vám predstaviť syntax balíka telegram.bota príklady kódu, pomocou ktorých môžete písať roboty na riešenie vašich vlastných problémov.

Obsah

Ak máte záujem o analýzu údajov, mohla by vás zaujímať moja telegram и youtube kanálov. Väčšina obsahu je venovaná jazyku R.

  1. Vytvorenie telegramového robota
  2. Inštalácia balíka na prácu s telegramovým robotom v R
  3. Odosielanie správ z R do telegramu
  4. Nastavenie plánu spustenia kontroly úloh
  5. Záver

Vytvorenie telegramového robota

Najprv musíme vytvoriť robota. To sa vykonáva pomocou špeciálneho robota Obaja Otec, ísť do odkaz a napíšte robotovi /start.

Potom dostanete správu so zoznamom príkazov:

Správa 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

Ak chcete vytvoriť nového robota, odošlite príkaz /newbot.

BotFather vás požiada o zadanie mena a prihlásenia robota.

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

Môžete zadať ľubovoľné meno, ale prihlásenie musí končiť na bot.

Ak ste urobili všetko správne, dostanete nasledujúcu správu:

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

Ďalej budete potrebovať prijatý token API, v mojom príklade to je 123456789:abcdefghijklmnopqrstuvwxyz.

V tomto kroku sú dokončené prípravné práce na vytvorenie robota.

Inštalácia balíka na prácu s telegramovým robotom v R

Predpokladám, že už máte nainštalovaný jazyk R a vývojové prostredie RStudio. Ak to tak nie je, môžete sa pozrieť na toto videonávod ako ich nainštalovať.

Na prácu s Telegram Bot API použijeme balík R telegram.bot.

Inštalácia balíkov v R sa vykonáva pomocou funkcie install.packages(), takže na inštaláciu balíka, ktorý potrebujeme, použite príkaz install.packages("telegram.bot").

Viac o inštalácii rôznych balíkov sa môžete dozvedieť z toto video.

Po nainštalovaní balíka ho musíte pripojiť:

library(telegram.bot)

Odosielanie správ z R do telegramu

Robot, ktorý ste vytvorili, nájdete v telegrame pomocou prihlasovacieho mena zadaného pri vytváraní, v mojom prípade je to tak @my_test_bot.

Pošlite robotovi akúkoľvek správu, napríklad „Ahoj robot“. V súčasnosti to potrebujeme, aby sme získali ID vášho rozhovoru s robotom.

Teraz napíšeme nasledujúci kód v R.

library(telegram.bot)

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

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

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

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

Najprv vytvoríme inštanciu nášho robota s funkciou Bot(), predtým prijatý token do nej musí byť odovzdaný ako argument.

Ukladanie tokenu v kóde sa nepovažuje za najlepší postup, takže ho môžete uložiť do premennej prostredia a prečítať si ho z nej. Štandardne v balíku telegram.bot Bola implementovaná podpora pre premenné prostredia s nasledujúcimi názvami: R_TELEGRAM_BOT_ИМЯ_ВАШЕГО_БОТА... Namiesto ИМЯ_ВАШЕГО_БОТА nahraďte meno, ktoré ste zadali pri vytváraní, v mojom prípade to bude premenná R_TELEGRAM_BOT_My Test Bot.

Existuje niekoľko spôsobov, ako vytvoriť premennú prostredia, poviem vám o najuniverzálnejšom a najuniverzálnejšom. Vytvorte vo svojom domovskom adresári (nájdete ho pomocou príkazu path.expand("~")) textový súbor s názvom .Renviron. Môžete to urobiť aj pomocou príkazu file.edit(path.expand(file.path("~", ".Renviron"))).

A pridajte k tomu nasledujúci riadok.

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

Ďalej môžete použiť token uložený v premennej prostredia pomocou funkcie bot_token(), t.j. Páči sa ti to:

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

metóda getUpdates()nám umožňuje získať aktualizácie botov, t.j. správy, ktoré mu boli zaslané. Metóda from_chat_id(), vám umožňuje získať ID chatu, z ktorého bola správa odoslaná. Toto ID potrebujeme na odosielanie správ od robota.

Okrem chat id z objektu získaného metódou getUpdates() získate aj ďalšie užitočné informácie. Napríklad informácie o používateľovi, ktorý správu odoslal.

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"

Takže v tejto fáze už máme všetko, čo potrebujeme na odoslanie správy od robota do telegramu. Použime metódu sendMessage(), do ktorého musíte zadať ID rozhovoru, text správy a typ označenia textu správy. Typ označenia môže byť Markdown alebo HTML a nastavuje sa argumentom parse_mode.

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

Základy formátovania Markdown:

  • Tučné písmo je zvýraznené *:
    • príklad: *жирный шритф*
    • výsledok: tučné písmo
  • Kurzíva je označená podčiarkovníkom:
    • príklad: _курсив_
    • výsledok: kurzíva
  • Jednopriestorové písmo, ktoré sa zvyčajne používa na zvýraznenie programového kódu, sa špecifikuje pomocou apostrofov - `:
    • príklad: `jednopriestorové písmo`
    • výsledok: моноширинный шрифт

Základy formátovania značiek HTML:
V HTML zalomíte časť textu, ktorú je potrebné zvýrazniť, do značiek, napr <тег>текст</тег>.

  • <tag> – otváracia značka
  • - uzatvárací štítok

Značky HTML

  • <b> - tučné písmo
    • príklad: <b>жирный шрифт</b>
    • výsledok tučné písmo
  • <i> - kurzíva
    • príklad: <i>курсив</i>
    • výsledok: kurzíva
  • — моноширинный шрифт
    • príklad: моноширинный шрифт
    • výsledok: моноширинный шрифт

Okrem textu môžete posielať aj ďalší obsah pomocou špeciálnych metód:

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

Tie. napríklad pomocou metódy sendPhoto() môžete odoslať graf, ktorý ste vytvorili pomocou balíka, uložený ako obrázok ggplot2.

Kontrola Plánovača úloh systému Windows a odosielanie upozornení na úlohy, ktoré sa nenormálne skončili

Ak chcete pracovať s Plánovačom úloh systému Windows, musíte si balík nainštalovať taskscheduleRa pre pohodlnú prácu s dátami si balík nainštalujte dplyr.

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

Ďalej pomocou funkcie taskscheduler_ls() požadujeme informácie o úlohách od nášho plánovača. Pomocou funkcie filter() z balíka dplyr Zo zoznamu úloh odstránime tie, ktoré boli úspešne dokončené a majú stav posledného výsledku 0, a tie, ktoré neboli nikdy spustené a majú stav 267011, zakázané úlohy a úlohy, ktoré sú momentálne spustené.

# запрашиваем список задач
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 objekte task Teraz máme zoznam úloh, ktoré zlyhali, musíme tento zoznam odoslať do telegramu.

Ak sa pozrieme na každý príkaz podrobnejšie, potom:

  • filter() — filtruje zoznam úloh podľa vyššie opísaných podmienok
  • select() — v tabuľke ponechá len jedno pole s názvom úloh
  • unique() - odstraňuje duplicitné mená
  • unlist() — prevedie vybratý stĺpec tabuľky na vektor
  • paste0() — spojí názvy úloh do jedného riadku a ako oddeľovač vloží posun riadku, t.j. n.

Zostáva nám už len poslať tento výsledok telegramom.

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

Takže kód bota momentálne vyzerá takto:

Kód robota na kontrolu úlohy

# Подключение пакета
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 použití vyššie uvedeného príkladu do kódu nahraďte svoj token bota a svoje ID chatu.

Môžete pridať podmienky na filtrovanie úloh, napríklad kontrolovať iba tie úlohy, ktoré ste vytvorili, okrem systémových.

Môžete tiež vložiť rôzne nastavenia do samostatného konfiguračného súboru a uložiť doň ID chatu a token. Konfiguráciu si môžete prečítať napríklad pomocou balíka configr.

Príklad ini konfigurácie

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

Príklad čítania premenných z konfigurácie 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

Nastavenie plánu spustenia kontroly úloh

Proces nastavenia spúšťania skriptov podľa plánu je podrobnejšie popísaný v tomto dokumente článok. Tu popíšem iba kroky, ktoré je potrebné na to dodržať. Ak vám niektorý z krokov nie je jasný, pozrite si článok, na ktorý som uviedol odkaz.

Predpokladajme, že sme kód bota uložili do súboru check_bot.R. Ak chcete naplánovať pravidelné spúšťanie tohto súboru, postupujte takto:

  1. Do systémovej premennej Path napíšte cestu k priečinku, v ktorom je nainštalovaný R, v systéme Windows bude cesta vyzerať takto: C:Program FilesRR-4.0.2bin.
  2. Vytvorte spustiteľný bat súbor iba s jedným riadkom R CMD BATCH C:rscriptscheck_botcheck_bot.R. Vymeňte C:rscriptscheck_botcheck_bot.R na úplnú cestu k vášmu súboru R.
  3. Potom pomocou Plánovača úloh systému Windows nastavte plán spúšťania, napríklad každú pol hodinu.

Záver

V tomto článku sme prišli na to, ako vytvoriť robota a použiť ho na odosielanie rôznych upozornení v telegrame.

Opísal som úlohu sledovania Plánovača úloh systému Windows, ale materiál v tomto článku môžete použiť na odosielanie akýchkoľvek upozornení, od predpovede počasia až po kurzy akcií na burze, pretože R vám umožňuje pripojiť sa k obrovskému množstvu zdrojov údajov.

V ďalšom článku prídeme na to, ako do bota pridať príkazy a klávesnicu, aby vedel nielen posielať upozornenia, ale aj vykonávať zložitejšie akcie.

Zdroj: hab.com

Pridať komentár