Að skrifa símskeyti botni í R (hluti 2): Bætir stjórnunarstuðningi og skilaboðasíum við botninn

В fyrri útgáfu við komum að því hvernig á að búa til vélmenni, frumstilltum tilvik af bekknum Bot og kynntist aðferðum við að senda skilaboð með því.

Í þessari grein held ég áfram þessu efni, svo ég mæli með að byrja að lesa þessa grein aðeins eftir lestur fyrsti hluti.

Í þetta skiptið munum við finna út hvernig á að endurlífga vélmenni okkar og bæta stjórnunarstuðningi við hann, og einnig kynnast bekknum Updater.

Á meðan á greininni stendur munum við skrifa nokkra einfalda vélmenni, þeir síðarnefndu munu, byggt á tiltekinni dagsetningu og landskóða, ákvarða hvort dagur í tilteknu landi sé helgi eða virkur dagur samkvæmt framleiðsludagatalinu. En eins og áður er tilgangur greinarinnar að kynna þér viðmót pakkans telegram.bot að leysa eigin vandamál.

Að skrifa símskeyti botni í R (hluti 2): Bætir stjórnunarstuðningi og skilaboðasíum við botninn

Allar greinar úr seríunni „Að skrifa símskeyti láni í R“

  1. Við búum til bot og notum það til að senda skilaboð í símskeyti
  2. Bættu stjórnunarstuðningi og skilaboðasíum við botninn

efni

Ef þú hefur áhuga á gagnagreiningu gætirðu haft áhuga á mínum símskeyti и YouTube rásir. Mest af efninu er tileinkað R tungumálinu.

  1. Uppfærsluflokkur
  2. Handlarar - meðhöndlarar
  3. Bættu fyrstu skipuninni við botninn, skipanastjórnun
  4. Textaskilaboðavinnsla og síur
  5. Bætir skipunum við með færibreytum
  6. Keyrðu botni í bakgrunni
  7. Ályktun

Uppfærsluflokkur

Updater er klassi sem auðveldar þér að þróa símskeyti botni og notar flokkinn undir hettunni Dispetcher. Bekkjarverkefni Updater er að fá uppfærslur frá botni (í fyrri grein notuðum við aðferðina í þessu skyni getUpdates()), og flytja þær áfram til Dispetcher.

Aftur á móti Dispetcher inniheldur umsjónarmennina sem þú bjóst til, þ.e. flokkshlutir Handler.

Handlarar - meðhöndlarar

Með umsjónarmönnum sem þú bætir við Dispetcher viðbrögð botna við ýmsum atburðum. Þegar þessi grein er skrifuð í telegram.bot Eftirfarandi tegundum stjórnenda hefur verið bætt við:

  • MessageHandler — Skilaboðameðferð
  • CommandHandler - Skipunarstjóri
  • CallbackQueryHandler — Gagnameðferð fyrir lyklaborð send frá Inline
  • ErrorHandler - Villumeðferð þegar beðið er um uppfærslur frá botni

Bættu fyrstu skipuninni við botninn, skipanastjórnun

Ef þú hefur aldrei notað vélmenni áður og veist ekki hvað skipun er, þá verður að senda skipanir til vélmennisins með því að nota skástrik / sem forskeyti.

Byrjað verður á einföldum skipunum, þ.e. við skulum kenna botni okkar að heilsa eftir skipun /hi.

Kóði 1: Að kenna botninum að heilsa

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()

Keyrðu kóðadæmið hér að ofan, eftir að hafa skipt út 'YOUR BOT TOKEN' fyrir raunverulega táknið sem þú fékkst þegar þú bjóst til botninn í gegnum BotFaðir (Ég talaði um að búa til vélmenni í fyrstu grein).

Aðferð start_polling() bekknum Updater, sem er notað í lok kóðans, byrjar endalausa lykkju af því að biðja um og vinna úr uppfærslum frá botni.

Nú skulum við opna Telegram og skrifa fyrstu skipunina í botninn okkar /hi.

Að skrifa símskeyti botni í R (hluti 2): Bætir stjórnunarstuðningi og skilaboðasíum við botninn

Nú skilur láni okkar skipunina /hi, og veit hvernig á að heilsa okkur.

Skipulega er hægt að lýsa ferlinu við að byggja svo einfaldan láni sem hér segir.

Að skrifa símskeyti botni í R (hluti 2): Bætir stjórnunarstuðningi og skilaboðasíum við botninn

  1. Búðu til tilvik af bekknum Updater;
  2. Við búum til aðferðir, þ.e. aðgerðir sem vélmenni okkar mun framkvæma. Í kóðadæminu er þetta fall say_hello(). Aðgerðirnar sem þú munt nota sem bot aðferðir verða að hafa tvö nauðsynleg rök - láni и uppfærsla, og einn valfrjáls - heldur því fram. Rök láni, þetta er lánmaðurinn þinn, með hjálp þess geturðu svarað skilaboðum, sent skilaboð eða notað aðrar aðferðir sem eru tiltækar fyrir botninn. Rök uppfærsla þetta er það sem botninn fékk frá notandanum, reyndar það sem við fengum í fyrstu greininni með aðferðinni getUpdates(). Rök heldur því fram gerir þér kleift að vinna úr viðbótargögnum sem notandinn sendir ásamt skipuninni, við munum snúa aftur að þessu efni aðeins síðar;
  3. Við búum til umsjónarmenn, þ.e. Við tengjum nokkrar notendaaðgerðir við aðferðirnar sem voru búnar til í fyrra skrefi. Í meginatriðum er stjórnandi kveikja, atburður sem kallar á einhverja botnaaðgerð. Í okkar dæmi er slík kveikja að senda skipun /hi, og er útfært af teyminu hi_hendler <- CommandHandler('hi', say_hello). Fyrstu fallrök CommandHandler() gerir þér kleift að tilgreina skipun, í okkar tilviki hi, sem vélmenni mun svara. Önnur röksemdin gerir þér kleift að tilgreina bot aðferðina, við munum kalla aðferðina say_hello, sem verður keyrt ef notandinn kallaði skipunina sem tilgreind er í fyrstu röksemdinni;
  4. Næst bætum við stofnuðum umsjónarmanni við afgreiðsluaðila bekkjartilviksins okkar Updater. Þú getur bætt við meðhöndlum á nokkra vegu; í ​​dæminu hér að ofan notaði ég þann einfaldasta með því að nota táknið +þ.e. updater <- updater + hi_hendler. Það sama er hægt að gera með aðferðinni add_handler(), sem tilheyrir bekknum Dispatcher, þú getur fundið þessa aðferð svona: updater$dispatcher$add_handler();
  5. Ræstu vélmenni með skipuninni start_polling().

Textaskilaboðavinnsla og síur

Við komumst að því hvernig á að senda skipanir til botnsins, en stundum þurfum við að hann svari ekki aðeins skipunum heldur einnig sumum venjulegum textaskilaboðum. Til að gera þetta þarftu að nota skilaboðastjórnun − Message Handler.

Normal Message Handler mun svara algerlega öllum skilaboðum sem berast. Þess vegna eru skilaboðameðferðaraðilar oft notaðir ásamt síum. Við skulum kenna botninum að heilsa ekki aðeins eftir skipun /hi, en einnig þegar eitt af eftirfarandi orðum kemur fyrir í skilaboðunum sem send eru til botnsins: halló, halló, heilsa, haí, bonjour.

Í bili munum við ekki skrifa neinar nýjar aðferðir, því... Við höfum nú þegar aðferð þar sem botninn heilsar okkur. Allt sem við þurfum að gera er að búa til nauðsynlega síu og skilaboðastjórnun.

Kóði 2: Bættu við textaskilaboðum og síu

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()

Keyrðu kóðadæmið hér að ofan, eftir að hafa skipt út 'YOUR BOT TOKEN' fyrir raunverulega táknið sem þú fékkst þegar þú bjóst til botninn í gegnum BotFaðir (Ég talaði um að búa til vélmenni í fyrstu grein).

Nú skulum við reyna að senda botninum nokkur skilaboð sem innihalda kveðjuorðin sem talin voru upp áðan:
Að skrifa símskeyti botni í R (hluti 2): Bætir stjórnunarstuðningi og skilaboðasíum við botninn

Svo fyrst og fremst kenndum við botninum ekki bara að heilsa heldur að svara kveðju. Við gerðum þetta með því að nota rökin svar_við_skilaboðaauðkenni, sem er í boði í aðferðinni sendMessage(), þar sem þú þarft að flytja auðkenni skilaboðanna sem þú vilt svara. Þú getur fengið skilaboðakennið svona: update$message$message_id.

En aðalatriðið sem við gerðum var að bæta síu við botninn með því að nota aðgerðina BaseFilter():

# создаём фильтры
MessageFilters$hi <- BaseFilter( 

  # анонимная фильтрующая функция
  function(message) {

    # проверяем, встречается ли в тексте сообщения слова приветствия
    grepl(x           = message$text, 
          pattern     = 'привет|здравствуй|салют|хай|бонжур',
          ignore.case = TRUE)
  }

)

Eins og þú hefur kannski tekið eftir þarf að bæta síum við hlutinn Skilaboðasíur, sem upphaflega inniheldur nú þegar lítið sett af tilbúnum síum. Í okkar dæmi, að hlutnum Skilaboðasíur við bættum við þætti hi, þetta er ný sía.

Í virkni BaseFilter() þú þarft að standast síuaðgerðina. Í meginatriðum er sía bara aðgerð sem tekur á móti skilaboðatilviki og skilar SATT eða RANGT. Í dæminu okkar skrifuðum við einfalda aðgerð sem notar grunnfallið grepl() athugar skilaboðatextann og hvort hann passi við reglulegu segðina привет|здравствуй|салют|хай|бонжур skilar SATT.

Næst búum við til skilaboðastjórnun hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi). Fyrstu fallrök MessageHandler() er aðferðin sem kallar á meðhöndlunina og önnur rökin eru sían sem hún verður kölluð með. Í okkar tilviki er þetta sían sem við bjuggum til MessageFilters$hi.

Jæja, á endanum bætum við hönnuðinum sem búið var til við sendanda hæ_txt_hnd.

updater <- updater + 
             hi_hendler +
             hi_txt_hnd

Eins og ég skrifaði hér að ofan, í pakkanum telegram.bot og mótmæla Skilaboðasíur Það er nú þegar sett af innbyggðum síum sem þú getur notað:

  • öll — Öll skilaboð
  • texti — Textaskilaboð
  • skipun — Skipanir, þ.e. skilaboð sem byrja á /
  • svar — Skilaboð sem eru svar við öðrum skilaboðum
  • hljóð — Skilaboð sem innihalda hljóðskrá
  • skjal — Skilaboð með sendu skjali
  • mynd - Skilaboð með sendum myndum
  • límmiði — Skilaboð með sendum límmiða
  • myndskeið — Skilaboð með myndskeiði
  • rödd - Talskilaboð
  • tengiliður — Skilaboð sem innihalda símskeyti notandans
  • staðsetning — Skilaboð með landfræðilegri staðsetningu
  • vettvangur — Framsend skilaboð
  • leikur — Leikir

Ef þú vilt sameina nokkrar síur í einum meðhöndlara skaltu bara nota táknið | - sem rökrétt Eða, og skrifa undir & eins rökrétt И. Til dæmis, ef þú vilt að botni kalli sömu aðferð þegar hann fær myndband, mynd eða skjal, notaðu eftirfarandi dæmi til að búa til skilaboðameðferð:

handler <- MessageHandler(callback, 
  MessageFilters$video | MessageFilters$photo | MessageFilters$document
)

Bætir skipunum við með færibreytum

Við vitum nú þegar hvað skipanir eru, hvernig á að búa þær til og hvernig á að þvinga botninn til að framkvæma þá skipun sem óskað er eftir. En í sumum tilfellum, auk skipanafnsins, þurfum við að senda nokkur gögn til að framkvæma þau.

Hér að neðan er dæmi um vélmenni sem, að gefnu tiltekinni dagsetningu og landi, skilar þér dagtegundinni úr framleiðsludagatalinu.

Botninn hér að neðan notar API framleiðsludagatalsins isdayoff.ru.

Kóði 3: Bot sem tilkynnir eftir dagsetningu og landi

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()

Keyrðu kóðadæmið hér að ofan, eftir að hafa skipt út 'YOUR BOT TOKEN' fyrir raunverulega táknið sem þú fékkst þegar þú bjóst til botninn í gegnum BotFaðir (Ég talaði um að búa til vélmenni í fyrstu grein).

Við bjuggum til vélmenni sem hefur aðeins eina aðferð í vopnabúrinu sínu check_date, þessi aðferð er kölluð með samnefndri skipun.

En til viðbótar við skipanafnið krefst þessi aðferð að þú slærð inn tvær breytur, landsnúmerið og dagsetninguna. Næst athugar vélmenni hvort tiltekinn dagur í tilgreindu landi sé helgi, styttur dagur eða virkur dagur samkvæmt opinberu framleiðsludagatali.

Til þess að aðferðin sem við búum til taki við viðbótarbreytum ásamt skipuninni, notaðu rökin pass_args = TRUE í virkni CommandHandler(), og þegar aðferð er búin til, auk nauðsynlegra röka láni, uppfærsla búa til valfrjálsan einn - heldur því fram. Aðferðin sem búin er til á þennan hátt mun samþykkja færibreyturnar sem þú sendir til botnsins á eftir skipanafninu. Færibreyturnar verða að vera aðskildar með bili; þær verða sendar í aðferðina sem textavektor.

Við skulum ræsa og prófa botann okkar.

Að skrifa símskeyti botni í R (hluti 2): Bætir stjórnunarstuðningi og skilaboðasíum við botninn

Keyrðu botni í bakgrunni

Síðasta skrefið sem við þurfum að klára er að ræsa botni í bakgrunni.

Til að gera þetta skaltu fylgja reikniritinu sem lýst er hér að neðan:

  1. Vistaðu bot-kóðann í skrá með endingunni R. Þegar unnið er í RStudio er þetta gert í gegnum valmyndina File, lið Vista sem ....
  2. Bættu slóðinni við bin möppuna, sem aftur er staðsett í möppunni sem þú settir upp R tungumálið í, við Path breytuna, leiðbeiningar hér.
  3. Búðu til venjulega textaskrá þar sem skrifað er 1 línu: R CMD BATCH C:UsersAlseyDocumentsmy_bot.R... Í staðinn C:UsersAseyDocumentsmy_bot.R skrifaðu slóðina að botnforritinu þínu. Á sama tíma er mikilvægt að það séu engir kýrilískir stafir eða bil á leiðinni, því þetta getur valdið vandamálum þegar vélin er keyrð. Vistaðu það og skiptu um framlengingu þess fyrir txt á Bat.
  4. Opnaðu Windows Task Scheduler, það eru margar leiðir til að gera þetta, til dæmis, opnaðu hvaða möppu sem er og sláðu inn heimilisfangið %windir%system32taskschd.msc /s. Aðrar ræsingaraðferðir má finna hér.
  5. Í valmyndinni efst til hægri í tímaáætluninni, smelltu á "Búa til verkefni...".
  6. Á flipanum „Almennt“, gefðu verkefninu þínu sérsniðið nafn og skiptu rofanum yfir í stöðuna „Keyra fyrir alla notendur“.
  7. Farðu í flipann „Aðgerðir“ og smelltu á „Búa til“. Í reitnum „Forrit eða handrit“, smelltu á „Skoða“, finndu það sem var búið til í öðru skrefi Bat skrá og smelltu á OK.
  8. Smelltu á OK og, ef nauðsyn krefur, sláðu inn lykilorðið fyrir stýrikerfisreikninginn þinn.
  9. Finndu búið til verkefnið í tímaáætluninni, veldu það og smelltu á „Run“ hnappinn neðst í hægra horninu.

Botni okkar keyrir í bakgrunni og mun virka þar til þú hættir verkefninu eða slökktir á tölvunni þinni eða netþjóni sem það var sett á.

Ályktun

Í þessari grein komumst við að því hvernig á að skrifa fullgildan vélmenni sem getur ekki aðeins sent skilaboð heldur einnig svarað skilaboðum og skipunum sem berast. Þekkingin sem aflað er er nú þegar nóg til að leysa flest vandamál þín.

Næsta grein mun fjalla um hvernig á að bæta lyklaborði við vélmenni fyrir þægilegri vinnu.

Gerast áskrifandi að mínum símskeyti и YouTube sund.

Heimild: www.habr.com

Bæta við athugasemd