R-də teleqram botunun yazılması (2-ci hissə): Bota komanda dəstəyi və mesaj filtrlərinin əlavə edilməsi

В əvvəlki nəşr botun necə yaradılacağını anladıq, sinif nümunəsini işə saldıq Bot və ondan istifadə edərək mesajların göndərilməsi üsulları ilə tanış oldu.

Bu yazıda bu mövzunu davam etdirirəm, ona görə də bu məqaləni yalnız oxuduqdan sonra oxumağa başlamağı məsləhət görürəm birinci hissəsində.

Bu dəfə biz botumuzu necə canlandıracağımızı və ona komanda dəstəyi əlavə edəcəyimizi, həmçinin siniflə tanış olacağıq. Updater.

Məqalənin gedişində bir neçə sadə bot yazacağıq, sonuncu, verilmiş tarixə və ölkə koduna əsaslanaraq, istehsal təqviminə görə müəyyən bir ölkədə bir günün həftə sonu və ya iş günü olduğunu müəyyən edəcəkdir. Ancaq əvvəllər olduğu kimi, məqalənin məqsədi sizi paket interfeysi ilə tanış etməkdir telegram.bot öz problemlərinizi həll etmək üçün.

R-də teleqram botunun yazılması (2-ci hissə): Bota komanda dəstəyi və mesaj filtrlərinin əlavə edilməsi

“R-də teleqram botunun yazılması” seriyasından bütün məqalələr

  1. Biz bot yaradırıq və ondan teleqramda mesaj göndərmək üçün istifadə edirik
  2. Bota komanda dəstəyi və mesaj filtrləri əlavə edin

Məzmun

Əgər məlumatların təhlili ilə maraqlanırsınızsa, mənimlə maraqlana bilərsiniz teleqram и youtube kanallar. Məzmununun çoxu R dilinə həsr olunub.

  1. Yeniləyici sinfi
  2. İşləyənlər - işləyicilər
  3. İlk əmri bota, əmr işləyicisinə əlavə edin
  4. Mətn mesajı prosessoru və filtrlər
  5. Parametrlərlə əmrlərin əlavə edilməsi
  6. Botu arxa planda işlədin
  7. Nəticə

Yeniləyici sinfi

Updater teleqram botunu inkişaf etdirməyinizi asanlaşdıran sinifdir və başlıq altındakı sinifdən istifadə edir Dispetcher. Sinif tapşırığı Updater botdan yeniləmələr almaqdır (əvvəlki məqalədə bu məqsədlə metoddan istifadə etdik getUpdates()) və onları daha da köçürün Dispetcher.

Öz növbəsində Dispetcher yaratdığınız işləyiciləri ehtiva edir, yəni. sinif obyektləri Handler.

İşləyənlər - işləyicilər

Əlavə etdiyiniz işləyicilərlə Dispetcher müxtəlif hadisələrə bot reaksiyaları. Bu məqaləni yazarkən telegram.bot Aşağıdakı işləyici növləri əlavə edilmişdir:

  • MessageHandler - Mesaj idarəedicisi
  • CommandHandler — Komanda işləyicisi
  • CallbackQueryHandler — Inline-dan göndərilən klaviaturalar üçün məlumat emalçısı
  • ErrorHandler — Botdan yeniləmə tələbi zamanı xəta idarəçisi

İlk əmri bota, əmr işləyicisinə əlavə edin

Əgər siz əvvəllər heç vaxt botlardan istifadə etməmisinizsə və əmrin nə olduğunu bilmirsinizsə, o zaman bota əmrlər kəsik işarəsi ilə göndərilməlidir. / prefiks kimi.

Biz sadə əmrlərlə başlayacağıq, yəni. botumuza əmrlə salam deməyi öyrədək /hi.

Kod 1: Bota salam deməyi öyrətmək

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

'SİZİN BOT TOKEN'i vasitəsilə botu yaradarkən aldığınız real işarə ilə əvəz etdikdən sonra yuxarıdakı kod nümunəsini işlədin. BotAta (Mən bir bot yaratmaq haqqında danışdım ilk məqalə).

üsul start_polling() sinif UpdaterKodun sonunda istifadə edilən , botdan yeniləmələri tələb etmək və emal etmək üçün sonsuz bir dövrə başlayır.

İndi Telegram-ı açaq və botumuza ilk əmri yazaq /hi.

R-də teleqram botunun yazılması (2-ci hissə): Bota komanda dəstəyi və mesaj filtrlərinin əlavə edilməsi

İndi botumuz əmri başa düşür /hi, və bizi necə salamlayacağını bilir.

Sxematik olaraq, belə sadə bir botun qurulması prosesi aşağıdakı kimi təsvir edilə bilər.

R-də teleqram botunun yazılması (2-ci hissə): Bota komanda dəstəyi və mesaj filtrlərinin əlavə edilməsi

  1. Sinif nümunəsini yaradın Updater;
  2. Biz üsullar yaradırıq, yəni. botumuzun yerinə yetirəcəyi funksiyalar. Kod nümunəsində bu bir funksiyadır say_hello(). Bot metodları kimi istifadə edəcəyiniz funksiyaların iki tələb olunan arqumenti olmalıdır - bot и yeniləmə, və bir isteğe bağlı - args. Arqument bot, bu sizin botunuzdur, onun köməyi ilə siz mesajlara cavab verə, mesaj göndərə və ya bot üçün mövcud olan hər hansı digər üsullardan istifadə edə bilərsiniz. Arqument yeniləmə bu, botun istifadəçidən aldığı şeydir, əslində metoddan istifadə edərək birinci məqalədə aldığımızdır getUpdates(). Arqument args komanda ilə birlikdə istifadəçi tərəfindən göndərilən əlavə məlumatları emal etməyə imkan verir, bir az sonra bu mövzuya qayıdacağıq;
  3. Biz işləyicilər yaradırıq, yəni. Bəzi istifadəçi hərəkətlərini əvvəlki addımda yaradılmış üsullarla əlaqələndiririk. Əslində, işləyici bir tetikleyicidir, bəzi bot funksiyasını çağıran bir hadisədir. Bizim nümunəmizdə belə bir tətik əmr göndərir /hi, və komanda tərəfindən həyata keçirilir hi_hendler <- CommandHandler('hi', say_hello). Birinci funksiya arqumenti CommandHandler() bizim vəziyyətimizdə əmri təyin etməyə imkan verir hi, bot buna cavab verəcək. İkinci arqument bot metodunu təyin etməyə imkan verir, biz metodu çağıracağıq say_hello, istifadəçi birinci arqumentdə göstərilən əmri çağırarsa icra ediləcək;
  4. Sonra, yaradılmış işləyicini sinif nümunəmizin dispetçerinə əlavə edirik Updater. İşləyiciləri bir neçə yolla əlavə edə bilərsiniz; yuxarıdakı nümunədə işarədən istifadə edərək ən sadəsini istifadə etdim +Yəni updater <- updater + hi_hendler. Eyni üsuldan istifadə etməklə edilə bilər add_handler()sinfinə aid olan Dispatcher, bu üsulu belə tapa bilərsiniz: updater$dispatcher$add_handler();
  5. Komandadan istifadə edərək botu işə salın start_polling().

Mətn mesajı prosessoru və filtrlər

Biz bota əmrlərin necə göndəriləcəyini anladıq, lakin bəzən bota təkcə əmrlərə deyil, həm də bəzi adi mətn mesajlarına cavab vermək lazımdır. Bunu etmək üçün mesaj işləyicilərindən istifadə etməlisiniz - MessageHandler.

adi MessageHandler tamamilə bütün daxil olan mesajlara cavab verəcəkdir. Buna görə də, mesaj işləyiciləri çox vaxt filtrlərlə birlikdə istifadə olunur. Gəlin bota yalnız əmrlə deyil, salam deməyi öyrədək /hi, həm də bota göndərilən mesajda aşağıdakı sözlərdən biri görünəndə: salam, salam, salam, hai, bonjour.

Hələlik heç bir yeni üsul yazmayacağıq, çünki... Artıq botun bizi salamladığı üsulumuz var. Bizə lazım olan tək şey tələb olunan filtr və mesaj işləyicisini yaratmaqdır.

Kod 2: Mətn mesajı idarəçisi və filtr əlavə edin

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

'SİZİN BOT TOKEN'i vasitəsilə botu yaradarkən aldığınız real işarə ilə əvəz etdikdən sonra yuxarıdakı kod nümunəsini işlədin. BotAta (Mən bir bot yaratmaq haqqında danışdım ilk məqalə).

İndi bota daha əvvəl sadalanan təbrik sözlərini ehtiva edən bir neçə mesaj göndərməyə çalışaq:
R-də teleqram botunun yazılması (2-ci hissə): Bota komanda dəstəyi və mesaj filtrlərinin əlavə edilməsi

Beləliklə, ilk növbədə, biz bota sadəcə salam verməyi deyil, bir salama cavab verməyi öyrətdik. Bunu arqumentdən istifadə edərək etdik mesaja_cavab_id, metodunda mövcud olan sendMessage(), cavab vermək istədiyiniz mesajın id-sini köçürməli olduğunuz. Mesaj id-sini belə əldə edə bilərsiniz: update$message$message_id.

Ancaq etdiyimiz əsas şey funksiyadan istifadə edərək bota filtr əlavə etmək idi BaseFilter():

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

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

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

)

Gördüyünüz kimi, obyektə filtrlər əlavə edilməlidir Mesaj Filtrləri, əvvəlcə kiçik bir hazır filtrlər dəstini ehtiva edir. Bizim nümunəmizdə obyektə Mesaj Filtrləri element əlavə etdik hi, bu yeni filtrdir.

Fəaliyyət göstərmək BaseFilter() filtr funksiyasını keçməlisiniz. Əslində, filtr sadəcə bir mesaj nümunəsini qəbul edən və qaytaran bir funksiyadır TRUE və ya SAXTA. Nümunəmizdə əsas funksiyadan istifadə edərək sadə bir funksiya yazdıq grepl() mesaj mətnini və onun normal ifadəyə uyğun olub olmadığını yoxlayır привет|здравствуй|салют|хай|бонжур qayıdır TRUE.

Sonra mesaj idarəçisi yaradırıq hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi). Birinci funksiya arqumenti MessageHandler() işləyicini çağıracaq metoddur, ikinci arqument isə onun çağırılacağı filtrdir. Bizim vəziyyətimizdə bu, yaratdığımız filtrdir MessageFilters$hi.

Yaxşı, sonda dispetçerə yaradılmış işləyicini əlavə edirik hi_txt_hnd.

updater <- updater + 
             hi_hendler +
             hi_txt_hnd

Yuxarıda yazdığım kimi, paketdə telegram.bot və obyekt Mesaj Filtrləri Artıq istifadə edə biləcəyiniz daxili filtrlər dəsti var:

  • hamısı — Bütün mesajlar
  • mətn — Mətn mesajları
  • komanda — Əmrlər, yəni. ilə başlayan mesajlar /
  • cavab — Başqa mesaja cavab olan mesajlar
  • audio — Audio faylı olan mesajlar
  • sənəd — Göndərilən sənədi olan mesajlar
  • şəkil - Göndərilən şəkilləri olan mesajlar
  • stiker — Göndərilən stiker olan mesajlar
  • video — Video ilə mesajlar
  • səs - Səsli mesajlar
  • əlaqə — İstifadəçinin teleqram məzmununu ehtiva edən mesajlar
  • yer — Geolokasiya ilə mesajlar
  • yer — Yönləndirilmiş mesajlar
  • oyun — Oyunlar

Bəzi filtrləri bir işləyicidə birləşdirmək istəyirsinizsə, sadəcə işarədən istifadə edin | - məntiq kimi OR, və imzalayın & məntiqi kimi И. Məsələn, botun video, şəkil və ya sənəd qəbul edərkən eyni metodu çağırmasını istəyirsinizsə, mesaj işləyicisi yaratmaq üçün aşağıdakı nümunədən istifadə edin:

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

Parametrlərlə əmrlərin əlavə edilməsi

Biz artıq əmrlərin nə olduğunu, onları necə yaratmağı və botu istədiyiniz əmri yerinə yetirməyə məcbur etməyi bilirik. Ancaq bəzi hallarda, komanda adından əlavə, onu yerinə yetirmək üçün bəzi məlumatları ötürməliyik.

Aşağıda verilmiş tarix və ölkəni nəzərə alaraq istehsal təqvimindən sizə gün növünü qaytaran botun nümunəsi verilmişdir.

Aşağıdakı bot istehsal təqvimi API-dən istifadə edir isdayoff.ru.

Kod 3: Tarix və ölkə üzrə hesabat verən bot

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

'SİZİN BOT TOKEN'i vasitəsilə botu yaradarkən aldığınız real işarə ilə əvəz etdikdən sonra yuxarıdakı kod nümunəsini işlədin. BotAta (Mən bir bot yaratmaq haqqında danışdım ilk məqalə).

Biz arsenalında yalnız bir metodu olan bir bot yaratdıq check_date, bu üsul eyni adlı əmrlə çağırılır.

Lakin, komanda adına əlavə olaraq, bu üsul iki parametr, ölkə kodu və tarix daxil etməyi tələb edir. Sonra, bot müəyyən edilmiş ölkədə müəyyən bir günün həftə sonu, qısaldılmış gün və ya rəsmi istehsal təqviminə uyğun olaraq iş günü olduğunu yoxlayır.

Yaratdığımız metodun əmrlə birlikdə əlavə parametrləri qəbul etməsi üçün arqumentdən istifadə edin pass_args = TRUE funksiyasında CommandHandler(), və metod yaratarkən tələb olunan arqumentlərə əlavə olaraq bot, yeniləmə isteğe bağlı yaradın - args. Bu şəkildə yaradılmış metod komanda adından sonra bota ötürdüyünüz parametrləri qəbul edəcək. Parametrlər boşluqla ayrılmalıdır, onlar mətn vektoru kimi metoda göndəriləcəklər.

Gəlin botu işə salaq və sınaqdan keçirək.

R-də teleqram botunun yazılması (2-ci hissə): Bota komanda dəstəyi və mesaj filtrlərinin əlavə edilməsi

Botu arxa planda işlədin

Tamamlamalı olduğumuz son addım botu arxa planda işə salmaqdır.

Bunu etmək üçün aşağıda təsvir olunan alqoritmə əməl edin:

  1. Bot kodunu R uzantılı faylda saxlayın. RStudio-da işləyərkən bu, menyu vasitəsilə həyata keçirilir. fayl, komanda Yadda saxla ....
  2. Öz növbəsində R dilini quraşdırdığınız qovluqda yerləşən bin qovluğuna yolu Path dəyişəninə, təlimatlara əlavə edin. burada.
  3. 1 sətir yazılan adi mətn faylı yaradın: R CMD BATCH C:UsersAlseyDocumentsmy_bot.R... Bunun əvəzinə C:UsersAlseyDocumentsmy_bot.R bot skriptinizə gedən yolu yazın. Eyni zamanda, yol boyu kiril hərflərinin və boşluqların olmaması vacibdir, çünki bu, botu işlədərkən problemlər yarada bilər. Onu yadda saxlayın və genişləndirilməsi ilə əvəz edin txt haqqında kırpmak.
  4. Windows Tapşırıq Planlayıcısını açın, bunun bir çox yolu var, məsələn, hər hansı bir qovluğu açın və ünvanı daxil edin %windir%system32taskschd.msc /s. Digər işə salma üsulları tapıla bilər burada.
  5. Planlayıcının yuxarı sağ menyusunda "Tapşırıq yarat..." düyməsini basın.
  6. "Ümumi" sekmesinde tapşırığınıza fərdi ad verin və keçidi "Bütün istifadəçilər üçün işləyin" vəziyyətinə keçirin.
  7. "Fəaliyyətlər" sekmesine keçin, "Yarat" düyməsini basın. "Proqram və ya skript" sahəsində "Gözdən keçir" düyməsini basın, ikinci addımda yaradılmışı tapın kırpmak faylı seçin və OK düyməsini basın.
  8. OK düyməsini basın və lazım olduqda əməliyyat sistemi hesabınız üçün parolu daxil edin.
  9. Planlayıcıda yaradılmış tapşırığı tapın, seçin və aşağı sağ küncdəki "Çalış" düyməsini basın.

Botumuz arxa planda işləyir və siz tapşırığı dayandırana qədər və ya onun işə salındığı kompüterinizi və ya serverinizi söndürənə qədər işləyəcək.

Nəticə

Bu yazıda biz nəinki mesaj göndərə, həm də daxil olan mesajlara və əmrlərə cavab verə bilən tam hüquqlu bir botun necə yazılacağını anladıq. Əldə olunan biliklər artıq problemlərinizin çoxunu həll etmək üçün kifayətdir.

Növbəti məqalədə daha rahat işləmək üçün bota klaviatura əlavə etmək barədə danışılacaq.

Abunə ol menim teleqram и youtube kanallar.

Mənbə: www.habr.com

Добавить комментарий