В aħna dehret kif noħolqu bot, inizjalizzaw istanza tal-klassi Bot u sar familjari mal-metodi kif jintbagħtu messaġġi bl-użu tiegħu.
F'dan l-artikolu nkompli dan is-suġġett, għalhekk nirrakkomanda li nibda naqra dan l-artikolu biss wara l-qari .
Din id-darba ser insemmu kif ngħixu mill-ġdid il-bot tagħna u nżidu l-appoġġ tal-kmand magħha, u wkoll niffamiljarizzaw ruħhom mal-klassi Updater.
Matul il-kors tal-artiklu, se niktbu diversi bots sempliċi, dawn tal-aħħar, ibbażati fuq data partikolari u kodiċi tal-pajjiż, jiddeterminaw jekk ġurnata f'pajjiż partikolari hijiex tmiem il-ġimgħa jew ġurnata tax-xogħol skont il-kalendarju tal-produzzjoni. Iżda, bħal qabel, l-iskop tal-artikolu huwa li jiffamiljarizzak mal-interface tal-pakkett telegram.bot biex issolvi l-problemi tiegħek.

L-artikoli kollha mis-serje "Kitba ta' bot ta' telegramma f'R"
Kontenut
Jekk inti interessat fl-analiżi tad-dejta, tista' tkun interessat f'tiegħi и kanali. Ħafna mill-kontenut huwa ddedikat għal-lingwa R.
Klassi ta' aġġornament
Updater hija klassi li tagħmilha aktar faċli għalik li tiżviluppa telegram bot, u tuża l-klassi taħt il-barnuża Dispetcher. Assenjazzjoni tal-klassi Updater huwa li tirċievi aġġornamenti mill-bot (fl-artikolu preċedenti użajna l-metodu għal dan il-għan getUpdates()), u ttrasferihom aktar għal Dispetcher.
Min-naħa tagħhom Dispetcher fih il-handlers li ħloqt, i.e. oġġetti tal-klassi Handler.
Handlers - handlers
Bil-handlers li żżid magħhom Dispetcher reazzjonijiet bot għal diversi avvenimenti. Fil-ħin tal-kitba ta’ dan l-artiklu fi telegram.bot Ġew miżjuda t-tipi li ġejjin ta’ handlers:
- MessageHandler — Maniġer tal-messaġġi
- CommandHandler — Maniġer tal-kmand
- CallbackQueryHandler — Maniġer tad-dejta għal tastieri mibgħuta minn Inline
- ErrorHandler — Maniġer tal-iżbalji meta titlob aġġornamenti mill-bot
Żid l-ewwel kmand mal-bot, handler tal-kmand
Jekk qatt ma użajt bots qabel u ma tafx x'inhu kmand, allura l-kmandi lill-bot għandhom jintbagħtu bl-użu ta' mmejla 'l quddiem / bħala prefiss.
Nibdew bi kmandi sempliċi, i.e. ejja ngħallmu lill-bot tagħna biex ngħidu bonjour fuq kmand /hi.
Kodiċi 1: Tgħallem lill-bot biex jgħid bonjour
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()Mexxi l-eżempju tal-kodiċi ta' hawn fuq, wara li ssostitwixxi 'T-TOKEN BOT TIEGĦEK' bit-token reali li rċevejt meta ħoloq il-bot permezz BotFather (Tkellimt dwar il-ħolqien ta' bot fi ).
Metodu start_polling() klassi Updater, li jintuża fl-aħħar tal-kodiċi, jibda linja bla tarf ta 'talba u proċessar aġġornamenti mill-bot.
Issa ejja niftħu Telegram u ikteb l-ewwel kmand lill-bot tagħna /hi.

Issa l-bot tagħna jifhem il-kmand /hi, u jaf isellemna.
Skematikament, il-proċess tal-bini ta 'bot sempliċi bħal dan jista' jiġi muri kif ġej.

- Oħloq eżempju tal-klassi
Updater; - Noħolqu metodi, i.e. funzjonijiet li l-bot tagħna se jwettaq. Fl-eżempju tal-kodiċi din hija funzjoni
say_hello(). Il-funzjonijiet li se tuża bħala metodi bot għandu jkollhom żewġ argumenti meħtieġa - bot и aġġornament, u waħda fakultattiva - args. Argument bot, dan huwa l-bot tiegħek, bl-għajnuna tiegħu tista 'tirrispondi għal messaġġi, tibgħat messaġġi, jew tuża kwalunkwe metodu ieħor disponibbli għall-bot. Argument aġġornament dan huwa dak li l-bot irċieva mill-utent, fil-fatt, dak li rċevejna fl-ewwel artiklu bl-użu tal-metodugetUpdates(). Argument args jippermettilek tipproċessa data addizzjonali mibgħuta mill-utent flimkien mal-kmand, aħna se nerġgħu lura għal dan is-suġġett ftit aktar tard; - Noħolqu handlers, i.e. Aħna nassoċjaw xi azzjonijiet tal-utent mal-metodi maħluqa fil-pass preċedenti. Essenzjalment, handler huwa trigger, avveniment li jsejjaħ xi funzjoni bot. Fl-eżempju tagħna, tali grillu qed jibgħat kmand
/hi, u hija implimentata mit-timhi_hendler <- CommandHandler('hi', say_hello). L-ewwel argument tal-funzjoniCommandHandler()jippermettilek tispeċifika kmand, fil-każ tagħnahi, li għaliha l-bot se jirrispondi. It-tieni argument jippermettilek li tispeċifika l-metodu bot, aħna se nsejħu l-metodusay_hello, li se jiġi esegwit jekk l-utent sejjaħ il-kmand speċifikat fl-ewwel argument; - Sussegwentement, inżidu l-handler maħluq mad-dispatcher tal-istanza tal-klassi tagħna
Updater. Tista 'żżid handlers f'diversi modi; fl-eżempju ta' hawn fuq, użajt l-aktar wieħed sempliċi, bl-użu tas-sinjal+jiġifieriupdater <- updater + hi_hendler. L-istess jista 'jsir bl-użu tal-metoduadd_handler(), li tappartjeni għall-klassiDispatcher, tista' ssib dan il-metodu bħal dan:updater$dispatcher$add_handler(); - Tnedija tal-bot billi tuża l-kmand
start_polling().
Proċessur tal-messaġġi u filtri
Aħna dehret kif nibagħtu kmandi lill-bot, iżda xi drabi għandna bżonn li l-bot jirrispondi mhux biss għall-kmandi, iżda wkoll għal xi messaġġi regolari. Biex tagħmel dan għandek bżonn tuża messaġġi li jimmaniġġjaw − MessageHandler.
Normali MessageHandler se jirrispondi għall-messaġġi deħlin assolutament kollha. Għalhekk, l-immaniġġjar tal-messaġġi spiss jintużaw flimkien ma 'filtri. Ejja ngħallmu lill-bot biex jgħid bonjour mhux biss fuq kmand /hi, iżda wkoll kull meta waħda mill-kliem li ġejjin tidher fil-messaġġ mibgħut lill-bot: hello, hello, salute, hai, bonjour.
Għalissa mhux se niktbu xi metodi ġodda, għax... Diġà għandna metodu li bih il-bot isellemna. Kulma rridu nagħmlu hu li noħolqu l-filtru meħtieġ u l-immaniġġjar tal-messaġġi.
Kodiċi 2: Żid immaniġġjar tal-messaġġi u filtru
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()Mexxi l-eżempju tal-kodiċi ta' hawn fuq, wara li ssostitwixxi 'T-TOKEN BOT TIEGĦEK' bit-token reali li rċevejt meta ħoloq il-bot permezz BotFather (Tkellimt dwar il-ħolqien ta' bot fi ).
Issa ejja nippruvaw nibagħtu lill-bot diversi messaġġi li fihom il-kliem ta’ tislima elenkati qabel:

Għalhekk, l-ewwelnett, għallimna lill-bot mhux biss biex jgħid bonjour, iżda biex iwieġeb għal tislima. Għamilna dan bl-użu tal-argument reply_to_message_id, li huwa disponibbli fil-metodu sendMessage(), li fiha għandek bżonn tittrasferixxi l-id tal-messaġġ li trid tirrispondi għalih. Tista' tikseb l-id tal-messaġġ bħal dan: update$message$message_id.
Imma l-ħaġa prinċipali li għamilna kienet li żid filtru mal-bot bl-użu tal-funzjoni BaseFilter():
# создаём фильтры
MessageFilters$hi <- BaseFilter(
# анонимная фильтрующая функция
function(message) {
# проверяем, встречается ли в тексте сообщения слова приветствия
grepl(x = message$text,
pattern = 'привет|здравствуй|салют|хай|бонжур',
ignore.case = TRUE)
}
)Kif forsi innotajt, jeħtieġ li jiġu miżjuda filtri mal-oġġett Filtri tal-Messaġġ, li inizjalment diġà fih sett żgħir ta 'filtri lesti. Fl-eżempju tagħna, għall-oġġett Filtri tal-Messaġġ żidna element hi, dan huwa filtru ġdid.
Fil-funzjoni BaseFilter() għandek bżonn tgħaddi l-funzjoni tal-filtru. Essenzjalment, filtru huwa biss funzjoni li tirċievi istanza ta 'messaġġ u terġa' lura VERU jew FALZ. Fl-eżempju tagħna, ktibna funzjoni sempliċi li, bl-użu tal-funzjoni bażika grepl() jiċċekkja t-test tal-messaġġ u jekk jaqbilx mal-espressjoni regolari привет|здравствуй|салют|хай|бонжур prospetti VERU.
Sussegwentement noħolqu messaġġier hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi). L-ewwel argument tal-funzjoni MessageHandler() huwa l-metodu li se jsejjaħ lill-handler, u t-tieni argument huwa l-filtru li bih se jissejjaħ. Fil-każ tagħna, dan huwa l-filtru li ħloqna MessageFilters$hi.
Ukoll, fl-aħħar, inżidu mad-dispatcher il-handler maħluq hi_txt_hnd.
updater <- updater +
hi_hendler +
hi_txt_hndKif ktibt hawn fuq, fil-pakkett telegram.bot u joġġezzjonaw Filtri tal-Messaġġ Diġà hemm sett ta’ filtri integrati li tista’ tuża:
- kollha — Il-messaġġi kollha
- test — Messaġġi
- kmand — Kmandi, i.e. messaġġi li jibdew bihom
/ - reply — Messaġġi li huma tweġiba għal messaġġ ieħor
- awdjo — Messaġġi li fihom fajl awdjo
- dokument — Messaġġi b'dokument mibgħut
- ritratt - Messaġġi b'immaġini mibgħuta
- stiker — Messaġġi bi stiker mibgħut
- vidjo — Messaġġi bil-vidjo
- vuċi - Messaġġi tal-vuċi
- kuntatt — Messaġġi li fihom il-kontenut tat-telegramma tal-utent
- post — Messaġġi bil-ġeolokalizzazzjoni
- post — Messaġġi mibgħuta
- logħba — Logħob
Jekk trid tgħaqqad xi filtri f'handler wieħed biss uża s-sinjal | - bħala loġika Or, u jiffirma & kif loġiku И. Pereżempju, jekk trid li l-bot isejjaħ l-istess metodu meta jirċievi vidjo, immaġni jew dokument, uża l-eżempju li ġej biex toħloq messaġġier:
handler <- MessageHandler(callback,
MessageFilters$video | MessageFilters$photo | MessageFilters$document
)Żieda Kmandi b'Parametri
Aħna diġà nafu x'inhuma l-kmandi, kif toħloqhom, u kif iġiegħel lill-bot jesegwixxi l-kmand mixtieq. Iżda f'xi każijiet, minbarra l-isem tal-kmand, għandna bżonn ngħaddu xi data biex tesegwixxiha.
Hawn taħt hawn eżempju ta 'bot li, minħabba data u pajjiż partikolari, jagħtik it-tip ta' ġurnata mill-kalendarju tal-produzzjoni.
Il-bot hawn taħt juża l-API tal-kalendarju tal-produzzjoni .
Kodiċi 3: Bot li jirrapporta skond id-data u l-pajjiż
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()Mexxi l-eżempju tal-kodiċi ta' hawn fuq, wara li ssostitwixxi 'T-TOKEN BOT TIEGĦEK' bit-token reali li rċevejt meta ħoloq il-bot permezz BotFather (Tkellimt dwar il-ħolqien ta' bot fi ).
Ħloqna bot li għandu metodu wieħed biss fl-armament tiegħu check_date, dan il-metodu jissejjaħ mill-kmand tal-istess isem.
Iżda, minbarra l-isem tal-kmand, dan il-metodu jeħtieġ li ddaħħal żewġ parametri, il-kodiċi tal-pajjiż u d-data. Sussegwentement, il-bot jiċċekkja jekk ġurnata partikolari fil-pajjiż speċifikat hijiex weekend, jum imqassar, jew jum tax-xogħol skont il-kalendarju uffiċjali tal-produzzjoni.
Sabiex il-metodu li noħolqu jaċċetta parametri addizzjonali flimkien mal-kmand, uża l-argument pass_args = TRUE fil-funzjoni CommandHandler(), u meta toħloq metodu, minbarra l-argumenti meħtieġa bot, aġġornament toħloq waħda fakultattiva - args. Il-metodu maħluq b'dan il-mod jaċċetta l-parametri li tgħaddi lill-bot wara l-isem tal-kmand. Il-parametri għandhom ikunu separati bi spazju; se jintbagħtu lill-metodu bħala vettur tat-test.
Ejja nniedu u nittestjaw il-bot tagħna.

Mexxi l-bot fl-isfond
L-aħħar pass li għandna bżonn inlestu huwa li nniedu l-bot fl-isfond.
Biex tagħmel dan, segwi l-algoritmu deskritt hawn taħt:
- Ħlief il-kodiċi bot f'fajl bl-estensjoni R. Meta taħdem f'RStudio, dan isir permezz tal-menu File, tim Save As ....
- Żid il-mogħdija mal-folder tal-bin, li mbagħad jinsab fil-folder li fih installajt il-lingwa R, mal-varjabbli Path, istruzzjonijiet .
- Oħloq fajl ta' test regolari li fih ikteb linja waħda:
R CMD BATCH C:UsersAlseyDocumentsmy_bot.R. Minflok C:UtentiAlseyDocumentsmy_bot.R ikteb it-triq għall-iskript tal-bot tiegħek. Fl-istess ħin, huwa importanti li ma jkunx hemm karattri Ċirilliċi jew spazji tul it-triq, għaliex dan jista 'jikkawża problemi meta tħaddem il-bot. Issejvjah, u ibdel l-estensjoni tiegħu bi txt fuq BAT. - Iftaħ l-Iskedatur tal-Kompiti Windows, hemm ħafna modi kif tagħmel dan, pereżempju, tiftaħ kwalunkwe fowlder u daħħal l-indirizz
%windir%system32taskschd.msc /s. Jistgħu jinstabu metodi oħra ta 'tnedija . - Fil-menu ta 'fuq tal-lemin tal-iskedar, ikklikkja "Oħloq kompitu...".
- Fuq it-tab "Ġenerali", agħti l-kompitu tiegħek isem personalizzat, u aqleb il-bidla għall-istat "Mexxi għall-utenti kollha".
- Mur fit-tab "Azzjonijiet", ikklikkja "Oħloq". Fil-qasam "Programm jew script", ikklikkja "Ibbrawżja", sib dik maħluqa fit-tieni pass BAT fajl u kklikkja OK.
- Ikklikkja OK u, jekk meħtieġ, daħħal il-password għall-kont tas-sistema operattiva tiegħek.
- Sib il-kompitu maħluq fl-iskeder, agħżelha u kklikkja l-buttuna "Run" fir-rokna t'isfel tal-lemin.
Il-bot tagħna jaħdem fl-isfond u se jaħdem sakemm twaqqaf il-kompitu, jew itfi l-PC tiegħek jew is-server li fuqu tnediet.
Konklużjoni
F'dan l-artikolu, aħna dehret kif tikteb bot sħiħ li mhux biss jista 'jibgħat messaġġi, iżda wkoll jirrispondi għal messaġġi u kmandi deħlin. L-għarfien miksub huwa diġà biżżejjed biex issolvi ħafna mill-problemi tiegħek.
L-artiklu li jmiss se jitkellem dwar kif iżżid tastiera mal-bot għal xogħol aktar konvenjenti.
Abbona għal tiegħi и kanali.
Sors: www.habr.com
