Píšeme telegram bota v jazyce R (část 1): Vytváříme bota a posíláme pomocí něj zprávy do telegramu

Publikum Telegram roste každý den geometrickou řadou, což usnadňuje pohodlí messengeru, přítomnost kanálů, chatů a samozřejmě možnost vytvářet boty.

Boti mohou být používáni k nejrůznějším účelům, od automatizace komunikace s vašimi klienty až po správu vlastních úkolů.

V podstatě lze prostřednictvím bota pomocí Telegramu provádět jakékoli operace: odesílat nebo dotazovat se na data, spouštět úkoly na serveru, shromažďovat informace do databáze, posílat e-maily a tak dále.

Plánuji napsat sérii článků o tom, jak pracovat s Telegram bot API, a vytvářet boty podle svých potřeb.

Píšeme telegram bota v jazyce R (část 1): Vytváříme bota a posíláme pomocí něj zprávy do telegramu

V tomto prvním článku si ukážeme, jak vytvořit Telegram bota a posílat pomocí něj oznámení na Telegram.

Výsledkem bude bot, který zkontroluje stav posledního vykonání všech úkolů v plánovači úloh Windows a pošle vám oznámení, pokud nějaké selhaly.

Ale cílem této série článků není naučit vás psát bota pro konkrétní úzký úkol, ale celkově vás seznámit se syntaxí balíčku telegram.bot, a příklady kódu, pomocí kterých si budete moci psát boty pro řešení vlastních úkolů.

Obsah

Pokud se zajímáte o analýzu dat, možná vás zaujmou mé telegram a youtube kanály. Většina obsahu je věnována jazyku R.

  1. Vytvoření Telegram bota
  2. Instalace balíčku pro práci s Telegram botem na R
  3. Odesílání zpráv z R do Telegramu
  4. Nastavení rozvrhu spuštění kontroly úkolů
  5. Závěr

Vytvoření Telegram bota

Nejprve musíme vytvořit bota. To se provádí pomocí speciálního bota BotFather, přecházíme na odkazu a napíšeme botovi /start.

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

Zpráva od BotFather

Mohu vám pomoci vytvořit a spravovat Telegram boty. Pokud jste noví ve Bot API, prosím, podívejte se na manuál (https://core.telegram.org/bots).

Můžete mě ovládat pomocí těchto příkazů:

/newbot - vytvořit nového bota
/mybots - upravit své boty [beta]

Upravit boty
/setname - změnit název bota
/setdescription - změnit popis bota
/setabouttext - změnit informace o botovi
/setuserpic - změnit profilovou fotografii bota
/setcommands - změnit seznam příkazů
/deletebot - smazat bota

Nastavení bota
/token - vygenerovat autorizační token
/revoke - odvolat token pro přístup bota
/setinline - přepnout inline režim (https://core.telegram.org/bots/inline)
/setinlinegeo - přepnout lokace inline požadavků (https://core.telegram.org/bots/inline#location-based-results)
/setinlinefeedback - změnit nastavení inline zpětné vazby (https://core.telegram.org/bots/inline#collecting-feedback)
/setjoingroups - může být váš bot přidán do skupin?
/setprivacy - přepnout režim ochrany soukromí (https://core.telegram.org/bots#privacy-mode) ve skupinách

Hry
/mygames - upravit své hry (https://core.telegram.org/bots/games) [beta]
/newgame - vytvořit novou hru (https://core.telegram.org/bots/games)
/listgames - získat seznam svých her
/editgame - upravit hru
/deletegame - smazat existující hru

Pro vytvoření nového bota odešlete příkaz /newbot.

BotFather vás požádá, abyste zadali jméno a uživatelské jméno bota.

BotFather, [25.07.20 09:39]
Dobře, nový bot. Jak ho budeme nazývat? Prosím, vyberte jméno pro svého bota.

Alexey Seleznev, [25.07.20 09:40]
Můj Test Bot

BotFather, [25.07.20 09:40]
Dobře. Teď vybereme uživatelské jméno pro vašeho bota. Musí končit na `bot`. Třeba TetrisBot nebo tetris_bot.

Alexey Seleznev, [25.07.20 09:40]
@my_test_bot

Jméno můžete zadat libovolně, ale uživatelské jméno musí končit na bot.

Pokud jste všechno udělali správně, obdržíte následující zprávu:

Hotovo! Gratuluji k vašemu novému botu. Najdete ho na t.me/my_test_bot. Nyní můžete přidat popis, sekci o bota a profilový obrázek, viz /help pro seznam příkazů. Mimochodem, když skončíte s vytvářením svého skvělého bota, kontaktujte naši podporu bota, pokud chcete lepší uživatelské jméno. Ujistěte se, že je bot plně funkční, než to uděláte.

Použijte tento token pro přístup k HTTP API:
123456789:abcdefghijklmnopqrstuvwxyz

O popisu Bot API si můžete přečíst na této stránce: https://core.telegram.org/bots/api

Dále budete potřebovat získaný API token, v mém případě je to 123456789:abcdefghijklmnopqrstuvwxyz.

Na tomto kroku jsou přípravné práce na vytvoření bota dokončeny.

Instalace balíčku pro práci s Telegram botem na R

Předpokládám, že máte již nainstalovaný jazyk R a vývojové prostředí RStudio. Pokud ne, můžete se podívat na tento video návod o tom, jak je nainstalovat.

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

Instalace balíčků v R se provádí pomocí funkce install.packages(), proto pro instalaci potřebného balíčku použijte příkaz install.packages("telegram.bot").

Podrobněji se o instalaci různých balíčků můžete dozvědět z tohoto videa.

Po instalaci balíčku je třeba ho připojit:

library(telegram.bot)

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

Vašeho vytvořeného bota můžete najít v Telegramu podle uživatelského jména, které jste při jeho vytvoření zadali, v mém případě je to @my_test_bot.

Pošlete botovi jakoukoli zprávu, například "Ahoj bože". V tuto chvíli to potřebujeme, abychom získali ID vašeho chatu s botem.

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

library(telegram.bot)

# vytváříme instanci bota
bot <- Bot(token = "123456789:abcdefghijklmnopqrstuvwxyz")

# Žádáme o informace o botovi
print(bot$getMe())

# Získáme aktualizace bota, tedy seznam zpráv, které byly zaslány
updates <- bot$getUpdates()

# Žádáme o identifikátor chatu
# Poznámka: Před žádostí o aktualizace musíte botovi poslat zprávu
chat_id <- updates[[1L]]$from_chat_id()

Nejdříve vytváříme instanci našeho bota funkcí Bot(), jako argument je potřeba předat dříve získaný token.

Uchovávat token v kódu se považuje za špatnou praxi, proto jej můžete uchovávat v proměnné prostředí a číst jej z ní. Ve výchozím nastavení má balíček telegram.bot implementována podpora proměnných prostředí následujícího názvu: R_TELEGRAM_BOT_JMÉNO_VAŠEHO_BOTA. Místo JMÉNO_VAŠEHO_BOTA dosadíte jméno, které jste zadali při vytváření, v mém případě bude proměnná R_TELEGRAM_BOT_Můj Test Bot.

Vytvořit proměnnou prostředí lze několika způsoby, já vám povím o nejuniverzálnějším a multiplatformním. Vytvořte ve vaší domácí složce (její umístění zjistíte pomocí příkazu path.expand("~")) textový soubor s názvem .Renviron. To lze také provést pomocí příkazu file.edit(path.expand(file.path("~", ".Renviron"))).

A přidejte do něj následující řádek.

R_TELEGRAM_BOT_JMÉNO_VAŠEHO_BOTA=123456789:abcdefghijklmnopqrstuvwxyz

Dále můžete použít token uložený v proměnné prostředí pomocí funkce bot_token(), tzn. takto:

bot <- Bot(token = bot_token("Můj Test Bot"))

Metoda getUpdates()nám umožňuje získat aktualizace bota, tedy zprávy, které mu byly zaslány. Metoda from_chat_id(), umožňuje získat identifikátor chatu, ze kterého byla zpráva odeslána. Tento identifikátor potřebujeme k odeslání zpráv od bota.

Kromě ID chatu z objektu získaného metodou getUpdates() získáte také 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] "Alexej"

$last_name
[1] "Selezněv"

$username
[1] "AlexejSelezněv"

$language_code
[1] "ru"

Takže v této fázi už máme vše potřebné pro odeslání zprávy od bota na Telegram. Využijeme metod sendMessage(), který je třeba předat identifikátor chatu, text zprávy a typ formátování textu zprávy. Typ formátování může být Markdown nebo HTML a je nastaven argumentem parse_mode.

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

Základy formátování Markdown:

  • Tučný text se zvýrazňuje pomocí znaku *:
    • příklad: *tučný text*
    • výsledek: tučný text
  • Kurzíva se nastavuje dolním podtržením:
    • příklad: _kurzíva_
    • výsledek: kurzíva
  • Jednotný font, který se obvykle používá pro zvýraznění kódu, se nastavuje pomocí apostrofů - `:
    • příklad: `jednotný font`
    • výsledek: jednotný font

Základy formátování HTML:
V HTML obklopíte část textu, kterou chcete zvýraznit, tagy, příklad text.

  • - otevírací tag
  • - uzavírací tag

Tagy HTML formátování

  • <b> — tučný text
    • příklad: <b>tučný písmo</b>
    • výsledek tučný písmo
  • — kurzíva
    • příklad: kurzíva
    • výsledek: kurzíva
  • - jednotný font
    • příklad: jednotný font
    • výsledek: jednotný font

Kromě textu můžete posílat i 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"
)

T.j. například pomocí metody sendPhoto() můžete poslat graf, který jste uložili jako obrázek, vytvořený pomocí balíčku ggplot2.

Kontrola plánovače úloh Windows a zasílání upozornění na úlohy, jejichž provádění skončilo chybou

Pro práci s plánovačem úloh Windows musíte nainstalovat balíček taskscheduleR, a pro pohodlnější práci s daty nainstalujeme balíček dplyr.

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

Dále pomocí funkce taskscheduler_ls() dotazujeme informace o úlohách z našeho plánovače. Pomocí funkce filter() z balíčku dplyr odstraňujeme ze seznamu úloh ty, které byly úspěšně provedeny a mají stav posledního výsledku 0, a ty, které ještě nebyly spuštěny a mají stav 267011, vypnuté úlohy a úlohy, které se v současnosti provádějí.

# запрашиваем список задач
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 máme nyní seznam úloh, jejichž provádění skončilo chybou, tento seznam musíme poslat do Telegramu.

Pokud se na každou příkaz podíváme podrobněji, tak:

  • filter() — filtruji seznam úloh podle výše uvedených podmínek
  • select() — ponechává v tabulce pouze jedno pole s názvem úloh
  • unique() — odstraňuje duplicity názvů
  • unlist() — převádí vybraný sloupec tabulky na vektor
  • paste0() — spojuje názvy úloh do jednoho řetězce a používá jako oddělovač znak nového řádku, tj. n.

Všechno, co nám zůstává, je poslat tento výsledek do Telegramu.

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

Takže, kód bota aktuálně vypadá takto:

Kód bota pro kontrolu úloh

# Подключение пакета
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 zadejte do kódu token vašeho bota a váš identifikátor chatu.

Můžete přidávat podmínky pro filtrování úloh, například kontrolováním pouze těch úloh, které jste vytvořili vy, a vyloučením systémových.

Můžete také přesunout různé nastavení do samostatného konfiguračního souboru a uchovávat v něm id chatu a token. Číst konfiguraci lze například pomocí balíčku configr.

Příklad ini konfigurace

[telegram_bot]
;nastavení telegram bota a chatu, do kterého budou přicházet upozornění
chat_id=12345678
bot_token=123456789:abcdefghijklmnopqrstuvwxyz"

Příklad čtení proměnných z konfigurace v R

library(configr)

# čtení konfigurace
config <- read.config('C:/cesta_k_konfiguraci/config.cfg', rcmd.parse = TRUE)

bot_token <- config$telegram_bot$bot_token
chat_id     <- config$telegram_bot$chat_id

Nastavujeme rozvrh spuštění kontroly úloh

Nejdůkladněji je proces nastavení spuštění skriptů podle rozvrhu popsán v tomto článku. Zde popíšu pouze kroky, které je třeba provést. Pokud některý krok nerozumíte, obraťte se na článek, na který odkazuji.

Předpokládejme, že jsme uložili kód našeho bota do souboru check_bot.R. Pro naplánování pravidelného spuštění tohoto souboru proveďte následující kroky:

  1. Napište do systémové proměnné Path cestu k složce, ve které je nainstalováno R, na Windows bude cesta přibližně takováto: C:Program FilesRR-4.0.2bin.
  2. Vytvořte spustitelný bat soubor, který bude mít pouze jeden řádek R CMD BATCH C:rscriptscheck_botcheck_bot.R. Nahraďte C:rscriptscheck_botcheck_bot.R úplnou cestou k vašemu R souboru.
  3. Dále nastavte pomocí plánovače úloh Windows rozvrh spuštění, například každých půl hodiny.

Závěr

V tomto článku jsme se podívali na to, jak vytvořit bota a posílat s jeho pomocí různé upozornění na telegram.

Popsal jsem úkol kontroly plánovače úloh Windows, ale můžete použít obsah tohoto článku k odesílání jakýchkoli upozornění, od předpovědi počasí po akciové ceny, protože R vám umožňuje připojit se k obrovskému množství datových zdrojů.

V příštím článku se společně podíváme na to, jak přidat bota příkazy a klávesnici, aby mohl nejen posílat upozornění, ale i vykonávat složitější akce.

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster