Telegram bot írása R nyelven (2. rész): Parancsok és üzenetszűrők támogatása a botba.

A korábbi publikációmnak Megértettük, hogyan készíthetünk botot, inicializáltuk az osztály példányát. Bot és megismertük a üzenetküldési módszereket vele.

Ebben a cikkben folytatom ezt a témát, így ezt a cikket ajánlom csak annak elolvasása után, első részben.

Ezúttal azt fogjuk megérteni, hogyan élesztjük fel a botunkat, és támogatást adunk neki parancsokhoz, valamint megismerkedünk az Updater.

Cikk során több egyszerű botot írunk, az utolsó a megadott dátum és az országkód alapján meg fogja határozni, hogy az adott országban munkaszüneti nap-e vagy munkanap a munkaügyi naptár szerint. De, mint korábban, a cikk célja az interface bemutatása. telegram.bot saját feladataid megoldásához.

Telegram bot írása R nyelven (2. rész): Parancsok és üzenetszűrők támogatása a botba.

Minden cikk a "Telegram bot írása R nyelven" sorozatból

  1. Bot létrehozása és üzenetek küldése a telegramon keresztül
  2. Bot parancsok támogatásának és üzenetszűrők hozzáadása

Tartalom

Ha érdeklik az adatelemzés, talán érdekesek lesznek a telegram és youtube csatornák. A tartalom nagyobb része R nyelvvel foglalkozik.

  1. Az Updater osztály
  2. Handlers - kezelők
  3. Hozzáadjuk az első parancsot a botnak, a parancskezelőt.
  4. Üzenetkezelő és szűrők
  5. Parancsok paraméterekkel való hozzáadásának folyamata
  6. A botot háttérben indítjuk el.
  7. Zárás

Az Updater osztály

Updater Ez az osztály megkönnyíti Önnek a Telegram bot fejlesztését, és a háttérben az alábbi osztályt használja. DispetcherAz osztály célja Updater az, hogy frissítéseket kapjon a bottól (az előző cikkben ezt a célra használtuk a getUpdates()), és továbbítsa azokat Dispetcher.

Másrészt Dispetcher tartalmazza az Ön által létrehozott kezelőket, azaz az Kezelő.

Handlers - kezelők

osztály objektumait. Dispetcher A kezelők segítségével hozzáadja a bot telegram.bot válaszait különböző eseményekre. A cikk írásának időpontjában a

  • következő típusú kezelők lettek hozzáadva:
  • MessageHandler - üzenetkezelő
  • CommandHandler - parancskezelő
  • CallbackQueryHandler - az Inline billentyűzetekből küldött adatok kezelője

Hozzáadjuk az első parancsot a botnak, a parancskezelőt.

ErrorHandler - hiba kezelő a bottól érkező frissítések kérésénél. / Ha korábban soha nem használt botokat, és nem tudja, mi az a parancs, akkor a parancsokat a botnak közvetlen perjellel kell elküldeni,

mint előtag. /hi.

Kód 1: Megtanítjuk a botot üdvözölni.

library(telegram.bot)

# Létrehozzuk az Updater osztály egy példányát
updater <- Updater('A BOTTOK KULCSA')

# Írjuk meg a köszöntő metódust
say_hello <- function(bot, update) {

  # Az a felhasználónév, akivel üdvözölni kell
  user_name <- update$message$from$first_name

  # Üdvözlő üzenet küldése
  bot$sendMessage(update$message$chat_id, 
                  text = paste0("Tiszteletem, ", user_name, "!"), 
                  parse_mode = "Markdown")

}

# Létrehozzuk a kezelőt
hi_hendler <- CommandHandler('hi', say_hello)

# Hozzáadjuk a kezelőt a diszpécserhez
updater <- updater + hi_hendler

# Elindítjuk a botot
updater$start_polling()

Futtassa a fenti kód példát úgy, hogy a 'BOTTOKEN' helyére a valós tokent írja, amit a bot létrehozásakor kapott a BotFather (a bot létrehozásáról már beszéltem a első cikkünkben).

Módszer start_polling() kapcsolat és csatornák Updater, amely a kód végén található, egy végtelen ciklust indít el, amely kérdéseket és a bot frissítéseit dolgozza fel.

Most nyissuk meg a Telegramot, és küldjük el az első parancsunkat a botunknak. /hi.

Telegram bot írása R nyelven (2. rész): Parancsok és üzenetszűrők támogatása a botba.

Most a botunk megérti a parancsot /hi, és tud köszönteni minket.

Sémásan a legegyszerűbb bot építési folyamatot így ábrázolhatjuk.

Telegram bot írása R nyelven (2. rész): Parancsok és üzenetszűrők támogatása a botba.

  1. Létrehozzuk az osztály példányát Updater;
  2. Létrehozzuk a metódusokat, azaz azokat a funkciókat, amelyeket a botunk végrehajt. A példakódban ez a funkció say_hello(). Azok a funkciók, amelyeket bot metódusaként fogunk használni, két kötelező paraméterrel kell rendelkezzenek — bot és update, és egy opcionálissal — args. Az argumentum bot, ez a te botod, amellyel válaszolhatsz az üzenetekre, üzeneteket küldhetsz, vagy bármely más elérhető metódust használhatsz. A paraméter update azt jelenti, amit a bot a felhasználótól kapott, lényegében azt, amit az első cikkben a getUpdates(). Az argumentum args metódussal szereztünk meg, lehetővé teszi, hogy a felhasználó által a parancs mellett elküldött extra adatokat feldolgozzuk; ehhez a témához még visszatérünk egy kicsit később;
  3. Létrehozunk kezelőket, azaz összekötjük a felhasználó bizonyos cselekedeteit a korábban létrehozott metódusokkal. A lényegében a kezelő egy trigger, egy esemény, amely egy funkciót hív meg a botban. A mi példánkban a trigger a parancs küldése /hi, amelyet a parancs segítségével valósítunk meg. hi_hendler <- CommandHandler('hi', say_hello). Az első paraméter a CommandHandler() funkciónál lehetővé teszi a parancs megadását, a mi esetünkben hi, amelyre a bot reagálni fog. A második paraméter lehetővé teszi, hogy megadj egy bot metódust, amelyet hívni fogunk; végrehajtjuk a say_hello, amely akkor fut le, ha a felhasználó aktiválta az első paraméterben megadott parancsot;
  4. Ezután hozzáadjuk a létrehozott kezelőt az osztályunk diszpécseréhez. Updater. A kezelőket többféleképpen lehet hozzáadni, a fenti példában a legegyszerűbb módszert használtam, a jel segítségével +, azaz updater <- updater + hi_hendler. Ugyanezt meg lehet tenni a add_handler(), amely a Dispatcherosztályhoz tartozik, ezt a metódust így találhatjuk meg: updater$dispatcher$add_handler();
  5. A botot a start_polling().

Üzenetkezelő és szűrők

Bot parancsok küldésével már tisztában vagyunk, de néha szükségünk van arra, hogy a bot ne csak a parancsokra reagáljon, hanem a sima, szöveges üzenetekre is. Ehhez üzenetkezelőket kell használnunk — MessageHandler.

Normál MessageHandler a bejövő üzenetekre minden esetben reagálni fog. Ezért gyakran az üzenetkezelőket szűrőkkel együtt használják. Tanítsuk meg a botot üdvözölni nemcsak parancsra, /hihanem mindig, amikor az üzenetben az alábbi szavak bármelyike szerepel: helló, üdvözlet, szia, hi, bonjour.

Egyelőre nem fogunk új metódusokat írni, mivel már van egy metódusunk, amellyel a bot üdvözöl minket. Csak a szükséges szűrőt és üzenetkezelőt kell létrehoznunk.

Kód 2: Üzenetek és szűrők kezelőinek hozzáadása

library(telegram.bot)

# Létrehozzuk az Updater osztály példányát
updater <- Updater('A BOT TOKENED')

# Írjunk metódust az üdvözléshez
## üdvözlés parancs
say_hello <- function(bot, update) {

  # A felhasználó neve, akivel üdvözöljük
  user_name <- update$message$from$first_name

  # Küldjük az üdvözlő üzenetet
  bot$sendMessage(update$message$chat_id, 
                  text = paste0("Üdvözletem, ", user_name, "!"),
                  parse_mode = "Markdown",
                  reply_to_message_id = update$message$message_id)

}

# Létrehozunk szűrőket
MessageFilters$hi <- BaseFilter(function(message) {

  # Ellenőrizzük, hogy a szövegben található-e a következő szavak: helló, üdvözlet, szia, hi, bonjour
  grepl(x           = message$text, 
        pattern     = 'helló|üdvözlet|szia|hi|bonjour',
        ignore.case = TRUE)
  }
)

# Létrehozunk kezelőt 
hi_hendler <- CommandHandler('hi', say_hello) # hi parancs kezelő
hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi)

# Hozzáadjuk a kezelőket a diszpécserhez
updater <- updater + 
             hi_hendler +
             hi_txt_hnd

# Elindítjuk a botot
updater$start_polling()

Futtassa a fenti kód példát úgy, hogy a 'BOTTOKEN' helyére a valós tokent írja, amit a bot létrehozásakor kapott a BotFather (a bot létrehozásáról már beszéltem a első cikkünkben).

Most próbáljunk meg néhány olyan üzenetet küldeni a botnak, amelyekben szerepelnek a korábban említett üdvözlő szavak:
Telegram bot írása R nyelven (2. rész): Parancsok és üzenetszűrők támogatása a botba.

Tehát, először is megtanítottuk a botot, hogy ne csak üdvözöljön, hanem reagáljon az üdvözlésre. Ezt a reply_to_message_idargumentum segítségével tettük elérhetővé a metódusban sendMessage(), amelybe át kell adni a választandó üzenet azonosítóját. Az üzenet azonosítóját így lehet lekérdezni: update$message$message_id.

De a legfontosabb, amit tettünk – a botnak szűrőt adtunk a BaseFilter():

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

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

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

)

Mint észrevehettétek, a szűrőket egy olyan objektumba kell beilleszteni, MessageFilters, amelynek már eleve van egy kis kész szűrőkészlete. Példánkban az objektumhoz MessageFilters hozzáadtuk az elemet hi, ez egy új szűrő.

A függvénybe BaseFilter() Meg kell adnia a szűrő funkciót. Lényegében a szűrő – ez egyszerűen egy olyan funkció, amely megkapja az üzenet példányát, és visszaadja IGAZ vagy HAMIS. Pélánkban egy egyszerű funkciót írtunk, amely a grepl() alapfunkciót használja az üzenet szövegének ellenőrzésére, és ha az megfelel a reguláris kifejezésnek, helló|üdvözlet|szia|hallo|bonjour a pénzeszközöket! Még dicséretet is kap 75-90% -tól a résztvevők közül, bár a projekt fejlődése nyilvánvalóan lelassult. A legmeglepőbb, hogy mindenki IGAZ.

Ezután üzenetkezelőt hozunk létre hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi). Az első paraméter a MessageHandler() – egy módszer, amely meg fogja hívni a kezelőt, második argumentumként pedig a szűrő, amely alapján hívódik. Esetünkben ez a általunk létrehozott szűrő, MessageFilters$hi.

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

updater <- updater + 
             hi_hendler +
             hi_txt_hnd

Ahogy korábban már írtam, a csomagban telegram.bot és az objektumban MessageFilters már van egy kész beépített szűrőkészlet, amelyet használhat:

  • all — Minden üzenet
  • text — Szöveges üzenetek
  • command — Parancsok, azaz üzenetek, amelyek valamilyen figyelemfelkeltő jellel kezdődnek /
  • reply — Olyan üzenetek, amelyek egy másik üzenetre válaszként érkeznek
  • audio — Olyan üzenetek, amelyek audio fájlt tartalmaznak
  • document — Olyan üzenetek, amelyek dokumentumot küldenek
  • photo — Olyan üzenetek, amelyek képeket küldenek
  • sticker — Olyan üzenetek, amelyek matricát küldenek
  • video — Olyan üzenetek, amelyek videót küldenek
  • voice — Hangüzenetek
  • contact — Olyan üzenetek, amelyek telefontartalommal rendelkeznek
  • location — Olyan üzenetek, amelyek földrajzi helyet tartalmaznak
  • venue — Átirányított üzenetek
  • game — Játékok

Ha szeretné kombinálni néhány szűrőt egy kezelőben, egyszerűen használja a jelet | — logikai jelként VAGY, és a jelet & — logikai jelként. ésPéldául, ha szeretné, hogy a bot ugyanazt a módszert hívja, amikor videót, képet vagy dokumentumot kap, használja az alábbi üzenetkezelő létrehozási példát:

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

Parancsok paraméterekkel való hozzáadásának folyamata

Már tudjuk, hogy mik a parancsok, hogyan lehet őket létrehozni és hogyan tudjuk rávenni a botot, hogy végrehajtsa a kívánt parancsot. De bizonyos esetekben a parancs neve mellett szükség lehet néhány adat átadására is annak végrehajtásához.

Az alábbi példa egy botra, amely egy adott dátum és ország alapján visszaadja a munkanaptípust a gyártási naptárból.

Az alább látható bot a gyártási naptár API-ját használja isdayoff.ru.

Kód 3: Bot, amely információt ad a dátum és az ország alapján

library(telegram.bot)

# Az Updater osztály példányosítása
updater <- Updater('1165649194:AAFkDqIzQ6Wq5GV0YU7PmEZcv1gmWIFIB_8')

# Üdvözlő metódus írása
## üdvözlő parancs
check_date <- function(bot, update, args) {

  # Bejövő adatok
  day <- args[1]  # dátum
  country <- args[2]  # ország

  # Beírt paraméterek ellenőrzése
  if ( !grepl('\d{4}-\d{2}-\d{2}', day) ) {

    # Egyedi billentyűzet küldése
    bot$sendMessage(update$message$chat_id, 
                    text = paste0(day, " - hibás dátum, kérjük, adja meg a dátumot a GGGG-HH-DD formátumban"),
                    parse_mode = "Markdown")

  } else {
    day <- as.Date(day)
    # POSIXtl formátumra alakítás
    y <- format(day, "%Y")
    m <- format(day, "%m")
    d <- format(day, "%d")

  }

  # Ország az ellenőrzéshez
  ## Az ország megadása
  ## Ha nincs megadva, beállítjuk ru-ra
  if ( ! country %in% c('ru', 'ua', 'by', 'kz', 'us') ) {

    # Egyedi billentyűzet küldése
    bot$sendMessage(update$message$chat_id, 
                    text = paste0(country, " - hibás országkód, lehetséges értékek: ru, by, kz, ua, us. Kérjük, adja meg az orosz adatokhoz.").
                    parse_mode = "Markdown")

    country <- 'ru'

  }

  # API-ból történő adatigénylés
  # HTTP kérés összeállítása
  url <- paste0("https://isdayoff.ru/api/getdata?",
                "year=",  y, "&",
                "month=", m, "&",
                "day=",   d, "&",
                "cc=",    country, "&",
                "pre=1&",
                "covid=1")

  # Válasz megszerzése
  res <- readLines(url)

  # Válasz értelmezése
  out <- switch(res, 
                "0"   = "Munkaidő",
                "1"   = "Nem munkaidő",
                "2"   = "Rövidített munkanap",
                "4"   = "covid-19",
                "100" = "Hiba a dátumban",
                "101" = "Adatok nem találhatók",
                "199" = "Szolgáltatási hiba")

  # Üzenet küldése
  bot$sendMessage(update$message$chat_id, 
                  text = paste0(day, " - ", out),
                  parse_mode = "Markdown")

}

# Kezelő létrehozása
date_hendler <- CommandHandler('check_date', check_date, pass_args = TRUE)

# Kezelő hozzáadása a dispatcherhez
updater <- updater + date_hendler

# Bot elindítása
updater$start_polling()

Futtassa a fenti kód példát úgy, hogy a 'BOTTOKEN' helyére a valós tokent írja, amit a bot létrehozásakor kapott a BotFather (a bot létrehozásáról már beszéltem a első cikkünkben).

Létrehoztunk egy botot, amelynek csak egy metódusa van check_date, ez a metódus az azonos nevű parancsot hívja meg.

A csapat neve mellett ez a módszer két paraméter megadását is várja tőled: az ország kódját és a dátumot. A bot ezután ellenőrzi, hogy a megadott nap az adott országban ünnepnap, rövidített vagy munkanap-e a hivatalos munkanaptár szerint.

Ahhoz, hogy a létrehozott módszer további paramétereket fogadjon el a parancs mellett, használd az pass_args = TRUE a funkcióban CommandHandler(), és amikor a módszert létrehozod, az kötelező argumentumok mellett bot, update hozz létre egy választható paramétert — args. Az így létrehozott módszer fogadni fogja azokat a paramétereket, amelyeket a botnak a parancs neve után adsz meg. A paramétereket szóközökkel kell elválasztani, a módszer szöveges vektor formájában fogja őket megkapni.

Indítsuk el, és teszteljük a botunkat.

Telegram bot írása R nyelven (2. rész): Parancsok és üzenetszűrők támogatása a botba.

A botot háttérben indítjuk el.

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

Ehhez kövesd az alább ismertetett algoritmust:

  1. Mentse a bot kódját egy R kiterjesztésű fájlba. Az RStudio-ban ezt a menüben Fájl, a Save As….
  2. paranccsal végezheti el. itt.
  3. Add meg a bin mappa elérési útját, amely a R nyelvet telepítő mappában található, az útmutató szerint. Hozz létre egy sima szöveges fájlt, amelyben egy sort írj be:. A helyére R CMD BATCH C:UsersAlseyDocumentsmy_bot.R C:UsersAlseyDocumentsmy_bot.R txt Gyorsan emlékezzünk vissza, hogyan működik a moduláris aritmetika. Az óra már egy ismert koncepció. Az órák használata bat.
  4. írd be a botod szkriptjének elérési útját. Fontos, hogy az útvonalban ne legyen cirill írás és szóköz, mert ez problémát okozhat a bot indításakor. Mentsd el, és cseréld ki a kiterjesztést Nyisd meg a Windows Feladatütemezőt, számos módon megteheted, például nyisd meg bármelyik mappát, és a címsorba írd be%windir%system32taskschd.msc /s itt.
  5. . További indítási módokat találsz.
  6. A Feladatütemező jobb felső sarkában kattints a "Feladat létrehozása..." gombra.
  7. A "Általános" fülön adj meg egy tetszőleges nevet a feladatodnak, és állítsd a kapcsolót az "Összes felhasználó számára végrehajtható" állapotba. bat Lépj a "Műveletek" fülre, kattints a "Létrehozás" gombra. A "Program vagy parancs" mezőnél kattints a "Böngészés" gombra, keresd meg a második lépésben létrehozott
  8. fájlt, és kattints az OK gombra.
  9. Kattints az OK gombra, szükség esetén írd be a rendszerfiókod jelszavát. Keresd meg a Feladatütemezőben a létrehozott feladatot, jelöld ki, és az alsó jobb sarokban kattints a "Futtatás" gombra.

A botunk háttérben fut, és működni fog, пока вы не остановите задачу или не выключите ваш ПК или сервер, на котором он запущен.

Zárás

Ebben a cikkben megvizsgáltuk, hogyan lehet egy teljes értékű botot írni, amely nemcsak képes üzeneteket küldeni, hanem reagál az bejövő üzenetekre és parancsokra is. Az eddigi tudás már elegendő a legtöbb feladat megoldásához.

A következő cikkben arról lesz szó, hogyan adhatunk a botnak billentyűzetet a kényelmesebb használat érdekében.

Iratkozz fel az én telegram és youtube csatornáimra.

Forrás: habr.com

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster