В keksimme kuinka luoda botti, alustimme luokan esiintymän Bot ja tutustui menetelmiin lähettää viestejä sen avulla.
Tässä artikkelissa jatkan tätä aihetta, joten suosittelen aloittamaan tämän artikkelin lukemisen vasta lukemisen jälkeen .
Tällä kertaa selvitetään kuinka elvyttää bottimme ja lisätä siihen komentotuki, sekä tutustutaan luokkaan Updater.
Artikkelin aikana kirjoitamme useita yksinkertaisia botteja, joista jälkimmäinen määrittää tietyn päivämäärän ja maakoodin perusteella, onko päivä tietyssä maassa viikonloppu vai työpäivä tuotantokalenterin mukaan. Mutta kuten ennenkin, artikkelin tarkoituksena on tutustua paketin käyttöliittymään telegram.bot ratkaisemaan omia ongelmiasi.

Kaikki artikkelit sarjasta "Sähköbotin kirjoittaminen R:ssä"
Pitoisuus
Jos olet kiinnostunut data-analyysistä, saatat olla kiinnostunut minun и kanavia. Suurin osa sisällöstä on omistettu R-kielelle.
Päivittäjäluokka
Updater on luokka, joka helpottaa sähkebotin kehittämistä ja käyttää luokkaa konepellin alla Dispetcher. Luokkatehtävä Updater on saada päivityksiä robotilta (edellisessä artikkelissa käytimme menetelmää tähän tarkoitukseen getUpdates()) ja siirrä ne edelleen osoitteeseen Dispetcher.
Vuorostaan Dispetcher sisältää luomasi käsittelijät, ts. luokan esineitä Handler.
Käsittelijät - käsittelijät
Käsittelijillä, joihin lisäät Dispetcher bot-reaktiot erilaisiin tapahtumiin. Tätä artikkelia kirjoitettaessa telegram.bot Seuraavat käsittelijät on lisätty:
- MessageHandler — Viestinkäsittelijä
- CommandHandler — Komentokäsittelijä
- CallbackQueryHandler — Tietojenkäsittelyohjelma Inlinesta lähetetyille näppäimistöille
- ErrorHandler — Virheenkäsittelijä pyydettäessä päivityksiä botilta
Lisää ensimmäinen komento bottiin, komentokäsittelijään
Jos et ole koskaan käyttänyt botteja ennen etkä tiedä mikä komento on, niin komennot botille on lähetettävä vinoviivalla / etuliitteenä.
Aloitamme yksinkertaisilla komennoilla, ts. opetetaan bottimme tervehtimään käskystä /hi.
Koodi 1: Opetetaan botti tervehtimään
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()Suorita yllä oleva koodiesimerkki sen jälkeen, kun olet korvannut 'YOUR BOT TOKEN' oikealla tunnuksella, jonka sait luodessasi bottia BotIsä (Puhuin botin luomisesta ).
menetelmä start_polling() luokka Updater, jota käytetään koodin lopussa, käynnistää loputtoman silmukan päivitysten pyytämistä ja käsittelyä botilta.
Avataan nyt Telegram ja kirjoitetaan ensimmäinen komento bottiin /hi.

Nyt bottimme ymmärtää komennon /hi, ja osaa tervehtiä meitä.
Kaavamaisesti tällaisen yksinkertaisen botin rakennusprosessi voidaan kuvata seuraavasti.

- Luo luokasta esiintymä
Updater; - Luomme menetelmiä, ts. toimintoja, joita bottimme suorittaa. Koodiesimerkissä tämä on funktio
say_hello(). Funktioilla, joita käytät bot-menetelminä, on oltava kaksi vaadittua argumenttia - bot и päivitysja yksi valinnainen - args. Perustelu bot, tämä on sinun bottisi, jonka avulla voit vastata viesteihin, lähettää viestejä tai käyttää muita botin käytettävissä olevia menetelmiä. Perustelu päivitys Tämän botti sai käyttäjältä, itse asiassa sen, mitä saimme ensimmäisessä artikkelissa menetelmällägetUpdates(). Perustelu args antaa sinun käsitellä käyttäjän komennon mukana lähettämiä lisätietoja, palaamme tähän aiheeseen hieman myöhemmin; - Luomme käsittelijöitä, ts. Yhdistämme joitain käyttäjän toimintoja edellisessä vaiheessa luotuihin menetelmiin. Käsittelijä on pohjimmiltaan liipaisin, tapahtuma, joka kutsuu jotain bottitoimintoa. Esimerkissämme tällainen laukaisin on komennon lähettäminen
/hi, ja tiimi toteuttaa senhi_hendler <- CommandHandler('hi', say_hello). Ensimmäinen funktion argumenttiCommandHandler()voit määrittää komennon meidän tapauksessammehi, johon botti vastaa. Toinen argumentti antaa sinun määrittää bot-menetelmän, kutsumme menetelmääsay_hello, joka suoritetaan, jos käyttäjä kutsuu ensimmäisessä argumentissa määritettyä komentoa; - Seuraavaksi lisäämme luodun käsittelijän luokkamme esiintymän lähettäjälle
Updater. Käsittelijöitä voi lisätä monella tapaa, yllä olevassa esimerkissä käytin yksinkertaisinta, merkkiä käyttäen+, ts.updater <- updater + hi_hendler. Sama voidaan tehdä menetelmälläadd_handler(), joka kuuluu luokkaanDispatcher, löydät tämän menetelmän seuraavasti:updater$dispatcher$add_handler(); - Käynnistä botti komennolla
start_polling().
Tekstiviestien prosessori ja suodattimet
Selvitimme kuinka lähettää komentoja bottiin, mutta joskus tarvitsemme botin vastaamaan paitsi komentoihin myös joihinkin tavallisiin tekstiviesteihin. Tätä varten sinun on käytettävä viestinkäsittelijöitä − Viestinkäsittelijä.
Normaali Viestinkäsittelijä vastaa ehdottomasti kaikkiin saapuviin viesteihin. Siksi viestikäsittelijöitä käytetään usein yhdessä suodattimien kanssa. Opetetaan botti tervehtimään ei vain käskystä /hi, mutta myös aina, kun jokin seuraavista sanoista esiintyy botille lähetetyssä viestissä: hello, hello, salute, hai, bonjour.
Toistaiseksi emme kirjoita uusia menetelmiä, koska... Meillä on jo menetelmä, jolla botti tervehtii meitä. Meidän tarvitsee vain luoda tarvittava suodatin ja viestikäsittelijä.
Koodi 2: Lisää tekstiviestien käsittelijä ja suodatin
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()Suorita yllä oleva koodiesimerkki sen jälkeen, kun olet korvannut 'YOUR BOT TOKEN' oikealla tunnuksella, jonka sait luodessasi bottia BotIsä (Puhuin botin luomisesta ).
Yritetään nyt lähettää botille useita viestejä, jotka sisältävät aiemmin luetellut tervehdyssanat:

Joten ensinnäkin opetimme bottia paitsi tervehtimään, myös vastaamaan tervehdykseen. Teimme tämän argumentin avulla reply_to_message_id, joka on saatavilla menetelmässä sendMessage(), johon sinun on siirrettävä sen viestin tunnus, johon haluat vastata. Voit saada viestin tunnuksen seuraavasti: update$message$message_id.
Mutta tärkein asia, jonka teimme, oli suodattimen lisääminen bottiin käyttämällä toimintoa BaseFilter():
# создаём фильтры
MessageFilters$hi <- BaseFilter(
# анонимная фильтрующая функция
function(message) {
# проверяем, встречается ли в тексте сообщения слова приветствия
grepl(x = message$text,
pattern = 'привет|здравствуй|салют|хай|бонжур',
ignore.case = TRUE)
}
)Kuten olet ehkä huomannut, objektiin on lisättävä suodattimet Viestisuodattimet, joka sisältää aluksi jo pienen sarjan valmiita suodattimia. Esimerkissämme kohteeseen Viestisuodattimet lisäsimme elementin hi, tämä on uusi suodatin.
Toiminnassa BaseFilter() sinun on läpäistävä suodatintoiminto. Pohjimmiltaan suodatin on vain toiminto, joka vastaanottaa sanoman esiintymän ja palauttaa sen TOSI tai VÄÄRÄ. Esimerkissämme kirjoitimme yksinkertaisen funktion, joka käyttää perusfunktiota grepl() tarkistaa viestin tekstin ja vastaako se säännöllistä lauseketta привет|здравствуй|салют|хай|бонжур palaa TOSI.
Seuraavaksi luomme viestinkäsittelijän hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi). Ensimmäinen funktion argumentti MessageHandler() on menetelmä, joka kutsuu käsittelijää, ja toinen argumentti on suodatin, jolla sitä kutsutaan. Meidän tapauksessamme tämä on luomamme suodatin MessageFilters$hi.
No, lopuksi lisäämme lähettäjälle luodun käsittelijän hi_txt_hnd.
updater <- updater +
hi_hendler +
hi_txt_hndKuten yllä kirjoitin, paketissa telegram.bot ja vastustaa Viestisuodattimet Käytössäsi on jo joukko sisäänrakennettuja suodattimia, joita voit käyttää:
- kaikki — Kaikki viestit
- teksti — Tekstiviestit
- komento — Komennot, ts. viestit, jotka alkavat
/ - vastaus — Viestit, jotka ovat vastaus toiseen viestiin
- audio — Äänitiedoston sisältävät viestit
- asiakirja — Viestit lähetetyn asiakirjan kanssa
- valokuva - Viestit lähetetyillä kuvilla
- tarra — Viestit, joissa on lähetetty tarra
- video — Viestit, joissa on video
- ääni - ääniviestit
- yhteystieto — Viestit, jotka sisältävät käyttäjän sähkeen sisällön
- sijainti — Viestit maantieteellisellä sijainnilla
- paikka — edelleenlähetetyt viestit
- peli - Pelit
Jos haluat yhdistää joitain suodattimia yhteen käsittelijää, käytä vain merkkiä | - loogisena TAI, ja allekirjoita & kuin loogista И. Jos esimerkiksi haluat botin kutsuvan samaa menetelmää vastaanottaessaan videon, kuvan tai asiakirjan, käytä seuraavaa esimerkkiä viestinkäsittelyn luomiseen:
handler <- MessageHandler(callback,
MessageFilters$video | MessageFilters$photo | MessageFilters$document
)Komentojen lisääminen parametreilla
Tiedämme jo, mitä komennot ovat, kuinka ne luodaan ja kuinka pakottaa botti suorittamaan haluttu komento. Mutta joissakin tapauksissa meidän on välitettävä komennon nimen lisäksi joitain tietoja sen suorittamiseksi.
Alla on esimerkki robotista, joka tietyn päivämäärän ja maan perusteella palauttaa sinulle päivätyypin tuotantokalenterista.
Alla oleva robotti käyttää tuotantokalenterin sovellusliittymää .
Koodi 3: Botti, joka raportoi päivämäärän ja maan mukaan
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()Suorita yllä oleva koodiesimerkki sen jälkeen, kun olet korvannut 'YOUR BOT TOKEN' oikealla tunnuksella, jonka sait luodessasi bottia BotIsä (Puhuin botin luomisesta ).
Loimme botin, jonka arsenaalissa on vain yksi menetelmä check_date, tätä menetelmää kutsutaan samannimisellä komennolla.
Mutta komennon nimen lisäksi tämä menetelmä edellyttää, että syötät kaksi parametria, maakoodin ja päivämäärän. Seuraavaksi botti tarkistaa, onko tietty päivä määritetyssä maassa viikonloppu, lyhennetty päivä vai työpäivä virallisen tuotantokalenterin mukaan.
Käytä argumenttia, jotta luomamme menetelmä hyväksyy lisäparametreja komennon ohella pass_args = TRUE toiminnassa CommandHandler(), ja menetelmää luotaessa vaadittujen argumenttien lisäksi bot, päivitys luo valinnainen - args. Tällä tavalla luotu menetelmä hyväksyy parametrit, jotka annat robotille komennon nimen jälkeen. Parametrit on erotettava välilyönnillä, ne lähetetään menetelmälle tekstivektorina.
Käynnistetään ja testataan bottiamme.

Suorita botti taustalla
Viimeinen vaihe, joka meidän on suoritettava, on käynnistää botti taustalla.
Voit tehdä tämän noudattamalla alla kuvattua algoritmia:
- Tallenna bot-koodi tiedostoon, jonka tunniste on R. Kun työskentelet RStudiossa, tämä tehdään valikon kautta filee, tiimi Tallenna nimellä….
- Lisää polku bin-kansioon, joka puolestaan sijaitsee kansiossa, johon asensit R-kielen, Path-muuttuja, ohjeet .
- Luo tavallinen tekstitiedosto, johon kirjoita 1 rivi:
R CMD BATCH C:UsersAlseyDocumentsmy_bot.R... Sijasta C:UsersAlseyDocumentsmy_bot.R kirjoita polku bot-skriptiisi. Samalla on tärkeää, että matkan varrella ei ole kyrillisiä merkkejä tai välilyöntejä, koska tämä voi aiheuttaa ongelmia bottia käytettäessä. Tallenna se ja korvaa sen jatke txt päälle bat. - Avaa tehtävien ajoitus Windows, tähän on monia tapoja, esimerkiksi avaa mikä tahansa kansio ja kirjoita osoite
%windir%system32taskschd.msc /s. Muita käynnistystapoja löytyy . - Napsauta ajastimen oikeasta yläkulmasta "Luo tehtävä...".
- Anna "Yleiset"-välilehdellä tehtävälle mukautettu nimi ja vaihda kytkin "Suorita kaikille käyttäjille" -tilaan.
- Siirry "Toiminnot" -välilehteen, napsauta "Luo". Napsauta "Ohjelma tai komentosarja" -kentässä "Selaa" ja etsi toisessa vaiheessa luotu bat tiedosto ja napsauta OK.
- Napsauta OK ja kirjoita tarvittaessa käyttöjärjestelmätilisi salasana.
- Etsi luotu tehtävä ajastimesta, valitse se ja napsauta "Suorita" -painiketta oikeassa alakulmassa.
Bottimme toimii taustalla ja toimii, kunnes lopetat tehtävän tai sammutat tietokoneen tai palvelimen, jolla se käynnistettiin.
Johtopäätös
Tässä artikkelissa selvitimme, kuinka kirjoittaa täysimittainen botti, joka ei voi vain lähettää viestejä, vaan myös vastata saapuviin viesteihin ja komentoihin. Saatu tieto riittää jo ratkaisemaan suurimman osan ongelmistasi.
Seuraava artikkeli käsittelee näppäimistön lisäämistä bottiin helpottamaan työskentelyä.
Tilaa minun и kanavia.
Lähde: will.com
