Pisanje telegram bota u R (2. dio): Dodavanje podrške za komande i filtera poruka botu

В prethodna publikacija shvatili smo kako da kreiramo bota, inicijalizirali instancu klase Bot i upoznao se sa metodama slanja poruka pomoću njega.

U ovom članku nastavljam ovu temu, pa preporučujem da počnete čitati ovaj članak tek nakon čitanja prvi deo.

Ovaj put ćemo smisliti kako oživjeti našeg bota i dodati mu podršku za komande, a također ćemo se upoznati s klasom Updater.

U toku članka ćemo napisati nekoliko jednostavnih botova, koji će na osnovu datog datuma i koda zemlje odrediti da li je dan u datoj zemlji vikend ili radni dan prema proizvodnom kalendaru. Ali, kao i ranije, svrha članka je da vas upozna sa interfejsom paketa telegram.bot da rešite sopstvene probleme.

Pisanje telegram bota u R (2. dio): Dodavanje podrške za komande i filtera poruka botu

Svi članci iz serije “Pisanje telegram bota u R”

  1. Kreiramo bota i koristimo ga za slanje poruka u telegramu
  2. Dodajte podršku za komande i filtere poruka botu

Sadržaj

Ako ste zainteresovani za analizu podataka, možda će vas zanimati moja telegram и youtube kanala. Većina sadržaja je posvećena R jeziku.

  1. Updater class
  2. Rukovaoci - rukovaoci
  3. Dodajte prvu komandu botu, rukovaocu komandama
  4. Procesor tekstualnih poruka i filteri
  5. Dodavanje naredbi s parametrima
  6. Pokrenite bot u pozadini
  7. zaključak

Updater class

Updater je klasa koja vam olakšava razvoj telegram bota i koristi klasu ispod haube Dispetcher. Zadatak razreda Updater je primanje ažuriranja od bota (u prethodnom članku smo koristili metodu za ovu svrhu getUpdates()), i prenesite ih dalje na Dispetcher.

Zauzvrat Dispetcher sadrži rukovaoce koje ste kreirali, tj. objekti klase Handler.

Rukovaoci - rukovaoci

Sa rukovaocima kojima dodajete Dispetcher reakcije bota na razne događaje. U vrijeme pisanja ovog članka u telegram.bot Dodane su sljedeće vrste rukovalaca:

  • MessageHandler — Rukovalac porukama
  • CommandHandler — Rukovalac komandom
  • CallbackQueryHandler — Rukovalac podacima za tastature poslane sa Inline
  • ErrorHandler — Rukovalac greškama prilikom traženja ažuriranja od bota

Dodajte prvu komandu botu, rukovaocu komandama

Ako nikada ranije niste koristili botove i ne znate što je naredba, tada se naredbe botu moraju slati pomoću kose crte naprijed / kao prefiks.

Počećemo sa jednostavnim komandama, tj. hajde da naučimo našeg bota da kaže zdravo na komandu /hi.

Kod 1: Učiti bota da se pozdravi

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

Pokrenite gornji primjer koda, nakon što zamijenite 'YOUR BOT TOKEN' sa pravim tokenom koji ste dobili prilikom kreiranja bota putem BotFather (Razgovarao sam o stvaranju bota u prvi članak).

Metoda start_polling() razred Updater, koji se koristi na kraju koda, pokreće beskonačnu petlju traženja i obrade ažuriranja od bota.

Sada otvorimo Telegram i napišemo prvu naredbu našem botu /hi.

Pisanje telegram bota u R (2. dio): Dodavanje podrške za komande i filtera poruka botu

Sada naš bot razumije naredbu /hi, i zna kako da nas pozdravi.

Šematski, proces izgradnje tako jednostavnog bota može se prikazati na sljedeći način.

Pisanje telegram bota u R (2. dio): Dodavanje podrške za komande i filtera poruka botu

  1. Kreirajte instancu klase Updater;
  2. Mi kreiramo metode, tj. funkcije koje će naš bot obavljati. U primjeru koda ovo je funkcija say_hello(). Funkcije koje ćete koristiti kao bot metode moraju imati dva potrebna argumenta - Bot и ažuriranje, i jedno opciono - args. Argument Bot, ovo je vaš bot, uz njegovu pomoć možete odgovarati na poruke, slati poruke ili koristiti bilo koje druge metode dostupne botu. Argument ažuriranje to je ono što je bot dobio od korisnika, zapravo, ono što smo dobili u prvom članku koristeći metodu getUpdates(). Argument args omogućava obradu dodatnih podataka koje korisnik šalje zajedno sa naredbom, vratit ćemo se na ovu temu malo kasnije;
  3. Kreiramo rukovatelje, tj. Neke radnje korisnika povezujemo s metodama kreiranim u prethodnom koraku. U suštini, rukovalac je okidač, događaj koji poziva neku funkciju bota. U našem primjeru, takav okidač je slanje naredbe /hi, a implementira ga tim hi_hendler <- CommandHandler('hi', say_hello). Prvi argument funkcije CommandHandler() omogućava vam da specificirate naredbu, u našem slučaju hi, na koje će bot odgovoriti. Drugi argument vam omogućava da navedete bot metodu, mi ćemo pozvati metodu say_hello, koji će se izvršiti ako korisnik pozove naredbu navedenu u prvom argumentu;
  4. Zatim dodajemo kreirani rukovalac dispečeru naše instance klase Updater. Rukovatelje možete dodati na nekoliko načina; u gornjem primjeru koristio sam najjednostavniji, koristeći znak +tj. updater <- updater + hi_hendler. Isto se može učiniti korištenjem metode add_handler(), koji pripada klasi Dispatcher, ovu metodu možete pronaći ovako: updater$dispatcher$add_handler();
  5. Pokrenite bot pomoću naredbe start_polling().

Procesor tekstualnih poruka i filteri

Shvatili smo kako da pošaljemo komande botu, ali ponekad nam je potrebno da bot odgovara ne samo na komande, već i na neke obične tekstualne poruke. Da biste to učinili, trebate koristiti rukovaoce porukama − MessageHandler.

običan MessageHandler će odgovoriti na apsolutno sve dolazne poruke. Stoga se rukovaoci porukama često koriste zajedno sa filterima. Naučimo bota da se pozdravlja ne samo na komandu /hi, ali i kad god se u poruci poslanoj botu pojavi jedna od sljedećih riječi: zdravo, zdravo, salute, hai, bonjour.

Za sada nećemo pisati nove metode, jer... Već imamo metodu kojom nas bot pozdravlja. Sve što treba da uradimo je da kreiramo potreban filter i rukovalac porukama.

Šifra 2: Dodajte rukovalac tekstualnim porukama i filter

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

Pokrenite gornji primjer koda, nakon što zamijenite 'YOUR BOT TOKEN' sa pravim tokenom koji ste dobili prilikom kreiranja bota putem BotFather (Razgovarao sam o stvaranju bota u prvi članak).

Sada pokušajmo poslati botu nekoliko poruka koje sadrže ranije navedene pozdravne riječi:
Pisanje telegram bota u R (2. dio): Dodavanje podrške za komande i filtera poruka botu

Dakle, prije svega, naučili smo bota ne samo da se pozdravi, već i da odgovori na pozdrav. Ovo smo uradili koristeći argument reply_to_message_id, koji je dostupan u metodi sendMessage(), u koju trebate prenijeti id poruke na koju želite odgovoriti. ID poruke možete dobiti ovako: update$message$message_id.

Ali glavna stvar koju smo uradili je dodavanje filtera botu pomoću funkcije BaseFilter():

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

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

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

)

Kao što ste možda primijetili, objektu je potrebno dodati filtere MessageFilters, koji u početku već sadrži mali set gotovih filtera. U našem primjeru, objektu MessageFilters dodali smo element hi, ovo je novi filter.

Da funkcioniše BaseFilter() morate proći funkciju filtera. U suštini, filter je samo funkcija koja prima instancu poruke i vraća ISTINITO ili FALSE. U našem primjeru napisali smo jednostavnu funkciju koja, koristeći osnovnu funkciju grepl() provjerava tekst poruke i da li odgovara regularnom izrazu привет|здравствуй|салют|хай|бонжур vraća ISTINITO.

Zatim kreiramo rukovalac porukama hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi). Prvi argument funkcije MessageHandler() je metoda koja će pozvati rukovalac, a drugi argument je filter pomoću kojeg će biti pozvan. U našem slučaju, ovo je filter koji smo kreirali MessageFilters$hi.

Pa, na kraju, dodamo dispečeru kreirani rukovalac hi_txt_hnd.

updater <- updater + 
             hi_hendler +
             hi_txt_hnd

Kao što sam gore napisao, u paketu telegram.bot i objekt MessageFilters Već postoji skup ugrađenih filtera koje možete koristiti:

  • sve — Sve poruke
  • tekst — Tekstualne poruke
  • komanda — komande, tj. poruke koje počinju sa /
  • odgovor — Poruke koje su odgovor na drugu poruku
  • audio — Poruke koje sadrže audio fajl
  • dokument — Poruke sa poslatim dokumentom
  • photo - Poruke sa poslanim slikama
  • naljepnica — Poruke sa poslatom naljepnicom
  • video — Poruke sa video zapisom
  • glas - Glasovne poruke
  • kontakt — Poruke koje sadrže sadržaj telegrama korisnika
  • lokacija — Poruke sa geolokacijom
  • mjesto — proslijeđene poruke
  • igra — Igre

Ako želite kombinirati neke filtere u jednom rukovaocu, samo koristite znak | - kao logično Or, i potpišite & kao logično И. Na primjer, ako želite da bot pozove istu metodu kada primi video, sliku ili dokument, koristite sljedeći primjer za kreiranje rukovatelja porukama:

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

Dodavanje naredbi s parametrima

Već znamo šta su naredbe, kako ih kreirati i kako natjerati bota da izvrši željenu naredbu. Ali u nekim slučajevima, pored imena komande, moramo proslediti neke podatke da bismo je izvršili.

Ispod je primjer bota koji vam, s obzirom na dati datum i zemlju, vraća tip dana iz proizvodnog kalendara.

Donji bot koristi API kalendara proizvodnje isdayoff.ru.

Kod 3: Bot koji izvještava po datumu i zemlji

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

Pokrenite gornji primjer koda, nakon što zamijenite 'YOUR BOT TOKEN' sa pravim tokenom koji ste dobili prilikom kreiranja bota putem BotFather (Razgovarao sam o stvaranju bota u prvi članak).

Napravili smo bota koji u svom arsenalu ima samo jednu metodu check_date, ovaj metod se poziva naredbom istog imena.

Ali, osim naziva komande, ovaj metod zahtijeva da unesete dva parametra, pozivni broj zemlje i datum. Zatim bot provjerava da li je određeni dan u navedenoj zemlji vikend, skraćeni ili radni dan prema zvaničnom proizvodnom kalendaru.

Da bi metod koji kreiramo prihvatio dodatne parametre zajedno sa naredbom, koristite argument pass_args = TRUE u funkciji CommandHandler(), a prilikom kreiranja metode, pored potrebnih argumenata Bot, ažuriranje kreirajte opcioni - args. Ovako kreirana metoda će prihvatiti parametre koje prosljeđujete botu nakon naziva naredbe. Parametri moraju biti odvojeni razmakom; oni će biti poslani metodi kao vektor teksta.

Pokrenimo i testiramo našeg bota.

Pisanje telegram bota u R (2. dio): Dodavanje podrške za komande i filtera poruka botu

Pokrenite bot u pozadini

Posljednji korak koji trebamo dovršiti je pokretanje bota u pozadini.

Da biste to učinili, slijedite algoritam opisan u nastavku:

  1. Sačuvajte kod bota u datoteku sa ekstenzijom R. Kada radite u RStudiu, to se radi preko menija fajl, tim Sačuvaj kao ....
  2. Dodajte putanju do bin foldera, koji se pak nalazi u folderu u koji ste instalirali R jezik, u varijablu Putanja, upute ovdje.
  3. Kreirajte običnu tekstualnu datoteku u koju upišite 1 red: R CMD BATCH C:UsersAlseyDocumentsmy_bot.R... Umjesto toga C:UsersAlseyDocumentsmy_bot.R napišite putanju do vaše bot skripte. Pri tome je važno da na putu nema ćiriličkih znakova ili razmaka, jer ovo može uzrokovati probleme pri pokretanju bota. Sačuvajte ga i zamijenite njegovu ekstenziju sa TXT na Bat.
  4. Otvorite Windows Task Scheduler, postoji mnogo načina da to učinite, na primjer, otvorite bilo koju mapu i unesite adresu %windir%system32taskschd.msc /s. Mogu se pronaći i druge metode pokretanja ovdje.
  5. U gornjem desnom meniju planera kliknite na "Kreiraj zadatak...".
  6. Na kartici "Općenito" dajte svom zadatku prilagođeno ime i prebacite prekidač u stanje "Pokreni za sve korisnike".
  7. Idite na karticu "Radnje", kliknite na "Kreiraj". U polju "Program ili skripta" kliknite na "Pregledaj", pronađite onaj kreiran u drugom koraku Bat datoteku i kliknite na OK.
  8. Kliknite OK i, ako je potrebno, unesite lozinku za svoj nalog operativnog sistema.
  9. Pronađite kreirani zadatak u planeru, odaberite ga i kliknite na dugme „Pokreni“ u donjem desnom uglu.

Naš bot radi u pozadini i radit će sve dok ne zaustavite zadatak, ili isključite svoj PC ili server na kojem je pokrenut.

zaključak

U ovom članku shvatili smo kako napisati punopravnog bota koji može ne samo slati poruke, već i odgovarati na dolazne poruke i naredbe. Stečeno znanje je već dovoljno za rješavanje većine vaših problema.

Sljedeći članak će govoriti o tome kako dodati tipkovnicu botu za praktičniji rad.

Pretplatite se na moj telegram и youtube kanali.

izvor: www.habr.com

Dodajte komentar