Ni skribas telegram-roton en la R-lingvo (parto 1): Kreu bot-on kaj sendu mesaĝojn al telegramo uzante ĝin

La telegrama spektantaro kreskas eksponente ĉiutage, tio estas faciligita de la komforto de la mesaĝisto, la havebleco de kanaloj, babilejoj, kaj kompreneble la kapablo krei bots.

Botoj povas esti uzataj por diversaj celoj, de aŭtomatigi komunikadon kun viaj klientoj ĝis administri viajn proprajn taskojn.

Fakte, per la bot, vi povas uzi telegramon por fari ajnan operacion: sendi aŭ peti datumojn, ruli taskojn en la servilo, kolekti informojn en datumbazo, sendi retpoŝtojn ktp.

Mi planas skribi serion da artikoloj pri kiel labori kun R en R. telegram-bot API, kaj skribu robotojn por viaj bezonoj.

Ni skribas telegram-roton en la R-lingvo (parto 1): Kreu bot-on kaj sendu mesaĝojn al telegramo uzante ĝin

En ĉi tiu unua artikolo, ni eltrovos kiel krei telegram-boton kaj sendi sciigojn al telegramo uzante ĝin.

Kiel rezulto, ni havos roboton, kiu kontrolos la staton de la lasta plenumo de ĉiuj taskoj en la Vindoza Task Scheduler, kaj sendos al vi sciigojn se iu malsukcesas.

Sed la celo de ĉi tiu serio de artikoloj ne estas instrui vin kiel skribi bot por specifa, malvasta tasko, sed enkonduki vin al la sintakso de la pakaĵo ĝenerale. telegram.bot, kaj kodaj ekzemploj per kiuj vi povas skribi robotojn por solvi viajn proprajn problemojn.

Enhavo

Se vi interesiĝas pri datuma analizo, vi eble interesiĝos pri mia telegramo и youtube kanaloj. La plej granda parto de kies enhavo estas dediĉita al la R-lingvo.

  1. Kreado de telegrambot
  2. Instalante pakaĵon por labori kun telegrambot sur R
  3. Sendante mesaĝojn de R al Telegramo
  4. Agordante la taskan skanadon lanĉan horaron
  5. konkludo

Kreado de telegrambot

Unue, ni devas krei bot. Ĉi tio estas farita per speciala bot BotPatro, iru al ligilo kaj skribu al la bot /start.

Tiam vi ricevos mesaĝon kun listo de komandoj:

Mesaĝo de 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

Por krei novan bot, sendu la komandon /newbot.

BotFather petos vin enigi la nomon kaj ensaluton de la bot.

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

Vi povas enigi arbitran nomon, kaj la ensaluto devas finiĝi per bot.

Se vi faris ĉion ĝuste, vi ricevos la jenan mesaĝon:

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

Poste, vi bezonos la ricevitan API-ĵetonon, en mia ekzemplo ĝi estas 123456789:abcdefghijklmnopqrstuvwxyz.

Je ĉi tiu paŝo, la prepara laboro por krei la roboton finiĝas.

Instalante pakaĵon por labori kun telegrambot sur R

Mi supozas, ke vi jam havas la R-lingvon instalitan kaj la evolumedion RStudio. Se ĉi tio ne estas la kazo, tiam vi povas rigardi ĉi tion video-lernilo pri kiel instali ilin.

Por labori kun la Telegram Bot API, ni uzos la R-pakaĵon telegramo.bot.

Instali pakaĵojn en R estas farita per la funkcio install.packages(), do por instali la pakaĵon, kiun ni bezonas, uzu la komandon install.packages("telegram.bot").

Por pliaj informoj pri instalado de diversaj pakaĵoj, vidu ĉi tiu video.

Post instalo de la pako, vi devas konekti ĝin:

library(telegram.bot)

Sendante mesaĝojn de R al Telegramo

La bot, kiun vi kreis, troveblas en Telegramo uzante la ensaluton specifitan dum kreado, en mia kazo ĝi estas @my_test_bot.

Sendu ajnan mesaĝon al la bot, kiel "Hi bot". Nuntempe, ni bezonas ĉi tion por akiri la identigilon de via babilejo kun la bot.

Nun en R ni skribas la sekvan kodon.

library(telegram.bot)

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

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

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

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

Komence, ni kreas ekzemplon de nia bot kun la funkcio Bot(), kiel argumento, vi devas pasi la antaŭe ricevitan ĵetonon al ĝi.

Stoki la ĵetonon en kodo estas konsiderata malbona praktiko, do vi povas konservi ĝin en mediovariablo kaj legi ĝin de ĝi. Defaŭlte en la pako telegram.bot efektivigis subtenon por mediovariabloj de la sekva nomo: R_TELEGRAM_BOT_ИМЯ_ВАШЕГО_БОТА... Anstataŭe ИМЯ_ВАШЕГО_БОТА anstataŭigu la nomon, kiun vi starigis dum kreado, en mia kazo ĝi estos variablo R_TELEGRAM_BOT_My Test Bot.

Vi povas krei median variablon en pluraj manieroj, mi parolos pri la plej universala kaj transplataforma. Kreu en via hejma dosierujo (vi povas trovi ĝin per la komando path.expand("~")) tekstdosiero kun la nomo .Renviron. Vi ankaŭ povas fari tion per la komando file.edit(path.expand(file.path("~", ".Renviron"))).

Kaj aldonu la sekvan linion al ĝi.

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

Vi povas tiam uzi la ĵetonon konservitan en la mediovariablo kun la funkcio bot_token(), t.e. kiel tio:

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

Metodo getUpdates()permesas al ni ricevi bot-ĝisdatigojn, t.e. mesaĝojn senditajn al li. Metodo from_chat_id(), permesas vin akiri la ID de la babilejo de kiu la mesaĝo estis sendita. Ni bezonas ĉi tiun identigilon por sendi mesaĝojn de la bot.

Krom la babilejo-id de la objekto ricevita per la metodo getUpdates() vi ricevas ankaŭ aliajn utilajn informojn. Ekzemple, informoj pri la uzanto kiu sendis la mesaĝon.

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"

Do, en ĉi tiu etapo, ni jam havas ĉion, kio necesas por sendi mesaĝon de la bot al telegramo. Ni uzu la metodon sendMessage(), al kiu vi devas transdoni la babilejon, mesaĝtekston kaj markadon de la mesaĝteksto. La markada tipo povas esti Markdown aŭ HTML kaj estas agordita de la argumento parse_mode.

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

Markdown-Bazaĵoj pri Formatado:

  • Grada tiparo estas markita per *:
    • ekzemplo: *жирный шритф*
    • rezulto: aŭdaca skribo
  • Kursivo estas donitaj per substrekoj:
    • ekzemplo: _курсив_
    • rezulto: kursivo
  • La fiksspaca tiparo, kiu estas kutime uzata por reliefigi programkodon, estas specifita per apostrofoj - `:
    • ekzemplo: `monospaca tiparo`
    • rezulto: моноширинный шрифт

Bazoj pri formatado de HTML-markado:
En HTML, vi envolvas la parton de la teksto, kiun vi volas reliefigi en etikedoj, ekzemple <тег>текст</тег>.

  • <etikedo> — malferma etikedo
  • - ferma etikedo

HTML-markadaj etikedoj

  • <b> - grasa tiparo
    • ekzemplo: <b>жирный шрифт</b>
    • efekto grasa tiparo
  • <i> - kursivo
    • ekzemplo: <i>курсив</i>
    • rezulto: kursivo
  • — моноширинный шрифт
    • ekzemplo: моноширинный шрифт
    • rezulto: моноширинный шрифт

Krom teksto, vi povas sendi alian enhavon per specialaj metodoj:

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

Tiuj. ekzemple uzante la metodon sendPhoto() vi povas sendi intrigon konservitan kiel bildo kiun vi konstruis kun la pako ggplot2.

Kontrolante la Vindozan Task Scheduler kaj sendo de sciigo pri taskoj kiuj kraŝis

Por labori kun la Vindoza Task Scheduler, vi devas instali la pakaĵon taskscheduleR, kaj por la komforto labori kun datumoj, instalu la pakaĵon dplyr.

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

Poste, uzante la funkcion taskscheduler_ls() ni petas informojn pri taskoj de nia planisto. Uzante la funkcion filter() el la pako dplyr ni forigas el la listo de taskoj tiujn, kiuj estis sukcese plenumitaj kaj havas lastan rezultan staton de 0, kaj tiujn, kiuj ankoraŭ neniam estis rulitaj kaj havas statuson de 267011, malfunkciigitajn taskojn, kaj taskojn kiuj nun funkcias.

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

En la objekto task ni nun havas liston de taskoj, kies laboro finiĝis per eraro, ni devas sendi ĉi tiun liston al Telegramo.

Se ni konsideras ĉiun ordonon pli detale, tiam:

  • filter() — filtras la liston de taskoj laŭ la kondiĉoj priskribitaj supre
  • select() - lasas nur unu kampon kun la nomo de la taskoj en la tabelo
  • unique() - forigas duplikatajn nomojn
  • unlist() - tradukas la elektitan tabelkolumnon en vektoron
  • paste0() - ligas la nomojn de taskoj en unu linion, kaj metas novlinian signon kiel apartigilon, t.e. n.

Restas al ni nur sendi ĉi tiun rezulton al telegramo.

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

Do, nuntempe la botkodo aspektas jene:

Botkodo kiu kontrolas la taskon

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

}

Kiam vi uzas la supran ekzemplon, anstataŭigu vian bot-ĵetonon kaj vian babilejon en la kodon.

Vi povas aldoni kondiĉojn de filtrado de taskoj, ekzemple, kontrolante nur tiujn taskojn, kiuj estis kreitaj de vi, ekskludante sistemajn.

Vi ankaŭ povas meti diversajn agordojn en apartan agordan dosieron, kaj konservi la babilejon kaj ĵetonon en ĝi. Vi povas legi la agordon, ekzemple, uzante la pakaĵon configr.

Ekzemplo ini agordo

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

Ekzemplo de legado de variabloj de agordo en 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

Agordi taskan skanadon lanĉan horaron

La procezo de agordo de planita skripto-lanĉo estas priskribita pli detale en ĉi tio artikolo. Ĉi tie mi nur priskribos la paŝojn, kiujn oni devas sekvi por ĉi tio. Se iu el la paŝoj ne estas klara por vi, tiam referu al la artikolo al kiu mi donis ligilon.

Ni diru, ke ni konservas nian robotkodon al dosiero check_bot.R. Por plani ĉi tiun dosieron por funkcii regule, sekvu ĉi tiujn paŝojn:

  1. Skribu la vojon al la dosierujo en kiu R estas instalita en la Path-sistema variablo, en Vindozo la vojo estos io kiel ĉi tio: C:Program FilesRR-4.0.2bin.
  2. Kreu ruleblan bat-dosieron kun nur unu linio R CMD BATCH C:rscriptscheck_botcheck_bot.R. Anstataŭigi C:rscriptscheck_botcheck_bot.R al la plena vojo al via R-dosiero.
  3. Poste, uzu la Vindozan Task Scheduler por agordi lanĉan horaron, ekzemple, ĉiun duonhoron.

konkludo

En ĉi tiu artikolo, ni eksciis kiel krei bot kaj uzi ĝin por sendi diversajn sciigojn al telegramo.

Mi priskribis la taskon kontroli la Vindozan Task Scheduler, sed vi povas uzi la materialon en ĉi tiu artikolo por sendi ajnan sciigon, de la veterprognozo ĝis akciaj kotizoj en la borso, ĉar. R permesas vin konekti al grandega nombro da datumfontoj.

En la sekva artikolo, ni ekscios kiel aldoni komandojn kaj klavaron al la bot, por ke ĝi ne nur povu sendi sciigojn, sed ankaŭ fari pli kompleksajn agojn.

fonto: www.habr.com

Aldoni komenton