Telegram bot bat idaztea R-n (2. zatia): komandoen laguntza eta mezu-iragazkiak gehitzea bot-ari

В aurreko argitalpena bot bat nola sortu asmatu genuen, klasearen instantzia bat hasieratu genuen Bot eta berau erabiliz mezuak bidaltzeko metodoak ezagutu zituen.

Artikulu honetan gai honekin jarraitzen dut, beraz, artikulu hau irakurri ondoren bakarrik hastea gomendatzen dut Lehenengo zatia.

Oraingoan gure bot-a nola berpiztu eta komandoen euskarria nola gehitu asmatuko dugu, eta klasearekin ere ezagutuko dugu. Updater.

Artikuluan zehar, hainbat bot sinple idatziko ditugu, azken honek, data eta herrialde-kode jakin batean oinarrituta, herrialde jakin bateko egun bat asteburua edo laneguna den zehaztuko du ekoizpen-egutegiaren arabera. Baina, lehen bezala, artikuluaren helburua paketeen interfazea ezagutzea da telegram.bot zure arazoak konpontzeko.

Telegram bot bat idaztea R-n (2. zatia): komandoen laguntza eta mezu-iragazkiak gehitzea bot-ari

"Telegram bot bat R-n idazten" serieko artikulu guztiak

  1. Bot bat sortzen dugu eta telegram-en mezuak bidaltzeko erabiltzen dugu
  2. Gehitu komando-laguntza eta mezu-iragazkiak bot-ari

Edukia

Datuen analisia interesatzen bazaizu, baliteke nirea interesatzea telegrama и youtube kanalak. Eduki gehienak R hizkuntzari eskainitakoak dira.

  1. Eguneratzeko klasea
  2. Kudeatzaileak - kudeatzaileak
  3. Gehitu lehen komandoa bot-ari, komando-kudeatzailea
  4. Testu-mezuen prozesadorea eta iragazkiak
  5. Parametroekin komandoak gehitzea
  6. Exekutatu bot-a atzeko planoan
  7. Ondorioa

Eguneratzeko klasea

Updater telegram bot bat garatzea errazten dizun klase bat da, eta klasea kaputxa azpian erabiltzen du Dispetcher. Klaseko lana Updater bot-aren eguneraketak jasotzea da (aurreko artikuluan metodoa erabili genuen horretarako getUpdates()), eta aurrerago eraman Dispetcher.

Bere txanda Dispetcher zuk sortu dituzun kudeatzaileak ditu, hau da. klaseko objektuak Handler.

Kudeatzaileak - kudeatzaileak

Gehitzen dituzun kudeatzaileekin Dispetcher hainbat gertaeraren aurrean bot erreakzioak. Artikulu hau idazteko unean telegram.bot Kudeatzaile mota hauek gehitu dira:

  • MessageHandler — Mezuen kudeatzailea
  • CommandHandler — Agindu-kudeatzailea
  • CallbackQueryHandler — Inline-tik bidalitako teklatuen datu-kudeatzailea
  • ErrorHandler — Errore-kudeatzailea bot-aren eguneraketak eskatzean

Gehitu lehen komandoa bot-ari, komando-kudeatzailea

Inoiz bot-ak erabili ez badituzu eta komando bat zer den ez badakizu, orduan bot-ari komandoak barra-barra erabiliz bidali behar dira. / aurrizki gisa.

Agindu sinpleekin hasiko gara, hau da. irakatsi diezaiogun gure bot-ari aginduz kaixo esaten /hi.

1. kodea: bot-ari kaixo esaten irakastea

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

Exekutatu goiko kodearen adibidea, "ZURE BOT TOKENA" bot-a sortzean jasotako benetako tokenarekin ordezkatu ondoren. BotAita (Bot bat sortzeaz hitz egin nuen lehen artikulua).

Метод start_polling() class Updater, kodearen amaieran erabiltzen dena, bot-tik eguneraketak eskatzeko eta prozesatzeko amaigabeko begizta bat hasten du.

Orain ireki diezaiogun Telegram eta idatzi lehen komandoa gure bot-ari /hi.

Telegram bot bat idaztea R-n (2. zatia): komandoen laguntza eta mezu-iragazkiak gehitzea bot-ari

Orain gure bot-ak komandoa ulertzen du /hi, eta badaki gu agurtzen.

Eskematikoki, honela irudikatu daiteke bot sinple bat eraikitzeko prozesua.

Telegram bot bat idaztea R-n (2. zatia): komandoen laguntza eta mezu-iragazkiak gehitzea bot-ari

  1. Sortu klasearen instantzia bat Updater;
  2. Metodoak sortzen ditugu, hau da. gure bot-ak beteko dituen funtzioak. Kode adibidean hau funtzio bat da say_hello(). Bot metodo gisa erabiliko dituzun funtzioek beharrezko bi argumentu izan behar dituzte - Zuzenean и eguneratzea, eta bat aukerakoa - args. Argudioa Zuzenean, hau da zure bot-a, bere laguntzarekin mezuei erantzun, mezuak bidali edo bot-aren eskura dauden beste edozein metodo erabil ditzakezu. Argudioa eguneratzea hau da bot-ak erabiltzailearengandik jasotakoa, hain zuzen ere, metodoa erabiliz lehen artikuluan jaso genuena getUpdates(). Argudioa args komandoarekin batera erabiltzaileak bidalitako datu gehigarriak prozesatzeko aukera ematen du, geroago itzuliko gara gai honetara;
  3. Kudeatzaileak sortzen ditugu, hau da. Erabiltzaileen ekintza batzuk aurreko urratsean sortutako metodoekin lotzen ditugu. Funtsean, kudeatzailea abiarazlea da, bot funtzioren bat deitzen duen gertaera bat. Gure adibidean, abiarazle bat komando bat bidaltzea da /hi, eta taldeak ezartzen du hi_hendler <- CommandHandler('hi', say_hello). Lehen funtzioaren argumentua CommandHandler() komando bat zehazteko aukera ematen du, gure kasuan hi, eta horri bot-ak erantzungo dio. Bigarren argumentuak bot metodoa zehazteko aukera ematen du, metodoari deituko diogu say_hello, erabiltzaileak lehen argumentuan zehaztutako komandoari deituz gero exekutatuko dena;
  4. Ondoren, sortutako kudeatzailea gehitzen dugu gure klase-instantziaren bidaltzaileari Updater. Kudeatzaileak hainbat modutara gehi ditzakezu; goiko adibidean, sinpleena erabili dut, zeinua erabiliz +, hau da. updater <- updater + hi_hendler. Gauza bera egin daiteke metodoa erabiliz add_handler(), klasekoa dena Dispatcher, metodo hau honela aurki dezakezu: updater$dispatcher$add_handler();
  5. Abiarazi bot-a komandoa erabiliz start_polling().

Testu-mezuen prozesadorea eta iragazkiak

Botera komandoak nola bidali asmatu genuen, baina batzuetan bot-ak aginduei ez ezik, ohiko testu-mezu batzuei ere erantzun behar diegu. Horretarako mezu-kudeatzaileak erabili behar dituzu − Mezuen kudeatzailea.

arrunt Mezuen kudeatzailea sarrerako mezu guztiei erantzungo die. Hori dela eta, mezu-kudeatzaileak iragazkiekin batera erabiltzen dira askotan. Irakats diezaiogun bot-ari agurtzen ez bakarrik aginduz /hi, baina baita bot-ari bidalitako mezuan hitz hauetako bat agertzen den bakoitzean ere: kaixo, kaixo, agur, hai, bonjour.

Oraingoz ez dugu metodo berririk idatziko, zeren... Dagoeneko badugu bot-ak agurtzen gaituen metodo bat. Behar dugun iragazkia eta mezuen kudeatzailea sortzea besterik ez dugu egin behar.

2. kodea: Gehitu testu-mezuen kudeatzailea eta iragazkia

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

Exekutatu goiko kodearen adibidea, "ZURE BOT TOKENA" bot-a sortzean jasotako benetako tokenarekin ordezkatu ondoren. BotAita (Bot bat sortzeaz hitz egin nuen lehen artikulua).

Orain saia gaitezen bot-ari lehen zerrendatutako agur hitzak dituzten hainbat mezu bidaltzen:
Telegram bot bat idaztea R-n (2. zatia): komandoen laguntza eta mezu-iragazkiak gehitzea bot-ari

Beraz, lehenik eta behin, bot-ari kaixo esaten ez ezik, agur bati erantzuten irakatsi genion. Hau argumentua erabiliz egin dugu erantzun_mezuaren_id, metodoan eskuragarri dagoena sendMessage(), zeinetara erantzun nahi duzun mezuaren id-a transferitu behar duzu. Honela lor dezakezu mezuaren IDa: update$message$message_id.

Baina egin genuen gauza nagusia bot-ari iragazki bat gehitzea izan zen funtzioa erabiliz BaseFilter():

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

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

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

)

Konturatuko zinen bezala, iragazkiak gehitu behar zaizkio objektuari Mezu-iragazkiak, hasieran dagoeneko prest egindako iragazki multzo txiki bat dauka. Gure adibidean, objektuari Mezu-iragazkiak elementu bat gehitu dugu hi, hau iragazki berria da.

Funtzionatzeko BaseFilter() iragazki funtzioa gainditu behar duzu. Funtsean, iragazkia mezu-instantzia bat jaso eta itzultzen duen funtzio bat besterik ez da TRUE edo FALSE. Gure adibidean, funtzio sinple bat idatzi dugu, oinarrizko funtzioa erabiliz grepl() mezuaren testua egiaztatzen du eta adierazpen erregulararekin bat datorren привет|здравствуй|салют|хай|бонжур itzultzen TRUE.

Ondoren, mezuen kudeatzailea sortuko dugu hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi). Lehen funtzioaren argumentua MessageHandler() kudeatzaileari deituko dion metodoa da, eta bigarren argumentua deituko zaion iragazkia da. Gure kasuan, hau da sortu dugun iragazkia MessageFilters$hi.

Tira, azkenean, bidaltzaileari sortutako kudeatzailea gehitzen diogu hi_txt_hnd.

updater <- updater + 
             hi_hendler +
             hi_txt_hnd

Goian idatzi dudan bezala, paketean telegram.bot eta objektua Mezu-iragazkiak Dagoeneko erabil ditzakezun iragazki integratuak daude:

  • guztiak — Mezu guztiak
  • testua — Testu mezuak
  • komandoa — Aginduak, hau da. hasten diren mezuak /
  • erantzun — Beste mezu baten erantzuna diren mezuak
  • audio — Audio fitxategi bat duten mezuak
  • dokumentua — Bidalitako dokumentu batekin mezuak
  • argazkia - Bidalitako irudiekin mezuak
  • eranskailua — Bidalitako eranskailua duten mezuak
  • bideoa — Mezuak bideoarekin
  • ahotsa - Ahots mezuak
  • kontaktua — Erabiltzailearen telegramen edukia duten mezuak
  • kokapena — Geokokapena duten mezuak
  • lekua — Birbidalitako mezuak
  • jokoa — Jokoak

Filtro batzuk kudeatzaile batean konbinatu nahi badituzu, erabili zeinua | - logiko gisa OR, eta sinatu & logikoa denez И. Adibidez, bot-ak bideo, irudi edo dokumentu bat jasotzen duenean metodo bera deitzea nahi baduzu, erabili adibide hau mezu-kudeatzailea sortzeko:

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

Parametroekin komandoak gehitzea

Dagoeneko badakigu zer diren komandoak, nola sortu eta nola behartu bot-a nahi den komandoa exekutatzeko. Baina kasu batzuetan, komandoaren izenaz gain, datu batzuk pasa behar ditugu exekutatzeko.

Jarraian, data eta herrialde jakin bat emanda, produkzio-egutegiko egun mota itzultzen dizun bot baten adibidea dago.

Beheko bot-ak produkzio-egutegiaren APIa erabiltzen du isdayoff.ru.

3. kodea: dataren eta herrialdearen arabera berri ematen duen 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()

Exekutatu goiko kodearen adibidea, "ZURE BOT TOKENA" bot-a sortzean jasotako benetako tokenarekin ordezkatu ondoren. BotAita (Bot bat sortzeaz hitz egin nuen lehen artikulua).

Bere armategian metodo bakarra duen bot bat sortu dugu check_date, metodo hau izen bereko komandoak deitzen du.

Baina, komandoaren izenaz gain, metodo honek bi parametro sartzea eskatzen du, herrialdearen kodea eta data. Ondoren, bot-ak egiaztatzen du zehaztutako herrialdeko egun bat asteburu bat, egun laburtua edo laneguna den produkzio-egutegi ofizialaren arabera.

Sortzen dugun metodoak komandoarekin batera parametro gehigarriak onar ditzan, erabili argumentua pass_args = TRUE funtzioan CommandHandler(), eta metodo bat sortzean, eskatutako argumentuez gain Zuzenean, eguneratzea sortu hautazko bat - args. Modu honetan sortutako metodoak komandoaren izenaren ondoren bot-ari pasatzen dizkiozun parametroak onartuko ditu. Parametroak zuriune batez bereizi behar dira; metodora bidaliko dira testu-bektore gisa.

Abiarazi eta proba dezagun gure bot.

Telegram bot bat idaztea R-n (2. zatia): komandoen laguntza eta mezu-iragazkiak gehitzea bot-ari

Exekutatu bot-a atzeko planoan

Egin behar dugun azken urratsa bot-a atzeko planoan abiarazteko da.

Horretarako, jarraitu behean deskribatzen den algoritmoa:

  1. Gorde bot kodea R luzapena duen fitxategi batean. RStudio-n lan egiten duzunean, menuaren bidez egiten da File, taldea Gorde ....
  2. Gehitu bidea bin karpetara, hau da, R hizkuntza instalatu duzun karpetan dagoena, Path aldagaira, argibideak. Hemen.
  3. Sortu testu-fitxategi arrunt bat eta bertan lerro bat idatzi: R CMD BATCH C:UsersAlseyDocumentsmy_bot.R... Ordez C: ErabiltzaileakAlseyDocumentsmy_bot.R idatzi zure bot scriptaren bidea. Aldi berean, garrantzitsua da bidean karaktere zirilikorik edo tarterik ez egotea, zeren honek arazoak sor ditzake bot-a exekutatzen denean. Gorde ezazu eta ordeztu bere luzapena txt on bat.
  4. Ireki Windows Task Scheduler, hau egiteko modu asko daude, adibidez, ireki edozein karpeta eta sartu helbidea %windir%system32taskschd.msc /s. Beste abiarazte metodo batzuk aurki daitezke Hemen.
  5. Antolatzailearen goiko eskuineko menuan, egin klik "Sortu zeregina...".
  6. "Orokorra" fitxan, eman zure zereginari izen pertsonalizatu bat eta aldatu etengailua "Exekutatu erabiltzaile guztientzat" egoerara.
  7. Joan "Ekintzak" fitxara, egin klik "Sortu". "Programa edo script" eremuan, egin klik "Arakatu", bilatu bigarren urratsean sortutakoa bat fitxategia eta sakatu Ados.
  8. Sakatu Ados eta, behar izanez gero, sartu zure sistema eragilearen kontuaren pasahitza.
  9. Aurkitu sortutako zeregina programatzailean, hautatu eta egin klik beheko eskuineko izkinan dagoen "Exekutatu" botoian.

Gure bot-a atzeko planoan exekutatzen da eta funtzionatuko du zeregina gelditu arte edo abiarazi den ordenagailua edo zerbitzaria itzali arte.

Ondorioa

Artikulu honetan, mezuak bidaltzeaz gain, sarrerako mezuei eta komandoei erantzuteko moduko bot osoa nola idatzi asmatu dugu. Lortutako ezagutza nahikoa da dagoeneko zure arazo gehienak konpontzeko.

Hurrengo artikuluan teklatu bat bot-ari nola gehitu lan erosoagoa izateko hitz egingo da.

Harpidetu nire telegrama и youtube kanalak.

Iturria: www.habr.com

Gehitu iruzkin berria