R-da telegramma botini yozish (2-qism): Botga buyruqlarni qo'llab-quvvatlash va xabar filtrlarini qo'shish

В oldingi nashr biz botni qanday yaratishni aniqladik, sinfning namunasini ishga tushirdik Bot va undan foydalanib xabar yuborish usullari bilan tanishdi.

Ushbu maqolada men ushbu mavzuni davom ettiraman, shuning uchun men ushbu maqolani o'qib chiqqandan keyingina o'qishni boshlashni maslahat beraman birinchi qism.

Bu safar biz botimizni qanday jonlantirish va unga buyruqlar yordamini qo'shishni aniqlaymiz, shuningdek sinf bilan tanishamiz. Updater.

Maqola davomida biz bir nechta oddiy botlarni yozamiz, ikkinchisi ma'lum bir sana va mamlakat kodi asosida ishlab chiqarish taqvimiga ko'ra ma'lum bir mamlakatda bir kun dam olish kuni yoki ish kuni ekanligini aniqlaydi. Ammo, avvalgidek, maqolaning maqsadi sizni paket interfeysi bilan tanishtirishdir telegram.bot o'z muammolaringizni hal qilish uchun.

R-da telegramma botini yozish (2-qism): Botga buyruqlarni qo'llab-quvvatlash va xabar filtrlarini qo'shish

“Telegram botini R-da yozish” turkumidagi barcha maqolalar

  1. Biz bot yaratamiz va undan telegramda xabar yuborish uchun foydalanamiz
  2. Botga buyruqlarni qo'llab-quvvatlash va xabar filtrlarini qo'shing

Mundarija

Agar siz ma'lumotlarni tahlil qilish bilan qiziqsangiz, meni qiziqtirishi mumkin telegramma и youtube kanallar. Kontentning katta qismi R tiliga bag'ishlangan.

  1. Yangilash sinfi
  2. Ishlovchilar - ishlov beruvchilar
  3. Birinchi buyruqni botga, buyruq ishlovchisiga qo'shing
  4. Matnli xabarlar protsessori va filtrlari
  5. Parametrlar bilan buyruqlar qo'shish
  6. Botni fonda ishga tushiring
  7. xulosa

Yangilash sinfi

Updater bu sizga telegram botini ishlab chiqishni osonlashtiradigan sinfdir va kaput ostidagi sinfdan foydalanadi Dispetcher. Sinfga topshiriq Updater botdan yangilanishlarni olishdir (oldingi maqolada biz shu maqsadda usuldan foydalanganmiz getUpdates()) va ularni boshqa joyga o'tkazing Dispetcher.

O'z navbatida Dispetcher siz yaratgan ishlov beruvchilarni o'z ichiga oladi, ya'ni. sinf ob'ektlari Handler.

Ishlovchilar - ishlov beruvchilar

Siz qo'shadigan ishlov beruvchilar bilan Dispetcher turli hodisalarga bot reaktsiyalari. Ushbu maqolani yozish paytida telegram.bot Quyidagi turdagi ishlov beruvchilar qo'shildi:

  • MessageHandler - Xabarlarni qayta ishlovchi
  • CommandHandler - Buyruqlarni ishlovchi
  • CallbackQueryHandler - Inline-dan yuborilgan klaviaturalar uchun ma'lumotlarni qayta ishlovchi
  • ErrorHandler - Botdan yangilanishlarni so'rashda xato ishlov beruvchisi

Birinchi buyruqni botga, buyruq ishlovchisiga qo'shing

Agar siz ilgari hech qachon botlardan foydalanmagan bo'lsangiz va buyruq nima ekanligini bilmasangiz, u holda botga buyruqlar qiyshiq chiziq yordamida yuborilishi kerak. / prefiks sifatida.

Biz oddiy buyruqlar bilan boshlaymiz, ya'ni. keling, botimizga buyruq bo'yicha salom aytishni o'rgatamiz /hi.

Kod 1: Botga salom aytishga o'rgatish

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

Yuqoridagi kod misolini ishga tushiring, "BOT TOKEN" ni bot yaratishda olgan haqiqiy token bilan almashtirgandan so'ng. BotOta (Men bot yaratish haqida gapirdim birinchi maqola).

usul start_polling() daraja Updater, kodning oxirida foydalaniladi, botdan yangilanishlarni so'rash va qayta ishlashning cheksiz tsiklini boshlaydi.

Endi Telegramni ochamiz va botimizga birinchi buyruqni yozamiz /hi.

R-da telegramma botini yozish (2-qism): Botga buyruqlarni qo'llab-quvvatlash va xabar filtrlarini qo'shish

Endi bizning botimiz buyruqni tushunadi /hi, va bizni qanday kutib olishni biladi.

Sxematik jihatdan bunday oddiy botni qurish jarayonini quyidagicha tasvirlash mumkin.

R-da telegramma botini yozish (2-qism): Botga buyruqlarni qo'llab-quvvatlash va xabar filtrlarini qo'shish

  1. Sinfning namunasini yarating Updater;
  2. Biz usullarni yaratamiz, ya'ni. botimiz bajaradigan funktsiyalar. Kod misolida bu funksiya say_hello(). Bot usullari sifatida foydalanadigan funktsiyalar ikkita talab qilinadigan argumentga ega bo'lishi kerak - bot и yangilash, va bitta ixtiyoriy - args. Dalil bot, bu sizning botingiz, uning yordamida siz xabarlarga javob berishingiz, xabarlar yuborishingiz yoki botda mavjud bo'lgan boshqa usullardan foydalanishingiz mumkin. Dalil yangilash bu bot foydalanuvchidan olgan narsa, aslida biz birinchi maqolada usul yordamida olgan narsamiz getUpdates(). Dalil args foydalanuvchi tomonidan yuborilgan qo'shimcha ma'lumotlarni buyruq bilan birga qayta ishlashga imkon beradi, biz ushbu mavzuga birozdan keyin qaytamiz;
  3. Biz ishlov beruvchilarni yaratamiz, ya'ni. Biz ba'zi foydalanuvchi harakatlarini oldingi bosqichda yaratilgan usullar bilan bog'laymiz. Aslini olganda, ishlov beruvchi bu bot funksiyasini chaqiruvchi tetik, hodisadir. Bizning misolimizda bunday trigger buyruq yuboradi /hi, va jamoa tomonidan amalga oshiriladi hi_hendler <- CommandHandler('hi', say_hello). Birinchi funktsiya argumenti CommandHandler() buyruqni ko'rsatishga imkon beradi, bizning holatlarimizda hi, bunga bot javob beradi. Ikkinchi argument bot usulini ko'rsatishga imkon beradi, biz usulni chaqiramiz say_hello, agar foydalanuvchi birinchi argumentda ko'rsatilgan buyruqni chaqirgan bo'lsa, bajariladi;
  4. Keyinchalik, biz yaratilgan ishlov beruvchini sinf misolimizning dispetcheriga qo'shamiz Updater. Ishlovchilarni bir necha usul bilan qo'shishingiz mumkin; yuqoridagi misolda men eng oddiy belgidan foydalanganman +ya'ni, updater <- updater + hi_hendler. Xuddi shu usul yordamida amalga oshirilishi mumkin add_handler(), sinfga tegishli Dispatcher, bu usulni quyidagicha topishingiz mumkin: updater$dispatcher$add_handler();
  5. Buyruq yordamida botni ishga tushiring start_polling().

Matnli xabarlar protsessori va filtrlari

Biz botga buyruqlarni qanday yuborishni aniqladik, lekin ba'zida bizga bot nafaqat buyruqlarga, balki ba'zi oddiy matnli xabarlarga ham javob berish uchun kerak bo'ladi. Buni amalga oshirish uchun siz xabarlarni qayta ishlash vositalaridan foydalanishingiz kerak - MessageHandler.

oddiy MessageHandler mutlaqo barcha kiruvchi xabarlarga javob beradi. Shuning uchun xabarlarni ishlov beruvchilar ko'pincha filtrlar bilan birga ishlatiladi. Keling, botga faqat buyruq bo'yicha emas, balki salom aytishni o'rgataylik /hi, balki botga yuborilgan xabarda quyidagi so'zlardan biri paydo bo'lganda ham: salom, salom, salom, hai, bonjour.

Hozircha biz yangi usullarni yozmaymiz, chunki... Bizda allaqachon bot bilan salomlashadigan usul mavjud. Biz qilishimiz kerak bo'lgan yagona narsa - kerakli filtr va xabar ishlov beruvchisini yaratish.

2-kod: matnli xabarlarni qayta ishlash va filtr qo'shing

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

Yuqoridagi kod misolini ishga tushiring, "BOT TOKEN" ni bot yaratishda olgan haqiqiy token bilan almashtirgandan so'ng. BotOta (Men bot yaratish haqida gapirdim birinchi maqola).

Keling, botga avval sanab o'tilgan tabrik so'zlarini o'z ichiga olgan bir nechta xabarlarni yuborishga harakat qilaylik:
R-da telegramma botini yozish (2-qism): Botga buyruqlarni qo'llab-quvvatlash va xabar filtrlarini qo'shish

Shunday qilib, birinchi navbatda, biz botni shunchaki salomlashishni emas, balki salomlashishga javob berishni o'rgatganmiz. Biz buni argument yordamida qildik javob_xabar_identifikatori, bu usulda mavjud sendMessage(), unga javob bermoqchi bo'lgan xabarning identifikatorini o'tkazishingiz kerak. Siz xabar identifikatorini quyidagicha olishingiz mumkin: update$message$message_id.

Lekin biz qilgan asosiy narsa funksiyadan foydalangan holda botga filtr qo'shish edi BaseFilter():

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

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

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

)

Siz sezganingizdek, ob'ektga filtrlar qo'shilishi kerak Xabar filtrlari, dastlab allaqachon tayyor filtrlarning kichik to'plamini o'z ichiga oladi. Bizning misolimizda, ob'ektga Xabar filtrlari element qo'shdik hi, bu yangi filtr.

Funktsiyada BaseFilter() filtr funksiyasidan o'tishingiz kerak. Aslini olganda, filtr bu faqat xabar namunasini oladigan va qaytaradigan funksiyadir HAQ yoki FALSE. Bizning misolimizda biz asosiy funktsiyadan foydalangan holda oddiy funktsiyani yozdik grepl() xabar matnini va u muntazam ifodaga mos kelishini tekshiradi привет|здравствуй|салют|хай|бонжур qaytadi HAQ.

Keyin biz xabarni qayta ishlovchi yaratamiz hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi). Birinchi funktsiya argumenti MessageHandler() ishlov beruvchini chaqiradigan usul, ikkinchi argument esa u chaqiriladigan filtrdir. Bizning holatda, bu biz yaratgan filtrdir MessageFilters$hi.

Va nihoyat, biz dispetcherga yaratilgan ishlov beruvchini qo'shamiz hi_txt_hnd.

updater <- updater + 
             hi_hendler +
             hi_txt_hnd

Yuqorida yozganimdek, paketda telegram.bot va ob'ekt Xabar filtrlari Siz foydalanishingiz mumkin bo'lgan o'rnatilgan filtrlar to'plami allaqachon mavjud:

  • hammasi — Barcha xabarlar
  • matn — Matnli xabarlar
  • buyruq - Buyruqlar, ya'ni. bilan boshlanadigan xabarlar /
  • javob berish — Boshqa xabarga javob bo'lgan xabarlar
  • audio — Audio faylni o'z ichiga olgan xabarlar
  • hujjat — Yuborilgan hujjat bilan xabarlar
  • foto - Yuborilgan rasmlari bo'lgan xabarlar
  • stiker — Yuborilgan stikerli xabarlar
  • video — Videoli xabarlar
  • ovozli - Ovozli xabarlar
  • kontakt — Foydalanuvchining telegram mazmunini o'z ichiga olgan xabarlar
  • joy — Geolokatsiyaga ega xabarlar
  • joy — Yoʻnaltirilgan xabarlar
  • o'yin - O'yinlar

Agar ba'zi filtrlarni bitta ishlov beruvchida birlashtirmoqchi bo'lsangiz, shunchaki belgidan foydalaning | - mantiqiy sifatida YoKI, va imzolang & mantiqiy kabi И. Misol uchun, agar siz bot video, rasm yoki hujjatni qabul qilganda xuddi shu usulni chaqirishini istasangiz, xabar ishlov beruvchisini yaratish uchun quyidagi misoldan foydalaning:

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

Parametrlar bilan buyruqlar qo'shish

Biz allaqachon buyruqlar nima ekanligini, ularni qanday yaratishni va botni kerakli buyruqni bajarishga majburlashni bilamiz. Ammo ba'zi hollarda, buyruq nomidan tashqari, biz uni bajarish uchun ba'zi ma'lumotlarni uzatishimiz kerak.

Quyida ma'lum sana va mamlakatni hisobga olgan holda ishlab chiqarish taqvimidan kun turini qaytaradigan bot misoli keltirilgan.

Quyidagi bot ishlab chiqarish kalendar API dan foydalanadi isdayoff.ru.

Kod 3: Sana va mamlakat bo'yicha hisobot beruvchi bot

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

Yuqoridagi kod misolini ishga tushiring, "BOT TOKEN" ni bot yaratishda olgan haqiqiy token bilan almashtirgandan so'ng. BotOta (Men bot yaratish haqida gapirdim birinchi maqola).

Biz arsenalida faqat bitta usulga ega bo'lgan bot yaratdik check_date, bu usul bir xil nomdagi buyruq bilan chaqiriladi.

Ammo, buyruq nomiga qo'shimcha ravishda, bu usul sizdan ikkita parametrni, mamlakat kodi va sanani kiritishingizni talab qiladi. Keyinchalik, bot belgilangan mamlakatdagi ma'lum kunning rasmiy ishlab chiqarish kalendariga ko'ra dam olish kuni, qisqartirilgan kun yoki ish kuni ekanligini tekshiradi.

Biz yaratgan usul buyruq bilan birga qo'shimcha parametrlarni qabul qilishi uchun argumentdan foydalaning pass_args = TRUE funktsiyada CommandHandler(), va usulni yaratishda, kerakli argumentlardan tashqari bot, yangilash ixtiyoriy yaratish - args. Shu tarzda yaratilgan usul buyruq nomidan keyin botga o'tadigan parametrlarni qabul qiladi. Parametrlar bo'sh joy bilan ajratilishi kerak, ular matn vektori sifatida usulga yuboriladi.

Keling, botimizni ishga tushiramiz va sinab ko'ramiz.

R-da telegramma botini yozish (2-qism): Botga buyruqlarni qo'llab-quvvatlash va xabar filtrlarini qo'shish

Botni fonda ishga tushiring

Biz bajarishimiz kerak bo'lgan oxirgi qadam botni fonda ishga tushirishdir.

Buning uchun quyida tavsiflangan algoritmga amal qiling:

  1. Bot kodini R kengaytmali faylga saqlang. RStudio da ishlaganda bu menyu orqali amalga oshiriladi. Fayl, jamoa Saqlash ....
  2. Path o'zgaruvchisiga, ko'rsatmalarga R tilini o'rnatgan papkada joylashgan bin papkasiga yo'lni qo'shing. shu yerda.
  3. Oddiy matn faylini yarating, unda 1 qator yoziladi: R CMD BATCH C:UsersAlseyDocumentsmy_bot.R... Buning o'rniga C:UsersAlseyDocumentsmy_bot.R bot skriptingizga yo'lni yozing. Shu bilan birga, yo'lda hech qanday kirill harflari yoki bo'shliqlar bo'lmasligi muhim, chunki bu botni ishga tushirishda muammolarga olib kelishi mumkin. Uni saqlang va kengaytmasini bilan almashtiring txt haqida ko'rshapalak.
  4. Windows Task Scheduler-ni oching, buni amalga oshirishning ko'plab usullari mavjud, masalan, istalgan papkani oching va manzilni kiriting %windir%system32taskschd.msc /s. Boshqa ishga tushirish usullarini topish mumkin shu yerda.
  5. Rejalashtiruvchining yuqori o'ng menyusida "Vazifa yaratish ..." tugmasini bosing.
  6. "Umumiy" yorlig'ida vazifangizga maxsus nom bering va kalitni "Barcha foydalanuvchilar uchun ishga tushirish" holatiga o'tkazing.
  7. "Amallar" yorlig'iga o'ting, "Yaratish" tugmasini bosing. "Dastur yoki skript" maydonida "Browse" tugmasini bosing, ikkinchi bosqichda yaratilganini toping ko'rshapalak fayl va OK tugmasini bosing.
  8. OK tugmasini bosing va agar kerak bo'lsa, operatsion tizim hisob qaydnomangiz uchun parolni kiriting.
  9. Yaratilgan vazifani rejalashtiruvchida toping, uni tanlang va pastki o'ng burchakdagi "Ishga tushirish" tugmasini bosing.

Bizning botimiz fonda ishlaydi va siz vazifani to'xtatmaguningizcha yoki u ishga tushirilgan shaxsiy kompyuteringizni yoki serveringizni o'chirguningizcha ishlaydi.

xulosa

Ushbu maqolada biz nafaqat xabarlarni jo'natibgina qolmay, balki kiruvchi xabarlar va buyruqlarga javob bera oladigan to'liq huquqli botni qanday yozishni aniqladik. Olingan bilimlar ko'p muammolaringizni hal qilish uchun etarli.

Keyingi maqolada qulayroq ishlash uchun botga klaviatura qanday qo'shilishi haqida so'z boradi.

Mening obuna bo'ling telegramma и youtube kanallar.

Manba: www.habr.com

a Izoh qo'shish