Pagsulat og telegram bot sa R ​​(bahin 2): Pagdugang sa suporta sa command ug mga filter sa mensahe sa bot

В miaging publikasyon nahibal-an namon kung giunsa paghimo ang usa ka bot, gisugdan ang usa ka pananglitan sa klase Bot ug nahimong pamilyar sa mga paagi sa pagpadala sa mga mensahe gamit kini.

Niini nga artikulo gipadayon nako kini nga hilisgutan, mao nga girekomenda nako nga sugdan ang pagbasa niini nga artikulo pagkahuman sa pagbasa ang una nga bahin.

Niining higayona mahibal-an namon kung giunsa pag-usab ang among bot ug pagdugang suporta sa komand niini, ug pamilyar usab sa klase Updater.

Atol sa dagan sa artikulo, magsulat kami pipila ka yano nga mga bot, ang ulahi, base sa gihatag nga petsa ug code sa nasud, mahibal-an kung ang usa ka adlaw sa usa ka nasud usa ka katapusan sa semana o usa ka adlaw sa pagtrabaho sumala sa kalendaryo sa produksiyon. Apan, sama kaniadto, ang katuyoan sa artikulo mao ang pag-familiarize kanimo sa interface sa package telegram.bot aron masulbad ang imong kaugalingon nga mga problema.

Pagsulat og telegram bot sa R ​​(bahin 2): Pagdugang sa suporta sa command ug mga filter sa mensahe sa bot

Ang tanan nga mga artikulo gikan sa serye nga "Pagsulat sa usa ka telegrama bot sa R"

  1. Paghimo usa ka bot ug gamita kini aron magpadala mga mensahe sa telegrama
  2. Idugang ang suporta sa command ug mga filter sa mensahe sa bot

Mga sulod

Kung interesado ka sa pagtuki sa datos, mahimong interesado ka sa akong telegram и youtube mga kanal. Kadaghanan sa sulod niini gipahinungod sa R ​​nga pinulongan.

  1. Klase sa Updater
  2. Handler - mga handler
  3. Idugang ang unang sugo sa bot, command handler
  4. Text message processor ug mga filter
  5. Pagdugang mga Sugo nga adunay mga Parameter
  6. Pagdalagan ang bot sa background
  7. konklusyon

Klase sa Updater

Updater usa ka klase nga nagpasayon ​​alang kanimo sa paghimo og telegram bot, ug gigamit ang klase sa ilawom sa tabon Dispetcher. Klase nga buluhaton Updater mao ang pagdawat sa mga update gikan sa bot (sa miaging artikulo among gigamit ang pamaagi alang niini nga katuyoan getUpdates()), ug ibalhin pa sila sa Dispetcher.

Sa iyang turno Dispetcher naglangkob sa mga tigdumala nga imong gibuhat, i.e. mga butang sa klase Handler.

Handler - mga handler

Sa mga handler nga imong gidugang Dispetcher mga reaksyon sa bot sa lainlaing mga panghitabo. Sa panahon sa pagsulat niini nga artikulo sa telegram.bot Ang mosunod nga mga matang sa mga tigdumala gidugang:

  • MessageHandler — tigdumala sa mensahe
  • CommandHandler - Command handler
  • CallbackQueryHandler — Data handler para sa mga keyboard nga gipadala gikan sa Inline
  • ErrorHandler - Error handler kung nangayo ug mga update gikan sa bot

Idugang ang unang sugo sa bot, command handler

Kung wala pa nimo gigamit ang mga bot kaniadto ug wala ka nahibal-an kung unsa ang usa ka mando, nan ang mga mando sa bot kinahanglan ipadala gamit ang usa ka forward slash / isip prefix.

Magsugod kita sa yano nga mga sugo, i.e. tudloan nato atong bot nga mangumusta sa sugo /hi.

Code 1: Pagtudlo sa bot nga mangumusta

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

Pagdalagan ang pananglitan sa code sa ibabaw, human ilisan ang 'YOUR BOT TOKEN' sa tinuod nga token nga imong nadawat sa paghimo sa bot pinaagi sa BotAmahan (Naghisgot ko bahin sa paghimo og bot sa unang artikulo).

Paagi start_polling() grade Updater, nga gigamit sa katapusan sa code, nagsugod sa usa ka walay katapusan nga loop sa paghangyo ug pagproseso sa mga update gikan sa bot.

Karon atong ablihan ang Telegram ug isulat ang unang sugo sa atong bot /hi.

Pagsulat og telegram bot sa R ​​(bahin 2): Pagdugang sa suporta sa command ug mga filter sa mensahe sa bot

Karon nasabtan na sa among bot ang sugo /hi, ug mahibalong motimbaya kanamo.

Sa eskematiko, ang proseso sa paghimo sa usa ka yano nga bot mahimong mahulagway ingon sa mosunod.

Pagsulat og telegram bot sa R ​​(bahin 2): Pagdugang sa suporta sa command ug mga filter sa mensahe sa bot

  1. Paghimo usa ka pananglitan sa klase Updater;
  2. Naghimo kami og mga pamaagi, i.e. mga function nga himuon sa among bot. Sa pananglitan sa code kini usa ka function say_hello(). Ang mga gimbuhaton nga imong gamiton isip mga pamaagi sa bot kinahanglan adunay duha ka gikinahanglan nga mga argumento - bot и update, ug usa ka opsyonal - mga argumento. Pangatarungan bot, kini ang imong bot, uban sa tabang niini ikaw makatubag sa mga mensahe, makapadala og mga mensahe, o makagamit sa bisan unsang ubang pamaagi nga anaa sa bot. Pangatarungan update kini ang nadawat sa bot gikan sa tiggamit, sa tinuud, kung unsa ang among nadawat sa una nga artikulo gamit ang pamaagi getUpdates(). Pangatarungan mga argumento nagtugot kanimo sa pagproseso sa dugang nga datos nga gipadala sa user uban sa sugo, mobalik kami niini nga hilisgutan sa ulahi;
  3. Naghimo kami og mga handler, i.e. Among gilangkit ang pipila ka mga aksyon sa user sa mga pamaagi nga gihimo sa miaging lakang. Sa tinuud, ang usa ka handler usa ka trigger, usa ka panghitabo nga nagtawag sa pipila ka function sa bot. Sa among pananglitan, ang ingon nga hinungdan mao ang pagpadala usa ka mando /hi, ug gipatuman sa team hi_hendler <- CommandHandler('hi', say_hello). Unang function argumento CommandHandler() nagtugot kanimo sa pagtino sa usa ka sugo, sa among kaso hi, diin ang bot motubag. Ang ikaduha nga argumento nagtugot kanimo sa pagtino sa pamaagi sa bot, among tawgon ang pamaagi say_hello, nga ipatuman kung ang user nagtawag sa sugo nga gitakda sa unang argumento;
  4. Sunod, among idugang ang gibuhat nga handler sa dispatcher sa among klase nga pananglitan Updater. Mahimo nimong idugang ang mga tigdumala sa daghang mga paagi; sa panig-ingnan sa ibabaw, gigamit nako ang pinakasimple, gamit ang timaan +, i.e. updater <- updater + hi_hendler. Ang sama nga mahimo gamit ang pamaagi add_handler(), nga iya sa klase Dispatcher, makit-an nimo kini nga pamaagi sama niini: updater$dispatcher$add_handler();
  5. Ilunsad ang bot gamit ang command start_polling().

Text message processor ug mga filter

Nahibal-an namon kung giunsa ipadala ang mga mando sa bot, apan usahay kinahanglan namon ang bot nga motubag dili lamang sa mga mando, kondili usab sa pipila ka regular nga mga text message. Aron mahimo kini kinahanglan nimo nga gamiton ang mga tigdumala sa mensahe − MessageHandler.

ordinaryo nga MessageHandler motubag sa hingpit sa tanan nga umaabot nga mga mensahe. Busa, ang mga tigdumala sa mensahe kanunay nga gigamit kauban ang mga pagsala. Tudloan nato ang bot nga mangumusta dili lang sa sugo /hi, apan usab sa matag higayon nga ang usa sa mosunod nga mga pulong makita sa mensahe nga gipadala ngadto sa bot: hello, hello, salute, hai, bonjour.

Sa pagkakaron dili kami mosulat og bisan unsang bag-ong mga pamaagi, tungod kay... Naa na tay paagi nga gitimbaya mi sa bot. Ang kinahanglan natong buhaton mao ang paghimo sa gikinahanglan nga filter ug tigdumala sa mensahe.

Code 2: Pagdugang usa ka tigdumala sa text message ug pagsala

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

Pagdalagan ang pananglitan sa code sa ibabaw, human ilisan ang 'YOUR BOT TOKEN' sa tinuod nga token nga imong nadawat sa paghimo sa bot pinaagi sa BotAmahan (Naghisgot ko bahin sa paghimo og bot sa unang artikulo).

Karon atong sulayan nga ipadala ang bot sa daghang mga mensahe nga adunay sulud nga mga pulong sa pagtimbaya nga gilista sa sayo pa:
Pagsulat og telegram bot sa R ​​(bahin 2): Pagdugang sa suporta sa command ug mga filter sa mensahe sa bot

Mao nga, una sa tanan, gitudloan namon ang bot nga dili lang mangumusta, apan sa pagtubag sa usa ka pagtimbaya. Gibuhat namo kini gamit ang argumento reply_to_message_id, nga anaa sa pamaagi sendMessage(), diin kinahanglan nimong ibalhin ang id sa mensahe nga gusto nimong tubagon. Makuha nimo ang message id sama niini: update$message$message_id.

Apan ang panguna nga butang nga among gibuhat mao ang pagdugang usa ka filter sa bot gamit ang function BaseFilter():

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

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

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

)

Sama sa imong namatikdan, ang mga pagsala kinahanglan nga idugang sa butang MessageFilters, nga sa sinugdan naglangkob na sa usa ka gamay nga hugpong sa andam nga mga pagsala. Sa atong pananglitan, sa butang MessageFilters midugang kami og elemento hi, kini usa ka bag-ong filter.

Aron molihok BaseFilter() kinahanglan nimo nga ipasa ang function sa filter. Sa tinuud, ang usa ka filter usa lamang ka function nga makadawat usa ka pananglitan sa mensahe ug mobalik TINUOD o SAYOP. Sa among panig-ingnan, nagsulat kami usa ka yano nga function nga, gamit ang sukaranan nga function grepl() nagsusi sa text sa mensahe ug kon kini mohaum sa regular nga ekspresyon привет|здравствуй|салют|хай|бонжур ningbalik TINUOD.

Sunod maghimo kami usa ka tigdumala sa mensahe hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi). Unang function argumento MessageHandler() mao ang paagi nga motawag sa handler, ug ang ikaduhang argumento mao ang filter diin kini tawgon. Sa among kaso, kini ang filter nga among gibuhat MessageFilters$hi.

Aw, sa katapusan, atong idugang sa dispatcher ang gibuhat nga handler hi_txt_hnd.

updater <- updater + 
             hi_hendler +
             hi_txt_hnd

Sama sa akong gisulat sa ibabaw, sa package telegram.bot ug butang MessageFilters Adunay na usa ka hugpong sa mga built-in nga mga filter nga imong magamit:

  • tanan — Tanan nga mensahe
  • text — Mga text message
  • sugo - Mga sugo, i.e. mga mensahe nga nagsugod sa /
  • reply — Mga mensahe nga tubag sa laing mensahe
  • audio — Mga mensahe nga adunay sulod nga audio file
  • dokumento - Mga mensahe nga adunay gipadala nga dokumento
  • litrato - Mga mensahe nga adunay gipadala nga mga imahe
  • sticker - Mga mensahe nga adunay gipadala nga sticker
  • video — Mga mensahe nga adunay video
  • tingog - Mga mensahe sa tingog
  • kontak - Mga mensahe nga adunay sulod nga telegrama sa user
  • lokasyon — Mga mensahe nga adunay geolocation
  • venue — Gipasa nga mga mensahe
  • dula — Dula

Kung gusto nimo nga maghiusa sa pipila nga mga pagsala sa usa ka handler gamita lang ang timaan | - isip usa ka lohikal O, ug sign & ingon lohikal И. Pananglitan, kung gusto nimo nga tawagan sa bot ang parehas nga pamaagi kung makadawat kini usa ka video, imahe o dokumento, gamita ang mosunod nga pananglitan aron makahimo usa ka tigdumala sa mensahe:

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

Pagdugang mga Sugo nga adunay mga Parameter

Nahibal-an na namon kung unsa ang mga mando, kung giunsa kini paghimo, ug kung giunsa pagpugos ang bot nga ipatuman ang gusto nga mando. Apan sa pipila ka mga kaso, dugang sa ngalan sa command, kinahanglan namon nga ipasa ang pipila ka mga datos aron ipatuman kini.

Sa ubos usa ka pananglitan sa usa ka bot nga, gihatagan sa gihatag nga petsa ug nasud, ibalik kanimo ang tipo sa adlaw gikan sa kalendaryo sa produksiyon.

Ang bot sa ubos naggamit sa production calendar API isdayoff.ru.

Code 3: Bot nga nagreport sa petsa ug nasud

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

Pagdalagan ang pananglitan sa code sa ibabaw, human ilisan ang 'YOUR BOT TOKEN' sa tinuod nga token nga imong nadawat sa paghimo sa bot pinaagi sa BotAmahan (Naghisgot ko bahin sa paghimo og bot sa unang artikulo).

Naghimo kami usa ka bot nga adunay usa ra nga pamaagi sa arsenal niini check_date, kini nga paagi gitawag pinaagi sa mando sa parehas nga ngalan.

Apan, dugang pa sa ngalan sa sugo, kini nga pamaagi nanginahanglan kanimo nga mosulod sa duha ka mga parameter, ang code sa nasud ug ang petsa. Sunod, susihon sa bot kung ang usa ka adlaw sa gipiho nga nasud usa ka katapusan sa semana, usa ka gipamubu nga adlaw, o usa ka adlaw sa pagtrabaho sumala sa opisyal nga kalendaryo sa produksiyon.

Aron ang pamaagi nga among gihimo aron makadawat dugang nga mga parameter kauban ang mando, gamita ang argumento pass_args = TRUE sa function CommandHandler(), ug kung maghimo usa ka pamaagi, dugang sa gikinahanglan nga mga argumento bot, update paghimo og usa ka opsyonal - mga argumento. Ang pamaagi nga gihimo niining paagiha makadawat sa mga parameter nga imong ipasa sa bot pagkahuman sa ngalan sa command. Ang mga parametro kinahanglang ibulag sa usa ka luna; ipadala kini sa pamaagi isip text vector.

Atong ilunsad ug sulayan ang atong bot.

Pagsulat og telegram bot sa R ​​(bahin 2): Pagdugang sa suporta sa command ug mga filter sa mensahe sa bot

Pagdalagan ang bot sa background

Ang katapusan nga lakang nga kinahanglan natong makompleto mao ang paglansad sa bot sa background.

Aron mahimo kini, sunda ang algorithm nga gihulagway sa ubos:

  1. I-save ang bot code sa usa ka file nga adunay extension nga R. Kung nagtrabaho sa RStudio, kini gihimo pinaagi sa menu file, team Makatipig Ingon ....
  2. Idugang ang dalan sa bin folder, nga sa baylo nahimutang sa folder diin imong gi-install ang R nga pinulongan, ngadto sa Path variable, mga instruksyon dinhi.
  3. Paghimo og usa ka regular nga text file diin isulat ang 1 ka linya: R CMD BATCH C:UsersAlseyDocumentsmy_bot.R... Sa baylo C:UsersAlseyDocumentsmy_bot.R isulat ang dalan sa imong bot script. Sa samang higayon, importante nga walay Cyrillic nga mga karakter o mga luna sa dalan, tungod kay kini mahimong hinungdan sa mga problema sa diha nga ang bot. I-save kini, ug pulihan ang extension niini sa txt sa kabog.
  4. Ablihi ang Windows Task Scheduler, adunay daghang mga paagi aron mahimo kini, pananglitan, pag-abli sa bisan unsang folder ug pagsulod sa adres %windir%system32taskschd.msc /s. Makita ang ubang mga pamaagi sa paglansad dinhi.
  5. Sa ibabaw nga tuo nga menu sa scheduler, i-klik ang "Paghimo buluhaton...".
  6. Diha sa tab nga "General", hatagi ang imong buluhaton og custom nga ngalan, ug ibalhin ang switch ngadto sa "Run for all users" state.
  7. Lakaw ngadto sa tab nga "Mga Aksyon", i-klik ang "Paghimo". Sa field nga "Programa o script", i-klik ang "Browse", pangitaa ang gihimo sa ikaduhang lakang kabog file ug i-klik ang OK.
  8. I-klik ang OK ug, kon gikinahanglan, isulod ang password alang sa imong operating system account.
  9. Pangitaa ang gibuhat nga buluhaton sa scheduler, pilia kini ug i-klik ang "Run" nga buton sa ubos nga tuo nga suok.

Ang among bot nagdagan sa background ug molihok hangtod imong ihunong ang buluhaton, o i-off ang imong PC o server diin kini gilusad.

konklusyon

Niini nga artikulo, nahibal-an namon kung giunsa pagsulat ang usa ka bug-os nga bot nga dili lamang makapadala mga mensahe, apan makatubag usab sa umaabot nga mga mensahe ug mga mando. Ang kahibalo nga nakuha igo na aron masulbad ang kadaghanan sa imong mga problema.

Ang sunod nga artikulo maghisgot kung giunsa pagdugang ang usa ka keyboard sa bot alang sa labi ka dali nga trabaho.

Subscribe sa akong telegram и youtube mga kanal.

Source: www.habr.com

Idugang sa usa ka comment