Пішам telegram бота на мове R (частка 1): Ствараем бота, і адпраўляем з яго дапамогай паведамленні ў telegram

Аўдыторыя telegram штодня расце з геаметрычнай прагрэсіяй, гэтаму спрыяе зручнасць месэнджара, наяўнасць каналаў, чатаў, і вядома магчымасць ствараць ботаў.

Боты могуць выкарыстоўвацца ў зусім розных мэтах, ад аўтаматызацыі камунікацыі з вашымі кліентамі да кіравання вашымі ўласнымі задачамі.

У сутнасці праз робата можна выкарыстоўваючы telegram выконваць любыя аперацыі: адпраўляць, або запытваць дадзеныя, запускаць задачы на ​​серверы, збіраць інфармацыю ў базу дадзеных, адпраўляць электронныя лісты і гэтак далей.

Я планую напісаць серыю артыкулаў, аб тым, як на мове R працаваць з telegram bot API, І пісаць ботаў пад свае патрэбы.

Пішам telegram бота на мове R (частка 1): Ствараем бота, і адпраўляем з яго дапамогай паведамленні ў telegram

У гэтым, першым артыкуле мы разбярэмся як стварыць тэлеграм бота, і адпраўляць з яго дапамогай апавяшчэння ў telegram.

У выніку ў нас атрымаецца бот, які будзе правяраць статус апошняга выканання ўсіх задач у планавальніку заданняў Windows, і адпраўляць вам апавяшчэння, калі нейкія завяршыліся памылкай.

Але мэта гэтай серыі артыкулаў заключаецца не ў тым, што б навучыць вас пісаць робата пад пэўную, вузкую задачу, а ў цэлым пазнаёміць з сінтаксісам пакета telegram.bot, і прыкладамі кода, з дапамогай якіх вы зможаце пісаць робатаў, пад рашэнне ўласных задач.

Змест

Калі вы цікавіцеся аналізам дадзеных магчыма вам будуць цікавыя мае тэлеграма и YouTube каналы. Большая частка кантэнту якіх прысвечаны мове R.

  1. Стварэнне тэлеграм бота
  2. Ўстаноўка пакета для працы з тэлеграм ботам на R
  3. Адпраўка паведамленняў з R у Telegram
  4. Настройка раскладу запуску праверкі задач
  5. Заключэнне

Стварэнне тэлеграм бота

Для пачатку нам трэба стварыць робата. Робіцца гэта з дапамогай спецыяльнага бота БотБацька, пераходзім па спасылцы і пішам боту /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"))).

І дадайце ў яго наступны радок.

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

Далей вы можаце выкарыстоўваць захаваны ў зменным асяроддзі токен з дапамогай функцыі bot_token(), г.зн. вось так:

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

метад getUpdates()дазваляе нам атрымаць абнаўленні бота, г.зн. паведамленні якія былі яму адпраўлены. Метад from_chat_id(), дазваляе атрымаць ідэнтыфікатар чата, з якога было даслана паведамленне. Гэты ідэнтыфікатар нам патрэбен для адпраўкі паведамленняў ад робата.

Апроч id чата з аб'екта атрыманага метадам getUpdates() вы атрымліваеце і некаторую іншую карысную інфармацыю. Напрыклад, інфармацыю аб карыстальніку, які даслаў паведамленне.

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"

Такім чынам, на дадзеным этапе ў нас ужо ёсць усё, што неабходна для адпраўкі паведамлення ад робата ў тэлеграм. Скарыстаемся метадам sendMessage(), у які неабходна перадаць ідэнтыфікатар чата, тэкст паведамлення, і тып разметкі тэксту паведамлення. Тып разметкі можа быць Markdown або HTML і ўстанаўліваецца аргументам parse_mode.

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

Асновы фарматавання Markdown разметкі:

  • Тоўсты шрыфт вылучаецца з дапамогай знака *:
    • прыклад: *жирный шритф*
    • вынік: тоўсты шрытф
  • Курсіў задаецца ніжнім падкрэсленнем:
    • прыклад: _курсив_
    • вынік: курсіў
  • Манашырынны шрыфт, якім звычайна вылучаецца праграмны код, задаецца з дапамогай апострафаў -`:
    • прыклад: `манашырынны шрыфт`
    • вынік: моноширинный шрифт

Асновы фарматавання HTML разметкі:
У HTML вы заварочваеце частку тэксту, якую трэба вырабіць, у тэгі, прыклад <тег>текст</тег>.

  • <тэг> - які адкрывае тэг
  • - які зачыняе тэг

Тэгі HTML разметкі

  • <b> - тлусты шрыфт
    • прыклад: <b>жирный шрифт</b>
    • вынік тоўсты шрыфт
  • <i> - курсіў
    • прыклад: <i>курсив</i>
    • вынік: курсіў
  • — моноширинный шрифт
    • прыклад: моноширинный шрифт
    • вынік: моноширинный шрифт

Акрамя тэксту вы можаце адпраўляць і іншы кантэнт выкарыстоўваючы спецыяльныя метады:

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

Г.зн. напрыклад з дапамогай метаду sendPhoto() вы можаце адправіць захаваны ў выглядзе выявы графік, які вы пабудавалі з дапамогай пакета ggplot2.

Праверка планавальніка задач Windows, і адпраўка апавяшчэння аб задачах, праца якіх была завершана аварыйна

Для працы з планавальнікам заданняў Windows вам неабходна ўсталяваць пакет taskscheduleR, і для зручнасці працы з дадзенымі ўсталюем пакет dplyr.

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

Далей з дапамогай функцыі taskscheduler_ls() мы запытваем інфармацыю аб задачах з нашага планавальніка. З дапамогай функцыі filter() з пакета dplyr мы прыбіраем са спісу задач тыя, якія былі паспяхова выкананы і маюць статус апошняга выніку 0, і тыя, якія яшчэ ні разу не запускаліся і маюць статус 267011, выключаныя задачы, і задачы якія выконваюцца ў дадзены момант.

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

У аб'екце 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"

Прыклад чытання зменных з канфіга ў 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

Наладжваем расклад запуску праверкі задач

Найбольш падрабязна працэс наладкі запуску скрыптоў па раскладзе апісаны ў гэтай артыкуле. Тут я толькі апішу крокі, якія для гэтага трэба выканаць. Калі які-небудзь з крокаў вам не зразумелы, то звернецеся да артыкула на якую я паказаў спасылку.

Выкажам здагадку, што мы захавалі код нашага робата ў файл check_bot.R. Для таго, каб запланаваць рэгулярны запуск гэтага файла выканайце наступныя крокі:

  1. Прапішыце ў сістэмную зменную Path шлях да тэчкі ў якой усталяваны R, у Windows шлях будзе прыкладна такім: C:Program FilesRR-4.0.2bin.
  2. Стварыце выкананы bat файл, у якім будзе ўсяго адзін радок R CMD BATCH C:rscriptscheck_botcheck_bot.R. Замяніце C:rscriptscheck_botcheck_bot.R на поўны шлях да вашага R файле.
  3. Далей наладзьце з дапамогай планавальніка задач Windows расклад запуску, напрыклад на кожныя падлогу гадзіны.

Заключэнне

У гэтым артыкуле мы разабраліся з тым, як стварыць робата, і адпраўляць з яго дапамогай розныя апавяшчэння ў telegram.

Я апісаў задачу кантролю планавальніка заданняў Windows, але вы можаце выкарыстоўваць матэрыял гэтага артыкула для адпраўкі любых апавяшчэнняў, ад прагнозу надвор'я да каціровак акцый на фондавай біржы, т.я. R дазваляе вам падлучыцца да велізарнай колькасці крыніц дадзеных.

У наступным артыкуле мы з вамі разбярэмся з тым, як дадаць робату каманды і клавіятуру, для таго, што ён мог не толькі адпраўляць апавяшчэнні, але і выконваць больш складаныя дзеянні.

Крыніца: habr.com

Дадаць каментар