В ons het uitgevind hoe om 'n bot te skep, 'n instansie van die klas geïnisialiseer Bot en het vertroud geraak met die metodes om boodskappe te stuur deur dit te gebruik.
In hierdie artikel gaan ek voort met hierdie onderwerp, so ek beveel aan dat u hierdie artikel eers begin lees nadat u dit gelees het .
Hierdie keer sal ons uitvind hoe om ons bot te laat herleef en opdragondersteuning daarby te voeg, en ook kennis maak met die klas Updater.
In die loop van die artikel sal ons verskeie eenvoudige bots skryf, laasgenoemde sal, gebaseer op 'n gegewe datum en landkode, bepaal of 'n dag in 'n gegewe land 'n naweek of 'n werksdag is volgens die produksiekalender. Maar, soos voorheen, is die doel van die artikel om jou vertroud te maak met die pakketkoppelvlak telegram.bot om jou eie probleme op te los.

Alle artikels uit die reeks "Skryf 'n telegram-bot in R"
inhoud
As jy belangstel in data-analise, sal jy dalk belangstel in my и kanale. Die meeste van die inhoud daarvan word aan die R-taal gewy.
Opdaterklas
Updater is 'n klas wat dit vir jou makliker maak om 'n telegrambot te ontwikkel, en gebruik die klas onder die enjinkap Dispetcher. Klas opdrag Updater is om opdaterings van die bot te ontvang (in die vorige artikel het ons die metode vir hierdie doel gebruik getUpdates()), en dra hulle verder oor na Dispetcher.
Op sy beurt Dispetcher bevat die hanteerders wat jy geskep het, m.a.w. klas voorwerpe Handler.
Hanteerders - hanteerders
Met hanteerders wat jy byvoeg Dispetcher botreaksies op verskeie gebeurtenisse. Ten tyde van die skryf van hierdie artikel in telegram.bot Die volgende tipes hanteerders is bygevoeg:
- MessageHandler — Boodskaphanteerder
- CommandHandler — Bevelhanteerder
- CallbackQueryHandler - Datahanteerder vir sleutelborde wat vanaf Inline gestuur word
- ErrorHandler - Fouthanteerder wanneer opdaterings van die bot versoek word
Voeg die eerste opdrag by die bot, opdraghanteerder
As jy nog nooit vantevore bots gebruik het nie en nie weet wat 'n opdrag is nie, moet opdragte na die bot gestuur word met 'n voorwaartse skuinsstreep / as 'n voorvoegsel.
Ons sal begin met eenvoudige opdragte, d.w.s. kom ons leer ons bot om op bevel hallo te sê /hi.
Kode 1: Leer die bot om hallo te sê
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()Begin die kodevoorbeeld hierbo, nadat jy 'JOU BOT-TOKEN' vervang het met die regte teken wat jy ontvang het toe jy die bot geskep het via BotVader (Ek het gepraat oor die skep van 'n bot in ).
metode start_polling() klas Updater, wat aan die einde van die kode gebruik word, begin 'n eindelose lus van versoek en verwerking van opdaterings van die bot.
Kom ons maak nou Telegram oop en skryf die eerste opdrag aan ons bot /hi.

Nou verstaan ons bot die opdrag /hi, en weet hoe om ons te groet.
Skematies kan die proses om so 'n eenvoudige bot te bou soos volg uitgebeeld word.

- Skep 'n instansie van die klas
Updater; - Ons skep metodes, m.a.w. funksies wat ons bot sal verrig. In die kode voorbeeld is dit 'n funksie
say_hello(). Die funksies wat jy as botmetodes sal gebruik, moet twee vereiste argumente hê - bot и Opdateer, en een opsioneel - args. Argument bot, dit is jou bot, met sy hulp kan jy op boodskappe antwoord, boodskappe stuur of enige ander metodes wat vir die bot beskikbaar is, gebruik. Argument Opdateer dit is wat die bot van die gebruiker ontvang het, in werklikheid wat ons in die eerste artikel ontvang het met behulp van die metodegetUpdates(). Argument args laat jou toe om bykomende data te verwerk wat deur die gebruiker saam met die opdrag gestuur is, ons sal 'n bietjie later na hierdie onderwerp terugkeer; - Ons skep hanteerders, m.a.w. Ons assosieer sommige gebruikershandelinge met die metodes wat by die vorige stap geskep is. In wese is 'n hanteerder 'n sneller, 'n gebeurtenis wat een of ander botfunksie oproep. In ons voorbeeld stuur so 'n sneller 'n opdrag
/hi, en word deur die span geïmplementeerhi_hendler <- CommandHandler('hi', say_hello). Eerste funksie argumentCommandHandler()laat jou toe om 'n opdrag te spesifiseer, in ons gevalhi, waarop die bot sal reageer. Die tweede argument laat jou toe om die botmetode te spesifiseer, ons sal die metode noemsay_hello, wat uitgevoer sal word as die gebruiker die opdrag genoem het wat in die eerste argument gespesifiseer is; - Vervolgens voeg ons die geskepte hanteerder by die versender van ons klasinstansie
Updater. Jy kan hanteerders op verskeie maniere in die voorbeeld hierbo byvoeg, ek het die eenvoudigste een gebruik, met die teken+Dwsupdater <- updater + hi_hendler. Dieselfde kan met die metode gedoen wordadd_handler(), wat aan die klas behoortDispatcher, kan jy hierdie metode soos volg vind:updater$dispatcher$add_handler(); - Begin die bot deur die opdrag te gebruik
start_polling().
SMS-verwerker en filters
Ons het uitgevind hoe om opdragte na die bot te stuur, maar soms het ons nodig dat die bot nie net op opdragte reageer nie, maar ook op 'n paar gewone teksboodskappe. Om dit te doen moet jy boodskaphanteerders − gebruik MessageHandler.
Normale MessageHandler sal op absoluut alle inkomende boodskappe reageer. Daarom word boodskaphanteerders dikwels saam met filters gebruik. Kom ons leer die bot om nie net op bevel te groet nie /hi, maar ook wanneer een van die volgende woorde in die boodskap wat aan die bot gestuur is verskyn: hallo, hallo, salute, hai, bonjour.
Vir nou sal ons geen nuwe metodes skryf nie, want... Ons het reeds 'n metode waarmee die bot ons groet. Al wat ons hoef te doen is om die vereiste filter en boodskap hanteerder te skep.
Kode 2: Voeg 'n teksboodskap hanteerder en filter by
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()Begin die kodevoorbeeld hierbo, nadat jy 'JOU BOT-TOKEN' vervang het met die regte teken wat jy ontvang het toe jy die bot geskep het via BotVader (Ek het gepraat oor die skep van 'n bot in ).
Kom ons probeer nou om die bot verskeie boodskappe te stuur wat die groetewoorde bevat wat vroeër gelys is:

So, eerstens, ons het die bot geleer om nie net te groet nie, maar om op 'n groet te reageer. Ons het dit gedoen deur die argument te gebruik antwoord_op_boodskap_id, wat beskikbaar is in die metode sendMessage(), waarin jy die ID van die boodskap moet oordra waarop jy wil reageer. Jy kan die boodskap-ID soos volg kry: update$message$message_id.
Maar die belangrikste ding wat ons gedoen het, was om 'n filter by die bot te voeg deur die funksie te gebruik BaseFilter():
# создаём фильтры
MessageFilters$hi <- BaseFilter(
# анонимная фильтрующая функция
function(message) {
# проверяем, встречается ли в тексте сообщения слова приветствия
grepl(x = message$text,
pattern = 'привет|здравствуй|салют|хай|бонжур',
ignore.case = TRUE)
}
)Soos jy dalk opgemerk het, moet filters by die voorwerp gevoeg word Boodskapfilters, wat aanvanklik reeds 'n klein stel klaargemaakte filters bevat. In ons voorbeeld, na die voorwerp Boodskapfilters ons het 'n element bygevoeg hi, dit is 'n nuwe filter.
Om te funksioneer BaseFilter() jy moet die filterfunksie slaag. In wese is 'n filter net 'n funksie wat 'n boodskapgeval ontvang en terugkeer WAAR of ONWAAR. In ons voorbeeld het ons 'n eenvoudige funksie geskryf wat die basiese funksie gebruik grepl() kontroleer die boodskapteks en of dit by die gewone uitdrukking pas привет|здравствуй|салют|хай|бонжур keer terug WAAR.
Volgende skep ons 'n boodskap hanteerder hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi). Eerste funksie argument MessageHandler() is die metode wat die hanteerder sal roep, en die tweede argument is die filter waardeur dit geroep sal word. In ons geval is dit die filter wat ons geskep het MessageFilters$hi.
Wel, op die ou end voeg ons die geskepte hanteerder by die versender hi_txt_hnd.
updater <- updater +
hi_hendler +
hi_txt_hndSoos ek hierbo geskryf het, in die pakkie telegram.bot en voorwerp Boodskapfilters Daar is reeds 'n stel ingeboude filters wat jy kan gebruik:
- almal — Alle boodskappe
- teks — SMS-boodskappe
- bevel — Bevele, d.w.s. boodskappe wat begin met
/ - antwoord — Boodskappe wat 'n antwoord op 'n ander boodskap is
- oudio — Boodskappe wat 'n oudiolêer bevat
- dokument — Boodskappe met 'n gestuurde dokument
- foto - Boodskappe met gestuurde beelde
- plakker — Boodskappe met 'n gestuurde plakker
- video — Boodskappe met video
- stem - Stemboodskappe
- kontak — Boodskappe wat die gebruiker se telegraminhoud bevat
- ligging — Boodskappe met geoligging
- venue — Aangestuurde boodskappe
- spel — Speletjies
As jy 'n paar filters in een hanteerder wil kombineer, gebruik net die teken | - as 'n logiese OF, en teken & as logies И. Byvoorbeeld, as jy wil hê die bot moet dieselfde metode noem wanneer dit 'n video, beeld of dokument ontvang, gebruik die volgende voorbeeld om 'n boodskaphanteerder te skep:
handler <- MessageHandler(callback,
MessageFilters$video | MessageFilters$photo | MessageFilters$document
)Voeg opdragte by met parameters
Ons weet reeds wat opdragte is, hoe om dit te skep en hoe om die bot te dwing om die verlangde opdrag uit te voer. Maar in sommige gevalle, benewens die opdragnaam, moet ons data deurgee om dit uit te voer.
Hieronder is 'n voorbeeld van 'n bot wat, gegewe 'n gegewe datum en land, vir jou die dagtipe van die produksiekalender terugstuur.
Die bot hieronder gebruik die produksiekalender API .
Kode 3: Bot wat volgens datum en land rapporteer
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()Begin die kodevoorbeeld hierbo, nadat jy 'JOU BOT-TOKEN' vervang het met die regte teken wat jy ontvang het toe jy die bot geskep het via BotVader (Ek het gepraat oor die skep van 'n bot in ).
Ons het 'n bot geskep wat net een metode in sy arsenaal het check_date, word hierdie metode genoem deur die opdrag met dieselfde naam.
Maar, benewens die opdragnaam, vereis hierdie metode dat u twee parameters invoer, die landkode en die datum. Vervolgens kyk die bot of 'n gegewe dag in die gespesifiseerde land 'n naweek, 'n verkorte dag of 'n werksdag is volgens die amptelike produksiekalender.
Om die metode wat ons skep om addisionele parameters saam met die opdrag te aanvaar, gebruik die argument pass_args = TRUE in funksie CommandHandler(), en wanneer 'n metode geskep word, bykomend tot die vereiste argumente bot, Opdateer skep 'n opsionele een - args. Die metode wat op hierdie manier geskep word, sal die parameters aanvaar wat u na die opdragnaam na die bot deurgee. Die parameters moet geskei word deur 'n spasie hulle sal na die metode gestuur word as 'n teksvektor.
Kom ons begin en toets ons bot.

Begin die bot in die agtergrond
Die laaste stap wat ons moet voltooi, is om die bot op die agtergrond te begin.
Om dit te doen, volg die algoritme wat hieronder beskryf word:
- Stoor die bot-kode in 'n lêer met die uitbreiding R. Wanneer jy in RStudio werk, word dit deur die kieslys gedoen File, span Stoor as ....
- Voeg die pad by die bin-lêergids, wat op sy beurt geleë is in die gids waarin jy die R-taal geïnstalleer het, by die Pad-veranderlike, instruksies .
- Skep 'n gewone tekslêer waarin 1 reël skryf:
R CMD BATCH C:UsersAlseyDocumentsmy_bot.R... In plaas daarvan C:UsersAlseyDocumentsmy_bot.R skryf die pad na jou bot script. Terselfdertyd is dit belangrik dat daar geen Cyrilliese karakters of spasies langs die pad is nie, want dit kan probleme veroorsaak wanneer die bot bestuur word. Stoor dit en vervang sy uitbreiding met txt op kolf. - Maak Windows Task Scheduler oop, daar is baie maniere om dit te doen, byvoorbeeld, maak enige gids oop en voer die adres in
%windir%system32taskschd.msc /s. Ander bekendstellingsmetodes kan gevind word . - Klik op "Skep taak..." in die spyskaart regs bo van die skeduleerder.
- Op die "Algemeen"-oortjie, gee jou taak 'n pasgemaakte naam en skakel die skakelaar na die "Lop vir alle gebruikers"-toestand.
- Gaan na die blad "Aksies", klik op "Skep". In die "Program of script"-veld, klik "Browse", vind die een wat in die tweede stap geskep is kolf lêer en klik OK.
- Klik OK en, indien nodig, voer die wagwoord vir jou bedryfstelselrekening in.
- Vind die geskepde taak in die skeduleerder, kies dit en klik op die "Run"-knoppie in die onderste regterhoek.
Ons bot loop in die agtergrond en sal werk totdat jy die taak stop, of jou rekenaar of bediener afskakel waarop dit geloods is.
Gevolgtrekking
In hierdie artikel het ons uitgevind hoe om 'n volwaardige bot te skryf wat nie net boodskappe kan stuur nie, maar ook kan reageer op inkomende boodskappe en opdragte. Die kennis wat opgedoen is, is reeds genoeg om die meeste van jou probleme op te los.
Die volgende artikel sal praat oor hoe om 'n sleutelbord by die bot te voeg vir meer gerieflike werk.
Teken in op my и kanale.
Bron: will.com
