Ekri yon bot telegram nan R (pati 2): Ajoute sipò kòmand ak filtè mesaj nan bot la

В piblikasyon anvan nou kalkile ki jan yo kreye yon bot, inisyalize yon egzanp nan klas la Bot epi yo te vin abitye ak metòd yo pou voye mesaj lè l sèvi avèk li.

Nan atik sa a mwen kontinye sijè sa a, kidonk mwen rekòmande kòmanse li atik sa a sèlman apre li fin li premye pati a.

Fwa sa a, nou pral konnen ki jan yo reviv bot nou an epi ajoute sipò kòmand nan li, epi tou fè konesans ak klas la. Updater.

Pandan atik la, nou pral ekri plizyè robo senp, lèt la pral, ki baze sou yon dat bay ak kòd peyi, detèmine si yon jou nan yon peyi bay se yon wikenn oswa yon jou travay dapre kalandriye pwodiksyon an. Men, tankou anvan, objektif la nan atik la se familyarize w ak koòdone nan pake telegram.bot pou rezoud pwoblèm pwòp ou yo.

Ekri yon bot telegram nan R (pati 2): Ajoute sipò kòmand ak filtè mesaj nan bot la

Tout atik ki soti nan seri "Ekri yon telegram bot nan R"

  1. Nou kreye yon bot epi sèvi ak li pou voye mesaj nan telegram
  2. Ajoute sipò kòmand ak filtè mesaj nan bot la

Content

Si w enterese nan analiz done, ou ta ka enterese nan mwen an telegram и YouTube chanèl. Pifò nan kontni an dedye a lang R la.

  1. Klas Updater
  2. Handlers - moun kap okipe yo
  3. Ajoute premye kòmandman an nan bot la, moun kap okipe kòmand
  4. Tèks mesaj processeur ak filtè
  5. Ajoute kòmandman ak paramèt
  6. Kouri bot la nan background nan
  7. Konklizyon

Klas Updater

Updater se yon klas ki fè li pi fasil pou w devlope yon telegram bot, epi sèvi ak klas la anba kapo a Dispetcher. Devwa klas la Updater se resevwa mizajou nan men bot la (nan atik anvan an nou te itilize metòd la pou objektif sa a getUpdates()), epi transfere yo pi lwen Dispetcher.

Nan vire Dispetcher gen moun kap okipe ou te kreye yo, i.e. objè klas yo Handler.

Handlers - moun kap okipe yo

Avèk moun kap okipe ou ajoute nan Dispetcher reyaksyon bot nan divès evènman. Nan moman w ap ekri atik sa a nan telegram.bot Yo te ajoute kalite moun kap okipe sa yo:

  • MessageHandler — Manadjè mesaj
  • CommandHandler — Manadjè kòmand
  • CallbackQueryHandler — Manadjè done pou klavye voye soti nan Inline
  • ErrorHandler - Manadjè erè lè w mande mizajou nan bot la

Ajoute premye kòmandman an nan bot la, moun kap okipe kòmand

Si ou pa janm itilize bots anvan epi ou pa konnen ki sa yon kòmand ye, Lè sa a, kòmandman pou bot la dwe voye lè l sèvi avèk yon koupe pi devan. / kòm yon prefiks.

Nou pral kòmanse ak kòmandman senp, i.e. ann aprann bot nou an di bonjou sou lòd /hi.

Kòd 1: Aprann bot la di bonjou

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

Kouri egzanp kòd ki anwo a, apre w fin ranplase 'YOUR BOT TOKEN' ak vrè siy ou te resevwa lè w kreye bot la atravè BotPather (Mwen te pale sou kreye yon bot nan premye atik).

Metòd start_polling() klas Updater, ki itilize nan fen kòd la, kòmanse yon bouk kontinuèl pou mande ak trete mizajou nan bot la.

Koulye a, ann louvri Telegram epi ekri premye kòmandman an nan bot nou an /hi.

Ekri yon bot telegram nan R (pati 2): Ajoute sipò kòmand ak filtè mesaj nan bot la

Koulye a, bot nou an konprann kòmandman an /hi, epi li konnen ki jan yo salye nou.

Schématikman, pwosesis la nan bati tankou yon bot senp ka montre jan sa a.

Ekri yon bot telegram nan R (pati 2): Ajoute sipò kòmand ak filtè mesaj nan bot la

  1. Kreye yon egzanp nan klas la Updater;
  2. Nou kreye metòd, i.e. fonksyon ke bot nou an pral fè. Nan egzanp kòd sa a se yon fonksyon say_hello(). Fonksyon ou pral itilize kòm metòd bot dwe gen de agiman obligatwa - bot и aktyalizasyon, ak yon opsyonèl - arg. Agiman bot, sa a se bot ou a, avèk èd li ou ka reponn mesaj, voye mesaj, oswa itilize nenpòt lòt metòd ki disponib nan bot la. Agiman aktyalizasyon sa a se sa bot la te resevwa nan men itilizatè a, an reyalite, sa nou te resevwa nan premye atik la lè l sèvi avèk metòd la getUpdates(). Agiman arg pèmèt ou trete plis done itilizatè a voye ansanm ak lòd la, nou pral retounen nan sijè sa a yon ti kras pita;
  3. Nou kreye moun kap okipe, i.e. Nou asosye kèk aksyon itilizatè yo ak metòd yo te kreye nan etap anvan an. Esansyèlman, yon moun kap okipe se yon deklanche, yon evènman ki rele kèk fonksyon bot. Nan egzanp nou an, tankou yon deklanche ap voye yon lòd /hi, epi ekip la aplike hi_hendler <- CommandHandler('hi', say_hello). Premye agiman fonksyon CommandHandler() pèmèt ou presize yon lòd, nan ka nou an hi, ki bot la pral reponn. Dezyèm agiman an pèmèt ou presize metòd bot la, nou pral rele metòd la say_hello, ki pral egzekite si itilizatè a te rele lòd ki espesifye nan premye agiman an;
  4. Apre sa, nou ajoute moun kap okipe a kreye nan dispatcher nan egzanp klas nou an Updater. Ou ka ajoute moun kap okipe yo nan plizyè fason; nan egzanp ki anwo a, mwen te itilize youn ki pi senp la, lè l sèvi avèk siy la +, sa vle di. updater <- updater + hi_hendler. Menm bagay la tou ka fè lè l sèvi avèk metòd la add_handler(), ki fè pati klas la Dispatcher, ou ka jwenn metòd sa a tankou sa a: updater$dispatcher$add_handler();
  5. Lanse bot la lè l sèvi avèk lòd la start_polling().

Tèks mesaj processeur ak filtè

Nou te kalkile ki jan yo voye kòmandman nan bot la, men pafwa nou bezwen bot la reponn non sèlman a kòmandman, men tou, nan kèk mesaj tèks regilye. Pou fè sa ou bezwen sèvi ak moun kap okipe mesaj - MessageHandler.

òdinè MessageHandler pral reponn a absoliman tout mesaj fèk ap rantre. Se poutèt sa, moun kap okipe mesaj yo souvan itilize ansanm ak filtè. Ann anseye bot la di bonjou pa sèlman sou lòd /hi, men tou, chak fwa youn nan mo sa yo parèt nan mesaj yo voye bay bot la: bonjou, bonjou, salut, hai, bonjou.

Pou kounye a nou pa pral ekri okenn nouvo metòd, paske... Nou deja gen yon metòd kote bot la salye nou. Tout sa nou bezwen fè se kreye filtè ki nesesè yo ak moun kap okipe mesaj yo.

Kòd 2: Ajoute yon moun kap okipe mesaj tèks ak filtre

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

Kouri egzanp kòd ki anwo a, apre w fin ranplase 'YOUR BOT TOKEN' ak vrè siy ou te resevwa lè w kreye bot la atravè BotPather (Mwen te pale sou kreye yon bot nan premye atik).

Koulye a, ann eseye voye bot la plizyè mesaj ki gen mo salitasyon yo ki nan lis pi bonè:
Ekri yon bot telegram nan R (pati 2): Ajoute sipò kòmand ak filtè mesaj nan bot la

Se konsa, anvan tout bagay, nou te anseye bot la pa sèlman di bonjou, men reponn a yon bonjou. Nou te fè sa lè l sèvi avèk agiman an reply_to_message_id, ki disponib nan metòd la sendMessage(), kote ou bezwen transfere id mesaj ou vle reponn a. Ou ka jwenn id mesaj la tankou sa a: update$message$message_id.

Men, bagay prensipal nou te fè se te ajoute yon filtè nan bot la lè l sèvi avèk fonksyon an BaseFilter():

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

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

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

)

Kòm ou ka remake, filtè yo bezwen ajoute nan objè a MessageFilters, ki okòmansman deja gen yon ti seri filtè pare yo. Nan egzanp nou an, nan objè a MessageFilters nou te ajoute yon eleman hi, sa a se yon nouvo filtè.

Pou fonksyone BaseFilter() ou bezwen pase fonksyon filtre a. Esansyèlman, yon filtè se jis yon fonksyon ki resevwa yon egzanp mesaj epi retounen VERITE oswa FO. Nan egzanp nou an, nou te ekri yon fonksyon senp ki, lè l sèvi avèk fonksyon debaz la grepl() tcheke tèks mesaj la epi si li matche ak ekspresyon regilye a привет|здравствуй|салют|хай|бонжур retounen VERITE.

Apre sa, nou kreye yon moun kap okipe mesaj hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi). Premye agiman fonksyon MessageHandler() se metòd ki pral rele moun kap okipe a, ak dezyèm agiman an se filtè ki pral rele li. Nan ka nou an, sa a se filtè nou te kreye MessageFilters$hi.

Oke, nan fen a, nou ajoute nan dispatcher a moun kap okipe a kreye hi_txt_hnd.

updater <- updater + 
             hi_hendler +
             hi_txt_hnd

Kòm mwen te ekri pi wo a, nan pake a telegram.bot ak objè MessageFilters Gen deja yon seri filtè entegre ke ou ka itilize:

  • tout — Tout mesaj
  • tèks — Mesaj tèks
  • kòmand — Kòmandman, i.e. mesaj ki kòmanse ak /
  • reply — Mesaj ki se yon repons pou yon lòt mesaj
  • odyo — Mesaj ki gen yon fichye odyo
  • dokiman — Mesaj ak yon dokiman voye
  • foto - Mesaj ak imaj voye
  • fichye — Mesaj ak yon fichye voye
  • videyo — Mesaj ak videyo
  • vwa - Mesaj vwa
  • kontak — Mesaj ki gen kontni telegram itilizatè a
  • kote — Mesaj ak jeolokalizasyon
  • pidevan — Voye mesaj
  • jwèt — jwèt

Si ou vle konbine kèk filtè nan yon sèl okipe jis itilize siy la | - kòm yon lojik OSWA, epi siyen & kòm lojik И. Pou egzanp, si ou vle bot la rele menm metòd la lè li resevwa yon videyo, imaj oswa dokiman, sèvi ak egzanp sa a pou kreye yon moun kap okipe mesaj:

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

Ajoute kòmandman ak paramèt

Nou deja konnen ki sa kòmandman yo ye, ki jan yo kreye yo, ak ki jan yo fòse bot la egzekite lòd la vle. Men, nan kèk ka, anplis non kòmandman an, nou bezwen pase kèk done pou egzekite li.

Anba la a se yon egzanp yon bot ki, bay yon dat ak peyi bay, retounen ou kalite jou nan kalandriye pwodiksyon an.

Bot ki anba a sèvi ak API kalandriye pwodiksyon an isdayoff.ru.

Kòd 3: Bot ki rapòte pa dat ak peyi

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

Kouri egzanp kòd ki anwo a, apre w fin ranplase 'YOUR BOT TOKEN' ak vrè siy ou te resevwa lè w kreye bot la atravè BotPather (Mwen te pale sou kreye yon bot nan premye atik).

Nou te kreye yon bot ki gen yon sèl metòd nan asenal li yo check_date, se metòd sa a rele pa lòd la nan menm non an.

Men, anplis non kòmandman an, metòd sa a mande pou ou antre de paramèt, kòd peyi a ak dat la. Apre sa, bot la tcheke si yon jou bay nan peyi espesifye a se yon wikenn, yon jou ki pi kout, oswa yon jou travay dapre kalandriye pwodiksyon ofisyèl la.

Pou metòd nou kreye a aksepte lòt paramèt ansanm ak kòmandman an, sèvi ak agiman an pass_args = TRUE nan fonksyon CommandHandler(), ak lè w ap kreye yon metòd, anplis agiman yo mande yo bot, aktyalizasyon kreye yon opsyonèl - arg. Metòd ki te kreye nan fason sa a pral aksepte paramèt yo ke ou pase nan bot la apre non an kòmand. Paramèt yo dwe separe pa yon espas; yo pral voye yo nan metòd la kòm yon vektè tèks.

Ann lanse epi teste bot nou an.

Ekri yon bot telegram nan R (pati 2): Ajoute sipò kòmand ak filtè mesaj nan bot la

Kouri bot la nan background nan

Dènye etap nou bezwen ranpli se lanse bot la nan background nan.

Pou fè sa, swiv algorithm ki dekri anba a:

  1. Sove kòd bot la nan yon dosye ki gen ekstansyon R. Lè w ap travay nan RStudio, sa fèt nan meni an File, ekip Sove tankou ....
  2. Ajoute chemen an nan katab bin la, ki an vire sitiye nan katab la kote ou enstale lang R la, nan varyab la Path, enstriksyon isit la.
  3. Kreye yon dosye tèks regilye nan ki ekri 1 liy: R CMD BATCH C:UsersAlseyDocumentsmy_bot.R. Olye de C:UsersAlseyDocumentsmy_bot.R ekri chemen an nan script bot ou a. An menm tan an, li enpòtan ke pa gen okenn karaktè sirilik oswa espas sou wout la, paske sa ka lakòz pwoblèm lè w ap kouri bot la. Sove li, epi ranplase ekstansyon li ak txt sou baton.
  4. Louvri Windows Task Scheduler, gen plizyè fason pou fè sa, pou egzanp, louvri nenpòt katab epi antre nan adrès la. %windir%system32taskschd.msc /s. Lòt metòd lansman ka jwenn isit la.
  5. Nan meni an tèt dwat nan orè a, klike sou "Kreye travay...".
  6. Sou tab la "Jeneral", bay travay ou yon non koutim, epi chanje switch la nan eta a "Kouri pou tout itilizatè".
  7. Ale nan tab la "Aksyon", klike sou "Kreye". Nan jaden an "Pwogram oswa script", klike sou "Browse", jwenn youn ki te kreye nan dezyèm etap la baton dosye epi klike sou OK.
  8. Klike sou OK epi, si sa nesesè, antre modpas pou kont sistèm opere w la.
  9. Jwenn travay la te kreye nan pwogramè a, chwazi li epi klike sou bouton "Kouri" ki nan kwen ki pi ba dwat.

Bot nou an kouri nan background nan epi yo pral travay jiskaske ou sispann travay la, oswa fèmen PC ou oswa sèvè kote li te lanse.

Konklizyon

Nan atik sa a, nou konnen ki jan yo ekri yon bot plen véritable ki ka pa sèlman voye mesaj, men tou, reponn a mesaj fèk ap rantre ak kòmandman. Konesans ou genyen deja ase pou rezoud pifò pwoblèm ou yo.

Pwochen atik la pral pale sou fason pou ajoute yon klavye nan bot la pou travay ki pi pratik.

Abòne ak mwen telegram и YouTube chanèl.

Sous: www.habr.com

Add nouvo kòmantè