Scriem un bot telegram în limbajul R (partea 1): creați un bot și trimiteți mesaje către telegram folosindu-l

Audiența telegramelor crește exponențial în fiecare zi, acest lucru este facilitat de comoditatea mesagerului, disponibilitatea canalelor, chat-urilor și, desigur, capacitatea de a crea boți.

Boții pot fi utilizați pentru o mare varietate de scopuri, de la automatizarea comunicării cu clienții până la gestionarea propriilor sarcini.

De fapt, prin intermediul botului, puteți folosi telegram pentru a efectua orice operațiune: trimiteți sau solicitați date, executați sarcini pe server, colectați informații într-o bază de date, trimiteți e-mailuri etc.

Intenționez să scriu o serie de articole despre cum să lucrez cu R în R. API-ul telegram botși scrieți roboți pentru nevoile dvs.

Scriem un bot telegram în limbajul R (partea 1): creați un bot și trimiteți mesaje către telegram folosindu-l

În acest prim articol, ne vom da seama cum să creăm un bot telegram și să trimitem notificări către telegram folosindu-l.

În consecință, vom avea un bot care va verifica starea ultimei execuții a tuturor sarcinilor din Windows Task Scheduler și vă va trimite notificări dacă vreuna eșuează.

Dar scopul acestei serii de articole nu este să te învețe cum să scrii un bot pentru o sarcină specifică, îngustă, ci să te introducă în sintaxa pachetului în general. telegram.bot, și exemple de cod cu care puteți scrie roboți pentru a vă rezolva propriile probleme.

Conținut

Dacă ești interesat de analiza datelor, s-ar putea să fii interesat de analiza mea telegramă и youtube canale. Cea mai mare parte a conținutului este dedicat limbajului R.

  1. Crearea unui bot telegram
  2. Instalarea unui pachet pentru lucrul cu un bot telegram pe R
  3. Trimiterea mesajelor de la R către Telegram
  4. Configurarea programului de lansare a scanării sarcinilor
  5. Concluzie

Crearea unui bot telegram

În primul rând, trebuie să creăm un bot. Acest lucru se face folosind un bot special Tatăl Bot, mergi la legătură și scrieți botului /start.

Apoi veți primi un mesaj cu o listă de comenzi:

Mesaj de la BotFather

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

Pentru a crea un bot nou, trimiteți comanda /newbot.

BotFather vă va cere să introduceți numele și autentificarea botului.

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

Puteți introduce un nume arbitrar, iar autentificarea trebuie să se încheie cu bot.

Dacă ați făcut totul corect, veți primi următorul mesaj:

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

În continuare, veți avea nevoie de jetonul API primit, în exemplul meu este 123456789:abcdefghijklmnopqrstuvwxyz.

La acest pas, munca pregătitoare pentru crearea botului este finalizată.

Instalarea unui pachet pentru lucrul cu un bot telegram pe R

Presupun că aveți deja instalat limbajul R și mediul de dezvoltare RStudio. Dacă nu este cazul, atunci poți să te uiți la asta tutorial video despre cum să le instalezi.

Pentru a lucra cu API-ul Telegram Bot, vom folosi pachetul R telegramă.bot.

Instalarea pachetelor în R se face prin funcție install.packages(), deci pentru a instala pachetul de care avem nevoie, folosiți comanda install.packages("telegram.bot").

Pentru mai multe informații despre instalarea diferitelor pachete, consultați acest video.

După instalarea pachetului, trebuie să-l conectați:

library(telegram.bot)

Trimiterea mesajelor de la R către Telegram

Botul pe care l-ați creat poate fi găsit în Telegram folosind login-ul specificat în timpul creării, în cazul meu este @my_test_bot.

Trimiteți orice mesaj către bot, cum ar fi „Hi bot”. Momentan, avem nevoie de acest lucru pentru a obține ID-ul chat-ului tău cu botul.

Acum în R scriem următorul cod.

library(telegram.bot)

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

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

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

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

Inițial, creăm o instanță a botului nostru cu funcția Bot(), ca argument, trebuie să îi transmiteți jetonul primit anterior.

Stocarea jetonului în cod este considerată o practică proastă, așa că îl puteți stoca într-o variabilă de mediu și îl puteți citi din ea. Implicit în pachet telegram.bot a implementat suport pentru variabilele de mediu cu următorul nume: R_TELEGRAM_BOT_ИМЯ_ВАШЕГО_БОТА... In loc de ИМЯ_ВАШЕГО_БОТА înlocuiți numele pe care l-ați setat la creare, în cazul meu va fi o variabilă R_TELEGRAM_BOT_My Test Bot.

Puteți crea o variabilă de mediu în mai multe moduri, voi vorbi despre cea mai universală și multiplatformă. Creați în directorul dvs. de acasă ( îl puteți găsi cu comanda path.expand("~")) fișier text cu numele .Înconjurător. Puteți face acest lucru și cu comanda file.edit(path.expand(file.path("~", ".Renviron"))).

Și adăugați următoarea linie la el.

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

Apoi puteți utiliza simbolul stocat în variabila de mediu cu funcția bot_token(), adică ca aceasta:

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

metodă getUpdates()ne permite să obținem actualizări de bot, de ex. mesajele trimise lui. Metodă from_chat_id(), vă permite să obțineți ID-ul chat-ului de la care a fost trimis mesajul. Avem nevoie de acest identificator pentru a trimite mesaje de la bot.

Pe lângă id-ul de chat de la obiectul primit prin metodă getUpdates() primești și alte informații utile. De exemplu, informații despre utilizatorul care a trimis mesajul.

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"

Deci, în această etapă, avem deja tot ce este necesar pentru a trimite un mesaj de la bot către telegramă. Să folosim metoda sendMessage(), căruia trebuie să îi transmiteți ID-ul de chat, textul mesajului și tipul de marcare al textului mesajului. Tipul de marcare poate fi Markdown sau HTML și este stabilit de argument parse_mode.

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

Noțiuni de bază privind formatarea Markdown:

  • Fontul aldine este marcat cu *:
    • exemplu: *жирный шритф*
    • rezultat: script îndrăzneț
  • Cursivele sunt date de subliniere:
    • exemplu: _курсив_
    • rezultat: cursive
  • Fontul cu spațiu fix, care este de obicei folosit pentru a evidenția codul programului, este specificat folosind apostrofe - `:
    • exemplu: `font monospace`
    • rezultat: моноширинный шрифт

Noțiuni de bază despre formatarea marcajului HTML:
În HTML, împachetați partea de text pe care doriți să o evidențiați în etichete, de exemplu <тег>текст</тег>.

  • <tag> — etichetă de deschidere
  • - eticheta de inchidere

Etichete de markup HTML

  • <b> - font aldine
    • exemplu: <b>жирный шрифт</b>
    • rezultat font aldine
  • <i> - cursive
    • exemplu: <i>курсив</i>
    • rezultat: cursive
  • — моноширинный шрифт
    • exemplu: моноширинный шрифт
    • rezultat: моноширинный шрифт

Pe lângă text, puteți trimite și alt conținut folosind metode speciale:

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

Acestea. de exemplu folosind metoda sendPhoto() puteți trimite o parcelă salvată ca imagine pe care ați construit-o împreună cu pachetul ggplot2.

Verificarea Windows Task Scheduler și trimiterea notificărilor privind sarcinile care s-au prăbușit

Pentru a lucra cu Windows Task Scheduler, trebuie să instalați pachetul taskscheduleR, iar pentru confortul lucrului cu date, instalați pachetul dplyr.

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

Apoi, folosind funcția taskscheduler_ls() solicităm informații despre sarcini de la planificatorul nostru. Folosind funcția filter() din pachet dplyr le eliminăm din lista de sarcini pe cele care au fost finalizate cu succes și au o stare de ultim rezultat de 0 și pe cele care nu au fost încă executate și au o stare de 267011, sarcini dezactivate și sarcini care rulează în prezent.

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

În instalație task avem acum o listă de sarcini a căror activitate s-a încheiat cu o eroare, trebuie să trimitem această listă la Telegram.

Dacă luăm în considerare fiecare comandă mai detaliat, atunci:

  • filter() — filtrează lista sarcinilor conform condițiilor descrise mai sus
  • select() - lasă un singur câmp cu numele sarcinilor din tabel
  • unique() - elimină numele duplicate
  • unlist() - traduce coloana tabelului selectată într-un vector
  • paste0() - conectează numele sarcinilor într-o singură linie și pune un caracter de linie nouă ca separator, de ex. n.

Tot ce ne rămâne este să trimitem acest rezultat la telegramă.

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

Deci, în acest moment, codul bot arată astfel:

Cod bot care verifică sarcina

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

}

Când utilizați exemplul de mai sus, înlocuiți jetonul bot și ID-ul de chat în cod.

Puteți adăuga condiții de filtrare a sarcinilor, de exemplu, verificând numai acele sarcini care au fost create de dvs., excluzând cele de sistem.

Puteți, de asemenea, să puneți diferite setări într-un fișier de configurare separat și să stocați ID-ul de chat și simbolul în el. Puteți citi configurația, de exemplu, folosind pachetul configr.

Exemplu ini config

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

Exemplu de citire a variabilelor din config în 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

Configurarea unui program de lansare a scanării sarcinilor

Procesul de configurare a lansării programate a scriptului este descris mai detaliat în aceasta articol. Aici voi descrie doar pașii care trebuie urmați pentru aceasta. Dacă vreunul dintre pași nu vă este clar, consultați articolul către care am furnizat un link.

Să presupunem că salvăm codul nostru bot într-un fișier check_bot.R. Pentru a programa acest fișier să ruleze în mod regulat, urmați acești pași:

  1. Scrieți calea către folderul în care este instalat R în variabila de sistem Path, pe Windows calea va fi cam așa: C:Program FilesRR-4.0.2bin.
  2. Creați un fișier bat executabil cu o singură linie R CMD BATCH C:rscriptscheck_botcheck_bot.R. A inlocui C:rscriptscheck_botcheck_bot.R la calea completă către fișierul dvs. R.
  3. Apoi, utilizați Windows Task Scheduler pentru a seta un program de pornire, de exemplu, la fiecare jumătate de oră.

Concluzie

În acest articol, ne-am dat seama cum să creăm un bot și să îl folosim pentru a trimite diverse notificări către Telegram.

Am descris sarcina de a monitoriza Windows Task Scheduler, dar puteți folosi materialul din acest articol pentru a trimite orice notificare, de la prognoza meteo până la cotațiile bursiere, deoarece. R vă permite să vă conectați la un număr mare de surse de date.

În articolul următor, ne vom da seama cum să adăugați comenzi și o tastatură la bot, astfel încât acesta să poată nu numai să trimită notificări, ci și să efectueze acțiuni mai complexe.

Sursa: www.habr.com

Adauga un comentariu