Навиштани боти телеграмма дар R (қисми 2): Илова кардани дастгирии фармон ва филтрҳои паёмӣ ба бот

В нашри қаблӣ мо фаҳмидем, ки чӣ гуна бот эҷод кунем, як мисоли синфро оғоз кардем Bot ва бо усулҳои ирсоли паёмҳо бо истифода аз он шинос шуданд.

Дар ин мақола ман ин мавзӯъро идома медиҳам, бинобар ин ман тавсия медиҳам, ки ба хондани ин мақола танҳо пас аз хондан шурӯъ кунед қисми якум.

Ин дафъа мо мефаҳмем, ки чӣ гуна боти худро эҳё кунем ва ба он дастгирии фармонро илова кунем ва инчунин бо синф шинос шавем. Updater.

Дар давоми мақола мо якчанд ботҳои оддиро менависем, ки охирин бо назардошти сана ва рамзи кишвар муайян мекунад, ки як рӯз дар ин кишвар рӯзи истироҳат аст ё рӯзи корӣ мувофиқи тақвими истеҳсолӣ. Аммо, мисли пештара, ҳадафи мақола ин аст, ки шуморо бо интерфейси баста шинос кунад telegram.bot барои халли проблемахои худ.

Навиштани боти телеграмма дар R (қисми 2): Илова кардани дастгирии фармон ва филтрҳои паёмӣ ба бот

Ҳама мақолаҳо аз силсилаи "Навиштани боти телеграмма дар R"

  1. Мо бот эҷод мекунем ва онро барои фиристодани паёмҳо дар телеграмма истифода мебарем
  2. Ба бот дастгирии фармон ва филтрҳои паём илова кунед

Мундариҷа

Агар шумо ба таҳлили маълумот таваҷҷӯҳ дошта бошед, шумо шояд ба ман таваҷҷӯҳ кунед телеграмма и YouTube каналхо. Аксари мундариҷа ба забони R бахшида шудаанд.

  1. Синфи навсозӣ
  2. Корфармоён - муомилот
  3. Фармони аввалро ба бот, коркардкунандаи фармон илова кунед
  4. Протсессор ва филтрҳои паёмҳои матнӣ
  5. Илова кардани фармонҳо бо параметрҳо
  6. Ботро дар замина иҷро кунед
  7. хулоса

Синфи навсозӣ

Updater синфест, ки барои шумо таҳияи боти телеграммаро осон мекунад ва синфро дар зери сарпӯш истифода мебарад Dispetcher. Супориши синф Updater гирифтани навсозиҳо аз бот аст (дар мақолаи қаблӣ мо усулро бо ин мақсад истифода бурдем getUpdates()), ва онҳоро ба минбаъда интиқол диҳед Dispetcher.

Дар навбати худ Dispetcher дорои коркардкунандагони офаридаи шумо, яъне. объектҳои синф Handler.

Корфармоён - муомилот

Бо коркардкунандагоне, ки шумо ба он илова мекунед Dispetcher вокунишҳои бот ба рӯйдодҳои гуногун. Ҳангоми навиштани ин мақола дар telegram.bot Навъҳои зерини коркардкунандагон илова карда шуданд:

  • MessageHandler — коркардкунандаи паём
  • CommandHandler — Идоракунандаи фармон
  • CallbackQueryHandler - коркардкунандаи маълумот барои клавиатураҳои аз Inline фиристодашуда
  • ErrorHandler - Коркарди хатогӣ ҳангоми дархости навсозиҳо аз бот

Фармони аввалро ба бот, коркардкунандаи фармон илова кунед

Агар шумо қаблан ҳеҷ гоҳ ботҳоро истифода накарда бошед ва намедонед, ки фармон чист, пас фармонҳо ба бот бояд бо истифода аз хати пеш фиристода шаванд. / ҳамчун префикс.

Мо бо фармонҳои оддӣ оғоз мекунем, яъне. биёед боти худамонро таълим диҳем, ки бо фармон салом бигӯяд /hi.

Рамзи 1: Таълим ба бот салом гуфтан

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

Мисоли рамзи дар боло зикршударо иҷро кунед, пас аз иваз кардани 'BOT TOKEN' -и шумо бо аломати воқеӣ, ки ҳангоми сохтани бот тавассути тавассути он гирифтаед. БотПадар (Ман дар бораи сохтани бот дар мақолаи аввал).

метод start_polling() дараҷа Updater, ки дар охири код истифода мешавад, як ҳалқаи беохири дархост ва коркарди навсозиро аз бот оғоз мекунад.

Акнун биёед Telegram-ро кушоем ва фармони аввалро ба боти худ нависед /hi.

Навиштани боти телеграмма дар R (қисми 2): Илова кардани дастгирии фармон ва филтрҳои паёмӣ ба бот

Акнун боти мо фармонро мефаҳмад /hi, ва медонад, ки моро чй тавр пешвоз гирад.

Ба таври схематикй, процесси сохтани чунин боти оддиро ба таври зерин тасвир кардан мумкин аст.

Навиштани боти телеграмма дар R (қисми 2): Илова кардани дастгирии фармон ва филтрҳои паёмӣ ба бот

  1. Як мисоли синфро эҷод кунед Updater;
  2. Мо усулҳоро эҷод мекунем, яъне. вазифаҳое, ки боти мо иҷро хоҳад кард. Дар мисоли код ин функсия аст say_hello(). Функсияҳое, ки шумо ҳамчун усулҳои бот истифода хоҳед кард, бояд ду далели зарурӣ дошта бошанд - боти и навсозии, ва як ихтиёрӣ - арғ. Баҳс боти, ин боти шумост, бо ёрии он шумо метавонед ба паёмҳо ҷавоб диҳед, паём фиристед ё дигар усулҳои дар бот дастрасро истифода баред. Баҳс навсозии ин он чизест, ки бот аз корбар гирифтааст, дар асл он чизест, ки мо дар мақолаи аввал бо истифода аз усул гирифтаем getUpdates(). Баҳс арғ ба шумо имкон медиҳад, ки маълумоти иловагии фиристодаи корбарро дар якҷоягӣ бо фармон коркард кунед, мо каме дертар ба ин мавзӯъ бармегардем;
  3. Мо коркардкунандагонро эҷод мекунем, яъне. Мо баъзе амалҳои корбарро бо усулҳои дар қадами қаблӣ сохташуда алоқаманд мекунем. Аслан, коркардкунанда триггер, ҳодисаест, ки баъзе функсияҳои ботро даъват мекунад. Дар мисоли мо, чунин триггер фиристодани фармон аст /hi, ва аз тарафи коллектив ба амал бароварда мешавад hi_hendler <- CommandHandler('hi', say_hello). Аргументи аввалини функсия CommandHandler() ба шумо имкон медиҳад, ки дар ҳолати мо фармонеро муайян кунед hi, ки ба он бот чавоб медихад. Далели дуюм ба шумо имкон медиҳад, ки усули ботро муайян кунед, мо методро даъват мекунем say_hello, ки агар корбар фармони дар аргументи аввал зикршударо даъват кунад, иҷро карда мешавад;
  4. Минбаъд, мо коркардкунандаи сохташударо ба диспетчери намунаи синфии худ илова мекунем Updater. Шумо метавонед коркардкунандагонро бо чанд роҳ илова кунед; дар мисоли боло ман соддатаринро бо истифода аз аломат истифода кардам +i.e. updater <- updater + hi_hendler. Бо истифода аз усул низ ҳамин корро кардан мумкин аст add_handler(), ки ба синф тааллук дорад Dispatcher, шумо метавонед ин усулро чунин пайдо кунед: updater$dispatcher$add_handler();
  5. Бо истифода аз фармон ботро оғоз кунед start_polling().

Протсессор ва филтрҳои паёмҳои матнӣ

Мо фаҳмидем, ки чӣ гуна фармонҳоро ба бот фиристем, аммо баъзан ба мо бот лозим аст, ки на танҳо ба фармонҳо, балки ба баъзе паёмҳои матнии муқаррарӣ низ посух диҳад. Барои ин шумо бояд коркардкунандагони паёмҳоро истифода баред - MessageHandler.

оддӣ MessageHandler комилан ба ҳама паёмҳои воридотӣ ҷавоб хоҳад дод. Аз ин рӯ, коркардкунандагони паёмҳо аксар вақт якҷоя бо филтрҳо истифода мешаванд. Биёед ба бот таълим диҳем, ки салом гуфтанро на танҳо аз рӯи фармон /hi, балки инчунин хар дафъае, ки дар паёме, ки ба бот фиристода мешавад, яке аз калимахои зерин пайдо мешавад: hello, hello, salute, hai, bonjour.

Ҳоло мо ягон усули нав наменависем, зеро... Мо аллакай як усул дорем, ки бот ба мо салом медиҳад. Ба мо танҳо лозим аст, ки филтр ва коркардкунандаи паёмро эҷод кунем.

Рамзи 2: Иловаи коркарди паёми матнӣ ва филтр

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

Мисоли рамзи дар боло зикршударо иҷро кунед, пас аз иваз кардани 'BOT TOKEN' -и шумо бо аломати воқеӣ, ки ҳангоми сохтани бот тавассути тавассути он гирифтаед. БотПадар (Ман дар бораи сохтани бот дар мақолаи аввал).

Акнун биёед кӯшиш кунем, ки ба бот якчанд паём фиристем, ки дорои калимаҳои табрикоти дар боло номбаршуда мебошанд:
Навиштани боти телеграмма дар R (қисми 2): Илова кардани дастгирии фармон ва филтрҳои паёмӣ ба бот

Пас, пеш аз хама, мо ба бот на танхо салом гуфтан, балки ба салом чавоб доданро ёд додем. Мо ин корро бо истифода аз аргумент анҷом додем ҷавоб_ба_хабар_иди, ки дар усул дастрас аст sendMessage(), ки ба он шумо бояд ID-и паёмеро, ки ба он посух додан мехоҳед, интиқол диҳед. Шумо метавонед id-и паёмро ба таври зерин дастрас кунед: update$message$message_id.

Аммо чизи асосии мо ин илова кардани филтр ба бот бо истифода аз функсия буд BaseFilter():

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

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

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

)

Тавре ки шумо пайхас кардаед, филтрҳо бояд ба объект илова карда шаванд Филтрҳои паёмҳо, ки дар аввал аллакай маҷмӯи хурди филтрҳои тайёрро дар бар мегирад. Дар мисоли мо, ба объект Филтрҳои паёмҳо мо як элемент илова кардем hi, ин филтри нав аст.

Дар функсия BaseFilter() шумо бояд вазифаи филтрро гузаронед. Аслан, филтр танҳо функсияест, ки мисоли паёмро қабул мекунад ва бармегардад ҲАҚИҚӢ ё козиб. Дар мисоли мо, мо як функсияи оддӣ навиштем, ки бо истифода аз функсияи асосӣ grepl() матни паёмро тафтиш мекунад ва агар он ба ифодаи муқаррарӣ мувофиқат кунад привет|здравствуй|салют|хай|бонжур бармегардад ҲАҚИҚӢ.

Минбаъд мо коркардкунандаи паёмро эҷод мекунем hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi). Аргументи аввалини функсия MessageHandler() усулест, ки коркардкунандаро даъват мекунад ва далели дуюм филтрест, ки тавассути он он даъват карда мешавад. Дар ҳолати мо, ин филтрест, ки мо офаридаем MessageFilters$hi.

Хуб, дар ниҳоят, мо ба диспетчер коркардкунандаи офаридашударо илова мекунем hi_txt_hnd.

updater <- updater + 
             hi_hendler +
             hi_txt_hnd

Тавре ки ман дар боло навишта будам, дар баста telegram.bot ва объект Филтрҳои паёмҳо Аллакай маҷмӯи филтрҳои дарунсохт мавҷуд аст, ки шумо метавонед онҳоро истифода баред:

  • ҳама — Ҳама паёмҳо
  • матн — Паёмҳои матнӣ
  • фармон — Фармонҳо, яъне. паёмҳое, ки бо оғоз мешаванд /
  • ҷавоб — Паёмҳое, ки ҷавоб ба паёми дигар мебошанд
  • аудио — Паёмҳое, ки файли аудио доранд
  • ҳуҷҷат — Паёмҳо бо ҳуҷҷати фиристодашуда
  • акс - Паёмҳо бо тасвирҳои фиристодашуда
  • стикер — Паёмҳо бо стикери фиристодашуда
  • видео — Паёмҳо бо видео
  • овоз - Паёмҳои овозӣ
  • тамос — Паёмҳое, ки мундариҷаи телеграммаи корбарро дар бар мегиранд
  • ҷойгир — Паёмҳо бо ҷойгиршавии географӣ
  • макони баргузории — Паёмҳои интиқолшуда
  • бозӣ — Бозиҳо

Агар шумо хоҳед, ки якчанд филтрҳоро дар як коркардкунанда якҷоя кунед, танҳо аломатро истифода баред | - ҳамчун мантиқӣ Ё, ва имзо кунед & ҳамчун мантиқӣ И. Масалан, агар шумо хоҳед, ки бот ҳангоми гирифтани видео, тасвир ё ҳуҷҷат ба ҳамон усул занг занад, мисоли зеринро барои сохтани коркарди паём истифода баред:

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

Илова кардани фармонҳо бо параметрҳо

Мо аллакай медонем, ки чӣ гуна фармонҳо, чӣ гуна сохтани онҳо ва чӣ гуна маҷбур кардани бот барои иҷрои фармони дилхоҳ. Аммо дар баъзе мавридҳо, ба ғайр аз номи фармон, ба мо лозим аст, ки баъзе маълумотҳоро барои иҷрои он гузаронем.

Дар зер намунаи бот оварда шудааст, ки бо назардошти сана ва кишвари додашуда ба шумо навъи рӯзро аз тақвими истеҳсолот бармегардонад.

Бот дар зер API тақвими истеҳсолиро истифода мебарад isdayoff.ru.

Рамзи 3: Бот, ки аз рӯи сана ва кишвар гузориш медиҳад

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

Мисоли рамзи дар боло зикршударо иҷро кунед, пас аз иваз кардани 'BOT TOKEN' -и шумо бо аломати воқеӣ, ки ҳангоми сохтани бот тавассути тавассути он гирифтаед. БотПадар (Ман дар бораи сохтани бот дар мақолаи аввал).

Мо бот эҷод кардем, ки дар арсеналаш танҳо як усул дорад check_date, ин усул бо фармони ҳамон ном даъват карда мешавад.

Аммо, илова ба номи фармон, ин усул аз шумо талаб мекунад, ки ду параметр, рамзи кишвар ва санаро ворид кунед. Баъдан, бот тафтиш мекунад, ки рӯзи додашуда дар кишвари зикршуда рӯзи истироҳат, рӯзи кӯтоҳ ё рӯзи корӣ мувофиқи тақвими расмии истеҳсолӣ аст.

Барои он ки усули эҷодкардаи мо параметрҳои иловагиро дар баробари фармон қабул кунад, аргументро истифода баред pass_args = TRUE дар функсия CommandHandler(), ва хангоми сохтани усул ба гайр аз далелхои зарурй боти, навсозии як ихтиёрӣ эҷод кунед - арғ. Усули бо ин роҳ сохташуда параметрҳоеро, ки шумо пас аз номи фармон ба бот мегузоред, қабул мекунад. Параметрҳо бояд бо фосила ҷудо карда шаванд; онҳо ба усул ҳамчун вектори матнӣ фиристода мешаванд.

Биёед боти худро оғоз кунем ва озмоиш кунем.

Навиштани боти телеграмма дар R (қисми 2): Илова кардани дастгирии фармон ва филтрҳои паёмӣ ба бот

Ботро дар замина иҷро кунед

Қадами охирине, ки мо бояд анҷом диҳем, ин оғоз кардани бот дар замина аст.

Барои ин, алгоритми дар зер тавсифшударо иҷро кунед:

  1. Рамзи ботро дар файл бо тамдиди R захира кунед. Ҳангоми кор дар RStudio, ин тавассути меню анҷом дода мешавад. File, команда Сабт ҳамчун ....
  2. Роҳро ба папкаи бин, ки дар навбати худ дар папкае ҷойгир аст, ки дар он забони R насб кардаед, ба тағирёбандаи Path, дастурҳо илова кунед дар ин ҷо.
  3. Файли матнии муқаррарӣ эҷод кунед, ки дар он 1 сатр нависед: R CMD BATCH C:UsersAlseyDocumentsmy_bot.R... Ба ҷои C:UsersAlseyDocumentsmy_bot.R роҳро ба скрипти боти худ нависед. Дар баробари ин муҳим он аст, ки дар роҳ ҳарф ва фосилаи кириллӣ вуҷуд надошта бошад, зеро ин метавонад ҳангоми кор кардани бот мушкилот ба бор орад. Онро захира кунед ва васеъшавии онро бо txt ба бл.
  4. Windows Task Scheduler -ро кушоед, роҳҳои зиёде барои ин вуҷуд доранд, масалан, ягон ҷузвдонро кушоед ва суроғаро ворид кунед %windir%system32taskschd.msc /s. Усулҳои дигари оғозёбӣ метавонанд пайдо шаванд дар ин ҷо.
  5. Дар менюи рости болоии нақшакаш, клик кунед "Сохтани вазифа...".
  6. Дар ҷадвали "Умумӣ" ба вазифаи худ номи фармоишӣ диҳед ва гузаришро ба ҳолати "Иҷроиш барои ҳама корбарон" гузаред.
  7. Ба ҷадвали "Амалҳо" гузаред, "Эҷод" -ро клик кунед. Дар майдони "Барнома ё скрипт" тугмаи "Баррасӣ" -ро клик кунед, онеро, ки дар қадами дуюм сохта шудааст, пайдо кунед бл файл ва OK-ро пахш кунед.
  8. OK-ро пахш кунед ва агар лозим бошад, пароли ҳисоби системаи оператсионии худро ворид кунед.
  9. Вазифаи сохташударо дар ҷадвал пайдо кунед, онро интихоб кунед ва тугмаи "Иҷроиш" -ро дар кунҷи рости поён пахш кунед.

Боти мо дар замина кор мекунад ва то он даме, ки шумо супоришро қатъ кунед ё компютер ё сервери худро, ки дар он оғоз шудааст, хомӯш кунед, кор мекунад.

хулоса

Дар ин мақола, мо фаҳмидем, ки чӣ гуна як боти мукаммалро нависед, ки метавонад на танҳо паём фиристад, балки инчунин ба паёмҳо ва фармонҳои воридотӣ ҷавоб диҳад. Дониши гирифташуда аллакай барои ҳалли аксари мушкилоти шумо кофӣ аст.

Дар мақолаи навбатӣ дар бораи чӣ гуна илова кардани клавиатура ба бот барои кори қулай сухан меравад.

Ба ман обуна шавед телеграмма и YouTube каналхо.

Манбаъ: will.com

Илова Эзоҳ