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(). Сіз бот әдістері ретінде пайдаланатын функцияларда екі қажетті аргумент болуы керек - Bot и жаңарту, және біреуі міндетті емес - доға. Аргумент Bot, бұл сіздің ботыңыз, оның көмегімен сіз хабарларға жауап бере аласыз, хабарламалар жібере аласыз немесе ботқа қолжетімді кез келген басқа әдістерді пайдалана аласыз. Аргумент жаңарту бұл пайдаланушыдан бот алған нәрсе, шын мәнінде, әдісті қолдана отырып, біз бірінші мақалада алдық getUpdates(). Аргумент доға командамен бірге пайдаланушы жіберген қосымша деректерді өңдеуге мүмкіндік береді, біз бұл тақырыпқа сәл кейінірек ораламыз;
  3. Біз өңдеушілерді жасаймыз, яғни. Біз кейбір пайдаланушы әрекеттерін алдыңғы қадамда жасалған әдістермен байланыстырамыз. Негізінде өңдеуші - триггер, қандай да бір бот функциясын шақыратын оқиға. Біздің мысалда мұндай триггер пәрменді жіберу болып табылады /hi, және команда жүзеге асырады hi_hendler <- CommandHandler('hi', say_hello). Бірінші функция аргументі CommandHandler() пәрменді көрсетуге мүмкіндік береді, біздің жағдайда hi, оған бот жауап береді. Екінші аргумент бот әдісін көрсетуге мүмкіндік береді, біз әдісті шақырамыз say_hello, егер пайдаланушы бірінші аргументте көрсетілген пәрменді шақырса орындалатын болады;
  4. Содан кейін біз құрылған өңдегішті сынып данасы диспетчеріне қосамыз Updater. Өңдеушілерді бірнеше жолмен қосуға болады; жоғарыдағы мысалда мен белгіні пайдаланып ең қарапайымын қолдандым +яғни, updater <- updater + hi_hendler. Әдістің көмегімен дәл осылай жасауға болады add_handler(), класына жатады Dispatcher, сіз бұл әдісті келесідей таба аласыз: updater$dispatcher$add_handler();
  5. Пәрменді пайдаланып ботты іске қосыңыз start_polling().

Мәтіндік хабар процессоры және сүзгілері

Біз ботқа пәрмендерді қалай жіберу керектігін түсіндік, бірақ кейде командаларға ғана емес, сонымен қатар кейбір кәдімгі мәтіндік хабарламаларға да жауап беру үшін бот қажет болады. Ол үшін хабар өңдеушілерін пайдалану керек − MessageHandler.

әдеттегі MessageHandler барлық кіріс хабарламаларға жауап береді. Сондықтан хабарлама өңдеушілер жиі сүзгілермен бірге қолданылады. Келіңіздер, ботқа тек команда бойынша емес, сәлемдесуді үйретейік /hi, сонымен қатар ботқа жіберілген хабарламада келесі сөздердің бірі пайда болған сайын: сәлем, сәлем, сәлем, 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(), оған жауап бергіңіз келетін хабардың идентификаторын жіберуіңіз керек. Хабарлама идентификаторын келесідей алуға болады: update$message$message_id.

Бірақ біз жасаған ең бастысы функцияны пайдаланып ботқа сүзгі қосу болды BaseFilter():

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

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

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

)

Сіз байқағандай, нысанға сүзгілерді қосу керек MessageFilters, онда бастапқыда дайын сүзгілердің шағын жиынтығы бар. Біздің мысалда нысанға MessageFilters элемент қостық hi, бұл жаңа сүзгі.

Функцияда BaseFilter() сүзгі функциясынан өту керек. Негізінде, сүзгі хабар данасын қабылдайтын және қайтаратын функция ғана TRUE немесе FALSE. Біздің мысалда біз қарапайым функцияны жаздық, ол негізгі функцияны пайдаланады grepl() хабарлама мәтінін және оның тұрақты өрнекке сәйкес келетінін тексереді привет|здравствуй|салют|хай|бонжур қайтарады TRUE.

Әрі қарай біз хабарлама өңдегішін жасаймыз hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi). Бірінші функция аргументі MessageHandler() өңдегішті шақыратын әдіс, ал екінші аргумент - ол шақырылатын сүзгі. Біздің жағдайда бұл біз жасаған сүзгі MessageFilters$hi.

Ақыр соңында, біз диспетчерге құрылған өңдегішті қосамыз hi_txt_hnd.

updater <- updater + 
             hi_hendler +
             hi_txt_hnd

Мен жоғарыда жазғанымдай, пакетте telegram.bot және объект MessageFilters Қолдануға болатын кірістірілген сүзгілер жинағы бар:

  • барлығы — Барлық хабарлар
  • мәтін — Мәтіндік хабарлар
  • команда — Командалар, яғни. деп басталатын хабарламалар /
  • жауап беру — Басқа хабарға жауап болып табылатын хабарлар
  • аудио — Аудио файлы бар хабарлар
  • құжат — Жіберілген құжаты бар хабарламалар
  • фотосурет - Жіберілген суреттері бар хабарламалар
  • стикер — Жіберілген стикері бар хабарламалар
  • бейне — Бейне бар хабарламалар
  • дауыс - Дауыстық хабарлар
  • контакт — пайдаланушының телеграмма мазмұнын қамтитын хабарлар
  • орын — Геолокациясы бар хабарламалар
  • орын — Қайта жіберілген хабарламалар
  • ойын — Ойындар

Кейбір сүзгілерді бір өңдегіште біріктіргіңіз келсе жай ғана белгіні пайдаланыңыз | - логика ретінде НЕМЕСЕ, және қол қойыңыз & логикалық сияқты И. Мысалы, бот бейнені, суретті немесе құжатты алған кезде бірдей әдісті шақыруын қаласаңыз, хабарлама өңдеушісін жасау үшін келесі мысалды пайдаланыңыз:

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(), және әдісті жасау кезінде қажетті аргументтерге қосымша Bot, жаңарту қосымшасын жасау - доға. Осылайша жасалған әдіс команда атынан кейін ботқа берілетін параметрлерді қабылдайды. Параметрлер бос орынмен бөлінуі керек, олар әдіске мәтіндік вектор ретінде жіберіледі.

Ботымызды іске қосып, сынап көрейік.

R тілінде телеграмма ботын жазу (2-бөлім): Ботқа командалық қолдау мен хабар сүзгілерін қосу

Ботты фондық режимде іске қосыңыз

Аяқтауымыз керек соңғы қадам - ​​ботты фондық режимде іске қосу.

Мұны істеу үшін төменде сипатталған алгоритмді орындаңыз:

  1. Бот кодын R кеңейтімі бар файлға сақтаңыз. RStudio бағдарламасында жұмыс істегенде бұл мәзір арқылы орындалады. файл, команда Басқаша сақтау ....
  2. Жолды айнымалы жолға, нұсқауларға R тілін орнатқан қалтада орналасқан қалта қалтасына қосыңыз. осында.
  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 арналар.

Ақпарат көзі: www.habr.com

пікір қалдыру