Kitba ta 'bot tat-telegramma f'R (parti 2): Żieda ta' appoġġ għall-kmand u filtri tal-messaġġi mal-bot

В pubblikazzjoni preċedenti 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 l-ewwel parti.

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.

Kitba ta 'bot tat-telegramma f'R (parti 2): Żieda ta' appoġġ għall-kmand u filtri tal-messaġġi mal-bot

L-artikoli kollha mis-serje "Kitba ta' bot ta' telegramma f'R"

  1. Aħna noħolqu bot u nużawh biex nibagħtu messaġġi f'telegramma
  2. Żid appoġġ għall-kmand u filtri tal-messaġġi mal-bot

Kontenut

Jekk inti interessat fl-analiżi tad-dejta, tista' tkun interessat f'tiegħi telegramma и YouTube kanali. Ħafna mill-kontenut huwa ddedikat għal-lingwa R.

  1. Klassi ta' aġġornament
  2. Handlers - handlers
  3. Żid l-ewwel kmand mal-bot, handler tal-kmand
  4. Proċessur tal-messaġġi u filtri
  5. Żieda Kmandi b'Parametri
  6. Mexxi l-bot fl-isfond
  7. Konklużjoni

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 l-ewwel artiklu).

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.

Kitba ta 'bot tat-telegramma f'R (parti 2): Żieda ta' appoġġ għall-kmand u filtri tal-messaġġi mal-bot

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.

Kitba ta 'bot tat-telegramma f'R (parti 2): Żieda ta' appoġġ għall-kmand u filtri tal-messaġġi mal-bot

  1. Oħloq eżempju tal-klassi Updater;
  2. 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-metodu getUpdates(). 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;
  3. 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-tim hi_hendler <- CommandHandler('hi', say_hello). L-ewwel argument tal-funzjoni CommandHandler() jippermettilek tispeċifika kmand, fil-każ tagħna hi, li għaliha l-bot se jirrispondi. It-tieni argument jippermettilek li tispeċifika l-metodu bot, aħna se nsejħu l-metodu say_hello, li se jiġi esegwit jekk l-utent sejjaħ il-kmand speċifikat fl-ewwel argument;
  4. 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ġifieri updater <- updater + hi_hendler. L-istess jista 'jsir bl-użu tal-metodu add_handler(), li tappartjeni għall-klassi Dispatcher, tista' ssib dan il-metodu bħal dan: updater$dispatcher$add_handler();
  5. 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 l-ewwel artiklu).

Issa ejja nippruvaw nibagħtu lill-bot diversi messaġġi li fihom il-kliem ta’ tislima elenkati qabel:
Kitba ta 'bot tat-telegramma f'R (parti 2): Żieda ta' appoġġ għall-kmand u filtri tal-messaġġi mal-bot

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_hnd

Kif 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 isdayoff.ru.

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 l-ewwel artiklu).

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

Kitba ta 'bot tat-telegramma f'R (parti 2): Żieda ta' appoġġ għall-kmand u filtri tal-messaġġi mal-bot

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:

  1. Ħlief il-kodiċi bot f'fajl bl-estensjoni R. Meta taħdem f'RStudio, dan isir permezz tal-menu File, tim Save As ....
  2. Żid il-mogħdija mal-folder tal-bin, li mbagħad jinsab fil-folder li fih installajt il-lingwa R, mal-varjabbli Path, istruzzjonijiet hawn.
  3. 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.
  4. 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 hawn.
  5. Fil-menu ta 'fuq tal-lemin tal-iskedar, ikklikkja "Oħloq kompitu...".
  6. Fuq it-tab "Ġenerali", agħti l-kompitu tiegħek isem personalizzat, u aqleb il-bidla għall-istat "Mexxi għall-utenti kollha".
  7. 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.
  8. Ikklikkja OK u, jekk meħtieġ, daħħal il-password għall-kont tas-sistema operattiva tiegħek.
  9. 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 telegramma и YouTube kanali.

Sors: www.habr.com

Ixtri hosting affidabbli għal siti bi protezzjoni DDoS, servers VPS VDS 🔥 Ixtri hosting ta' websajts affidabbli bi protezzjoni DDoS, servers VPS VDS | ProHoster