Nulis bot telegram ing R (bagean 2): Nambahake dhukungan printah lan saringan pesen menyang bot

В publikasi sadurungé kita ngerti carane nggawe bot, miwiti conto kelas Bot lan dadi akrab karo cara ngirim pesen nggunakake.

Ing artikel iki aku nerusake topik iki, mula aku nyaranake miwiti maca artikel iki mung sawise maca sisih pisanan.

Wektu iki kita bakal nemtokake cara kanggo urip maneh bot lan nambah dhukungan printah, lan uga kenal karo kelas kasebut Updater.

Sajrone artikel kasebut, kita bakal nulis sawetara bot sing prasaja, sing terakhir bakal, adhedhasar tanggal lan kode negara, nemtokake manawa dina ing negara tartamtu minangka akhir minggu utawa dina kerja miturut tanggalan produksi. Nanging, kaya sadurunge, tujuane artikel kasebut yaiku supaya sampeyan ngerti antarmuka paket kasebut telegram.bot kanggo ngatasi masalah sampeyan dhewe.

Nulis bot telegram ing R (bagean 2): Nambahake dhukungan printah lan saringan pesen menyang bot

Kabeh artikel saka seri "Nulis bot telegram ing R"

  1. Kita nggawe bot lan digunakake kanggo ngirim pesen ing telegram
  2. Tambah dhukungan printah lan saringan pesen menyang bot

Isi

Yen sampeyan kasengsem ing analisis data, sampeyan bisa uga kasengsem ing sandi telegram и youtube saluran. Sebagéyan gedhé isiné dikhususaké kanggo basa R.

  1. Kelas Updater
  2. Pawang - pawang
  3. Tambah printah pisanan kanggo bot, pawang printah
  4. Prosesor pesen teks lan saringan
  5. Nambahake Prentah karo Parameter
  6. Jalanake bot ing latar mburi
  7. kesimpulan

Kelas Updater

Updater iku kelas sing nggampangake sampeyan ngembangaken bot telegram, lan nggunakake kelas ing hood Dispetcher. Tugas kelas Updater kanggo nampa nganyari saka bot (ing artikel sadurunge kita nggunakake cara kanggo maksud iki getUpdates()), lan pindhah menyang Dispetcher.

Banjur Dispetcher ngemot pawang sing digawe, i.e. obyek kelas Handler.

Pawang - pawang

Kanthi pawang sampeyan nambah Dispetcher reaksi bot kanggo macem-macem acara. Ing wektu nulis artikel iki ing telegram.bot Jinis panangan ing ngisor iki wis ditambahake:

  • MessageHandler - Pawang pesen
  • CommandHandler - pawang Command
  • CallbackQueryHandler - Panangan data kanggo keyboard sing dikirim saka Inline
  • ErrorHandler - Penangan kesalahan nalika njaluk nganyari saka bot

Tambah printah pisanan kanggo bot, pawang printah

Yen sampeyan durung tau nggunakake bot sadurunge lan ora ngerti apa iku printah, banjur printah kanggo bot kudu dikirim nggunakake garis miring maju. / minangka ater-ater.

Kita bakal miwiti karo printah prasaja, i.e. ayo ngajari bot kita ngucapake salam ing dhawuh /hi.

Kode 1: Ngajari bot kanggo ngucapake salam

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

Jalanake conto kode ing ndhuwur, sawise ngganti 'TOKEN BOT YOUR' karo token nyata sing ditampa nalika nggawe bot liwat BotBapak (Aku ngomong babagan nggawe bot ing artikel pisanan).

Cara start_polling() kelas Updater, sing digunakake ing mburi kode, miwiti daur ulang tanpa wates kanggo njaluk lan ngolah nganyari saka bot.

Saiki ayo mbukak Telegram lan nulis perintah pisanan menyang bot kita /hi.

Nulis bot telegram ing R (bagean 2): Nambahake dhukungan printah lan saringan pesen menyang bot

Saiki bot kita ngerti perintah kasebut /hi, lan ngerti carane menehi salam marang kita.

Secara skematis, proses mbangun bot sing prasaja kasebut bisa digambarake kaya ing ngisor iki.

Nulis bot telegram ing R (bagean 2): Nambahake dhukungan printah lan saringan pesen menyang bot

  1. Nggawe conto kelas Updater;
  2. Kita nggawe cara, i.e. fungsi sing bakal ditindakake bot kita. Ing conto kode iki minangka fungsi say_hello(). Fungsi sing bakal digunakake minangka metode bot kudu duwe rong argumen sing dibutuhake - bot и nganyari, lan siji opsional - bantahan. Argumentasi bot, iki bot sampeyan, kanthi bantuan sampeyan bisa mbales pesen, ngirim pesen, utawa nggunakake cara liya sing kasedhiya kanggo bot. Argumentasi nganyari iki sing ditampa bot saka pangguna, nyatane, sing ditampa ing artikel pisanan nggunakake metode kasebut getUpdates(). Argumentasi bantahan ngidini sampeyan ngolah data tambahan sing dikirim dening pangguna bebarengan karo printah, kita bakal bali menyang topik iki mengko;
  3. We nggawe handler, i.e. Kita nggandhengake sawetara tumindak pangguna karo cara sing digawe ing langkah sadurunge. Ateges, panangan minangka pemicu, acara sing nyebutake sawetara fungsi bot. Ing conto kita, pemicu kasebut ngirim prentah /hi, lan dileksanakake dening tim hi_hendler <- CommandHandler('hi', say_hello). Argumen fungsi pisanan CommandHandler() ngidini sampeyan nemtokake prentah, ing kasus kita hi, sing bot bakal nanggapi. Argumentasi kapindho ngidini sampeyan nemtokake cara bot, kita bakal nelpon metode kasebut say_hello, sing bakal dieksekusi yen pangguna nelpon printah kasebut ing argumen pisanan;
  4. Sabanjure, kita nambah handler digawe menyang dispatcher saka conto kelas kita Updater. Sampeyan bisa nambah panangan kanthi sawetara cara; ing conto ing ndhuwur, aku nggunakake sing paling gampang, nggunakake tandha +, i.e. updater <- updater + hi_hendler. Sing padha bisa ditindakake kanthi nggunakake metode kasebut add_handler(), sing kalebu kelas Dispatcher, sampeyan bisa nemokake cara iki kaya iki: updater$dispatcher$add_handler();
  5. Bukak bot nggunakake printah start_polling().

Prosesor pesen teks lan saringan

We figured metu carane ngirim printah kanggo bot, nanging kadhangkala kita kudu bot kanggo nanggapi ora mung kanggo printah, nanging uga kanggo sawetara pesen teks biasa. Kanggo nindakake iki, sampeyan kudu nggunakake panangan pesen − MessageHandler.

biasa MessageHandler bakal nanggapi pancen kabeh pesen sing mlebu. Mulane, pawang pesen asring digunakake bebarengan karo saringan. Ayo ngajari bot kanggo ngucapake salam ora mung kanthi prentah /hi, nanging uga saben tembung ing ngisor iki katon ing pesen sing dikirim menyang bot: hello, hello, salute, hai, bonjour.

Saiki kita ora bakal nulis cara anyar, amarga ... Kita wis duwe cara sing bot menehi salam marang kita. Kabeh sing kudu kita lakoni yaiku nggawe filter lan pawang pesen sing dibutuhake.

Kode 2: Tambah pawang pesen teks lan saringan

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

Jalanake conto kode ing ndhuwur, sawise ngganti 'TOKEN BOT YOUR' karo token nyata sing ditampa nalika nggawe bot liwat BotBapak (Aku ngomong babagan nggawe bot ing artikel pisanan).

Saiki ayo nyoba ngirim bot sawetara pesen sing ngemot tembung salam sing kadhaptar sadurunge:
Nulis bot telegram ing R (bagean 2): Nambahake dhukungan printah lan saringan pesen menyang bot

Dadi, pisanan, kita ngajar bot kasebut ora mung ngucapake salam, nanging kanggo nanggapi salam. Kita nindakake iki nggunakake argumentasi reply_to_message_id, sing kasedhiya ing cara sendMessage(), menyang ngendi sampeyan kudu nransfer id pesen sing arep ditanggapi. Sampeyan bisa njaluk id pesen kaya iki: update$message$message_id.

Nanging sing paling penting yaiku nambah filter menyang bot nggunakake fungsi kasebut BaseFilter():

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

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

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

)

Kaya sing sampeyan ngerteni, saringan kudu ditambahake menyang obyek kasebut MessageFilters, sing wiwitane wis ngemot saringan cilik sing wis siap. Ing conto kita, kanggo obyek MessageFilters kita nambah unsur hi, iki saringan anyar.

Ing fungsi BaseFilter() sampeyan kudu pass fungsi Filter. Ateges, saringan mung minangka fungsi sing nampa conto pesen lan bali TRUE utawa lupute. Ing conto kita, kita wrote fungsi prasaja sing, nggunakake fungsi dhasar grepl() mriksa teks pesen lan yen cocog karo ekspresi biasa привет|здравствуй|салют|хай|бонжур bali TRUE.

Sabanjure kita nggawe handler pesen hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi). Argumen fungsi pisanan MessageHandler() minangka cara sing bakal nelpon pawang, lan argumen kapindho yaiku filter sing bakal diarani. Ing kasus kita, iki minangka filter sing digawe MessageFilters$hi.

Inggih, ing pungkasan, kita nambah menyang dispatcher handler digawe hi_txt_hnd.

updater <- updater + 
             hi_hendler +
             hi_txt_hnd

Nalika aku nulis ing ndhuwur, ing paket telegram.bot lan obyek MessageFilters Wis ana saringan saringan sing bisa digunakake:

  • kabeh - Kabeh pesen
  • teks — Pesen teks
  • printah - Prentah, i.e. pesen sing diwiwiti karo /
  • reply - Pesen sing balesan kanggo pesen liyane
  • audio - Pesen sing ngemot file audio
  • dokumen - Pesen karo dokumen sing dikirim
  • foto - Pesen karo gambar dikirim
  • stiker - Pesen karo stiker sing dikirim
  • video — Pesen karo video
  • swara - Pesen swara
  • kontak - Pesen sing ngemot isi telegram pangguna
  • lokasi - Pesen karo geolokasi
  • panggonan - Pesen sing diterusake
  • game - Games

Yen sampeyan pengin gabungke sawetara saringan ing siji handler mung nggunakake tandha | - minangka logis Utawa, lan tandha & minangka logis И. Contone, yen sampeyan pengin bot nelpon cara sing padha nalika nampa video, gambar utawa dokumen, gunakake conto ing ngisor iki kanggo nggawe pawang pesen:

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

Nambahake Prentah karo Parameter

Kita wis ngerti apa prentah, carane nggawe, lan carane meksa bot kanggo nglakokaké printah sing dikarepake. Nanging ing sawetara kasus, saliyane jeneng printah, kita kudu ngliwati sawetara data kanggo nglakokake.

Ing ngisor iki conto bot sing, diwenehi tanggal lan negara tartamtu, ngasilake jinis dina saka tanggalan produksi.

Bot ing ngisor iki nggunakake API tanggalan produksi isdayoff.ru.

Kode 3: Bot sing nglaporake miturut tanggal lan 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()

Jalanake conto kode ing ndhuwur, sawise ngganti 'TOKEN BOT YOUR' karo token nyata sing ditampa nalika nggawe bot liwat BotBapak (Aku ngomong babagan nggawe bot ing artikel pisanan).

Kita nggawe bot sing mung duwe siji cara ing arsenal check_date, cara iki diarani kanthi printah kanthi jeneng sing padha.

Nanging, saliyane jeneng printah, cara iki mbutuhake sampeyan ngetik rong paramèter, kode negara lan tanggal. Sabanjure, bot mriksa manawa dina tartamtu ing negara kasebut minangka akhir minggu, dina sing dicekak, utawa dina kerja miturut tanggalan produksi resmi.

Supaya cara sing digawe bisa nampa paramèter tambahan bebarengan karo prentah, gunakake argumen kasebut pass_args = TRUE ing fungsi CommandHandler(), lan nalika nggawe cara, saliyane argumen sing dibutuhake bot, nganyari nggawe opsional - bantahan. Cara sing digawe kanthi cara iki bakal nampa paramèter sing dikirim menyang bot sawise jeneng printah. Parameter kasebut kudu dipisahake kanthi spasi; bakal dikirim menyang metode minangka vektor teks.

Ayo miwiti lan nyoba bot kita.

Nulis bot telegram ing R (bagean 2): Nambahake dhukungan printah lan saringan pesen menyang bot

Jalanake bot ing latar mburi

Langkah pungkasan sing kudu ditindakake yaiku miwiti bot ing latar mburi.

Kanggo nindakake iki, tindakake algoritma ing ngisor iki:

  1. Simpen kode bot menyang file kanthi ekstensi R. Nalika nggarap RStudio, iki ditindakake liwat menu file, tim Simpen Minangka ....
  2. Tambah path menyang folder bin, sing uga ana ing folder sing sampeyan instal basa R, menyang variabel Path, instruksi kene.
  3. Gawe file teks biasa sing nulis 1 baris: R CMD BATCH C:UsersAlseyDocumentsmy_bot.R... tinimbang C:UsersAlseyDocumentsmy_bot.R tulis path menyang skrip bot sampeyan. Ing wektu sing padha, penting yen ora ana karakter utawa spasi Cyrillic ing dalan, amarga iki bisa nimbulaké masalah nalika mbukak bot. Simpen, lan ngganti extension karo txt ing bat.
  4. Bukak Windows Task Scheduler, ana akeh cara kanggo nindakake iki, contone, mbukak sembarang folder lan ketik alamat %windir%system32taskschd.msc /s. Cara peluncuran liyane bisa ditemokake kene.
  5. Ing menu tengen ndhuwur panjadwal, klik "Gawe tugas ...".
  6. Ing tab "Umum", wenehi jeneng khusus tugas sampeyan, lan ngalih menyang negara "Run for all users".
  7. Pindhah menyang tab "Tindakan", klik "Gawe". Ing lapangan "Program utawa skrip", klik "Browse", golek sing digawe ing langkah kapindho bat file banjur klik OK.
  8. Klik OK lan, yen perlu, ketik sandhi kanggo akun sistem operasi sampeyan.
  9. Temokake tugas sing digawe ing panjadwal, pilih banjur klik tombol "Run" ing pojok tengen ngisor.

Bot kita mlaku ing latar mburi lan bakal bisa nganti sampeyan mungkasi tugas, utawa mateni PC utawa server sing diluncurake.

kesimpulan

Ing artikel iki, kita ngerti carane nulis bot lengkap sing ora mung bisa ngirim pesen, nanging uga nanggapi pesen lan prentah sing mlebu. Kawruh sing dipikolehi wis cukup kanggo ngatasi masalah sampeyan.

Artikel sabanjure bakal ngomong babagan carane nambah keyboard menyang bot kanggo karya sing luwih trep.

Langganan sandi telegram и youtube saluran.

Source: www.habr.com

Add a comment