Пишемо 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. Висновок

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

Для початку нам необхідно створити бота. Робиться це за допомогою спеціального робота BotFather, переходимо по за посиланням і пишемо боту /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 розклад запуску, наприклад, на кожні півгодини.

Висновок

У цій статті ми розібралися з тим, як створити бота, і надсилати за його допомогою різні повідомлення у телеграм.

Я описав завдання контролю планувальника завдань Windows, але ви можете використовувати матеріал цієї статті для відправлення будь-яких повідомлень, від прогнозу погоди до котирувань акцій на фондовій біржі, т.к. R дозволяє підключитися до величезної кількості джерел даних.

У наступній статті ми з вами розберемося з тим, як додати роботу команди і клавіатуру, для того, що він міг не тільки надсилати повідомлення, але й виконувати більш складні дії.

Джерело: habr.com

Додати коментар або відгук