Пишување бот за телеграма во R (дел 1): Создавање бот и користење за испраќање пораки во телеграма

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

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

Во суштина, можете да користите телеграма за да извршите какви било операции преку бот: испраќање или барање податоци, извршување задачи на серверот, собирање информации во базата на податоци, испраќање е-пошта итн.

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

Пишување бот за телеграма во R (дел 1): Создавање бот и користење за испраќање пораки во телеграма

Во оваа прва статија ќе откриеме како да креираме бот за телеграма и да го користиме за испраќање известувања во телеграма.

Како резултат на тоа, ќе имаме бот кој ќе го провери статусот на последното извршување на сите задачи во Распоредувачот на задачи на Windows и ќе ви испраќа известувања доколку некоја од нив не успее.

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

содржина

Ако сте заинтересирани за анализа на податоци, можеби ќе ве интересира мојата телеграма и YouTube канали. Најголем дел од содржината е посветена на јазикот Р.

  1. Креирање на бот за телеграма
  2. Инсталирање пакет за работа со телеграм бот во Р
  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 и околината за развој на RStudio. Ако ова не е случај, тогаш можете да го погледнете ова видео упатство за тоа како да ги инсталирате.

За да работиме со Telegram Bot API, ќе го користиме пакетот R телеграма.бот.

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

Можете да дознаете повеќе за инсталирање на различни пакети од ова видео.

Откако ќе го инсталирате пакетот, треба да го поврзете:

library(telegram.bot)

Испраќање пораки од R на Telegram

Ботот што го создадовте може да се најде во Telegram користејќи го најавувањето наведено при креирањето, во мојот случај тоа е @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(), ви овозможува да го добиете 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(), во кој треба да ги пренесете ID на разговор, текстот на пораката и типот на означување на текстот на пораката. Типот на обележување може да биде 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 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.

Сè што ни останува е да го испратиме овој резултат преку телеграма.

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 на разговор во кодот.

Можете да додадете услови за филтрирање задачи, на пример, да ги проверите само оние задачи што сте ги создале, со исклучок на системските.

Можете исто така да ставите различни поставки во посебна конфигурациска датотека и да ги зачувате ID и токенот за разговор во неа. Можете да ја прочитате конфигурацијата, на пример, користејќи го пакетот configr.

Пример ini config

[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. Напишете ја патеката до папката во која е инсталирана 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 Task Scheduler за да поставите распоред за стартување, на пример, на секои половина час.

Заклучок

Во оваа статија, сфативме како да креираме бот и да го користиме за испраќање разни известувања во телеграма.

Ја опишав задачата за следење на Распоредувачот на задачи на Windows, но можете да го искористите материјалот во оваа статија за да испратите какви било известувања, од временска прогноза до цени на акции на берзата, бидејќи R ви овозможува да се поврзете со огромен број на извори на податоци.

Во следната статија, ќе откриеме како да додадеме команди и тастатура на ботот за да може не само да испраќа известувања, туку и да врши посложени дејства.

Извор: www.habr.com

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