Ð Bot
áááºážááá¯á¡áá¯á¶ážááŒá¯á áááºáá±á·áá»áºááá¯á·áááºážáá»á¬ážááᯠáááºážááŸá®ážáá¬áá²á·áááºá
á€áá±á¬ááºážáá«ážááœáẠáá»áœááºá¯ááºááẠá€á¡ááŒá±á¬ááºážá¡áá¬ááᯠáááºáááºáá±ážáá¬ážáá¬ážáá±á¬ááŒá±á¬áá·áº á€áá±á¬ááºážáá«ážááᯠáááºááŒá®ážááŸáᬠá
áááºáááºááŸá¯ááẠá¡ááŒá¶ááŒá¯ááá¯áá«áááºá
á€áá
áºááŒáááºááœáẠáá»áœááºá¯ááºááá¯á·ááẠáá»áœááºá¯ááºááá¯á·á bot ááᯠáááºááá¯á·ááŒááºáááºá¡áááºááœááºážááááºááᯠá¡ááŒá±ááŸá¬ááŒá®áž áááºážááœáẠcommand support áá±á«ááºážááá·áºáᬠá¡áááºážááŸáá·áºáááºáž áááºážááŸá®ážá
á±áááºááŒá
áºáááºá Updater
.
áá±á¬ááºážáá«ážááááºáááºážáá¬áá¡ááœááºážá áá»áœááºá¯ááºááá¯á·ááẠááá¯ážááŸááºážáá±á¬ áá±á¬á·ááºáá»á¬ážá
áœá¬ááᯠáá±ážáá¬ážáááºááŒá
áºááŒá®ážá áá±á¬ááºááá¯ááºážááœáẠáá±ážáá¬ážáá±á¬ áááºá
áœá²ááŸáá·áº ááá¯ááºáá¶áá¯ááºáá±á«áºááœáẠá¡ááŒá±áá¶á áá±ážáá¬ážáá±á¬ ááá¯ááºáá¶áá
áºáá¯á áá
áºáááºááẠááááºááẠááá¯á·ááá¯áẠáá¯ááºáá¯ááºáá±ážááŒáá¹áááááºá¡á á¡áá¯ááºáá»áááºááŒá
áºáááŒá
Ạáá¯á¶ážááŒááºáááºááŒá
áºáááºá ááá¯á·áá±á¬áº ááááºáá²á·ááá¯á·áááºá áá±á¬ááºážáá«ážá áááºááœááºáá»ááºááŸá¬ package interface ááŸáá·áº áááºážááŸá®ážá
á±áááºááŒá
áºáááºá telegram.bot
ááá·áºááá¯ááºááá¯ááºááŒá¿áá¬áá»á¬ážááá¯ááŒá±ááŸááºážáááºá
á á®ážáá®áž "ááŒá±ážáááºážá á¬ááá¯ááºá ááºááᯠR ááŒáá·áºáá±ážáá¬ážááŒááºáž" á á®ážáá®ážá០áá±á¬ááºážáá«ážáá»á¬ážá¡á¬ážáá¯á¶áž
áá»áœááºá¯ááºááá¯á·ááẠáá±á¬á·ááºáá áºáá¯ááᯠáááºáá®ážááŒá®áž áááºáá®ááááºááŒáá·áº á á¬ááá¯áá±ážááá¯á·ááẠáááºážááᯠá¡áá¯á¶ážááŒá¯áááºá áá±á¬á·ááºááá¯á· á¡áááá·áºáá±ážááŸá¯ááŸáá·áº áááºáá±á·áá»áº á á áºáá¯ááºááŸá¯áá»á¬ážááᯠááá·áºáá«á
á¡ááŒá±á¬ááºážá¡áá¬
áá±áá¬ááœá²ááŒááºážá
áááºááŒá¬ááŒááºážááᯠá
áááºáááºá
á¬ážáá«á áá»áœááºá¯ááºááᯠá
áááºáááºá
á¬ážáá±áááºá
Updater á¡áááºáž ááá¯ááºááœááºáá°áá»á¬áž - ááá¯ááºááœááºáá°áá»á¬áž ááááá¯á¶áž command ááᯠbotá command handler ááá¯á·ááá·áºáá«á á á¬áá¬ážáááºáá±á·áá»áº áááá¯áááºáá¬ááŸáá·áº á á áºáá¯ááºááŸá¯áá»á¬áž Parameters áá»á¬ážááŒáá·áº Command áá»á¬ážááá·áºááŒááºážá áá±á¬ááºáá¶ááœáẠbot ááᯠrun áá±á¬ááºáá»ááº
Updater á¡áááºáž
Updater
áááºáá®áááẠbot áá
áºáá¯ááᯠáá®ááœááºáááºááŸáá·áº áá±á¬ááºá¡á±á¬ááºááŸá á¡áááºážááᯠá¡áá¯á¶ážááŒá¯ááẠááá·áºá¡ááœáẠááá¯ááá¯ááœááºáá°á
á±ááá·áº á¡áááºážáá
áºáá¯ááŒá
áºáááºá Dispetcher
. á¡áááºážáá¬ááẠUpdater
bot á០updates áá»á¬ážááá¯áááºáá¶áááŸááááºááŒá
áºááẠ(ááááºáá±á¬ááºážáá«ážááœááºá€áááºááœááºáá»ááºá¡ááœááºáááºážáááºážááá¯áá»áœááºá¯ááºááá¯á·á¡áá¯á¶ážááŒá¯áá²á·áááºá getUpdates()
) ááŸáá·áº áááºážááá¯á·ááᯠáááºáá¶ááœáŸá²ááŒá±á¬ááºážáá«á Dispetcher
.
áááºážáá¡ááŸáá·áºá Dispetcher
áááºáááºáá®ážáá¬ážáá±á¬ áááºááá¯ááºáá»á¬ážáá«ááŸááááºá ááá¯ááá¯áááºááŸá¬á á¡áááºážá¡áá¬ááá¹áᯠHandler
.
ááá¯ááºááœááºáá°áá»á¬áž - ááá¯ááºááœááºáá°áá»á¬áž
áááºááá·áºááœááºážáá¬ážáá±á¬ áááºááá¯ááºáááááá¬áá»á¬ážááŒáá·áº Dispetcher
á¡áá»áá¯ážáá»áá¯ážáá±á¬ááŒá
áºáááºáá»á¬ážá¡ááœáẠbot áá¯á¶á·ááŒááºááŸá¯á áá®áá±á¬ááºážáá«ážáá±ážáá²á· á¡áá»áááºááŸá¬ telegram.bot
á¡á±á¬ááºáá« ááá¯ááºááœááºáááááᬠá¡áá»áá¯ážá¡á
á¬ážáá»á¬ážááᯠááá·áºááœááºážáá¬ážáá«áááºá
- MessageHandler â áááºáá±á·áá»áºááá¯ááºááœááºáá°
- CommandHandler - á¡áááá·áºáá±ážáá°
- CallbackQueryHandler â Inline ááŸáá±ážááá¯á·áá±á¬ áá®ážáá¯ááºáá»á¬ážá¡ááœáẠáá±áá¬ááá¯ááºááœááºáá°
- ErrorHandler â bot á០á¡ááºááááºáá»á¬ážááᯠáá±á¬ááºážááá¯áá±á¬á¡áá« á¡ááŸá¬ážááá¯ááºááœááºáá°
ááááá¯á¶áž command ááᯠbotá command handler ááá¯á·ááá·áºáá«á
á¡áááºá áááºááẠbot áá»á¬ážááᯠááááºá ááá¯á¶ážáá°ážáá² command ááẠáá¬áá² ááááá«áá bot ááá¯á· command áá»á¬ážááᯠforward slash ááŒáá·áº áá±ážááá¯á·ááá«áááºá /
ááŸá±á·áááºá¡ááŒá
áºá
áá»áœááºá¯ááºááá¯á·ááẠááá¯ážááŸááºážáá±á¬ command áá»á¬ážááŒáá·áº á
áááºáá«áááºá i.e. command áá²á· hello ááŒá±á¬áááºá¡á±á¬áẠbot ááᯠáááºáá±ážáá¡á±á¬áẠ/hi
.
áá¯áẠ1- áá±á¬á·ááºááᯠááŸá¯ááºáááºá áá¬ážááŒá±á¬áááºá¡á±á¬áẠáááºáá±ážááŒááºážá
library(telegram.bot)
# ÑПзЎаÑÐŒ ÑкзеЌплÑÑ ÐºÐ»Ð°ÑÑа Updater
updater <- Updater('ТÐÐÐÐ ÐÐКÐÐÐ ÐÐТÐ')
# ÐОÑеЌ ЌеÑПЎ ÐŽÐ»Ñ Ð¿ÑОвеÑÑвОÑ
say_hello <- function(bot, update) {
# ÐÐŒÑ Ð¿ÐŸÐ»ÑзПваÑÐµÐ»Ñ Ñ ÐºÐŸÑПÑÑÐŒ МаЎП пПзЎаÑПваÑÑÑÑ
user_name <- update$message$from$first_name
# ÐÑпÑавка пÑОвеÑÑÑвеММПгП ÑППбÑеМОÑ
bot$sendMessage(update$message$chat_id,
text = paste0("ÐÐŸÑ Ð¿ÐŸÑÑеМОе, ", user_name, "!"),
parse_mode = "Markdown")
}
# ÑПзЎаÑÐŒ ПбÑабПÑÑОк
hi_hendler <- CommandHandler('hi', say_hello)
# ЎПбалÑеЌ ПбÑабПÑÑОк в ЎОÑпеÑÑеÑ
updater <- updater + hi_hendler
# запÑÑкаеЌ бПÑа
updater$start_polling()
á¡áááºáá±á¬áºááŒáá« áá¯ááºááá°áá¬ááᯠáá¯ááºáá±á¬ááºáá«á 'YOUR BOT TOKEN' ááᯠáá±á¬á·ááºááá¯áááºáá®ážáá¬ááœáẠáááºáááŸááá±á¬ ááá¯áááºá¡á á áºááŸáá·áº á¡á á¬ážááá¯ážááŒá®ážáá±á¬ááºá BotFather (áá»áœááºáá±á¬áº bot áá áºáá¯ááᯠáááºáá®ážááá¯á· ááŒá±á¬áá²á·áááºá
ááááá±á¬ááºážáá«áž ).
áááºážáááºáž start_polling()
клаÑÑа Updater
áá¯ááºáá¡áá¯á¶ážááœáẠá¡áá¯á¶ážááŒá¯ááá·áºá áá±á¬á·ááºáá¶á០á¡ááºááááºáá»á¬ážááᯠáá±á¬ááºážááá¯ááŒááºážááŸáá·áº áá¯ááºáá±á¬ááºááŒááºážá á¡áá¯á¶ážáá²á·ááŸáá·áºááœááºááᯠá
áááºáááºá
ááᯠTelegram ááá¯ááœáá·áºááŒá®áž áá»áœááºá¯ááºááá¯á·á bot ááá¯á· ááááá¯á¶áž command ááá¯áá±ážááŒáá«á
áá¯á· /hi
.
ááá¯áá»áœááºá¯ááºááá¯á·á bot ááẠcommand ááá¯áá¬ážáááºáááºá /hi
áá«ááá¯á·ááᯠáááºááá¯ááŸá¯ááºáááºááááºááá¯áᬠáááááºá
ááá¯ážááŸááºážáá±á¬ bot áá áºáá¯ááᯠáááºáá±á¬ááºááŒááºáž áá¯ááºáááºážá ááºááᯠááá¬ážááœááºá¡á á¡á±á¬ááºáá«á¡ááá¯ááºáž áá¯á¶áá±á¬áºááá¯ááºáá«áááºá
- á¡áááºážáá¥ááá¬áá
áºáá¯áááºáá®ážáá«á
Updater
; - áá»áœááºá¯ááºááá¯á·ááẠáááºážáááºážáá»á¬ážááᯠáááºáá®ážáááºá i.e. áá»áœááºá¯ááºááá¯á·á bot ááŸáá¯ááºáá±á¬ááºááá·áºáá¯ááºáá±á¬ááºáá»ááºáá»á¬ážá áá¯ááºááá°áá¬ááœáẠá€á¡áá¬ááẠfunction áá
áºáá¯ááŒá
áºáááºá
say_hello()
. bot áááºážáááºážáá»á¬ážá¡ááŒá Ạáááºá¡áá¯á¶ážááŒá¯ááá·áº áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááœáẠááá¯á¡ááºáá±á¬ á¡ááŒá±á¬ááºážááŒáá»ááºááŸá áºáá¯ááŸááááẠ- bot О update ááá¯ááœá±ážáá»ááºááá¯ááºááœáá·áº-á ááŒááºážáá¯á¶ááŸá¯áá»á¬áž. áááºááŒá± botá€á¡áá¬ááẠáááºá áá±á¬á·ááºááŒá áºáááºá áááºážáá¡áá°á¡áá®ááŒáá·áº áááºááẠáááºáá±á·áá»áºáá»á¬ážááᯠá á¬ááŒááºááŒááºážá áááºáá±á·áá»áºááá¯á·ááŒááºáž ááá¯á·ááá¯áẠáá±á¬á·ááºá¡ááœáẠáááŸáááá¯ááºáá±á¬ á¡ááŒá¬ážáááºážáááºážáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯ááá¯ááºáááºá áááºááŒá± update ááᯠáááºážááẠáááºážáááºážááᯠá¡áá¯á¶ážááŒá¯á ááááá±á¬ááºážáá«ážááœáẠá¡áá¯á¶ážááŒá¯áá°áá¶á០bot ááŸáááŸáááá·áºá¡áá¬ááŒá áºáááºágetUpdates()
. áááºááŒá± ááŒááºážáá¯á¶ááŸá¯áá»á¬áž command ááŸáá·áºá¡áá° áá¯á¶ážá áœá²áá°á០áá±ážááá¯á·áá±á¬ á¡ááá¯áá±áá¬ááᯠáááºáá¯ááºáá±á¬ááºááá¯ááºáááºá áá»áœááºá¯ááºááá¯á·ááẠá€á¡ááŒá±á¬ááºážá¡áá¬ááá¯á· á¡áááºážáááºááŒá¬áá±á¬á¡áá« ááŒááºááœá¬ážáá«áááºá - áá»áœááºá¯ááºááá¯á·ááẠáááºááá¯ááºáááááá¬áá»á¬ážááᯠáááºáá®ážáá±ážáááºá ááá¯ááá¯áááºááŸá¬á áá»áœááºá¯ááºááá¯á·ááẠááááºá¡ááá·áºááœáẠáááºáá®ážáá¬ážáá±á¬ áááºážáááºážáá»á¬ážááŸáá·áº á¡áá¯á¶ážááŒá¯áá° áá¯ááºáá±á¬ááºáá»ááºáá»á¬áž á¡áá»áá¯á·ááᯠáááºá
ááºáá±ážáá«áááºá á¡ááŒá±áá¶á¡á¬ážááŒáá·áºá ááá¯ááºááœááºáá°ááẠá¡á
áá»áá¯ážáá
áºáá¯ááŒá
áºááŒá®áž á¡áá»áá¯á·áá±á¬ bot áá¯ááºáá±á¬ááºáá»ááºááᯠáá±á«áºááá·áº ááŒá
áºáááºáá
áºáá¯ááŒá
áºáááºá áá»áœááºá¯ááºááá¯á·áá¥ááá¬ááœááºá ááá¯ááá¯á·áá±á¬á¡á
áá»áá¯ážááŸá¯áá
áºáá¯ááẠá¡áááá·áºáá
áºáá¯áá±ážááá¯á·áá±áááºá
/hi
ááŸáá·áº á¡ááœá²á·á០á¡áá±á¬ááºá¡áááºáá±á¬áºáááºáhi_hendler <- CommandHandler('hi', say_hello)
. ááááá¯á¶áž function á¡ááŒááºážá¡áá¯á¶CommandHandler()
áá»áœááºá¯ááºááá¯á·áááá á¹á ááœááºá áááºááẠcommand ááá¯áááºááŸááºáááºááœáá·áºááŒá¯áááºáhi
bot á áá¯á¶á·ááŒááºáá«áááá·áºáááºá áá¯áááá¡ááŒááºážá¡áá¯á¶ááẠááá·áºá¡á¬áž bot method ááá¯áááºááŸááºááœáá·áºááŒá¯áááºá áá»áœááºá¯ááºááá¯á·ááẠmethod ááá¯áá±á«áºáá«áááºásay_hello
á¡áá¯á¶ážááŒá¯áá°á áááá¡ááŒááºážá¡áá¯á¶ááœáẠáááºááŸááºáá¬ážááá·áº command ááᯠáá±á«áºáá«áá - ááá¯á·áá±á¬ááºá áá»áœááºá¯ááºááá¯á·ááẠáá»áœááºá¯ááºááá¯á·á class instance á dispatcher ááá¯á· áááºáá®ážáá¬ážáá±á¬ handler ááᯠáá±á«ááºážááá·áºáá«áááºá
Updater
. ááá¯ááºááœááºáá°á¡á¬áž áááºážáááºážáá»á¬ážá áœá¬ááŒáá·áº áááºááá·áºááœááºážááá¯ááºáááºá á¡áááºáá±á¬áºááŒáá« á¥ááá¬ááœááºá áá»áœááºá¯ááºááẠá¡ááá¯ážááŸááºážáá¯á¶ážáá áºáá¯ááᯠááááááºááá¹ááá¬ááᯠá¡áá¯á¶ážááŒá¯áá¬ážáááºá+
, IEupdater <- updater + hi_hendler
. áááºážáááºážááᯠá¡áá¯á¶ážááŒá¯ááááºáž á¡áá¬ážáá° áá¯ááºáá±á¬ááºááá¯ááºáááºáadd_handler()
á¡áááºážááá¯ááºáDispatcher
á€áá²á·ááá¯á·áá±á¬áááºážáááºážááá¯áááºááœá±á·ááá¯ááºáááº-updater$dispatcher$add_handler()
; - command ááá¯á¡áá¯á¶ážááŒá¯á bot ááá¯ááœáá·áºáá«á
start_polling()
.
á á¬áá¬ážáááºáá±á·áá»áº áááá¯áááºáá¬ááŸáá·áº á á áºáá¯ááºááŸá¯áá»á¬áž
bot ááá¯á· command áá»á¬áž áááºááá¯á·áá±ážááá¯á·ááááºááᯠáá»áœááºá¯ááºááá¯á· ááŸá¬ááœá±ááœá±á·ááŸááá²á·áá±á¬áºáááºáž áá áºáá«áá áºáá¶ááœáẠcommand áá»á¬ážááá¯áá¬áá áá¯á¶ááŸááºá á¬áá¬ážáááºáá±á·ááºá»á¡áá»áá¯á·ááá¯áá« áá¯á¶á·ááŒááºááẠbot ááᯠááá¯á¡ááºáá«áááºá áááºážááá¯áá¯ááºáá±á¬ááºááẠáááºááẠáááºáá±á·áá»áºááá¯ááºááœááºáá°áá»á¬ážááᯠâ á¡áá¯á¶ážááŒá¯áááºááá¯á¡ááºáááºá MessageHandler.
áá¬ááẠMessageHandler áááºáá¬áá±á¬ áááºáá±á·áá»áºáá»á¬ážá¡á¬ážáá¯á¶ážááᯠáá¯á¶ážááá¯á¶á·ááŒááºáá«áááºá ááá¯á·ááŒá±á¬áá·áºá áááºáá±á·áá»áºááá¯ááºááœááºáá°áá»á¬ážááᯠá
á
áºáá¯ááºááŸá¯áá»á¬ážááŸáá·áº ááœá²áá¯á¶ážáá±á·ááŸááááºá áá±á¬á·ááºááᯠá¡áááá·áºáá±ážáá¯á¶áá¬áá ááŸá¯ááºáááºá
áá¬ážááŒá±á¬áááºá¡á±á¬áẠáááºáá±ážááŒáá«á
áá¯á· /hi
bot ááá¯á· áá±ážááá¯á·áá±á¬ áááºáá±á·áá»áºááœáẠá¡á±á¬ááºáá«á
áá¬ážáá¯á¶ážáá»á¬áž áá±á«áºáá¬ááá·áºá¡áá«ááá¯ááºáž- hello, hello, salute, hai, bonjour.
áá±á¬áá±á¬áááºáá±á¬á· áááºážáááºážáá áºááœá± ááá±ážáá±á¬á·áá°ážááá¯áá±á¬á·... bot á áá»áœááºáá±á¬áºááá¯á·ááᯠááŸá¯ááºáááºáá²á· áááºážáááºážáá áºáᯠááŸáááŒá®ážáá¬ážáá«á áá»áœááºá¯ááºááá¯á·áá¯ááºááẠááá¯á¡ááºáááºááŸá¬ ááá¯á¡ááºáá±á¬ filter ááŸáá·áº message handler ááá¯áááºáá®ážáá«á
áá¯áẠ2- á á¬áá¬ážáááºáá±á·áá»áºááá¯ááºááœááºáá°ááŸáá·áº á á áºáá¯ááºááŸá¯áá áºáá¯ááᯠááá·áºáá«á
library(telegram.bot)
# ÑПзЎаÑÐŒ ÑкзеЌплÑÑ ÐºÐ»Ð°ÑÑа Updater
updater <- Updater('ТÐÐÐÐ ÐÐКÐÐÐ ÐÐТÐ')
# ÐОÑеЌ ЌеÑПЎ ÐŽÐ»Ñ Ð¿ÑОвеÑÑвОÑ
## кПЌаМЎа пÑОвеÑвОÑ
say_hello <- function(bot, update) {
# ÐÐŒÑ Ð¿ÐŸÐ»ÑзПваÑÐµÐ»Ñ Ñ ÐºÐŸÑПÑÑÐŒ МаЎП пПзЎаÑПваÑÑÑÑ
user_name <- update$message$from$first_name
# ÐÑпÑавлÑеЌ пÑОвеÑÑвеММПе ÑППбÑеМОе
bot$sendMessage(update$message$chat_id,
text = paste0("ÐÐŸÑ Ð¿ÐŸÑÑеМОе, ", user_name, "!"),
parse_mode = "Markdown",
reply_to_message_id = update$message$message_id)
}
# ÑПзЎаÑÐŒ ÑОлÑÑÑÑ
MessageFilters$hi <- BaseFilter(function(message) {
# пÑПвеÑÑеЌ, вÑÑÑеÑаеÑÑÑ Ð»Ðž в ÑекÑÑе ÑППбÑÐµÐœÐžÑ ÑлПва: пÑОвеÑ, зЎÑавÑÑвÑй, ÑалÑÑ, Ñ
ай, бПМжÑÑ
grepl(x = message$text,
pattern = 'пÑОвеÑ|зЎÑавÑÑвÑй|ÑалÑÑ|Ñ
ай|бПМжÑÑ',
ignore.case = TRUE)
}
)
# ÑПзЎаÑÐŒ ПбÑабПÑÑОк
hi_hendler <- CommandHandler('hi', say_hello) # ПбÑабПÑÑОк ÐºÐŸÐŒÐ°ÐœÐŽÑ hi
hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi)
# ЎПбалÑеЌ ПбÑабПÑÑОкО в ЎОÑпеÑÑеÑ
updater <- updater +
hi_hendler +
hi_txt_hnd
# запÑÑкаеЌ бПÑа
updater$start_polling()
á¡áááºáá±á¬áºááŒáá« áá¯ááºááá°áá¬ááᯠáá¯ááºáá±á¬ááºáá«á 'YOUR BOT TOKEN' ááᯠáá±á¬á·ááºááá¯áááºáá®ážáá¬ááœáẠáááºáááŸááá±á¬ ááá¯áááºá¡á á áºááŸáá·áº á¡á á¬ážááá¯ážááŒá®ážáá±á¬ááºá BotFather (áá»áœááºáá±á¬áº bot áá áºáá¯ááᯠáááºáá®ážááá¯á· ááŒá±á¬áá²á·áááºá
ááááá±á¬ááºážáá«áž ).
á¡áᯠá
á±á¬á
á±á¬ááá±á¬áºááŒáá¬ážáá²á· ááŸá¯ááºááœááºážáááºá
áá¬ážááœá±áá«áá²á· bot ááœá±ááᯠáááºáá±á·áá»áºáá±á«ááºážáá»á¬ážá
áœá¬ ááá¯á·ááŒáá·áºáá¡á±á¬ááºá
áá«ááŒá±á¬áá·áº ááááá¯á¶ážá¡áá±áá²á· bot ááᯠááŸá¯ááºáááºáá¯á¶áá¬áááá² ááŸá¯ááºáááºááŒááºážááá¯áááºáž áá¯á¶á·ááŒááºáááºá¡á±á¬áẠáááºáá±ážáá²á·áá«áááºá á¡ááŒááºážá¡áá¯á¶áá¯á¶ážááŒá®áž áá«ááá¯áá¯ááºáá²á·ááŒáááºá á¡ááŒá±á¬ááºážááŒááº_to_message_idáááºážáááºážááœáẠáááŸáááá¯ááºáá«áááºá sendMessage()
áááºáá¯á¶á·ááŒááºááá¯áá±á¬ áááºáá±á·áá»áºá id ááᯠááœáŸá²ááŒá±á¬ááºážááẠááá¯á¡ááºáááºá á€áá²á·ááá¯á·áá±á¬ áááºáá±á·ááºá»á¡áá¯ááºáá®ááᯠáááºáááá¯ááºáááº- update$message$message_id
.
ááá¯á·áá±á¬áº áá»áœááºá¯ááºááá¯á·áá¯ááºáá±á¬ááºáá²á·ááá·áº á¡áááá¡áá¬ááŸá¬ áá¯ááºáá±á¬ááºáá»ááºááá¯á¡áá¯á¶ážááŒá¯á bot ááá¯á· á
á
áºáá¯ááºááŸá¯áá
áºáá¯ááá·áºááŒááºážááŒá
áºáááºá BaseFilter()
:
# ÑПзЎаÑÐŒ ÑОлÑÑÑÑ
MessageFilters$hi <- BaseFilter(
# Ð°ÐœÐŸÐœÐžÐŒÐœÐ°Ñ ÑОлÑÑÑÑÑÑÐ°Ñ ÑÑМкÑОÑ
function(message) {
# пÑПвеÑÑеЌ, вÑÑÑеÑаеÑÑÑ Ð»Ðž в ÑекÑÑе ÑППбÑÐµÐœÐžÑ ÑлПва пÑОвеÑÑÑвОÑ
grepl(x = message$text,
pattern = 'пÑОвеÑ|зЎÑавÑÑвÑй|ÑалÑÑ|Ñ
ай|бПМжÑÑ',
ignore.case = TRUE)
}
)
áááºáááááŒá¯áááá¬ážááá·áºá¡ááá¯ááºážá ááá¬áá»á¬ážááᯠá¡áá¬ááá¹áá¯áá²ááá¯á· ááá·áºááẠááá¯á¡ááºáá«áááºá MessageFiltersá¡á ááá¯ááºážááœáẠá¡áááºááá·áºáá¯ááºáá¬ážáá±á¬ á á áºáá¯ááºááŸá¯áá»á¬áž á¡áááºážáááºáá«ááŸáááŒá®ážááŒá áºááá·áºá áá»áœááºá¯ááºááá¯á·áá¥ááá¬ááœááºá á¡áá¬ááá¹áá¯áá®ááá¯á· MessageFilters áá»áœááºá¯ááºááá¯á·ááẠá¡á áááºá¡ááá¯ááºážáá áºáá¯ááᯠááá·áºáá¬ážáááºá hiá€á¡áá¬ááẠá á áºáá¯ááºááŸá¯á¡áá áºáá áºáá¯ááŒá áºáááºá
áá¯ááºáá±á¬ááºááẠBaseFilter()
filter function ááá¯áááºááŒááºáááºážáááºááá¯á¡ááºáááºá á¡ááŒá±áá¶á¡á¬ážááŒáá·áºá filter ááẠmessage instance ááá¯áááºáá¶áááŸáááŒá®áž return ááŒááºááá·áº function áá
áºáá¯áá»áŸáá¬ááŒá
áºáááºá TRUE ááá¯á·ááá¯áẠá¡áá¯á¡áá±á¬áá». áá»áœááºá¯ááºááá¯á·áá¥ááá¬ááœááºá áá»áœááºá¯ááºááá¯á·ááẠá¡ááŒá±áá¶áá¯ááºáá±á¬ááºáá»ááºááá¯á¡áá¯á¶ážááŒá¯á ááá¯ážááŸááºážáá±á¬áá¯ááºáá±á¬ááºáá»ááºááᯠáá±ážáá¬ážáá²á·áááºá grepl()
áááºáá±á·áá»áºá
á¬áá¬ážááᯠá
á
áºáá±ážááŒá®áž áááºážááẠáá¯á¶ááŸááºáá±á¬áºááŒáá»ááºááŸáá·áº ááá¯ááºáá®ááŸá¯ááŸááááŸá á
á
áºáá±ážáá«á пÑОвеÑ|зЎÑавÑÑвÑй|ÑалÑÑ|Ñ
ай|бПМжÑÑ
ááŒááºáá¬ááẠTRUE.
ááá¯á·áá±á¬áẠáá»áœááºá¯ááºááá¯á·ááẠáááºáá±á·áá»áºááá¯ááºááœááºáá°ááᯠáááºáá®ážáááºá hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi)
. ááááá¯á¶áž function á¡ááŒááºážá¡áá¯á¶ MessageHandler()
ááá¯ááºááœááºáá°ááá¯áá±á«áºááá·áºáááºážáááºážááŒá
áºááŒá®áž áá¯áááá¡ááŒááºážá¡áá¯á¶ááŸá¬ áááºážááá¯áá±á«áºááá·áº filter ááŒá
áºáááºá áá»áœááºá¯ááºááá¯á·áá¡ááŒá±á¡áá±ááœááºá áááºážáááºáá»áœááºá¯ááºááá¯á·áááºáá®ážáá¬ážáá±á¬ filter ááŒá
áºáááºá MessageFilters$hi
.
áá±á¬ááºážááŒá®á á¡áá¯á¶ážááœááºá áá»áœááºá¯ááºááá¯á·ááẠáááºáá®ážáá¬ážáá±á¬ááá¯ááºááœááºáá°á¡á¬áž áá±ážááá¯á·áá°áᶠáá±á«ááºážááá·áºáááºá hi_txt_hnd.
updater <- updater +
hi_hendler +
hi_txt_hnd
á¡áááºááŸá¬ áá±ážáá²á·áááá¯áá² á¡áá¯ááºáá²ááŸá¬ telegram.bot
á¡áá¬ááá¹áᯠMessageFilters áááºá¡áá¯á¶ážááŒá¯ááá¯ááºáá±á¬ built-in filter á¡á
á¯á¶ááŸáááŒá®ážáá¬ážááŒá
áºáááº-
- á¡á¬ážáá¯á¶áž â áááºáá±á·áá»áºáá»á¬ážá¡á¬ážáá¯á¶áž
- á á¬áá¬áž â á á¬áá¬ážáááºáá±á·ááºá»áá»á¬áž
- command â ááœáŸááºááŒá¬ážáá»ááºáá»á¬áž á i.e. áááºáá±á·áá»áºáá»á¬ážááŒáá·áº á
áááºáááºá
/
- á á¬ááŒááºááẠâ á¡ááŒá¬ážáááºáá±á·áá»áºááᯠááŒááºááŒá¬ážááá·áº á á¬ááá¯áá»á¬áž
- á¡áᶠâ á¡áá¶ááá¯ááºáá áºáá¯áá«ááŸááá±á¬ áááºáá±á·áá»áºáá»á¬áž
- á á¬ááœááºá á¬áááºáž â áá±ážááá¯á·áá¬ážáá±á¬ á á¬ááœááºá á¬áááºážáá«áá±á¬ áááºáá±á·áá»áºáá»á¬áž
- áá¬ááºáá¯á¶ - áá±ážááá¯á·áá¬ážáá±á¬áá¯á¶áá»á¬ážááŸáá·áºá¡áá° áááºáá±á·áá»áºáá»á¬áž
- á áá áºáᬠâ áá±ážááá¯á·áá¬ážáá±á¬á áá áºáá¬áá«áá±á¬ áááºáá±á·áá»áºáá»á¬áž
- áá®áá®ááᯠâ áá®áá®ááá¯áá«áá±á¬ áááºáá±á·áá»áºáá»á¬áž
- á¡áᶠ- á¡áá¶áááºáá±á·áá»áºáá»á¬áž
- áááºááœááºááẠ- á¡áá¯á¶ážááŒá¯áá°á ááŒá±ážáááºážá á¬áá« á¡ááŒá±á¬ááºážá¡áá¬áá»á¬áž áá«áááºáá±á¬ áááºáá±á·áá»áºáá»á¬áž
- áááºáá±áᬠâ áááá®áááºáá±áá¬ááŸáá·áº áááºáá±á·áá»áºáá»á¬áž
- áá±áᬠ- áááºááá·áºááá¯á·áá¬ážáá±á¬ áááºáá±á·áá»áºáá»á¬áž
- ááááºáž â ááááºážáá»á¬áž
á¡áá»áá¯á·áá±á¬ filter áá»á¬ážááᯠhandler áá
áºáá¯ááœáẠáá±á«ááºážá
ááºááá¯áá«á ááá¯ááºážáá¯ááºááᯠá¡áá¯á¶ážááŒá¯áá«á |
- áá¯áá¹ááá¡ááŒá
ẠORá ááŸáá·áº áááºááŸááºáá±ážááá¯ážáá«á &
áá¯áá¹ááááŸáááá²á·ááá¯á· Ð. á¥ááá¬á¡á¬ážááŒáá·áºá áááºááẠbot ááẠáá®áá®ááá¯á áá¯á¶ ááá¯á·ááá¯áẠá
á¬ááœááºá
á¬áááºážááᯠáááºáá¶áááŸáááá·áºá¡áá« áá°áá®áá±á¬áááºážáááºážááá¯áá±á«áºááá¯ááá¯áá«áá áááºáá±á·áá»áºááá¯ááºááœááºáá°áááºáá®ážááẠá¡á±á¬ááºáá«á¥ááá¬ááᯠá¡áá¯á¶ážááŒá¯áá«á
handler <- MessageHandler(callback,
MessageFilters$video | MessageFilters$photo | MessageFilters$document
)
Parameters áá»á¬ážááŒáá·áº Command áá»á¬ážááá·áºááŒááºážá
ááẠcommands ááœá±áá²á á¡á²áá«ááœá±ááᯠáááºááá¯áááºáá®ážáááá²á ááá¯áá»ááºáá²á· command ááᯠexecute áá¯ááºááá¯á·á¡ááœáẠbot ááᯠáááºááá¯ááœááºážáááá²ááá¯áá¬ááᯠáá»áœááºáá±á¬áºááá¯á· ááááŒá®ážáá¬ážáá«á ááá¯á·áá±á¬áº á¡áá»áá¯á·ááá á¹á áá»á¬ážááœááºá command name á¡ááŒááºá áááºážááᯠexecute áá¯ááºááẠdata á¡áá»áá¯á·ááᯠpass áá±ážáááºááá¯á¡ááºáá«áááºá
á¡á±á¬ááºááœááºáá±á¬áºááŒáá¬ážáá±á¬ áááºá áœá²ááŸáá·áº ááá¯ááºáá¶áá áºáá¯áá±ážáá¬ážáá±á¬ áá¯ááºáá¯ááºááŸá¯ááŒáá¹áááááºá០ááá·áºá¡á¬áž áá±á·á¡áá»áá¯ážá¡á á¬ážááᯠááŒááºáá±ážááá·áº bot á á¥ááá¬áá áºáá¯ááŒá áºáááºá
á¡á±á¬ááºáá±á¬áºááŒáá« áá±á¬á·ááºááẠáá¯ááºáá¯ááºááŸá¯ááŒáá¹ááááẠAPI ááᯠá¡áá¯á¶ážááŒá¯áááºá
áá¯áẠ3- áááºá áœá²ááŸáá·áº ááá¯ááºáá¶á¡ááá¯áẠááááºážááá¯á·ááá·áº áá±á¬á·ááº
library(telegram.bot)
# ÑПзЎаÑÐŒ ÑкзеЌплÑÑ ÐºÐ»Ð°ÑÑа Updater
updater <- Updater('1165649194:AAFkDqIzQ6Wq5GV0YU7PmEZcv1gmWIFIB_8')
# ÐОÑеЌ ЌеÑПЎ ÐŽÐ»Ñ Ð¿ÑОвеÑÑвОÑ
## кПЌаМЎа пÑОвеÑвОÑ
check_date <- function(bot, update, args) {
# вÑ
ПЎÑÑОе ЎаММÑе
day <- args[1] # ЎаÑа
country <- args[2] # ÑÑÑаМа
# пÑПвеÑка ввеЎÑММÑÑ
паÑаЌеÑÑПв
if ( !grepl('\d{4}-\d{2}-\d{2}', day) ) {
# Send Custom Keyboard
bot$sendMessage(update$message$chat_id,
text = paste0(day, " - МекПÑÑеÑÐºÐœÐ°Ñ ÐŽÐ°Ñа, ввеЎОÑе ЎаÑÑ Ð² ÑПÑЌаÑе ÐÐÐÐ-ÐÐ-ÐÐ"),
parse_mode = "Markdown")
} else {
day <- as.Date(day)
# пеÑевПЎОЌ в ÑПÑÐŒÐ°Ñ POSIXtl
y <- format(day, "%Y")
m <- format(day, "%m")
d <- format(day, "%d")
}
# ÑÑÑаМа ÐŽÐ»Ñ Ð¿ÑПвеÑкО
## пÑПвеÑÑеЌ заЎаМа лО ÑÑÑаМа
## еÑлО Ме заЎаМа ÑÑÑаМавлОваеЌ ru
if ( ! country %in% c('ru', 'ua', 'by', 'kz', 'us') ) {
# Send Custom Keyboard
bot$sendMessage(update$message$chat_id,
text = paste0(country, " - МекПÑÑеÑкÑÐœÑй кПЎ ÑÑÑаМÑ, вПзЌПжММÑе зМаÑеМОÑ: ru, by, kz, ua, us. ÐапÑПÑÐµÐœÑ ÐŽÐ°ÐœÐœÑе пП РПÑÑОО."),
parse_mode = "Markdown")
country <- 'ru'
}
# запÑÐŸÑ ÐŽÐ°ÐœÐœÑÑ
Оз API
# кПЌпПМПвка HTTP запÑПÑа
url <- paste0("https://isdayoff.ru/api/getdata?",
"year=", y, "&",
"month=", m, "&",
"day=", d, "&",
"cc=", country, "&",
"pre=1&",
"covid=1")
# пПлÑÑаеЌ ПÑвеÑ
res <- readLines(url)
# ОМÑÑепÑеÑаÑÐžÑ ÐŸÑвеÑа
out <- switch(res,
"0" = "РабПÑОй ЎеМÑ",
"1" = "ÐеÑабПÑОй ЎеМÑ",
"2" = "СПкÑаÑÑММÑй ÑабПÑОй ЎеМÑ",
"4" = "covid-19",
"100" = "ÐÑОбка в ЎаÑе",
"101" = "ÐаММÑе Ме МайЎеМÑ",
"199" = "ÐÑОбка ÑеÑвОÑа")
# ПÑпÑавлÑеЌ ÑППбÑеМОе
bot$sendMessage(update$message$chat_id,
text = paste0(day, " - ", out),
parse_mode = "Markdown")
}
# ÑПзЎаÑÐŒ ПбÑабПÑÑОк
date_hendler <- CommandHandler('check_date', check_date, pass_args = TRUE)
# ЎПбалÑеЌ ПбÑабПÑÑОк в ЎОÑпеÑÑеÑ
updater <- updater + date_hendler
# запÑÑкаеЌ бПÑа
updater$start_polling()
á¡áááºáá±á¬áºááŒáá« áá¯ááºááá°áá¬ááᯠáá¯ááºáá±á¬ááºáá«á 'YOUR BOT TOKEN' ááᯠáá±á¬á·ááºááá¯áááºáá®ážáá¬ááœáẠáááºáááŸááá±á¬ ááá¯áááºá¡á á áºááŸáá·áº á¡á á¬ážááá¯ážááŒá®ážáá±á¬ááºá BotFather (áá»áœááºáá±á¬áº bot áá áºáá¯ááᯠáááºáá®ážááá¯á· ááŒá±á¬áá²á·áááºá
ááááá±á¬ááºážáá«áž ).
áá»áœááºá¯ááºááá¯á·ááẠáááºážááááºáááºááá¯ááºááœáẠáááºážáááºážáá
áºáá¯áá¬ááŸáááá·áº áá±á¬á·ááºáá
áºáá¯ááᯠáááºáá®ážáá²á·áááºá check_date
á€áááºážáááºážááᯠáá°áá®áá±á¬á¡áááºá á¡áááá·áºááŒáá·áº áá±á«áºáááºá
ááá¯á·áá±á¬áºá á¡áááá·áºá¡áááºá¡ááŒááºá á€áááºážáááºážááẠááá·áºá¡á¬áž áá±á¬ááºááŸá áºáá¯á ááá¯ááºáá¶áá¯ááºááŸáá·áº áááºá áœá²ááá¯á·ááᯠááá·áºááœááºážááẠááá¯á¡ááºáááºá ááá¯á·áá±á¬ááºá áá±á¬á·ááºááẠáááºááŸááºáá¬ážáá±á¬ááá¯ááºáá¶ááŸá áá±ážáá¬ážááá·áºáá±á·ááẠááááºá¹áááœá±á á¡ááá¯áá»á¯á¶ážáá±á¬áá±á· ááá¯á·ááá¯áẠááá¬ážáááºáá¯ááºáá¯ááºáá±ážááŒáá¹áááááºá¡á á¡áá¯ááºáá»áááºáá¯ááºááá¯áẠá á áºáá±ážáááºá
command ááŸáá·áºá¡áá° áá±á¬ááºááẠparameter áá»á¬ážááᯠáááºáá¶ááẠáá»áœááºá¯ááºááá¯á· áááºáá®ážáá¬ážáá±á¬ áááºážáááºážá¡ááœááºá argument ááᯠá¡áá¯á¶ážááŒá¯áá«á pass_args = TRUE
function áá²ááŸá¬ CommandHandler()
áááºážáááºážáá
áºáᯠáááºáá®ážááá·áºá¡áá«á ááá¯á¡ááºáá±á¬ á¡ááŒá±á¬ááºážááŒáá»ááºáá»á¬ážá¡ááŒáẠbot, update ááᯠááœá±ážáá»ááºááœáá·áºáá
áºáá¯ááᯠáááºáá®ážáá« - ááŒááºážáá¯á¶ááŸá¯áá»á¬áž. á€áááºážááŒáá·áº áááºáá®ážáá¬ážáá±á¬áááºážáááºážááẠcommand name ááŒá®ážáá±á¬áẠbot ááá¯á· áááºáá±ážááá¯á·áá±á¬ áá±á¬ááºáá»á¬ážááᯠáááºáá¶áááºááŒá
áºáááºá áá±á¬ááºáá»á¬ážááᯠspace áá
áºáá¯ááŒáá·áº ááá¯ááºážááŒá¬ážáá¬ážááááºááŒá
áºááŒá®áž áááºážááá¯á·ááᯠá
á¬áá¬áž vector á¡ááŒá
Ạáááºážáááºážááá¯á· áá±ážááá¯á·áááºááŒá
áºáááºá
áá»áœááºá¯ááºááá¯á·á bot ááᯠá áááºááŒá®áž á ááºážáááºááŒáá«á áá¯á·á
áá±á¬ááºáá¶ááœáẠbot ááᯠrun
ááŒá®ážááŒá±á¬ááºááẠáá±á¬ááºáá¯á¶ážá¡ááá·áºááŸá¬ bot ááᯠáá±á¬ááºáá¶ááœáẠá áááºáááºááŒá áºáááºá
áá«ááá¯áá¯ááºááá¯á·á á¡á±á¬ááºááŸá¬áá±á¬áºááŒáá¬ážáá²á· algorithm ááá¯ááá¯ááºáá¬áá«-
- Extension R áá«áá±á¬ áá±á¬á·áá¯ááºááᯠááá¯ááºáá áºáá¯ááœáẠááááºážáááºážáá«á RStudio ááœáẠá¡áá¯ááºáá¯ááºáá±á¬á¡áá«á áááºážááᯠáá®áá°ážááŸáááá·áº áá¯ááºáá±á¬ááºáááºá ááá¯ááºááŸááºáááºáž, á¡áááºážá¡ááœá²á· á¡ááŒá áºááááºážáááºážáá« ....
- R áá¬áá¬á
áá¬ážááᯠáááºááá·áºááœááºážáá¬ážááá·áº ááá¯ááºááœá²ááœáẠáááºááŸáááá·áº bin ááá¯áá«ááá¯á· áááºážááŒá±á¬ááºážááᯠáá±á«ááºážááá·áºáá«á áááºážááŒá±á¬ááºážááŒá±á¬ááºážááá¯ááºáá±á¬á áááºážááœáŸááºáá»ááºáá»á¬ážá
áá®ááŸá¬ . - 1 á
á¬ááŒá±á¬ááºážáá±ážááá·áº áá¯á¶ááŸááºá
á¬áá¬ážááá¯ááºááᯠáááºáá®ážáá«-
R CMD BATCH C:UsersAlseyDocumentsmy_bot.R
... á¡á á¬áž C:UsersAlseyDocumentsmy_bot.R áááºá bot script ááá¯á·áááºážááŒá±á¬ááºážááá¯áá±ážáá«á áá áºáá»áááºáááºážááŸá¬áááºá á¡ááŒá±á¬ááºážááŸá¬ áááºážáá áºáá»áŸá±á¬ááºááœáẠCyrillic á á¬áá¯á¶ážáá»á¬áž ááá¯á·ááá¯áẠáá±áá¬ááœááºáá»á¬ážáááŸáááẠá¡áá±ážááŒá®ážáá«áááºá áááºážááẠbot ááᯠrun áá±á¬á¡áá«ááœááºááŒá¿áá¬áá»á¬ážááŒá áºáá±á«áºá á±ááá¯ááºáááºá áááºážááᯠááááºážáááºážááŒá®áž áááºážá extension ááŒáá·áº á¡á á¬ážááá¯ážáá«á TXT á¡áá±á«áº áááºážááá¯á·. - Windows Task Scheduler ááá¯ááœáá·áºáá«á áááºážááá¯ááŒá¯áá¯ááºáááºáááºážáááºážáá»á¬ážá
áœá¬ááŸááááºá á¥ááá¬á áááºááá·áºááá¯ááºááœá²ááá¯ááœáá·áºááŒá®áž ááááºá
á¬áá²ááá¯á·ááá·áºáá«á
%windir%system32taskschd.msc /s
. á¡ááŒá¬ážáá áºááœáŸááºáááºážáá»á¬ážááᯠááœá±á·ááá¯ááºáááºááá®ááŸá¬ . - á¡áá»áááºááá¬ážááœá²áá°á áá¬áááºá¡áá±á«áºáá±á¬áá·áºááŸá "á¡áá¯ááºáá áºáá¯ááᯠáááºáá®ážáá«..." ááá¯ááŸáááºáá«á
- "á¡ááœá±ááœá±" áááºááºááœááºá ááá·áºáá¯ááºáááºážáá¬áááºááᯠá áááºááŒáá¯ááºá¡áááºáá±ážáᬠááá¯ááºááᯠ"á¡áá¯á¶ážááŒá¯áá°á¡á¬ážáá¯á¶ážá¡ááœáẠá¡áá¯á¶ážááŒá¯áááº" á¡ááŒá±á¡áá±ááá¯á· ááŒá±á¬ááºážáá«á
- "Actions" tab ááá¯ááœá¬ážááŒá®áž "Create" ááá¯ááŸáááºáá«á "Program ááá¯á·ááá¯áẠscript" á¡ááœááºááœááºá "Browse" ááá¯ááŸáááºááŒá®áž áá¯áááá¡ááá·áºááœáẠáááºáá®ážáá¬ážááá·áºá¡áá¬ááᯠááŸá¬áá«á áááºážááá¯á· ááá¯ááºááᯠOK ááŸáááºáá«á
- OK ááá¯ááŸáááºááŒá®áž ááá¯á¡ááºáá«á ááá·áºáááºáááºááŸá¯á áá áºá¡áá±á¬áá·áºá¡ááœáẠá áá¬ážááŸááºááá¯ááá·áºáá«á
- á¡áá»áááºááá¬ážááœá²áá°ááœáẠáááºáá®ážáá¬ážáá±á¬ á¡áá¯ááºáá áºáá¯ááᯠááŸá¬áá«á áááºážááᯠááœá±ážáá»ááºááŒá®áž áá¬áááºá¡á±á¬ááºáá±á¬áá·áºááŸá âRunâ ááá¯ááºááᯠááŸáááºáá«á
áá»áœááºá¯ááºááá¯á·á áá±á¬á·ááºááẠáá±á¬ááºáá¶ááœáẠá¡áá¯ááºáá¯ááºááŒá®áž áááºáá¯ááºáá±á¬ááºááŸá¯ááᯠáááºááá·áºáááºá¡áá ááá¯á·ááá¯áẠáááºážááᯠá áááºáá²á·ááá·áº áááºá PC ááá¯á·ááá¯áẠáá¬áá¬ááᯠááááºáááºá¡áá áá¯ááºáá±á¬ááºáá«áááºá
áá±á¬ááºáá»ááº
á€áá±á¬ááºážáá«ážááœááºá áááºáá±á·áá»áºáá»á¬ážááá¯á·áá¯á¶áá¬áá á¡áááºáááºáá±á·áá»áºáá»á¬ážááŸáá·áº á¡áááá·áºáá»á¬ážááᯠáá¯á¶á·ááŒááºááá¯ááºááá·áº ááŒáá·áºá á¯á¶áá±á¬ bot ááᯠáááºááá¯á·áá±ážááááºááᯠáá»áœááºá¯ááºááá¯á· ááŸá¬ááœá±ááœá±á·ááŸááá²á·áááºá áááŸááá¬áá²á· á¡ááááá¬á ááá·áºááŒá¿áá¬á¡áá»á¬ážá á¯ááᯠááŒá±ááŸááºážááá¯á· áá¯á¶áá±á¬ááºáá±áá«ááŒá®á
áá±á¬ááºáá±á¬ááºážáá«ážááœáẠááá¯ááá¯á¡áááºááŒá±á á±áááºá¡ááœáẠbot ááá¯á· áá®ážáá¯ááºááá·áºáááºážááᯠááœá±ážááœá±ážáá«áááºá
áá»áœááºá¯ááºáᶠá
á¬áááºážááœááºážáá«á
source: www.habr.com