A 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, .
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.

Minden cikk a "Telegram bot írása R nyelven" sorozatból
Tartalom
Ha érdeklik az adatelemzés, talán érdekesek lesznek a és csatornák. A tartalom nagyobb része R nyelvvel foglalkozik.
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 ).
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.

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.

- Létrehozzuk az osztály példányát
Updater; - 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 agetUpdates(). 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; - 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 aCommandHandler()funkciónál lehetővé teszi a parancs megadását, a mi esetünkbenhi, 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 asay_hello, amely akkor fut le, ha a felhasználó aktiválta az első paraméterben megadott parancsot; - 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+, azazupdater <- updater + hi_hendler. Ugyanezt meg lehet tenni aadd_handler(), amely aDispatcherosztályhoz tartozik, ezt a metódust így találhatjuk meg:updater$dispatcher$add_handler(); - 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 ).
Most próbáljunk meg néhány olyan üzenetet küldeni a botnak, amelyekben szerepelnek a korábban említett üdvözlő szavak:

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_hndAhogy 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 .
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 ).
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.

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:
- Mentse a bot kódját egy R kiterjesztésű fájlba. Az RStudio-ban ezt a menüben Fájl, a Save As….
- paranccsal végezheti el. .
- 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. - í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 . - . További indítási módokat találsz.
- A Feladatütemező jobb felső sarkában kattints a "Feladat létrehozása..." gombra.
- 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
- fájlt, és kattints az OK gombra.
- 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 és csatornáimra.
Forrás: habr.com
