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

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

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

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

Планирам да напиша серия от статии за това как да работим с R в R. API за телеграм бот, и пишете ботове за вашите нужди.

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

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

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

Но целта на тази поредица от статии не е да ви научи как да напишете бот за конкретна, тясна задача, а да ви запознае със синтаксиса на пакета като цяло. 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. Ако това не е така, тогава можете да погледнете това urok видео как да ги инсталирате.

За да работим с API на Telegram Bot, ще използваме R пакета telegram.bot.

Инсталирането на пакети в R се извършва от функцията install.packages(), така че за да инсталираме необходимия ни пакет, използвайте командата install.packages("telegram.bot").

За повече информация относно инсталирането на различни пакети вижте това видео.

След като инсталирате пакета, трябва да го свържете:

library(telegram.bot)

Изпращане на съобщения от R към Telegram

Създаденият от вас бот може да бъде намерен в Telegram с помощта на данните за влизане, посочени по време на създаването, в моя случай е така @my_test_bot.

Изпратете произволно съобщение до бота, като например „Здравей, бот“. В момента имаме нужда от това, за да получим идентификатора на вашия чат с бота.

Сега в 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(), ви позволява да получите идентификатора на чата, от който е изпратено съобщението. Нуждаем се от този идентификатор, за да изпращаме съобщения от бота.

В допълнение към идентификатора на чата от обекта, получен от метода 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"

Така че на този етап вече имаме всичко необходимо за изпращане на съобщение от бота до telegram. Нека използваме метода sendMessage(), на който трябва да предадете идентификатора на чата, текста на съобщението и типа на маркиране на текста на съобщението. Типът маркиране може да бъде Markdown или HTML и се задава от аргумента parse_mode.

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

Основи на форматирането на Markdown:

  • Удебеленият шрифт е маркиран с *:
    • Например: *жирный шритф*
    • резултат: удебелен скрипт
  • Курсивът е даден с долна черта:
    • Например: _курсив_
    • резултат: курсив
  • Шрифтът с фиксиран интервал, който обикновено се използва за подчертаване на програмния код, се определя с помощта на апострофи - `:
    • пример: `monospace font`
    • резултат: моноширинный шрифт

Основи на форматирането на HTML маркиране:
В HTML увивате частта от текста, която искате да маркирате, в тагове, например <тег>текст</тег>.

  • <tag> — отварящ етикет
  • - затварящ етикет

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 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"

Пример за четене на променливи от config в 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. Напишете пътя до папката, в която е инсталиран R в системната променлива Path, в 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 Task Scheduler, но можете да използвате материала в тази статия, за да изпратите всяко известие, от прогнозата за времето до борсовите котировки на борсата, т.к. R ви позволява да се свържете с огромен брой източници на данни.

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

Източник: www.habr.com

Добавяне на нов коментар