Viết bot telegram trong R (phần 2): Thêm hỗ trợ lệnh và lọc tin nhắn cho bot

В xuất bản trước chúng tôi đã tìm ra cách tạo bot, khởi tạo một phiên bản của lớp Bot và làm quen với các phương thức gửi tin nhắn bằng nó.

Trong bài viết này tôi tiếp tục chủ đề này, vì vậy tôi khuyên bạn chỉ nên bắt đầu đọc bài viết này sau khi đọc phần đầu tiên.

Lần này chúng ta sẽ tìm ra cách khôi phục bot của mình và thêm hỗ trợ lệnh cho nó, đồng thời làm quen với lớp Updater.

Trong suốt bài viết, chúng tôi sẽ viết một số bot đơn giản, dựa trên một ngày và mã quốc gia nhất định, chúng tôi sẽ xác định xem một ngày ở một quốc gia nhất định là cuối tuần hay ngày làm việc theo lịch sản xuất. Tuy nhiên, như trước, mục đích của bài viết là giúp bạn làm quen với giao diện gói telegram.bot để giải quyết vấn đề của riêng bạn.

Viết bot telegram trong R (phần 2): Thêm hỗ trợ lệnh và lọc tin nhắn cho bot

Tất cả các bài viết trong loạt bài “Viết bot telegram trong R”

  1. Chúng tôi tạo bot và sử dụng nó để gửi tin nhắn trong telegram
  2. Thêm bộ lọc tin nhắn và hỗ trợ lệnh vào bot

nội dung

Nếu bạn quan tâm đến phân tích dữ liệu, bạn có thể quan tâm đến tôi điện tín и youtube kênh truyền hình. Hầu hết nội dung được dành cho ngôn ngữ R.

  1. Lớp cập nhật
  2. Người xử lý - người xử lý
  3. Thêm lệnh đầu tiên vào bot, trình xử lý lệnh
  4. Bộ xử lý và bộ lọc tin nhắn văn bản
  5. Thêm lệnh có tham số
  6. Chạy bot ở chế độ nền
  7. Kết luận

Lớp cập nhật

Updater là lớp giúp bạn phát triển bot điện tín dễ dàng hơn và sử dụng lớp này một cách chuyên sâu Dispetcher. Phân lớp Updater là nhận thông tin cập nhật từ bot (trong bài viết trước chúng tôi đã sử dụng phương pháp này cho mục đích getUpdates()) và chuyển chúng tiếp sang Dispetcher.

Lần lượt, Dispetcher chứa các trình xử lý bạn đã tạo, tức là đối tượng lớp Handler.

Người xử lý - người xử lý

Với trình xử lý bạn thêm vào Dispetcher phản ứng của bot đối với các sự kiện khác nhau. Tại thời điểm viết bài viết này trong telegram.bot Các loại trình xử lý sau đã được thêm vào:

  • MessageHandler - Trình xử lý tin nhắn
  • CommandHandler - Trình xử lý lệnh
  • CallbackQueryHandler - Trình xử lý dữ liệu cho bàn phím được gửi từ Inline
  • ErrorHandler - Trình xử lý lỗi khi yêu cầu cập nhật từ bot

Thêm lệnh đầu tiên vào bot, trình xử lý lệnh

Nếu bạn chưa từng sử dụng bot trước đây và không biết lệnh là gì thì lệnh tới bot phải được gửi bằng dấu gạch chéo lên / như một tiền tố.

Chúng ta sẽ bắt đầu với các lệnh đơn giản, tức là. hãy dạy bot của chúng ta nói xin chào theo lệnh /hi.

Mã 1: Dạy bot nói xin chào

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

Chạy mã ví dụ ở trên, sau khi thay thế 'MÃ BOT CỦA BẠN' bằng mã thông báo thực mà bạn nhận được khi tạo bot thông qua bố bot (Tôi đã nói về việc tạo bot trong bài viết đầu tiên).

Phương thức start_polling() lớp Updater, được sử dụng ở cuối mã, bắt đầu một vòng lặp vô tận yêu cầu và xử lý các bản cập nhật từ bot.

Bây giờ hãy mở Telegram và viết lệnh đầu tiên cho bot của chúng tôi /hi.

Viết bot telegram trong R (phần 2): Thêm hỗ trợ lệnh và lọc tin nhắn cho bot

Bây giờ bot của chúng tôi đã hiểu lệnh /hi, và biết cách chào đón chúng tôi.

Về mặt sơ đồ, quá trình xây dựng một bot đơn giản như vậy có thể được mô tả như sau.

Viết bot telegram trong R (phần 2): Thêm hỗ trợ lệnh và lọc tin nhắn cho bot

  1. Tạo một thể hiện của lớp Updater;
  2. Chúng tôi tạo ra các phương thức, tức là các chức năng mà bot của chúng tôi sẽ thực hiện. Trong ví dụ mã đây là một hàm say_hello(). Các hàm mà bạn sẽ sử dụng làm phương thức bot phải có hai đối số bắt buộc - bot и cập nhậtvà một tùy chọn - args.. Lý lẽ bot, đây là bot của bạn, với sự trợ giúp của nó, bạn có thể trả lời tin nhắn, gửi tin nhắn hoặc sử dụng bất kỳ phương pháp nào khác có sẵn cho bot. Lý lẽ cập nhật đây là những gì bot nhận được từ người dùng, trên thực tế, đó là những gì chúng tôi đã nhận được trong bài viết đầu tiên sử dụng phương pháp này getUpdates(). Lý lẽ args. cho phép bạn xử lý dữ liệu bổ sung do người dùng gửi cùng với lệnh, chúng tôi sẽ quay lại chủ đề này sau;
  3. Chúng tôi tạo ra các trình xử lý, tức là Chúng tôi liên kết một số hành động của người dùng với các phương thức được tạo ở bước trước. Về cơ bản, trình xử lý là một trình kích hoạt, một sự kiện gọi một số hàm bot. Trong ví dụ của chúng tôi, trình kích hoạt như vậy đang gửi lệnh /hi, và được thực hiện bởi nhóm hi_hendler <- CommandHandler('hi', say_hello). Đối số hàm đầu tiên CommandHandler() cho phép bạn chỉ định một lệnh, trong trường hợp của chúng tôi hi, mà bot sẽ phản hồi. Đối số thứ hai cho phép bạn chỉ định phương thức bot, chúng tôi sẽ gọi phương thức này say_hello, lệnh này sẽ được thực thi nếu người dùng gọi lệnh được chỉ định trong đối số đầu tiên;
  4. Tiếp theo, chúng ta thêm trình xử lý đã tạo vào bộ điều phối của thể hiện lớp của chúng ta Updater. Bạn có thể thêm trình xử lý theo nhiều cách; trong ví dụ trên, tôi đã sử dụng cách đơn giản nhất, sử dụng dấu hiệu +Tức là updater <- updater + hi_hendler. Điều tương tự có thể được thực hiện bằng cách sử dụng phương pháp add_handler(), thuộc về lớp Dispatcher, bạn có thể tìm thấy phương pháp này như thế này: updater$dispatcher$add_handler();
  5. Khởi chạy bot bằng lệnh start_polling().

Bộ xử lý và bộ lọc tin nhắn văn bản

Chúng tôi đã tìm ra cách gửi lệnh đến bot, nhưng đôi khi chúng tôi cần bot phản hồi không chỉ với các lệnh mà còn với một số tin nhắn văn bản thông thường. Để làm điều này bạn cần sử dụng trình xử lý tin nhắn − Trình xử lý tin nhắn.

Bình thường Trình xử lý tin nhắn sẽ trả lời hoàn toàn tất cả các tin nhắn đến. Vì vậy, các trình xử lý tin nhắn thường được sử dụng cùng với các bộ lọc. Hãy dạy bot nói xin chào không chỉ theo lệnh /hi, mà còn bất cứ khi nào một trong những từ sau xuất hiện trong tin nhắn gửi tới bot: hello, hello, salute, hai, bonjour.

Hiện tại chúng tôi sẽ không viết bất kỳ phương pháp mới nào, bởi vì... Chúng tôi đã có một phương pháp để bot chào đón chúng tôi. Tất cả những gì chúng ta cần làm là tạo bộ lọc và trình xử lý thông báo cần thiết.

Mã 2: Thêm trình xử lý và bộ lọc tin nhắn văn bản

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

Chạy mã ví dụ ở trên, sau khi thay thế 'MÃ BOT CỦA BẠN' bằng mã thông báo thực mà bạn nhận được khi tạo bot thông qua bố bot (Tôi đã nói về việc tạo bot trong bài viết đầu tiên).

Bây giờ hãy thử gửi cho bot một số tin nhắn có chứa những lời chào được liệt kê trước đó:
Viết bot telegram trong R (phần 2): Thêm hỗ trợ lệnh và lọc tin nhắn cho bot

Vì vậy, trước hết, chúng tôi đã dạy bot không chỉ nói xin chào mà còn phải đáp lại lời chào. Chúng tôi đã làm điều này bằng cách sử dụng đối số trả lời_to_message_id, có sẵn trong phương thức sendMessage(), vào đó bạn cần chuyển id của tin nhắn mà bạn muốn trả lời. Bạn có thể nhận được id tin nhắn như thế này: update$message$message_id.

Nhưng điều quan trọng nhất chúng tôi đã làm là thêm bộ lọc vào bot bằng hàm BaseFilter():

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

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

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

)

Như bạn có thể nhận thấy, cần phải thêm bộ lọc vào đối tượng Bộ lọc tin nhắn, ban đầu đã chứa một bộ nhỏ các bộ lọc làm sẵn. Trong ví dụ của chúng tôi, đối tượng Bộ lọc tin nhắn chúng tôi đã thêm một yếu tố hi, đây là một bộ lọc mới.

Trong chức năng BaseFilter() bạn cần phải vượt qua chức năng lọc. Về cơ bản, bộ lọc chỉ là một hàm nhận phiên bản tin nhắn và trả về TRUE hoặc KHÔNG ĐÚNG. Trong ví dụ của chúng tôi, chúng tôi đã viết một hàm đơn giản, sử dụng hàm cơ bản grepl() kiểm tra văn bản tin nhắn và xem nó có khớp với biểu thức chính quy không привет|здравствуй|салют|хай|бонжур trả lại TRUE.

Tiếp theo chúng ta tạo một trình xử lý tin nhắn hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi). Đối số hàm đầu tiên MessageHandler() là phương thức sẽ gọi trình xử lý và đối số thứ hai là bộ lọc mà nó sẽ được gọi. Trong trường hợp của chúng tôi, đây là bộ lọc chúng tôi đã tạo MessageFilters$hi.

Chà, cuối cùng, chúng tôi thêm trình xử lý đã tạo vào bộ điều phối xin chào_txt_hnd.

updater <- updater + 
             hi_hendler +
             hi_txt_hnd

Như tôi đã viết ở trên, trong gói telegram.bot và đối tượng Bộ lọc tin nhắn Hiện đã có một bộ bộ lọc tích hợp mà bạn có thể sử dụng:

  • tất cả - Tất cả tin nhắn
  • văn bản - Tin nhắn văn bản
  • lệnh - Lệnh, tức là tin nhắn bắt đầu bằng /
  • trả lời - Tin nhắn trả lời một tin nhắn khác
  • âm thanh - Tin nhắn chứa tệp âm thanh
  • tài liệu - Tin nhắn có tài liệu đã gửi
  • ảnh - Tin nhắn có hình ảnh đã gửi
  • nhãn dán - Tin nhắn có nhãn dán đã gửi
  • video — Tin nhắn có video
  • giọng nói - Tin nhắn thoại
  • liên hệ - Tin nhắn chứa nội dung điện tín của người dùng
  • vị trí - Tin nhắn có vị trí địa lý
  • địa điểm - Tin nhắn được chuyển tiếp
  • trò chơi – Trò chơi

Nếu bạn muốn kết hợp một số bộ lọc trong một trình xử lý, chỉ cần sử dụng dấu hiệu | - theo logic OR, và ký tên & logic И. Ví dụ: nếu bạn muốn bot gọi cùng một phương thức khi nhận được video, hình ảnh hoặc tài liệu, hãy sử dụng ví dụ sau để tạo trình xử lý tin nhắn:

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

Thêm lệnh có tham số

Chúng ta đã biết lệnh là gì, cách tạo chúng và cách buộc bot thực thi lệnh mong muốn. Nhưng trong một số trường hợp, ngoài tên lệnh, chúng ta cần truyền một số dữ liệu để thực thi nó.

Dưới đây là ví dụ về bot, với một ngày và quốc gia nhất định, sẽ trả về cho bạn loại ngày từ lịch sản xuất.

Bot bên dưới sử dụng API lịch sản xuất isdayoff.ru.

Mã 3: Bot báo cáo theo ngày và quốc gia

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

Chạy mã ví dụ ở trên, sau khi thay thế 'MÃ BOT CỦA BẠN' bằng mã thông báo thực mà bạn nhận được khi tạo bot thông qua bố bot (Tôi đã nói về việc tạo bot trong bài viết đầu tiên).

Chúng tôi đã tạo một bot chỉ có một phương pháp trong kho vũ khí của nó check_date, phương thức này được gọi bằng lệnh cùng tên.

Tuy nhiên, ngoài tên lệnh, phương pháp này yêu cầu bạn nhập hai tham số là mã quốc gia và ngày tháng. Tiếp theo, bot kiểm tra xem một ngày nhất định ở quốc gia được chỉ định là ngày cuối tuần, ngày rút ngắn hay ngày làm việc theo lịch sản xuất chính thức.

Để phương thức chúng ta tạo có thể chấp nhận các tham số bổ sung cùng với lệnh, hãy sử dụng đối số pass_args = TRUE trong chức năng CommandHandler()và khi tạo một phương thức, ngoài các đối số bắt buộc bot, cập nhật tạo một tùy chọn - args.. Phương thức được tạo theo cách này sẽ chấp nhận các tham số mà bạn truyền cho bot sau tên lệnh. Các tham số phải được phân tách bằng dấu cách; chúng sẽ được gửi đến phương thức dưới dạng vectơ văn bản.

Hãy khởi chạy và kiểm tra bot của chúng tôi.

Viết bot telegram trong R (phần 2): Thêm hỗ trợ lệnh và lọc tin nhắn cho bot

Chạy bot ở chế độ nền

Bước cuối cùng chúng ta cần hoàn thành là khởi chạy bot ở chế độ nền.

Để thực hiện việc này, hãy làm theo thuật toán được mô tả bên dưới:

  1. Lưu mã bot vào một tệp có phần mở rộng R. Khi làm việc trong RStudio, việc này được thực hiện thông qua menu Tập tin, đội Lưu thành.
  2. Thêm đường dẫn vào thư mục bin, thư mục này nằm trong thư mục mà bạn đã cài đặt ngôn ngữ R, vào biến Đường dẫn, hướng dẫn đây.
  3. Tạo một tệp văn bản thông thường trong đó viết 1 dòng: R CMD BATCH C:UsersAlseyDocumentsmy_bot.R. Thay vì C:Người dùngAlseyDocumentsmy_bot.R viết đường dẫn đến tập lệnh bot của bạn. Đồng thời, điều quan trọng là không có ký tự Cyrillic hoặc dấu cách trên đường đi, bởi vì điều này có thể gây ra vấn đề khi chạy bot. Lưu nó và thay thế phần mở rộng của nó bằng txt trên dơi.
  4. Mở Windows Task Scheduler, có nhiều cách để thực hiện việc này, ví dụ mở thư mục bất kỳ và nhập địa chỉ %windir%system32taskschd.msc /s. Các phương pháp khởi chạy khác có thể được tìm thấy đây.
  5. Ở menu trên cùng bên phải của bộ lập lịch, nhấp vào "Tạo tác vụ...".
  6. Trên tab "Chung", đặt tên tùy chỉnh cho tác vụ của bạn và chuyển nút gạt sang trạng thái "Chạy cho tất cả người dùng".
  7. Chuyển đến tab "Hành động", nhấp vào "Tạo". Trong trường "Chương trình hoặc tập lệnh", nhấp vào "Duyệt", tìm chương trình được tạo ở bước thứ hai dơi tập tin và nhấn OK.
  8. Nhấp vào OK và nếu cần, hãy nhập mật khẩu cho tài khoản hệ điều hành của bạn.
  9. Tìm tác vụ đã tạo trong bộ lập lịch, chọn tác vụ đó và nhấp vào nút “Chạy” ở góc dưới bên phải.

Bot của chúng tôi chạy ở chế độ nền và sẽ hoạt động cho đến khi bạn dừng tác vụ hoặc tắt PC hoặc máy chủ nơi nó được khởi chạy.

Kết luận

Trong bài viết này, chúng tôi đã tìm ra cách viết một bot chính thức không chỉ có thể gửi tin nhắn mà còn trả lời các tin nhắn và lệnh đến. Kiến thức thu được đã đủ để giải quyết hầu hết các vấn đề của bạn.

Bài viết tiếp theo sẽ nói về cách thêm bàn phím vào bot để làm việc thuận tiện hơn.

Đăng ký của tôi điện tín и youtube kênh truyền hình.

Nguồn: www.habr.com

Thêm một lời nhận xét