Telegram bot írása R-ben (2. rész): Parancstámogatás és üzenetszűrők hozzáadása a bothoz

В korábbi kiadvány kitaláltuk, hogyan hozhatunk létre egy botot, inicializáltuk az osztály példányát Bot és megismerkedett a segítségével az üzenetküldés módszereivel.

Ebben a cikkben ezt a témát folytatom, ezért azt javaslom, hogy csak olvasás után kezdje el ezt a cikket az első rész.

Ezúttal kitaláljuk, hogyan lehet újraéleszteni a botunkat, és parancstámogatást adni hozzá, valamint megismerkedni az osztállyal Updater.

A cikk során több egyszerű botot fogunk írni, ez utóbbiak egy adott dátum és országkód alapján határozzák meg, hogy egy nap egy adott országban hétvége vagy munkanap a gyártási naptár szerint. De mint korábban, a cikk célja, hogy megismertesse Önt a csomag felületével telegram.bot hogy megoldja a saját problémáit.

Telegram bot írása R-ben (2. rész): Parancstámogatás és üzenetszűrők hozzáadása a bothoz

Az összes cikk a „Telegram bot írása R-ben” sorozatból

  1. Létrehozunk egy botot, és ezzel üzeneteket küldünk táviratban
  2. Parancstámogatás és üzenetszűrők hozzáadása a bothoz

Tartalom

Ha érdekel az adatelemzés, akkor az én oldalam is érdekelheti távirat и youtube csatornák. A tartalom nagy része az R nyelvnek szól.

  1. Frissítő osztály
  2. Kezelők - kezelők
  3. Adja hozzá az első parancsot a bothoz, a parancskezelőhöz
  4. Szöveges üzenet feldolgozó és szűrők
  5. Parancsok hozzáadása paraméterekkel
  6. Futtassa a robotot a háttérben
  7. Következtetés

Frissítő osztály

Updater egy olyan osztály, amely megkönnyíti a távirat-bot fejlesztését, és a motorháztető alatti osztályt használja Dispetcher. Órafeladat Updater frissítéseket kapni a bottól (az előző cikkben ezt a módszert használtuk erre a célra getUpdates()), és továbbítsa őket ide Dispetcher.

Másrészt Dispetcher tartalmazza az általad létrehozott kezelőket, pl. osztályú objektumok Handler.

Kezelők - kezelők

Olyan kezelőkkel, amelyekhez hozzá kell adni Dispetcher bot reakciói különböző eseményekre. A cikk írásakor a telegram.bot A következő típusú kezelők kerültek hozzáadásra:

  • MessageHandler — Üzenetkezelő
  • CommandHandler — Parancskezelő
  • CallbackQueryHandler – Adatkezelő az Inline-ről küldött billentyűzetekhez
  • ErrorHandler – Hibakezelő frissítések kérésekor a bottól

Adja hozzá az első parancsot a bothoz, a parancskezelőhöz

Ha még soha nem használt botokat, és nem tudja, mi az a parancs, akkor a parancsokat a botnak perjellel kell elküldeni / előtagként.

Egyszerű parancsokkal kezdjük, pl. tanítsuk meg a botunkat parancsra köszönni /hi.

1. kód: Megtanítjuk a botot köszönni

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

Futtassa a fenti kódpéldát, miután lecserélte a „YOUR BOT TOKEN” szót arra a valódi tokenre, amelyet a bot létrehozásakor kapott BotFather (A bot létrehozásáról beszéltem első cikk).

módszer start_polling() класса Updater, amelyet a kód végén használunk, elindítja a frissítések kérésének és feldolgozásának végtelen ciklusát a bottól.

Most nyissuk meg a Telegramot, és írjuk be az első parancsot a robotunkba /hi.

Telegram bot írása R-ben (2. rész): Parancstámogatás és üzenetszűrők hozzáadása a bothoz

Most a robotunk megérti a parancsot /hi, és tudja, hogyan üdvözöljön minket.

Sematikusan egy ilyen egyszerű bot felépítésének folyamata a következőképpen ábrázolható.

Telegram bot írása R-ben (2. rész): Parancstámogatás és üzenetszűrők hozzáadása a bothoz

  1. Hozzon létre egy példányt az osztályból Updater;
  2. Módszereket hozunk létre, pl. funkciókat, amelyeket a robotunk fog végrehajtani. A kódpéldában ez egy függvény say_hello(). A bot-módszerként használt függvényeknek két kötelező argumentummal kell rendelkezniük - pofa и frissítés, és egy nem kötelező - érvel. Érv pofa, ez az Ön botja, segítségével válaszolhat üzenetekre, üzeneteket küldhet, vagy bármilyen más, a bot rendelkezésére álló módszert használhat. Érv frissítés ezt kapta a bot a felhasználótól, sőt, amit az első cikkben kaptunk a módszerrel getUpdates(). Érv érvel lehetővé teszi a felhasználó által a paranccsal együtt küldött további adatok feldolgozását, erre a témára kicsit később visszatérünk;
  3. Handlereket hozunk létre, pl. Néhány felhasználói műveletet társítunk az előző lépésben létrehozott metódusokhoz. Lényegében a kezelő egy trigger, egy esemény, amely meghív valamilyen bot függvényt. Példánkban egy ilyen trigger parancsot küld /hi, és a csapat valósítja meg hi_hendler <- CommandHandler('hi', say_hello). Első függvény argumentum CommandHandler() esetünkben lehetővé teszi egy parancs megadását hi, amire a bot válaszol. A második argumentum lehetővé teszi a bot metódus megadását, ezt hívjuk meg say_hello, amely akkor kerül végrehajtásra, ha a felhasználó meghívta az első argumentumban megadott parancsot;
  4. Ezután hozzáadjuk a létrehozott kezelőt az osztálypéldányunk diszpécseréhez Updater. Kezelőket többféleképpen is hozzáadhat, a fenti példában a legegyszerűbbet használtam, a jel használatával +, azaz updater <- updater + hi_hendler. Ugyanez megtehető a módszerrel add_handler()osztályba tartozó Dispatcher, ezt a módszert így találhatja meg: updater$dispatcher$add_handler();
  5. Indítsa el a botot a paranccsal start_polling().

Szöveges üzenet feldolgozó és szűrők

Kitaláltuk, hogyan kell parancsokat küldeni a botnak, de néha szükségünk van arra, hogy a bot ne csak a parancsokra válaszoljon, hanem néhány szokásos szöveges üzenetre is. Ehhez üzenetkezelőket kell használnia − Message Handler.

Normál Message Handler abszolút minden bejövő üzenetre válaszol. Ezért az üzenetkezelőket gyakran szűrőkkel együtt használják. Tanítsuk meg a botot, hogy ne csak parancsra köszönjön /hi, hanem amikor a következő szavak valamelyike ​​megjelenik a botnak küldött üzenetben: hello, hello, salute, hai, bonjour.

Egyelőre nem írunk új módszereket, mert... Már van egy módszerünk, amellyel a bot köszön nekünk. Nincs más dolgunk, mint létrehozni a szükséges szűrőt és üzenetkezelőt.

2. kód: Szöveges üzenetkezelő és szűrő hozzáadása

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

Futtassa a fenti kódpéldát, miután lecserélte a „YOUR BOT TOKEN” szót arra a valódi tokenre, amelyet a bot létrehozásakor kapott BotFather (A bot létrehozásáról beszéltem első cikk).

Most próbáljunk meg több üzenetet küldeni a botnak, amelyek a korábban felsorolt ​​üdvözlő szavakat tartalmazzák:
Telegram bot írása R-ben (2. rész): Parancstámogatás és üzenetszűrők hozzáadása a bothoz

Tehát először is megtanítottuk a botot nem csak köszönni, hanem válaszolni egy üdvözlésre. Ezt az érv segítségével tettük válasz_üzenetazonosítóra, amely a módszerben elérhető sendMessage(), amelybe át kell vinnie annak az üzenetnek az azonosítóját, amelyre válaszolni szeretne. Az üzenet azonosítóját így kaphatja meg: update$message$message_id.

De a legfontosabb dolog, amit tettünk, az volt, hogy a funkció segítségével szűrőt adtunk a bothoz BaseFilter():

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

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

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

)

Amint azt már észrevette, szűrőket kell hozzáadni az objektumhoz Üzenetszűrők, amely kezdetben már tartalmaz egy kis kész szűrőkészletet. Példánkban az objektumra Üzenetszűrők hozzáadtunk egy elemet hi, ez egy új szűrő.

Funkcióban BaseFilter() át kell mennie a szűrő funkción. Lényegében a szűrő csak egy függvény, amely fogad egy üzenetpéldányt, és visszatér TRUE vagy HAMIS. Példánkban egy egyszerű függvényt írtunk, amely az alapfüggvény használatával grepl() ellenőrzi az üzenet szövegét, és azt, hogy az megegyezik-e a reguláris kifejezéssel привет|здравствуй|салют|хай|бонжур visszatér TRUE.

Ezután létrehozunk egy üzenetkezelőt hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi). Első függvény argumentum MessageHandler() az a metódus, amely meghívja a kezelőt, a második argumentum pedig a szűrő, amellyel meghívásra kerül. A mi esetünkben ez az általunk készített szűrő MessageFilters$hi.

Nos, a végén hozzáadjuk a diszpécserhez a létrehozott kezelőt hi_txt_hnd.

updater <- updater + 
             hi_hendler +
             hi_txt_hnd

Ahogy fentebb írtam, a csomagban telegram.bot és tárgyat Üzenetszűrők Már létezik egy sor beépített szűrő, amelyet használhat:

  • mind — Minden üzenet
  • szöveg — Szöveges üzenetek
  • parancs – Parancsok, i.e. -vel kezdődő üzenetek /
  • válasz — olyan üzenetek, amelyek válasz egy másik üzenetre
  • audio — Hangfájlt tartalmazó üzenetek
  • dokumentum — Üzenetek egy elküldött dokumentummal
  • fotó - Üzenetek elküldött képekkel
  • matrica — Elküldött matricával ellátott üzenetek
  • videó — Üzenetek videóval
  • hang – Hangüzenetek
  • kapcsolattartó — A felhasználó távirattartalmát tartalmazó üzenetek
  • hely — Üzenetek földrajzi helymeghatározással
  • helyszín — Továbbított üzenetek
  • játék — Játékok

Ha egyes szűrőket egy kezelőben szeretne kombinálni, csak használja a jelet | - mint logikai ИЛИ, és aláírja & mint logikus И. Ha például azt szeretné, hogy a bot ugyanazt a metódust hívja meg, amikor videót, képet vagy dokumentumot fogad, használja a következő példát üzenetkezelő létrehozásához:

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

Parancsok hozzáadása paraméterekkel

Már tudjuk, mik azok a parancsok, hogyan hozhatjuk létre őket, és hogyan kényszeríthetjük a botot a kívánt parancs végrehajtására. De bizonyos esetekben a parancsnév mellett néhány adatot is át kell adnunk a végrehajtáshoz.

Az alábbiakban egy példa látható egy robotra, amely adott dátumtól és országtól függően visszaadja a nap típusát a gyártási naptárból.

Az alábbi robot az éles naptár API-t használja isdayoff.ru.

3. kód: Bot, amely dátum és ország szerint jelent

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

Futtassa a fenti kódpéldát, miután lecserélte a „YOUR BOT TOKEN” szót arra a valódi tokenre, amelyet a bot létrehozásakor kapott BotFather (A bot létrehozásáról beszéltem első cikk).

Létrehoztunk egy botot, amelynek csak egy módszere van az arzenáljában check_date, ezt a metódust az azonos nevű parancs hívja meg.

Ehhez a módszerhez azonban a parancsnéven kívül két paramétert is meg kell adni, az országkódot és a dátumot. Ezután a bot ellenőrzi, hogy a megadott országban egy adott nap hétvége, rövidített nap vagy munkanap a hivatalos gyártási naptár szerint.

Ahhoz, hogy az általunk létrehozott metódus a paranccsal együtt további paramétereket is elfogadjon, használja az argumentumot pass_args = TRUE funkcióban CommandHandler(), és metódus létrehozásakor a szükséges argumentumok mellett pofa, frissítés hozzon létre egy opcionálisat - érvel. Az így létrehozott metódus elfogadja azokat a paramétereket, amelyeket a parancs neve után átad a botnak. A paramétereket szóközzel kell elválasztani, ezek szövegvektorként kerülnek a metódusba.

Indítsuk el és teszteljük a robotunkat.

Telegram bot írása R-ben (2. rész): Parancstámogatás és üzenetszűrők hozzáadása a bothoz

Futtassa a robotot a háttérben

Az utolsó lépés, amit el kell végeznünk, hogy elindítsuk a botot a háttérben.

Ehhez kövesse az alábbi algoritmust:

  1. Mentse el a bot kódját egy R kiterjesztésű fájlba. Ha az RStudióban dolgozik, ez a menün keresztül történik filé, csapat Mentés másként….
  2. Adja hozzá a bin mappa elérési útját, amely viszont abban a mappában található, amelybe az R nyelvet telepítette, a Path változóhoz, utasítások itt.
  3. Hozzon létre egy normál szövegfájlt, amelybe írjon 1 sort: R CMD BATCH C:UsersAlseyDocumentsmy_bot.R... Ahelyett C:UsersAlseyDocumentsmy_bot.R írja meg a bot szkriptjének elérési útját. Ugyanakkor fontos, hogy ne legyenek cirill karakterek vagy szóközök az úton, mert ez problémákat okozhat a bot futtatásakor. Mentse el, és cserélje ki a kiterjesztését erre txt on bat.
  4. Nyissa meg a Windows Feladatütemezőt, ennek számos módja van, például nyissa meg bármelyik mappát, és írja be a címet %windir%system32taskschd.msc /s. Más indítási módszerek is megtalálhatók itt.
  5. Az ütemező jobb felső menüjében kattintson a "Feladat létrehozása..." elemre.
  6. Az „Általános” lapon adjon egyéni nevet a feladatnak, és állítsa a kapcsolót „Futtatás minden felhasználó számára” állapotba.
  7. Lépjen a "Műveletek" fülre, kattintson a "Létrehozás" gombra. A "Program vagy script" mezőben kattintson a "Tallózás" gombra, és keresse meg a második lépésben létrehozottat bat fájlt, és kattintson az OK gombra.
  8. Kattintson az OK gombra, és ha szükséges, írja be az operációs rendszer fiókjához tartozó jelszót.
  9. Keresse meg a létrehozott feladatot az ütemezőben, jelölje ki, és kattintson a jobb alsó sarokban található „Futtatás” gombra.

A robotunk a háttérben fut, és addig működik, amíg le nem állítja a feladatot, vagy ki nem kapcsolja azt a számítógépet vagy szervert, amelyen elindította.

Következtetés

Ebben a cikkben kitaláltuk, hogyan írjunk egy teljes értékű botot, amely nem csak üzeneteket tud küldeni, hanem válaszol a bejövő üzenetekre és parancsokra is. A megszerzett tudás már elegendő a legtöbb problémája megoldásához.

A következő cikk arról fog szólni, hogyan lehet billentyűzetet hozzáadni a bothoz a kényelmesebb munka érdekében.

Iratkozz fel az enyémre távirat и youtube csatornák.

Forrás: will.com

Hozzászólás