Ekri yon bot telegram nan R (pati 1): Kreye yon bot epi sèvi ak li pou voye mesaj nan telegram

Odyans lan Telegram ap grandi eksponansyèlman chak jou, sa a se fasilite pa konvenyans nan mesaje a, prezans nan chanèl, chat, ak nan kou kapasite nan kreye robo.

Bot yo ka itilize pou rezon konplètman diferan, soti nan otomatize kominikasyon ak kliyan ou a jere pwòp travay ou.

Esansyèlman, ou ka itilize telegram pou fè nenpòt operasyon atravè yon bot: voye oswa mande done, kouri travay sou sèvè a, kolekte enfòmasyon nan yon baz done, voye imèl, ak sou sa.

Mwen planifye pou yo ekri yon seri de atik sou kijan pou travay avèk telegram bot API, epi ekri bots selon bezwen ou yo.

Ekri yon bot telegram nan R (pati 1): Kreye yon bot epi sèvi ak li pou voye mesaj nan telegram

Nan premye atik sa a nou pral konnen ki jan yo kreye yon bot telegram epi sèvi ak li pou voye notifikasyon nan telegram.

Kòm yon rezilta, nou pral gen yon bot ki pral tcheke estati dènye ekzekisyon tout travay nan Windows Task Scheduler, epi voye notifikasyon ou si nenpòt nan yo echwe.

Men, objektif seri atik sa a se pa pou moutre w kijan pou w ekri yon bot pou yon travay espesifik ki jis, men se jeneralman pou w entwodui w nan sentaks pakè a. telegram.bot, ak egzanp kòd ak ki ou ka ekri robo pou rezoud pwoblèm pwòp ou yo.

Content

Si w enterese nan analiz done, ou ta ka enterese nan mwen an telegram и YouTube chanèl. Pifò nan kontni an dedye a lang R la.

  1. Kreye yon bot telegram
  2. Enstale yon pake pou travay ak yon bot telegram nan R
  3. Voye mesaj soti nan R nan Telegram
  4. Mete kanpe yon orè pou kouri analiz travay
  5. Konklizyon

Kreye yon bot telegram

Premyèman, nou bezwen kreye yon bot. Sa a se fè lè l sèvi avèk yon bot espesyal BotPather, ale nan lyen epi ekri bot la /start.

Apre sa ou pral resevwa yon mesaj ak yon lis kòmandman:

Mesaj 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

Pou kreye yon nouvo bot, voye lòd la /newbot.

BotFather ap mande w antre non bot la ak konekte.

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

Ou ka antre nenpòt non, men login la dwe fini ak bot.

Si ou te fè tout bagay kòrèkteman, w ap resevwa mesaj sa a:

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

Apre w ap bezwen siy API resevwa a, nan egzanp mwen an li ye 123456789:abcdefghijklmnopqrstuvwxyz.

Nan etap sa a, travay preparasyon pou kreye bot la fini.

Enstale yon pake pou travay ak yon bot telegram nan R

Mwen sipoze ke ou deja gen lang R la ak anviwònman devlopman RStudio enstale. Si sa a se pa ka a, Lè sa a, ou ka gade nan sa a leson patikilye videyo sou kijan pou yo enstale yo.

Pou travay avèk Telegram Bot API nou pral sèvi ak pake R la telegram.bot.

Enstale pakè nan R se fè lè l sèvi avèk fonksyon an install.packages(), Se konsa, enstale pake nou bezwen an, sèvi ak lòd la install.packages("telegram.bot").

Ou ka aprann plis sou enstale divès pakè soti nan videyo sa a.

Apre enstale pake a, ou bezwen konekte li:

library(telegram.bot)

Voye mesaj soti nan R nan Telegram

Ou ka jwenn bot ou te kreye a nan Telegram lè l sèvi avèk login ki espesifye pandan kreyasyon an, nan ka mwen li ye @my_test_bot.

Voye bot la nenpòt mesaj, tankou "Hey bot." Nan moman sa a, nou bezwen sa a yo nan lòd yo jwenn id la nan chat ou a ak bot la.

Koulye a, nou ekri kòd sa a nan R.

library(telegram.bot)

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

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

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

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

Okòmansman, nou kreye yon egzanp bot nou an ak fonksyon an Bot(), siy ki te deja resevwa a dwe pase nan li kòm yon agiman.

Li pa konsidere kòm pi bon pratik nan magazen jeton an nan kòd, kidonk, ou ka estoke li nan yon varyab anviwònman epi li li nan li. Pa default nan pake telegram.bot Sipò pou varyab anviwònman yo nan non sa yo te aplike: R_TELEGRAM_BOT_ИМЯ_ВАШЕГО_БОТА. Olye de ИМЯ_ВАШЕГО_БОТА ranplase non ou espesifye lè w ap kreye a, nan ka mwen an li pral yon varyab R_TELEGRAM_BOT_My Test Bot.

Gen plizyè fason yo kreye yon varyab anviwònman; mwen pral di w sou youn ki pi inivèsèl ak kwa-platfòm. Kreye nan anyè lakay ou (ou ka jwenn li lè l sèvi avèk kòmandman an path.expand("~")) dosye tèks ak non an .Renviron. Ou ka fè sa tou lè l sèvi avèk kòmandman an file.edit(path.expand(file.path("~", ".Renviron"))).

Epi ajoute liy sa a nan li.

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

Apre sa, ou ka itilize siy ki sove nan varyab anviwònman an lè l sèvi avèk fonksyon an bot_token(), i.e. tankou sa a:

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

Metòd getUpdates()pèmèt nou jwenn mizajou bot, i.e. mesaj yo te voye ba li. Metòd from_chat_id(), pèmèt ou jwenn idantite chat kote yo te voye mesaj la. Nou bezwen ID sa a pou voye mesaj ki soti nan bot la.

Anplis de idantite chat soti nan objè a jwenn nan metòd la getUpdates() ou resevwa tou kèk lòt enfòmasyon itil. Pou egzanp, enfòmasyon sou itilizatè a ki voye mesaj la.

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"

Se konsa, nan etap sa a nou deja gen tout sa nou bezwen voye yon mesaj soti nan yon bot nan Telegram. Ann sèvi ak metòd la sendMessage(), kote ou bezwen pase ID chat la, tèks mesaj, ak kalite maketing tèks mesaj. Kalite maketing la ka Markdown oswa HTML epi li tabli pa agiman an parse_mode.

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

Prensip de baz fòma Markdown:

  • Polis fonse make ak *:
    • egzanp: *жирный шритф*
    • rezilta: font fonse
  • Italik yo endike ak souliye:
    • egzanp: _курсив_
    • rezilta: italik
  • Polis monospace, ki anjeneral yo itilize pou mete aksan sou kòd pwogram lan, espesifye lè l sèvi avèk apòt - `:
    • egzanp: `font monospace`
    • rezilta: моноширинный шрифт

Prensip fondamantal nan fòma make HTML:
Nan HTML, ou vlope pati nan tèks la ki bezwen make nan tags, egzanp <тег>текст</тег>.

  • <tag> - tag ouvèti
  • - tag fèmen

Tags HTML maketing

  • <b> - font fonse
    • egzanp: <b>жирный шрифт</b>
    • rezilta font fonse
  • <i> - italik
    • egzanp: <i>курсив</i>
    • rezilta: italik
  • — моноширинный шрифт
    • egzanp: моноширинный шрифт
    • rezilta: моноширинный шрифт

Anplis tèks, ou ka voye lòt kontni lè l sèvi avèk metòd espesyal:

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

Moun sa yo. pou egzanp lè l sèvi avèk metòd la sendPhoto() ou ka voye graf ou te kreye lè l sèvi avèk pake a, sove kòm yon imaj ggplot2.

Tcheke Windows Task Scheduler epi voye notifikasyon sou travay ki fini anòmalman

Pou travay avèk Windows Task Scheduler ou bezwen enstale pake a taskscheduleR, ak pou konvenyans nan travay ak done, enstale pake a dplyr.

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

Apre sa, sèvi ak fonksyon an taskscheduler_ls() nou mande enfòmasyon sou travay nan pwogramè nou an. Sèvi ak fonksyon an filter() soti nan pake a dplyr Nou retire nan lis travay sa yo ki te konplete avèk siksè epi ki gen yon estati dènye rezilta 0, ak sa yo ki pa janm te lanse epi ki gen yon estati 267011, travay ki andikape, ak travay ki kounye a ap kouri.

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

Nan objè a task Kounye a nou gen yon lis travay ki echwe, nou bezwen voye lis sa a bay Telegram.

Si nou gade chak kòmandman an plis detay, lè sa a:

  • filter() — filtre lis travay selon kondisyon ki dekri pi wo a
  • select() — kite yon sèl jaden nan tablo a ak non travay yo
  • unique() - retire non doub
  • unlist() — konvèti kolòn tab la chwazi a nan yon vektè
  • paste0() — konekte non travay yo nan yon sèl liy, epi mete yon liy liy kòm yon separasyon, i.e. n.

Tout sa ki rete pou nou se voye rezilta sa via telegram.

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

Se konsa, nan moman sa a kòd bot la sanble sa a:

Kod bot revize travay

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

}

Lè w ap itilize egzanp ki anwo a, ranplase siy bot ou a ak ID chat ou a nan kòd la.

Ou ka ajoute kondisyon pou filtraj travay, pou egzanp, tcheke sèlman travay sa yo ke ou te kreye, eksepte sa yo sistèm.

Ou kapab tou mete divès kalite paramèt nan yon dosye konfigirasyon separe, epi estoke id chat la ak siy ladan l. Ou ka li konfigirasyon an, pou egzanp, lè l sèvi avèk pake a configr.

Egzanp ini konfigirasyon

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

Yon egzanp lekti varyab ki soti nan yon konfigirasyon nan 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

Mete kanpe yon orè pou kouri analiz travay

Pwosesis la nan mete kanpe lansman an nan scripts sou yon orè yo dekri an plis detay nan sa a Atik. Isit la mwen pral sèlman dekri etap sa yo ki bezwen swiv pou sa a. Si nenpòt nan etap yo pa klè pou ou, al gade nan atik mwen te bay yon lyen.

Ann sipoze ke nou sove kòd bot nou an nan yon dosye check_bot.R. Pou pwograme dosye sa a kouri regilyèman, swiv etap sa yo:

  1. Ekri chemen an nan katab la kote R enstale nan varyab sistèm Path la; nan Windows, chemen an pral yon bagay tankou sa a: C:Program FilesRR-4.0.2bin.
  2. Kreye yon dosye baton ègzekutabl ak yon sèl liy R CMD BATCH C:rscriptscheck_botcheck_bot.R. Ranplase C:rscriptscheck_botcheck_bot.R nan chemen an konplè nan dosye R ou a.
  3. Apre sa, sèvi ak Windows Task Scheduler pou mete sou pye yon orè lansman, pou egzanp, chak demi èdtan.

Konklizyon

Nan atik sa a, nou te konnen ki jan yo kreye yon bot epi sèvi ak li voye notifikasyon divès kalite nan telegram.

Mwen te dekri travay la nan siveyans Windows Task Scheduler, men ou ka itilize materyèl ki nan atik sa a pou voye nenpòt notifikasyon, soti nan pwevwa move tan an ak quotes aksyon sou echanj la, paske R pèmèt ou konekte ak yon gwo kantite sous done.

Nan pwochen atik la, nou pral konnen ki jan yo ajoute kòmandman ak yon klavye nan bot la pou ke li ka pa sèlman voye notifikasyon, men tou, fè aksyon pi konplèks.

Sous: www.habr.com

Add nouvo kòmantè