Píšeme telegramového robota v jazyce R (část 1): Vytvořte robota a pomocí něj posílejte zprávy do telegramu

Sledovanost telegramu roste exponenciálně každý den, což je usnadněno pohodlím messengeru, dostupností kanálů, chatů a samozřejmě schopností vytvářet roboty.

Boty lze použít pro širokou škálu účelů, od automatizace komunikace se zákazníky až po správu vašich vlastních úkolů.

Ve skutečnosti můžete prostřednictvím robota používat telegram k provádění jakékoli operace: odesílání nebo vyžádání dat, spouštění úloh na serveru, shromažďování informací v databázi, odesílání e-mailů a tak dále.

Mám v plánu napsat sérii článků o tom, jak pracovat s R v R. telegram bot APIa psát roboty pro vaše potřeby.

Píšeme telegramového robota v jazyce R (část 1): Vytvořte robota a pomocí něj posílejte zprávy do telegramu

V tomto prvním článku zjistíme, jak vytvořit telegramového robota a pomocí něj odesílat oznámení do telegramu.

V důsledku toho budeme mít robota, který bude kontrolovat stav posledního provedení všech úloh v Plánovači úloh systému Windows a v případě selhání vám zašle upozornění.

Ale účelem této série článků není naučit vás napsat bota pro konkrétní, úzký úkol, ale představit vám syntaxi balíčku obecně. telegram.bota příklady kódu, pomocí kterých můžete psát roboty, abyste vyřešili své vlastní problémy.

Obsah

Pokud vás zajímá analýza dat, mohla by vás zajímat moje telegram и Youtube kanály. Většina obsahu je věnována jazyku R.

  1. Vytvoření telegramového robota
  2. Instalace balíčku pro práci s telegramovým robotem na R
  3. Odesílání zpráv z R do telegramu
  4. Konfigurace plánu spouštění kontroly úloh
  5. Závěr

Vytvoření telegramového robota

Nejprve musíme vytvořit robota. To se provádí pomocí speciálního robota Oba Otec, jít do odkaz a napište robotovi /start.

Poté obdržíte zprávu se seznamem příkazů:

Zprá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

Chcete-li vytvořit nového robota, odešlete příkaz /newbot.

BotFather vás požádá o zadání jména a přihlašovacího jména 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 zadat libovolné jméno a přihlášení musí končit bot.

Pokud jste vše udělali správně, obdržíte následující zprá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

Dále budete potřebovat přijatý token API, v mém příkladu to je 123456789:abcdefghijklmnopqrstuvwxyz.

V tomto kroku jsou dokončeny přípravné práce pro vytvoření robota.

Instalace balíčku pro práci s telegramovým robotem na R

Předpokládám, že již máte nainstalovaný jazyk R a vývojové prostředí RStudio. Pokud tomu tak není, můžete se podívat na toto video tutoriál o tom, jak je nainstalovat.

Pro práci s Telegram Bot API použijeme balíček R telegram.bot.

Instalaci balíčků v R provádí funkce install.packages(), takže k instalaci balíčku, který potřebujeme, použijte příkaz install.packages("telegram.bot").

Další informace o instalaci různých balíčků viz tohle video.

Po instalaci balíčku jej musíte připojit:

library(telegram.bot)

Odesílání zpráv z R do telegramu

Bota, který jste vytvořili, najdete v Telegramu pomocí přihlašovacího jména zadaného při vytváření, v mém případě to tak je @my_test_bot.

Pošlete robotovi jakoukoli zprávu, například „Ahoj bote“. V tuto chvíli to potřebujeme, abychom získali ID vašeho chatu s robotem.

Nyní v R napíšeme následující kód.

library(telegram.bot)

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

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

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

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

Nejprve vytvoříme instanci našeho bota s funkcí Bot(), jako argument mu musíte předat dříve přijatý token.

Ukládání tokenu v kódu je považováno za špatný postup, takže jej můžete uložit do proměnné prostředí a číst jej z ní. Standardně v balíčku telegram.bot implementována podpora pro proměnné prostředí s následujícím názvem: R_TELEGRAM_BOT_ИМЯ_ВАШЕГО_БОТА... Namísto ИМЯ_ВАШЕГО_БОТА nahraďte názvem, který jste nastavili při vytváření, v mém případě to bude proměnná R_TELEGRAM_BOT_My Test Bot.

Proměnnou prostředí můžete vytvořit několika způsoby, budu mluvit o nejuniverzálnějším a multiplatformním. Vytvořte ve svém domovském adresáři (najdete jej příkazem path.expand("~")) textový soubor s názvem .Renviron. Můžete to udělat také pomocí příkazu file.edit(path.expand(file.path("~", ".Renviron"))).

A přidejte k tomu následující řádek.

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

S funkcí pak můžete použít token uložený v proměnné prostředí bot_token(), tj. takhle:

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

metoda getUpdates()nám umožňuje získávat aktualizace botů, tzn. zprávy, které mu byly zaslány. Metoda from_chat_id(), umožňuje získat ID chatu, ze kterého byla zpráva odeslána. Tento identifikátor potřebujeme k odesílání zpráv od robota.

Kromě ID chatu z objektu přijatého metodou getUpdates() získáte i další užitečné informace. Například informace o uživateli, který zprávu odeslal.

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 této fázi již máme vše, co je potřeba k odeslání zprávy od robota do telegramu. Použijme metodu sendMessage(), kterému musíte předat ID chatu, text zprávy a typ označení textu zprávy. Typ označení může být Markdown nebo HTML a nastavuje se argumentem parse_mode.

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

Základy formátování Markdown:

  • Tučné písmo je označeno *:
    • příklad: *жирный шритф*
    • výsledek: tučné písmo
  • Kurzíva je uvedena podtržítky:
    • příklad: _курсив_
    • výsledek: kurzíva
  • Písmo s pevnou mezerou, které se obvykle používá ke zvýraznění programového kódu, je určeno pomocí apostrofů - `:
    • příklad: `jednoprostorové písmo`
    • výsledek: моноширинный шрифт

Základy formátování značek HTML:
V HTML zalomíte část textu, kterou chcete zvýraznit, do značek, příklad <тег>текст</тег>.

  • <tag> — úvodní značka
  • - uzavírací značka

HTML značkovací značky

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

Kromě textu můžete odesílat další obsah pomocí speciálních metod:

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

Tito. například pomocí metody sendPhoto() můžete poslat výkres uložený jako obrázek, který jste vytvořili s balíčkem ggplot2.

Kontrola Plánovače úloh systému Windows a odesílání upozornění na úlohy, které se zhroutily

Chcete-li pracovat s Plánovačem úloh systému Windows, musíte balíček nainstalovat taskscheduleRa pro usnadnění práce s daty si balíček nainstalujte dplyr.

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

Dále pomocí funkce taskscheduler_ls() požadujeme informace o úkolech od našeho plánovače. Pomocí funkce filter() z balíčku dplyr odstraníme ze seznamu úloh ty, které byly úspěšně dokončeny a mají stav posledního výsledku 0, a ty, které ještě nebyly nikdy spuštěny a mají stav 267011, zakázané úlohy a úlohy, které právě běží.

# запрашиваем список задач
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 nyní máme seznam úkolů, jejichž práce skončila chybou, musíme tento seznam odeslat do Telegramu.

Pokud zvážíme každý příkaz podrobněji, pak:

  • filter() — filtruje seznam úkolů podle výše popsaných podmínek
  • select() - ponechá v tabulce pouze jedno pole s názvem úkolů
  • unique() - odstraňuje duplicitní jména
  • unlist() - převede vybraný sloupec tabulky do vektoru
  • paste0() - spojí názvy úkolů do jednoho řádku, a jako oddělovač vloží znak nového řádku, tzn. n.

Zbývá nám pouze poslat tento výsledek do telegramu.

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

Takže v tuto chvíli vypadá kód bota takto:

Kód bota, který kontroluje úlohu

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

}

Při použití výše uvedeného příkladu nahraďte kód svým tokenem bota a ID chatu.

Můžete přidat podmínky filtrování úloh, například kontrolovat pouze ty úlohy, které jste vytvořili, s výjimkou systémových.

Můžete také vložit různá nastavení do samostatného konfiguračního souboru a uložit do něj ID chatu a token. Konfiguraci si můžete přečíst například pomocí balíčku configr.

Příklad ini config

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

Příklad čtení proměnných z config 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

Nastavení plánu spouštění kontroly úloh

Proces konfigurace plánovaného spouštění skriptů je zde podrobněji popsán článek. Zde popíšu pouze kroky, které je k tomu nutné dodržet. Pokud vám některý z kroků není jasný, podívejte se na článek, na který jsem uvedl odkaz.

Řekněme, že uložíme kód našeho bota do souboru check_bot.R. Chcete-li naplánovat pravidelné spouštění tohoto souboru, postupujte takto:

  1. Do systémové proměnné Path napište cestu ke složce, ve které je R nainstalován, ve Windows bude cesta vypadat nějak takto: C:Program FilesRR-4.0.2bin.
  2. Vytvořte spustitelný soubor bat pouze s jedním řádkem R CMD BATCH C:rscriptscheck_botcheck_bot.R. Nahradit C:rscriptscheck_botcheck_bot.R na úplnou cestu k vašemu souboru R.
  3. Dále pomocí Plánovače úloh systému Windows nastavte plán spouštění, například každou půlhodinu.

Závěr

V tomto článku jsme přišli na to, jak vytvořit bota a použít jej k odesílání různých upozornění na telegram.

Popsal jsem úkol sledování Plánovače úloh systému Windows, ale materiál v tomto článku můžete použít k odeslání jakéhokoli oznámení, od předpovědi počasí až po kurzy akcií na burze, protože. R umožňuje připojení k obrovskému množství datových zdrojů.

V příštím článku vymyslíme, jak botovi přidat příkazy a klávesnici, aby mohl nejen posílat upozornění, ale také provádět složitější akce.

Zdroj: www.habr.com

Přidat komentář