Menulis bot telegram dalam bahasa R (bagian 2): Menambahkan dukungan perintah dan filter pesan ke bot

Di posting sebelumnya, kami menemukan cara membuat bot, menginisialisasi sebuah instance kelas Botdan berkenalan dengan metode pengiriman pesan yang menggunakannya.



Di artikel ini, saya melanjutkan topik ini, jadi saya sarankan untuk mulai membaca artikel ini hanya setelah membaca bagian pertama .



Kali ini kita akan mencari cara untuk menghidupkan kembali bot kita dan menambahkan dukungan perintah padanya, serta berkenalan dengan kelasnya Updater.



Dalam perjalanan artikel, kami akan menulis beberapa bot sederhana, yang terakhir akan, menurut tanggal dan kode negara tertentu, menentukan apakah suatu hari di suatu negara adalah akhir pekan atau hari kerja menurut kalender produksi. Tetapi, seperti sebelumnya, tujuan artikel ini adalah untuk membiasakan Anda dengan antarmuka paket telegram.botuntuk menyelesaikan masalah Anda sendiri.





Semua artikel dari seri "Menulis bot telegram dalam bahasa R"



  1. Kami membuat bot dan mengirim pesan ke telegram dengannya
  2. Tambahkan dukungan perintah dan filter pesan ke bot
  3. Cara menambahkan dukungan keyboard ke bot Anda
  4. Membangun dialog yang konsisten dan logis dengan bot
  5. Manajemen hak pengguna bot


Kandungan



telegram youtube . R.



  1. Updater
  2. Handlers β€”
  3. ,


Updater



Updater β€” , , Dispetcher. Updater , ( getUpdates()), Dispetcher.



Dispetcher , .. Handler.



Handlers β€”



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


, ' ' , BotFather ( ).

start_polling() Updater, , .



, /hi.





/hi, .



.





  1. Updater;
  2. , .. . say_hello(). , β€” bot update, β€” args. bot, , , , . update , , , getUpdates(). args , ;
  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, , : , , , , .



- , .. . .



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


, ' ' , BotFather ( ).

, :



, , . reply_to_message_id, sendMessage(), id . id : 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 , :



  • all β€”
  • text β€”
  • command β€” , .. /
  • reply β€” ,
  • audio β€”
  • document β€”
  • photo β€”
  • sticker β€”
  • video β€”
  • voice β€”
  • contact β€”
  • location β€”
  • venue β€”
  • game β€”


| β€” , & . , , :



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




, , . , .



, .



API isdayoff.ru.



3: ,
library(telegram.bot)

#    Updater
updater <- Updater('  ')

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


, ' ' , BotFather ( ).

, check_date, .



, , , . , , .



, pass_args = TRUE CommandHandler(), , bot, update β€” args. , . , .



, .







β€” .



:



  1. R. RStudio File, Save As....
  2. bin, R Path, .
  3. , 1 : R CMD BATCH C:\Users\Alsey\Documents\my_bot.R. C:\Users\Alsey\Documents\my_bot.R . , , .. . , txt bat.
  4. Windows, , %windir%\system32\taskschd.msc /s. .
  5. " ...".
  6. "" , " ".
  7. "", "". " " "", bat , .
  8. , .
  9. , "".


, , , .





, , . .



, , .



telegram youtube .




All Articles