Nulis bot telegram dina basa Sunda (bagian 2): Nambahan pangrojong paréntah sareng saringan pesen ka bot

В publikasi saméméhna urang ilahar kaluar kumaha carana nyieun bot, initialized hiji conto kelas Bot tur jadi akrab jeung métode ngirim pesen ngagunakeun éta.

Dina artikel ieu kuring neruskeun topik ieu, jadi kuring nyarankeun dimimitian maca artikel ieu ngan sanggeus maca bagian kahiji.

Waktos ieu urang bakal terang kumaha carana nyegerkeun bot urang sareng nambihan dukungan paréntah ka éta, sareng ogé kenal sareng kelas. Updater.

Salila kursus artikel, urang bakal nulis sababaraha bot basajan, dimungkinkeun bakal, dumasar kana tanggal dibikeun jeung kode nagara, nangtukeun naha hiji poé di nagara tangtu mangrupakeun sabtu minggu atawa poé gawé nurutkeun kalénder produksi. Tapi, sakumaha sateuacanna, tujuan tulisan nyaéta pikeun familiarize anjeun sareng antarmuka pakét telegram.bot pikeun ngajawab masalah anjeun sorangan.

Nulis bot telegram dina basa Sunda (bagian 2): Nambahan pangrojong paréntah sareng saringan pesen ka bot

Sadaya tulisan tina séri "Nulis bot telegram dina basa Sunda"

  1. Kami nyiptakeun bot sareng dianggo pikeun ngirim pesen dina telegram
  2. Tambihkeun dukungan paréntah sareng saringan pesen ka bot

eusi

Lamun museurkeun analisis data, Anjeun bisa jadi kabetot dina abdi telegram и youtube saluran. Seuseueurna eusina dikhususkeun kanggo basa Sunda.

  1. kelas Updater
  2. Pawang - pawang
  3. Tambahkeun paréntah pangheulana bot, panangan paréntah
  4. Prosesor pesen téks sareng saringan
  5. Nambahkeun Paréntah jeung Parameter
  6. Jalankeun bot di latar tukang
  7. kacindekan

kelas Updater

Updater mangrupakeun kelas nu matak ngamudahkeun pikeun anjeun ngamekarkeun bot telegram, tur ngagunakeun kelas handapeun tiung Dispetcher. Tugas kelas Updater nyaéta pikeun nampa apdet ti bot (dina tulisan sateuacana kami nganggo metodeu pikeun tujuan ieu getUpdates()), sarta mindahkeun aranjeunna salajengna ka Dispetcher.

Dina gilirannana Dispetcher ngandung pawang anjeun dijieun, i.e. objék kelas Handler.

Pawang - pawang

Kalawan pawang Anjeun nambahkeun kana Dispetcher réaksi bot kana sagala rupa acara. Dina waktu nulis artikel ieu dina telegram.bot Jenis panangan ieu parantos ditambah:

  • MessageHandler - Panangan pesen
  • CommandHandler - Panangan Paréntah
  • CallbackQueryHandler - Panangan data pikeun kibor anu dikirim ti Inline
  • ErrorHandler - Panangan kasalahan nalika nyuhunkeun apdet ti bot

Tambahkeun paréntah pangheulana bot, panangan paréntah

Upami anjeun teu acan kantos nganggo bot sateuacanna sareng henteu terang naon paréntahna, maka paréntah ka bot kedah dikirim nganggo garis miring ka hareup. / salaku awalan.

Urang mimitian ku paréntah basajan, i.e. hayu urang ajar bot urang ngucapkeun salam dina paréntah /hi.

Kode 1: Ngajarkeun bot pikeun ngucapkeun 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()

Jalankeun conto kode di luhur, saatos ngagentos 'TOKEN BOT ANDA' sareng token nyata anu anjeun tampi nalika nyiptakeun bot via BotBapa (Kuring ngobrol ngeunaan nyieun bot di artikel munggaran).

Metode start_polling() класса Updater, nu dipaké dina tungtung kode, dimimitian hiji loop sajajalan requesting jeung ngolah apdet ti bot.

Ayeuna hayu urang buka Telegram sareng nyerat paréntah pangheulana kana bot urang /hi.

Nulis bot telegram dina basa Sunda (bagian 2): Nambahan pangrojong paréntah sareng saringan pesen ka bot

Ayeuna bot urang ngartos paréntahna /hi, jeung nyaho kumaha carana salam urang.

Sacara skématik, prosés ngawangun bot saderhana sapertos kieu tiasa digambarkeun sapertos kieu.

Nulis bot telegram dina basa Sunda (bagian 2): Nambahan pangrojong paréntah sareng saringan pesen ka bot

  1. Jieun conto kelas Updater;
  2. Urang nyieun métode, i.e. fungsi nu bot urang bakal ngalakukeun. Dina conto kode ieu fungsi say_hello(). Pungsi nu bakal Anjeun pake salaku métode bot kudu boga dua argumen diperlukeun - bot и update, sareng hiji pilihan - args. Arguméntasi bot, ieu bot anjeun, kalayan bantosanana anjeun tiasa ngabales pesen, ngirim pesen, atanapi nganggo metodeu sanés anu sayogi pikeun bot. Arguméntasi update Ieu naon bot narima ti pamaké, kanyataanna, naon urang narima dina artikel munggaran ngagunakeun métode getUpdates(). Arguméntasi args ngamungkinkeun anjeun pikeun ngolah data tambahan anu dikirim ku pangguna sareng paréntahna, kami bakal uih deui ka topik ieu engké;
  3. Urang nyieun pawang, i.e. Kami ngahubungkeun sababaraha tindakan pangguna sareng metode anu diciptakeun dina léngkah saacanna. Intina, panangan mangrupikeun pemicu, acara anu nyauran sababaraha fungsi bot. Dina conto urang, pemicu sapertos ngirim paréntah /hi, sarta dilaksanakeun ku tim hi_hendler <- CommandHandler('hi', say_hello). Argumen fungsi munggaran CommandHandler() ngidinan Anjeun pikeun nangtukeun paréntah, bisi urang hi, nu bot bakal ngabales. Argumen kadua ngidinan Anjeun pikeun nangtukeun métode bot, urang bakal nelepon metoda say_hello, nu bakal dieksekusi lamun pamaké disebut paréntah dieusian dina argumen kahiji;
  4. Salajengna, urang tambahkeun Handler dijieun ka dispatcher sahiji conto kelas urang Updater. Anjeun tiasa nambihan pawang dina sababaraha cara; dina conto di luhur, kuring nganggo anu pangbasajanna, nganggo tanda +, i.e. updater <- updater + hi_hendler. Sami tiasa dilakukeun nganggo metodeu add_handler(), nu kagolong kana kelas Dispatcher, anjeun tiasa mendakan metode ieu sapertos kieu: updater$dispatcher$add_handler();
  5. Jalankeun bot nganggo paréntah start_polling().

Prosesor pesen téks sareng saringan

Urang terang kumaha cara ngirim paréntah ka bot, tapi sakapeung urang peryogi bot pikeun ngabales henteu ngan ukur paréntah, tapi ogé sababaraha pesen téks biasa. Jang ngalampahkeun ieu anjeun kedah nganggo panangan pesen − MessageHandler.

biasa MessageHandler bakal ngabales leres pisan sadaya pesen anu asup. Ku alatan éta, pawang pesen sering dianggo sareng saringan. Hayu urang ngajar bot ngucapkeun salam sanés ngan ukur paréntah /hi, tapi ogé iraha waé salah sahiji kecap di handap ieu muncul dina pesen anu dikirim ka bot: halo, halo, salam, hai, bonjour.

Pikeun ayeuna kami moal nyerat metode anyar, sabab ... Kami parantos ngagaduhan metode anu ku bot ngabagéakeun kami. Sadaya anu urang kedah laksanakeun nyaéta nyiptakeun saringan sareng panangan pesen anu diperyogikeun.

Kodeu 2: Tambihkeun panangan pesen téks sareng 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()

Jalankeun conto kode di luhur, saatos ngagentos 'TOKEN BOT ANDA' sareng token nyata anu anjeun tampi nalika nyiptakeun bot via BotBapa (Kuring ngobrol ngeunaan nyieun bot di artikel munggaran).

Ayeuna hayu urang cobian ngirim bot sababaraha pesen anu ngandung kecap salam anu didaptarkeun sateuacana:
Nulis bot telegram dina basa Sunda (bagian 2): Nambahan pangrojong paréntah sareng saringan pesen ka bot

Janten, mimitina, urang ngajarkeun bot henteu ngan ukur ngucapkeun salam, tapi ngabales salam. Urang ngalakukeun ieu ngagunakeun argumen reply_to_message_id, nu sadia dina metoda sendMessage(), dimana anjeun kedah nransferkeun id pesen anu anjeun badé ngabales. Anjeun tiasa nampi pesen id sapertos kieu: update$message$message_id.

Tapi hal utama anu urang lakukeun nyaéta nambihan saringan ka bot nganggo fungsina BaseFilter():

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

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

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

)

Sakumaha anjeun tiasa perhatikeun, saringan kedah ditambihkeun kana obyék MessageFilters, nu mimitina geus ngandung sakumpulan leutik saringan siap-dijieun. Dina conto urang, ka obyék MessageFilters urang ditambahkeun unsur hi, ieu saringan anyar.

Pikeun fungsi BaseFilter() Anjeun kudu lulus fungsi filter. Intina, saringan ngan ukur fungsi anu nampi conto pesen sareng uih deui BENER atawa PALSU. Dina conto urang, urang nulis fungsi basajan nu, ngagunakeun fungsi dasar grepl() pariksa téks pesen sareng upami cocog sareng ekspresi biasa привет|здравствуй|салют|хай|бонжур mulih BENER.

Salajengna urang nyieun hiji handler pesen hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi). Argumen fungsi munggaran MessageHandler() nya éta métode anu bakal nelepon Handler, sarta argumen kadua nyaéta filter ku nu eta bakal disebut. Dina kasus urang, ieu mangrupikeun saringan anu kami ciptakeun MessageFilters$hi.

Nya, tungtungna, urang tambahkeun ka dispatcher panangan anu diciptakeun hi_txt_hnd.

updater <- updater + 
             hi_hendler +
             hi_txt_hnd

Salaku I wrote luhur, dina iket telegram.bot jeung objék MessageFilters Geus aya sakumpulan saringan anu tiasa dianggo:

  • sadaya - Sadaya pesen
  • téks — Talatah téks
  • paréntah - Paréntah, i.e. pesen nu dimimitian ku /
  • reply - Talatah nu balesan ka pesen sejen
  • audio - Talatah anu ngandung file audio
  • dokumen - Pesen sareng dokumen anu dikirim
  • poto - Pesen sareng gambar anu dikirim
  • stiker - Pesen sareng stiker anu dikirim
  • video - Talatah jeung video
  • sora - Talatah sora
  • kontak - Pesen anu ngandung eusi telegram pangguna
  • lokasi - Pesen sareng geolokasi
  • tempat - pesen diteruskeun
  • kaulinan - Kaulinan

Upami anjeun hoyong ngagabungkeun sababaraha saringan dina hiji pawang ngan ukur nganggo tanda | - salaku logis OR, jeung tanda & sakumaha logis И. Contona, upami anjeun hoyong bot nyauran metodeu anu sami nalika nampi pidéo, gambar atanapi dokumen, paké conto di handap ieu pikeun ngadamel panangan pesen:

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

Nambahkeun Paréntah jeung Parameter

Kami parantos terang naon paréntahna, kumaha cara nyiptakeunana, sareng kumaha carana maksa bot pikeun ngalaksanakeun paréntah anu dipikahoyong. Tapi dina sababaraha kasus, salian nami paréntah, urang kedah ngalebetkeun sababaraha data pikeun ngalaksanakeunana.

Di handap ieu conto bot anu, dibéré tanggal jeung nagara tinangtu, mulih Anjeun tipe poé ti kalénder produksi.

Bot di handap ngagunakeun API kalénder produksi isdayoff.ru.

Kode 3: Bot anu ngalaporkeun dumasar tanggal sareng nagara

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

Jalankeun conto kode di luhur, saatos ngagentos 'TOKEN BOT ANDA' sareng token nyata anu anjeun tampi nalika nyiptakeun bot via BotBapa (Kuring ngobrol ngeunaan nyieun bot di artikel munggaran).

Kami nyiptakeun bot anu ngan ukur gaduh hiji metode dina arsenal na check_date, Metoda ieu disebut ku paréntah tina nami nu sami.

Tapi, sajaba nami paréntah, metoda ieu merlukeun anjeun ngasupkeun dua parameter, kode nagara jeung tanggal. Salajengna, bot mariksa naha dinten anu tangtu di nagara anu ditangtukeun nyaéta sabtu minggu, dinten anu disingkat, atanapi dinten damel dumasar kana kalénder produksi resmi.

Supados metodeu anu urang ciptakeun nampi parameter tambahan sareng paréntahna, paké argumen pass_args = TRUE dina fungsi CommandHandler(), sarta nalika nyieun métode, sajaba argumen diperlukeun bot, update nyieun hiji pilihan - args. Métode anu diciptakeun ku cara ieu bakal nampi parameter anu anjeun paskeun ka bot saatos nami paréntah. Parameter kudu dipisahkeun ku spasi; aranjeunna bakal dikirim ka métode salaku véktor téks.

Hayu urang ngajalankeun sarta nguji bot urang.

Nulis bot telegram dina basa Sunda (bagian 2): Nambahan pangrojong paréntah sareng saringan pesen ka bot

Jalankeun bot di latar tukang

Léngkah terakhir anu urang kedah réngsé nyaéta ngaluncurkeun bot di latar tukang.

Jang ngalampahkeun ieu, turutan algoritma di handap ieu:

  1. Simpen kodeu bot kana file sareng ekstensi R. Nalika damel di RStudio, ieu dilakukeun ngaliwatan ménu file, tim Simpen Salaku ....
  2. Tambahkeun jalur ka folder bin, anu dina gilirannana ayana dina folder nu Anjeun masang basa Sunda, kana variabel Path, parentah di dieu.
  3. Jieun file téks biasa nu nulis 1 baris: R CMD BATCH C:UsersAlseyDocumentsmy_bot.RKawasna dina lamunan. Tibatan C:UsersAlseyDocumentsmy_bot.R nyerat jalur ka skrip bot anjeun. Dina waktu nu sarua, hal anu penting nu aya euweuh karakter Cyrillic atawa spasi sapanjang jalan, sabab ieu tiasa nyababkeun masalah nalika ngajalankeun bot. Simpen eta, sarta ngaganti extension na kalawan txt dina lalay.
  4. Buka Windows Task Scheduler, aya sababaraha cara pikeun ngalakukeun ieu, contona, buka folder naon waé sareng lebetkeun alamatna %windir%system32taskschd.msc /s. Métode peluncuran anu sanés tiasa dipendakan di dieu.
  5. Dina menu katuhu luhur scheduler, klik "Jieun tugas ...".
  6. Dina tab "Umum", masihan tugas anjeun ngaran custom, sarta pindah switch ka "Jalankeun pikeun sakabéh pamaké" kaayaan.
  7. Buka tab "Aksi", klik "Jieun". Dina widang "Program atanapi skrip", klik "Browse", milarian anu didamel dina léngkah kadua lalay file teras klik OK.
  8. Pencét OK sareng, upami diperyogikeun, lebetkeun kecap akses pikeun akun sistem operasi anjeun.
  9. Milarian tugas anu didamel dina jadwal, pilih teras klik tombol "Run" di pojok katuhu handap.

Bot kami dijalankeun di latar tukang sareng bakal tiasa dianggo dugi ka anjeun ngeureunkeun tugas, atanapi mareuman PC atanapi server anjeun dimana éta diluncurkeun.

kacindekan

Dina tulisan ieu, urang terang kumaha cara nyerat bot lengkep anu henteu ngan ukur tiasa ngirim pesen, tapi ogé ngabales pesen sareng paréntah anu asup. Pangetahuan anu dicandak parantos cekap pikeun ngabéréskeun seueur masalah anjeun.

Artikel salajengna bakal ngobrol ngeunaan kumaha carana nambahkeun keyboard kana bot pikeun digawé leuwih merenah.

Langganan abdi telegram и youtube saluran.

sumber: www.habr.com

Tambahkeun komentar