ProHoster > блог > адміністраванне > Пішам telegram бота на мове R (частка 1): Ствараем бота, і адпраўляем з яго дапамогай паведамленні ў telegram
Пішам telegram бота на мове R (частка 1): Ствараем бота, і адпраўляем з яго дапамогай паведамленні ў telegram
Аўдыторыя telegram штодня расце з геаметрычнай прагрэсіяй, гэтаму спрыяе зручнасць месэнджара, наяўнасць каналаў, чатаў, і вядома магчымасць ствараць ботаў.
Боты могуць выкарыстоўвацца ў зусім розных мэтах, ад аўтаматызацыі камунікацыі з вашымі кліентамі да кіравання вашымі ўласнымі задачамі.
У сутнасці праз робата можна выкарыстоўваючы telegram выконваць любыя аперацыі: адпраўляць, або запытваць дадзеныя, запускаць задачы на серверы, збіраць інфармацыю ў базу дадзеных, адпраўляць электронныя лісты і гэтак далей.
Я планую напісаць серыю артыкулаў, аб тым, як на мове R працаваць з telegram bot API, І пісаць ботаў пад свае патрэбы.
У гэтым, першым артыкуле мы разбярэмся як стварыць тэлеграм бота, і адпраўляць з яго дапамогай апавяшчэння ў telegram.
У выніку ў нас атрымаецца бот, які будзе правяраць статус апошняга выканання ўсіх задач у планавальніку заданняў Windows, і адпраўляць вам апавяшчэння, калі нейкія завяршыліся памылкай.
Але мэта гэтай серыі артыкулаў заключаецца не ў тым, што б навучыць вас пісаць робата пад пэўную, вузкую задачу, а ў цэлым пазнаёміць з сінтаксісам пакета telegram.bot, і прыкладамі кода, з дапамогай якіх вы зможаце пісаць робатаў, пад рашэнне ўласных задач.
Змест
Калі вы цікавіцеся аналізам дадзеных магчыма вам будуць цікавыя мае тэлеграма и YouTube каналы. Большая частка кантэнту якіх прысвечаны мове R.
Для пачатку нам трэба стварыць робата. Робіцца гэта з дапамогай спецыяльнага бота БотБацька, пераходзім па спасылцы і пішам боту /start.
Пасля чаго вы атрымаеце паведамленне са спісам каманд:
Паведамленне ад 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
Для стварэння новага робата адпраўляем каманду /newbot.
BotFather папросіць вас увесці імя і лагін бота.
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
Імя вы можаце ўвесці адвольнае, а лагін павінен сканчацца на bot.
Калі вы ўсё зрабілі правільна, то атрымаеце наступнае паведамленне:
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
Далей вам спатрэбіцца атрыманы API токен, у маім прыкладзе гэта 123456789:abcdefghijklmnopqrstuvwxyz.
На гэтым этапе падрыхтоўчыя працы па стварэнні робата завершаны.
Ўстаноўка пакета для працы з тэлеграм ботам на R
Я мяркую, што ў вас ужо ўсталяваны мова R, і асяроддзе распрацоўкі RStudio. Калі гэта не так, то вы можаце паглядзець дадзены відэа ўрок аб тым, як іх усталяваць.
Для працы з Telegram Bot API мы будзем выкарыстоўваць R пакет telegram.bot.
Ўстаноўка пакетаў у R ажыццяўляецца функцыяй install.packages(), таму для ўсталёўкі патрэбнага нам пакета выкарыстоўвайце каманду install.packages("telegram.bot").
Больш падрабязна даведацца пра ўсталёўку розных пакетаў можна з гэтага відэа.
Пасля ўсталёўкі пакета яго неабходна падлучыць:
library(telegram.bot)
Адпраўка паведамленняў з R у Telegram
Створанага вамі робата можна знайсці ў Telegram па зададзеным пры стварэнні лагіну, у маім выпадку гэта @my_test_bot.
Адпраўце боту любое паведамленне, напрыклад "Прывітанне бот". На дадзены момант гэта нам трэба для таго, каб атрымаць id вашага з ботам чата.
Цяпер у R пішам наступны код.
library(telegram.bot)
# создаём экземпляр бота
bot <- Bot(token = "123456789:abcdefghijklmnopqrstuvwxyz")
# Запрашиваем информацию о боте
print(bot$getMe())
# Получаем обновления бота, т.е. список отправленных ему сообщений
updates <- bot$getUpdates()
# Запрашиваем идентификатор чата
# Примечание: перед запросом обновлений вы должны отправить боту сообщение
chat_id <- updates[[1L]]$from_chat_id()
Першапачаткова мы ствараем асобнік нашага бота функцыяй Bot(), у якасці аргументу ў яе неабходна перадаць атрыманы раней токен.
Захоўваць токен у кодзе лічыцца не лепшай практыкай, таму вы можаце захоўваць яго ў зменным асяроддзі, і счытваць яго з яе. Па змаўчанні ў пакеце telegram.bot рэалізавана падтрымка зменных асяроддзя наступнага наймення: R_TELEGRAM_BOT_ИМЯ_ВАШЕГО_БОТА. Замест ИМЯ_ВАШЕГО_БОТА падстаўце імя якое вы задалі пры стварэнні, у маім выпадку будзе зменная R_TELEGRAM_BOT_My Test Bot.
Стварыць зменную асяроддзі можна некалькімі спосабамі, я распавяду пра найболей універсальным і кросплатформавым. Стварыце ў вашай хатняй дырэкторыі (даведацца яе можна з дапамогай каманды path.expand("~")) тэкставы файл з назвай .Renviron. Зрабіць гэта таксама можна з дапамогай каманды file.edit(path.expand(file.path("~", ".Renviron"))).
Далей вы можаце выкарыстоўваць захаваны ў зменным асяроддзі токен з дапамогай функцыі bot_token(), г.зн. вось так:
bot <- Bot(token = bot_token("My Test Bot"))
метад getUpdates()дазваляе нам атрымаць абнаўленні бота, г.зн. паведамленні якія былі яму адпраўлены. Метад from_chat_id(), дазваляе атрымаць ідэнтыфікатар чата, з якога было даслана паведамленне. Гэты ідэнтыфікатар нам патрэбен для адпраўкі паведамленняў ад робата.
Апроч id чата з аб'екта атрыманага метадам getUpdates() вы атрымліваеце і некаторую іншую карысную інфармацыю. Напрыклад, інфармацыю аб карыстальніку, які даслаў паведамленне.
Такім чынам, на дадзеным этапе ў нас ужо ёсць усё, што неабходна для адпраўкі паведамлення ад робата ў тэлеграм. Скарыстаемся метадам sendMessage(), у які неабходна перадаць ідэнтыфікатар чата, тэкст паведамлення, і тып разметкі тэксту паведамлення. Тып разметкі можа быць Markdown або HTML і ўстанаўліваецца аргументам parse_mode.
# Отправка сообщения
bot$sendMessage(chat_id,
text = "Привет, *жирный текст* _курсив_",
parse_mode = "Markdown"
)
Асновы фарматавання Markdown разметкі:
Тоўсты шрыфт вылучаецца з дапамогай знака *:
прыклад: *жирный шритф*
вынік: тоўсты шрытф
Курсіў задаецца ніжнім падкрэсленнем:
прыклад: _курсив_
вынік: курсіў
Манашырынны шрыфт, якім звычайна вылучаецца праграмны код, задаецца з дапамогай апострафаў -`:
прыклад: `манашырынны шрыфт`
вынік: моноширинный шрифт
Асновы фарматавання HTML разметкі:
У HTML вы заварочваеце частку тэксту, якую трэба вырабіць, у тэгі, прыклад <тег>текст</тег>.
<тэг> - які адкрывае тэг
- які зачыняе тэг
Тэгі HTML разметкі
<b> - тлусты шрыфт
прыклад: <b>жирный шрифт</b>
вынік тоўсты шрыфт
<i> - курсіў
прыклад: <i>курсив</i>
вынік: курсіў
— моноширинный шрифт
прыклад: моноширинный шрифт
вынік: моноширинный шрифт
Акрамя тэксту вы можаце адпраўляць і іншы кантэнт выкарыстоўваючы спецыяльныя метады:
Г.зн. напрыклад з дапамогай метаду sendPhoto() вы можаце адправіць захаваны ў выглядзе выявы графік, які вы пабудавалі з дапамогай пакета ggplot2.
Праверка планавальніка задач Windows, і адпраўка апавяшчэння аб задачах, праца якіх была завершана аварыйна
Для працы з планавальнікам заданняў Windows вам неабходна ўсталяваць пакет taskscheduleR, і для зручнасці працы з дадзенымі ўсталюем пакет dplyr.
# Установка пакетов
install.packages(c('taskscheduleR', 'dplyr'))
# Подключение пакетов
library(taskscheduleR)
library(dplyr)
Далей з дапамогай функцыі taskscheduler_ls() мы запытваем інфармацыю аб задачах з нашага планавальніка. З дапамогай функцыі filter() з пакета dplyr мы прыбіраем са спісу задач тыя, якія былі паспяхова выкананы і маюць статус апошняга выніку 0, і тыя, якія яшчэ ні разу не запускаліся і маюць статус 267011, выключаныя задачы, і задачы якія выконваюцца ў дадзены момант.
У аб'екце task у нас зараз спіс задач, праца якіх завяршылася памылкай, гэты спіс нам трэба адправіць у Telegram.
Калі разгледзець кожную каманду падрабязней, то:
filter() - фільтруе спіс задач, па апісаным вышэй умовам
select() - пакідае ў табліцы толькі адно поле з назвай задач
unique() - прыбірае дублі назваў
unlist() - Пераводзіць выбраны слупок табліцы ў вектар
paste0() - злучае назвы задач у адзін радок, і ставіць у якасці падзельніка знак перакладу радка, г.зн. n.
Усё, што нам застаецца - адправіць гэты вынік у тэлеграм.
bot$sendMessage(chat_id,
text = task,
parse_mode = "Markdown"
)
Такім чынам, на дадзены момант код робата выглядае вось так:
Код робата правяраючага задачы
# Подключение пакета
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"
)
}
Пры выкарыстанні прыведзенага вышэй прыкладу падстаўце ў код токен вашага робата і ваш ідэнтыфікатар чата.
Вы можаце дадаваць умовы фільтрацыі задач, напрыклад правяраючы толькі тыя задачы, якія былі створаны вамі, выняткоўваючы сістэмныя.
Гэтак жа вы можаце вынесці розныя налады ў асобны файл канфігурацыі, і захоўваць у ім id чата і токен. Чытаць канфіг можна напрыклад з дапамогай пакета configr.
Прыклад ini канфіга
[telegram_bot]
;настройки телеграм бота и чата, в который будут приходить уведомления
chat_id=12345678
bot_token=123456789:abcdefghijklmnopqrstuvwxyz"
Найбольш падрабязна працэс наладкі запуску скрыптоў па раскладзе апісаны ў гэтай артыкуле. Тут я толькі апішу крокі, якія для гэтага трэба выканаць. Калі які-небудзь з крокаў вам не зразумелы, то звернецеся да артыкула на якую я паказаў спасылку.
Выкажам здагадку, што мы захавалі код нашага робата ў файл check_bot.R. Для таго, каб запланаваць рэгулярны запуск гэтага файла выканайце наступныя крокі:
Прапішыце ў сістэмную зменную Path шлях да тэчкі ў якой усталяваны R, у Windows шлях будзе прыкладна такім: C:Program FilesRR-4.0.2bin.
Стварыце выкананы bat файл, у якім будзе ўсяго адзін радок R CMD BATCH C:rscriptscheck_botcheck_bot.R. Замяніце C:rscriptscheck_botcheck_bot.R на поўны шлях да вашага R файле.
Далей наладзьце з дапамогай планавальніка задач Windows расклад запуску, напрыклад на кожныя падлогу гадзіны.
Заключэнне
У гэтым артыкуле мы разабраліся з тым, як стварыць робата, і адпраўляць з яго дапамогай розныя апавяшчэння ў telegram.
Я апісаў задачу кантролю планавальніка заданняў Windows, але вы можаце выкарыстоўваць матэрыял гэтага артыкула для адпраўкі любых апавяшчэнняў, ад прагнозу надвор'я да каціровак акцый на фондавай біржы, т.я. R дазваляе вам падлучыцца да велізарнай колькасці крыніц дадзеных.
У наступным артыкуле мы з вамі разбярэмся з тым, як дадаць робату каманды і клавіятуру, для таго, што ён мог не толькі адпраўляць апавяшчэнні, але і выконваць больш складаныя дзеянні.