Писање телеграм бота у Р (1. део): Креирање бота и његово коришћење за слање порука у телеграму

Публика Телеграма експоненцијално расте сваким даном, што је олакшано погодношћу месинџера, присуством канала, ћаскања и наравно могућношћу креирања ботова.

Ботови се могу користити у потпуно различите сврхе, од аутоматизације комуникације са вашим клијентима до управљања сопственим задацима.

У суштини, можете користити телеграм за обављање било које операције преко бота: слање или захтевање података, покретање задатака на серверу, прикупљање информација у бази података, слање е-поште итд.

Планирам да напишем серију чланака о томе како радити са АПИ за телеграм бот, и пишите ботове који одговарају вашим потребама.

Писање телеграм бота у Р (1. део): Креирање бота и његово коришћење за слање порука у телеграму

У овом првом чланку ћемо схватити како да креирамо телеграм бот и да га користимо за слање обавештења у телеграму.

Као резултат тога, имаћемо бота који ће проверавати статус последњег извршења свих задатака у Виндовс Таск Сцхедулер-у и слати вам обавештења ако неки од њих није успео.

Али сврха ове серије чланака није да вас научи како да напишете бота за одређени, уски задатак, већ да вас уопштено упозна са синтаксом пакета telegram.bot, и примере кода помоћу којих можете писати ботове за решавање сопствених проблема.

Садржина

Ако сте заинтересовани за анализу података, можда ће вас занимати моја телеграм и ИоуТубе канала. Већина садржаја је посвећена Р језику.

  1. Креирање телеграм бота
  2. Инсталирање пакета за рад са телеграм ботом у Р
  3. Слање порука са Р на Телеграм
  4. Подешавање распореда за покретање скенирања задатака
  5. Закључак

Креирање телеграм бота

Прво, треба да направимо бота. Ово се ради помоћу посебног бота БотФатхер, Иди на веза и пишите боту /start.

Након тога ћете добити поруку са листом команди:

Порука од БотФатхер-а

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, [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

Затим ће вам требати примљени АПИ токен, у мом примеру јесте 123456789:abcdefghijklmnopqrstuvwxyz.

На овом кораку припремни рад за креирање бота је завршен.

Инсталирање пакета за рад са телеграм ботом у Р

Претпостављам да већ имате инсталиран Р језик и развојно окружење РСтудио. Ако то није случај, онда можете погледати ово видео туториал о томе како да их инсталирате.

За рад са Телеграм Бот АПИ-јем користићемо Р пакет телеграм.бот.

Инсталирање пакета у Р се врши помоћу функције install.packages(), па да инсталирате пакет који нам је потребан, користите команду install.packages("telegram.bot").

Можете сазнати више о инсталирању различитих пакета са овај видео.

Након инсталирања пакета, потребно је да га повежете:

library(telegram.bot)

Слање порука са Р на Телеграм

Бот који сте креирали се може наћи у Телеграму користећи логин који је наведен током креирања, у мом случају јесте @my_test_bot.

Пошаљите боту било коју поруку, на пример „Хеј, бот“. Ово нам је тренутно потребно да бисмо добили ИД вашег ћаскања са ботом.

Сада пишемо следећи код у Р.

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("~")) текстуалну датотеку са именом .Ренвирон. То можете урадити и помоћу команде 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"

Дакле, у овој фази већ имамо све што нам је потребно да пошаљемо поруку од бота Телеграму. Хајде да користимо метод sendMessage(), у који треба да проследите ИД ћаскања, текст поруке и тип ознаке текста поруке. Тип ознаке може бити Маркдовн или ХТМЛ и постављен је аргументом parse_mode.

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

Основе форматирања Маркдовн:

  • Подебљани фонт је истакнут са *:
    • пример: *жирный шритф*
    • резултат: масним словима
  • Курзив је означен доњом цртом:
    • пример: _курсив_
    • резултат: курзив
  • Једноразредни фонт, који се обично користи за истицање програмског кода, наведен је помоћу апострофа - `:
    • пример: `моноспаце фонт`
    • резултат: моноширинный шрифт

Основе форматирања ХТМЛ ознаке:
У ХТМЛ-у умотавате део текста који треба да буде истакнут у таговима, на пример <тег>текст</тег>.

  • <таг> - почетна ознака
  • - завршна ознака

ХТМЛ ознаке за означавање

  • <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.

Провера Виндовс планера задатака и слање обавештења о задацима који су неуобичајено прекинути

Да бисте радили са Виндовс Таск Сцхедулер-ом, потребно је да инсталирате пакет 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 Сада имамо листу задатака који нису успели, треба да пошаљемо ову листу Телеграму.

Ако детаљније погледамо сваку команду, онда:

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

}

Када користите горњи пример, замените свој токен бота и свој ИД за ћаскање у код.

Можете додати услове за филтрирање задатака, на пример, проверу само оних задатака које сте креирали, искључујући системске.

Такође можете да ставите различита подешавања у засебну конфигурациону датотеку и да сачувате ИД ћаскања и токен у њој. Можете прочитати конфигурацију, на пример, користећи пакет configr.

Пример ини конфигурације

[telegram_bot]
;настройки телеграм бота и чата, в который будут приходить уведомления
chat_id=12345678
bot_token=123456789:abcdefghijklmnopqrstuvwxyz"

Пример читања променљивих из конфигурације у Р

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. Напишите путању до фасцикле у којој је Р инсталиран у системску променљиву Путања; у Виндовс-у, путања ће бити отприлике овако: C:Program FilesRR-4.0.2bin.
  2. Креирајте извршну бат датотеку са само једном линијом R CMD BATCH C:rscriptscheck_botcheck_bot.R. Заменити C:rscriptscheck_botcheck_bot.R до пуне путање до ваше Р датотеке.
  3. Затим користите Виндовс Таск Сцхедулер да подесите распоред покретања, на пример, сваких пола сата.

Закључак

У овом чланку смо схватили како да креирамо бота и користимо га за слање различитих обавештења у телеграму.

Описао сам задатак надгледања Виндовс Таск Сцхедулер-а, али материјал из овог чланка можете користити за слање било каквих обавештења, од временске прогнозе до берзанских котација на берзи, јер Р вам омогућава да се повежете са огромним бројем извора података.

У следећем чланку ћемо схватити како да додамо команде и тастатуру боту тако да не само да може да шаље обавештења, већ и да обавља сложеније радње.

Извор: ввв.хабр.цом

Додај коментар