ProHoster > Блог > Administrado > Ni skribas telegram-roton en la R-lingvo (parto 1): Kreu bot-on kaj sendu mesaĝojn al telegramo uzante ĝin
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.
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.
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"))).
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.
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:
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.
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"
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:
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.
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.
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.