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

В publikasi sebelumnya kami menemukan cara membuat bot, menginisialisasi sebuah instance kelas Bot dan menjadi terbiasa dengan metode pengiriman pesan yang menggunakannya.

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

Kali ini kita akan mengetahui cara menghidupkan kembali bot kita dan menambahkan dukungan perintah ke dalamnya, serta mengenal kelasnya Updater.

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

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

Semua artikel dari seri “Menulis bot telegram di R”

  1. Kami membuat bot dan menggunakannya untuk mengirim pesan di telegram
  2. Tambahkan dukungan perintah dan filter pesan ke bot

kadar

Jika Anda tertarik dengan analisis data, Anda mungkin tertarik dengan saya Telegram и Youtube saluran. Sebagian besar konten didedikasikan untuk bahasa R.

  1. Kelas pembaruan
  2. Penangan – penangan
  3. Tambahkan perintah pertama ke bot, pengendali perintah
  4. Pemroses dan filter pesan teks
  5. Menambahkan Perintah dengan Parameter
  6. Jalankan bot di latar belakang
  7. Kesimpulan

Kelas pembaruan

Updater adalah kelas yang memudahkan Anda mengembangkan bot telegram, dan menggunakan kelas tersebut Dispetcher. tugas kelas Updater adalah menerima pembaruan dari bot (di artikel sebelumnya kami menggunakan metode untuk tujuan ini getUpdates()), dan transfer lebih jauh ke Dispetcher.

Pada gilirannya Dispetcher berisi penangan yang Anda buat, mis. objek kelas Handler.

Penangan – penangan

Dengan penangan yang Anda tambahkan Dispetcher reaksi bot terhadap berbagai peristiwa. Pada saat penulisan artikel ini di telegram.bot Jenis penangan berikut telah ditambahkan:

  • MessageHandler — Penangan pesan
  • CommandHandler - Pengendali perintah
  • CallbackQueryHandler — Pengendali data untuk keyboard yang dikirim dari Inline
  • ErrorHandler — Penangan kesalahan saat meminta pembaruan dari bot

Tambahkan perintah pertama ke bot, pengendali perintah

Jika Anda belum pernah menggunakan bot sebelumnya dan tidak tahu apa itu perintah, maka perintah ke bot harus dikirimkan menggunakan garis miring ke depan / sebagai awalan.

Kami akan mulai dengan perintah sederhana, yaitu. mari ajari bot kita untuk menyapa sesuai perintah /hi.

Kode 1: Mengajari bot untuk menyapa

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

Jalankan contoh kode di atas, setelah mengganti 'TOKEN BOT ANDA' dengan token asli yang Anda terima saat membuat bot melalui ayah kedua (Saya berbicara tentang membuat bot di artikel pertama).

metode start_polling() kelas Updater, yang digunakan di akhir kode, memulai putaran permintaan dan pemrosesan pembaruan tanpa akhir dari bot.

Sekarang mari kita buka Telegram dan tulis perintah pertama ke bot kita /hi.

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

Sekarang bot kita memahami perintahnya /hi, dan tahu bagaimana menyambut kami.

Secara skematis proses pembuatan bot sederhana tersebut dapat digambarkan sebagai berikut.

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

  1. Buat sebuah instance dari kelas Updater;
  2. Kami membuat metode, mis. fungsi yang akan dilakukan bot kita. Dalam contoh kode ini adalah sebuah fungsi say_hello(). Fungsi yang akan Anda gunakan sebagai metode bot harus memiliki dua argumen wajib - bot и memperbarui, dan satu opsional - args. Argumen bot, ini bot Anda, dengan bantuannya Anda dapat membalas pesan, mengirim pesan, atau menggunakan metode lain yang tersedia untuk bot. Argumen memperbarui inilah yang diterima bot dari pengguna, sebenarnya, apa yang kami terima di artikel pertama menggunakan metode ini getUpdates(). Argumen args memungkinkan Anda memproses data tambahan yang dikirim oleh pengguna bersama dengan perintahnya, kami akan kembali ke topik ini nanti;
  3. Kami membuat penangan, mis. Kami mengaitkan beberapa tindakan pengguna dengan metode yang dibuat pada langkah sebelumnya. Pada dasarnya, handler adalah pemicu, sebuah peristiwa yang memanggil beberapa fungsi bot. Dalam contoh kita, pemicu tersebut adalah mengirimkan perintah /hi, dan diterapkan oleh tim hi_hendler <- CommandHandler('hi', say_hello). Argumen fungsi pertama CommandHandler() memungkinkan Anda menentukan perintah, dalam kasus kami hi, yang akan ditanggapi oleh bot. Argumen kedua memungkinkan Anda menentukan metode bot, kami akan memanggil metode tersebut say_hello, yang akan dieksekusi jika pengguna memanggil perintah yang ditentukan dalam argumen pertama;
  4. Selanjutnya, kita menambahkan handler yang dibuat ke operator instance kelas kita Updater. Anda dapat menambahkan handler dengan beberapa cara; pada contoh di atas, saya menggunakan cara yang paling sederhana, yaitu menggunakan tanda +, yaitu updater <- updater + hi_hendler. Hal yang sama dapat dilakukan dengan menggunakan metode ini add_handler(), yang termasuk dalam kelas Dispatcher, Anda dapat menemukan metode ini seperti ini: updater$dispatcher$add_handler();
  5. Luncurkan bot menggunakan perintah start_polling().

Pemroses dan filter pesan teks

Kami menemukan cara mengirim perintah ke bot, tapi terkadang kami membutuhkan bot untuk merespons tidak hanya perintah, tetapi juga beberapa pesan teks biasa. Untuk melakukan ini, Anda perlu menggunakan penangan pesan - penangan pesan.

Normal penangan pesan akan merespons sepenuhnya semua pesan masuk. Oleh karena itu, penangan pesan sering digunakan bersama dengan filter. Mari kita ajari bot untuk menyapa tidak hanya berdasarkan perintah /hi, tetapi juga setiap kali salah satu kata berikut muncul dalam pesan yang dikirim ke bot: halo, halo, salut, hai, selamat datang.

Untuk saat ini kami tidak akan menulis metode baru apa pun, karena... Kami sudah memiliki metode yang digunakan bot untuk menyambut kami. Yang perlu kita lakukan hanyalah membuat filter dan penangan pesan yang diperlukan.

Kode 2: Tambahkan penangan dan filter pesan teks

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

Jalankan contoh kode di atas, setelah mengganti 'TOKEN BOT ANDA' dengan token asli yang Anda terima saat membuat bot melalui ayah kedua (Saya berbicara tentang membuat bot di artikel pertama).

Sekarang mari kita coba mengirim beberapa pesan ke bot yang berisi kata-kata ucapan yang tercantum sebelumnya:
Menulis bot telegram di R (bagian 2): Menambahkan dukungan perintah dan filter pesan ke bot

Jadi, pertama-tama, kami mengajari bot untuk tidak hanya mengucapkan halo, namun juga merespons sapaan. Kami melakukan ini dengan menggunakan argumen balasan_ke_pesan_id, yang tersedia dalam metode ini sendMessage(), ke dalamnya Anda perlu mentransfer id pesan yang ingin Anda balas. Anda bisa mendapatkan id pesan seperti ini: update$message$message_id.

Namun hal utama yang kami lakukan adalah menambahkan filter ke bot menggunakan fungsi tersebut BaseFilter():

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

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

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

)

Seperti yang mungkin Anda perhatikan, filter perlu ditambahkan ke objek Filter Pesan, yang awalnya sudah berisi sekumpulan kecil filter siap pakai. Dalam contoh kita, ke objek Filter Pesan kami menambahkan elemen hi, ini adalah filter baru.

Dalam fungsi BaseFilter() Anda harus melewati fungsi filter. Pada dasarnya, filter hanyalah sebuah fungsi yang menerima contoh pesan dan mengembalikannya BENAR или SALAH. Dalam contoh kita, kita menulis sebuah fungsi sederhana, menggunakan fungsi dasar grepl() memeriksa teks pesan dan apakah cocok dengan ekspresi reguler привет|здравствуй|салют|хай|бонжур kembali BENAR.

Selanjutnya kita membuat penangan pesan hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi). Argumen fungsi pertama MessageHandler() adalah metode yang akan memanggil pengendali, dan argumen kedua adalah filter yang akan digunakan untuk memanggilnya. Dalam kasus kami, ini adalah filter yang kami buat MessageFilters$hi.

Nah, pada akhirnya, kami menambahkan handler yang dibuat ke operator hai_txt_hnd.

updater <- updater + 
             hi_hendler +
             hi_txt_hnd

Seperti yang saya tulis di atas, di dalam paket telegram.bot dan objek Filter Pesan Sudah ada satu set filter bawaan yang dapat Anda gunakan:

  • semua — Semua pesan
  • teks — Pesan teks
  • perintah - Perintah, mis. pesan yang dimulai dengan /
  • reply — Pesan yang merupakan balasan terhadap pesan lain
  • audio — Pesan yang berisi file audio
  • dokumen — Pesan dengan dokumen terkirim
  • foto - Pesan dengan gambar terkirim
  • stiker — Pesan dengan stiker terkirim
  • video — Pesan dengan video
  • suara - Pesan suara
  • kontak — Pesan yang berisi konten telegram pengguna
  • lokasi — Pesan dengan geolokasi
  • tempat — Pesan yang diteruskan
  • permainan — Permainan

Jika ingin menggabungkan beberapa filter dalam satu handler cukup gunakan tandanya | - sebagai logis OR, dan menandatangani & sebagai logis И. Misalnya, jika Anda ingin bot memanggil metode yang sama saat menerima video, gambar, atau dokumen, gunakan contoh berikut untuk membuat pengendali pesan:

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

Menambahkan Perintah dengan Parameter

Kita sudah mengetahui apa itu perintah, cara membuatnya, dan cara memaksa bot untuk menjalankan perintah yang diinginkan. Namun dalam beberapa kasus, selain nama perintah, kita perlu meneruskan beberapa data untuk menjalankannya.

Di bawah ini adalah contoh bot yang, berdasarkan tanggal dan negara tertentu, mengembalikan jenis hari dari kalender produksi kepada Anda.

Bot di bawah ini menggunakan API kalender produksi isdayoff.ru.

Kode 3: Bot yang melaporkan berdasarkan tanggal dan negara

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

Jalankan contoh kode di atas, setelah mengganti 'TOKEN BOT ANDA' dengan token asli yang Anda terima saat membuat bot melalui ayah kedua (Saya berbicara tentang membuat bot di artikel pertama).

Kami membuat bot yang hanya memiliki satu metode di gudang senjatanya check_date, metode ini dipanggil dengan perintah dengan nama yang sama.

Namun, selain nama perintah, cara ini mengharuskan Anda memasukkan dua parameter, kode negara dan tanggal. Selanjutnya, bot memeriksa apakah hari tertentu di negara tertentu adalah akhir pekan, hari yang dipersingkat, atau hari kerja menurut kalender produksi resmi.

Agar metode yang kita buat dapat menerima parameter tambahan bersama dengan perintahnya, gunakan argumen pass_args = TRUE dalam fungsi CommandHandler(), dan saat membuat metode, selain argumen yang diperlukan bot, memperbarui buat yang opsional - args. Metode yang dibuat dengan cara ini akan menerima parameter yang Anda berikan ke bot setelah nama perintah. Parameter harus dipisahkan dengan spasi; parameter tersebut akan dikirim ke metode sebagai vektor teks.

Mari luncurkan dan uji bot kita.

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

Jalankan bot di latar belakang

Langkah terakhir yang perlu kita selesaikan adalah meluncurkan bot di latar belakang.

Untuk melakukannya, ikuti algoritma yang dijelaskan di bawah ini:

  1. Simpan kode bot ke file dengan ekstensi R. Saat bekerja di RStudio, ini dilakukan melalui menu File, tim Simpan Sebagai.
  2. Tambahkan path ke folder bin, yang terletak di folder tempat Anda menginstal bahasa R, ke variabel Path, instruksi di sini.
  3. Buat file teks biasa yang menulis 1 baris: R CMD BATCH C:UsersAlseyDocumentsmy_bot.R... Dari pada C:PenggunaAlseyDocumentsmy_bot.R tulis jalur ke skrip bot Anda. Pada saat yang sama, penting bahwa tidak ada karakter atau spasi Sirilik di sepanjang jalan, karena ini dapat menyebabkan masalah saat menjalankan bot. Simpan, dan ganti ekstensinya dengan txt pada kelelawar.
  4. Buka Penjadwal Tugas Windows, ada banyak cara untuk melakukannya, misalnya membuka folder apa saja dan memasukkan alamatnya %windir%system32taskschd.msc /s. Metode peluncuran lainnya dapat ditemukan di sini.
  5. Di menu kanan atas penjadwal, klik "Buat tugas...".
  6. Pada tab "Umum", berikan nama khusus pada tugas Anda, dan alihkan tombol ke status "Jalankan untuk semua pengguna".
  7. Buka tab "Tindakan", klik "Buat". Di bidang "Program atau skrip", klik "Jelajahi", temukan yang dibuat pada langkah kedua kelelawar file dan klik OK.
  8. Klik OK dan, jika perlu, masukkan kata sandi untuk akun sistem operasi Anda.
  9. Temukan tugas yang dibuat di penjadwal, pilih dan klik tombol "Jalankan" di sudut kanan bawah.

Bot kami berjalan di latar belakang dan akan bekerja hingga Anda menghentikan tugas, atau mematikan PC atau server tempat tugas tersebut diluncurkan.

Kesimpulan

Pada artikel ini, kami menemukan cara menulis bot lengkap yang tidak hanya dapat mengirim pesan, tetapi juga merespons pesan dan perintah masuk. Pengetahuan yang diperoleh sudah cukup untuk menyelesaikan sebagian besar masalah Anda.

Artikel selanjutnya akan membahas tentang cara menambahkan keyboard ke bot untuk pekerjaan yang lebih nyaman.

Berlangganan ke saya Telegram и Youtube saluran.

Sumber: www.habr.com

Tambah komentar