Аудитория на Telegram расте ежедневно с геометрична прогресия, което се дължи на удобството на месинджъра, наличието на канали, чатове и разбира се, възможността за създаване на ботове.
Ботовете могат да се използват с напълно различни цели - от автоматизация на комуникацията с вашите клиенти до управление на собствените ви задачи.
Всъщност с помощта на бот в Telegram можете да извършвате всякакви операции: да изпращате или запитвате данни, да стартирате задачи на сървъра, да събирате информация в база данни, да изпращате електронни писма и така нататък.
Планирам да напиша поредица от статии за това как да работим с , и да пишем ботове според своите нужди.

В тази, първа статия, ще разберем как да създадем Telegram бот и как да изпращаме с негова помощ уведомления в Telegram.
В резултат на това ще имаме бот, който ще проверява статуса на последното изпълнение на всички задачи в планираното време на Windows и ще ви изпраща уведомления, ако някои от тях завършат с грешка.
Но целта на тази поредица статии не е да ви научи как да пишете бот за определена, тясна задача, а по-скоро да ви запознае със синтаксиса на пакета telegram.bot, и с примери на код, с чиято помощ вие ще можете да пишете ботове за решаване на собствените си задачи.
Съдържание
Ако се интересувате от анализ на данни, вероятно ще ви бъдат интересни моите и канали. Голямата част от съдържанието, което се отнася до езика R.
Създаване на Telegram бот
Първо, трябва да създадем бот. Това става с помощта на специален бот BotFather, преминаваме по и пишем на бота /start.
След което ще получите съобщение със списък с команди:
Съобщение от BotFather
Мога да ви помогна да създадете и управлявате Telegram ботове. Ако сте нови в Bot API, моля, вижте ръководството (https://core.telegram.org/bots).
Можете да ме контролирате, като изпратите тези команди:
/newbot - създайте нов бот
/mybots - редактирайте вашите ботове [бета]
Редактиране на ботове
/setname - променете името на бота
/setdescription - променете описанието на бота
/setabouttext - променете информацията за бота
/setuserpic - променете профилната снимка на бота
/setcommands - променете списъка с команди
/deletebot - изтрийте бот
Настройки на бота
/token - генерирайте токен за авторизация
/revoke - оттеглете токена за достъп на бота
/setinline - превключете режима на вграждане (https://core.telegram.org/bots/inline)
/setinlinegeo - превключете заявките за местоположение в режим на вграждане (https://core.telegram.org/bots/inline#location-based-results)
/setinlinefeedback - променете настройките за обратна връзка в режим на вграждане (https://core.telegram.org/bots/inline#collecting-feedback)
/setjoingroups - може ли вашият бот да бъде добавен в групи?
/setprivacy - превключете режима на поверителност (https://core.telegram.org/bots#privacy-mode) в групи
Игри
/mygames - редактирайте вашите игри (https://core.telegram.org/bots/games) [бета]
/newgame - създайте нова игра (https://core.telegram.org/bots/games)
/listgames - получете списък с вашите игри
/editgame - редактирайте игра
/deletegame - изтрийте съществуваща играИзпратете командата, за да създадете нов бот /newbot.
BotFather ще ви помоли да въведете име и потребителско име на бота.
BotFather, [25.07.20 09:39]
Добре, нов бот. Как ще го наречем? Моля, изберете име за вашия бот.
Алексей Селезнев, [25.07.20 09:40]
Моят тестов бот
BotFather, [25.07.20 09:40]
Добре. Сега нека да изберем потребителско име за вашия бот. То трябва да завършва на `bot`. Например: TetrisBot или tetris_bot.
Алексей Селезнев, [25.07.20 09:40]
@my_test_botИмето можете да въведете произволно, но потребителското име трябва да завършва на bot.
Ако всичко е направено правилно, ще получите следното съобщение:
Готово! Поздравления за новия ви бот. Можете да го намерите на t.me/my_test_bot. Сега можете да добавите описание, раздел За нас и профилна снимка за вашия бот, вижте /help за списък с команди. Между другото, когато завършите създаването на вашия страхотен бот, свържете се с нашата Поддръжка на бота, ако искате по-добро потребителско име за него. Просто се уверете, че ботът функционира напълно, преди да го направите.
Използвайте този токен за достъп до HTTP API:
123456789:abcdefghijklmnopqrstuvwxyz
За описание на Bot API, вижте тази страница: https://core.telegram.org/bots/apiСлед това ще ви е необходим полученият API токен, в примера ми това е 123456789:abcdefghijklmnopqrstuvwxyz.
На този етап подготовките за създаването на бота са завършени.
Инсталиране на пакета за работа с Telegram бот на R
Предполагам, че вече имате инсталиран езика R и средата за разработка RStudio. Ако не е така, можете да гледате този за това как да ги инсталирате.
За работа с Telegram Bot API ще използваме R пакета .
Инсталирането на пакети в 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] "Алексей"
$last_name
[1] "Селезнев"
$username
[1] "АлексейСелезнев"
$language_code
[1] "ru"И така, на този етап ние вече имаме всичко необходимо за изпращане на съобщение от бота в Telegram. Нека използваме метода sendMessage(), в който е необходимо да се предаде идентификаторът на чата, текстът на съобщението и типът на форматирането на текста на съобщението. Типът на форматирането може да бъде Markdown или HTML и се задава с аргумент parse_mode.
# Отправка сообщения
bot$sendMessage(chat_id,
text = "Привет, *жирный текст* _курсив_",
parse_mode = "Markdown"
)Основи на форматирането на Markdown:
- Удебелен текст се изтъква с помощта на знака *:
- пример:
*удебелен текст* - резултат: удебелен текст
- пример:
- Курсивът се задава с долна черта:
- пример:
_курсив_ - резултат: курсив
- пример:
- Моноширинният шрифт, с който обикновено се изтъква код, се задава с апострофи — `:
- пример: `моноширинен шрифт`
- резултат:
моноширинен шрифт
Основи на форматирането на HTML:
В HTML обграждате част от текста, която искате да изтъкнете, в тагове, например тексттег>.
- — отварящ таг
- тег> — затварящ таг
Таговете на HTML
<b>— удебелен текст- пример:
<b>дебел шрифт</b> - резултат дебел шрифт
- пример:
— курсив- пример:
курсив - резултат: курсив
- пример:
— моноширинен шрифт- пример:
моноширинен шрифт - резултат:
моноширинен шрифт
- пример:
Освен текст можете да изпращате и друго съдържание, използвайки специални методи:
# Отправить изображение
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 Task Scheduler и изпращане на уведомление за задачи, завършили с грешка
За работа с Windows Task Scheduler необходимо е да инсталирате пакета 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.
Всичко, което ни остава — е да изпратим този резултат в Telegram.
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. За да планирате регулярно стартиране на този файл, изпълнете следните стъпки:
- Добавете в системната променлива 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 ви позволява да се свържете с огромно количество източници на данни.
В следващата статия ще се запознаем с това как да добавим команди и клавиатура на бота, за да може той не само да изпраща уведомления, но и да извършва по-сложни действия.
Източник: habr.com
