Създаваме telegram бот на езика R (част 1): Създаваме бота и изпращаме съобщения с него в telegram.

Аудитория на Telegram расте ежедневно с геометрична прогресия, което се дължи на удобството на месинджъра, наличието на канали, чатове и разбира се, възможността за създаване на ботове.

Ботовете могат да се използват с напълно различни цели - от автоматизация на комуникацията с вашите клиенти до управление на собствените ви задачи.

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

Планирам да напиша поредица от статии за това как да работим с Telegram Bot API, и да пишем ботове според своите нужди.

Създаваме telegram бот на езика R (част 1): Създаваме бота и изпращаме съобщения с него в telegram.

В тази, първа статия, ще разберем как да създадем Telegram бот и как да изпращаме с негова помощ уведомления в Telegram.

В резултат на това ще имаме бот, който ще проверява статуса на последното изпълнение на всички задачи в планираното време на Windows и ще ви изпраща уведомления, ако някои от тях завършат с грешка.

Но целта на тази поредица статии не е да ви научи как да пишете бот за определена, тясна задача, а по-скоро да ви запознае със синтаксиса на пакета telegram.bot, и с примери на код, с чиято помощ вие ще можете да пишете ботове за решаване на собствените си задачи.

Съдържание

Ако се интересувате от анализ на данни, вероятно ще ви бъдат интересни моите telegram и youtube канали. Голямата част от съдържанието, което се отнася до езика R.

  1. Създаване на Telegram бот
  2. Инсталиране на пакета за работа с Telegram бот на R
  3. Изпращане на съобщения от R в Telegram
  4. Настройка на графика за проверка на задачите
  5. Заключение

Създаване на 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 пакета 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] "Алексей"

$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. За да планирате регулярно стартиране на този файл, изпълнете следните стъпки:

  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

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster