Sähkebotin kirjoittaminen R:ssä (osa 2): Komentojen tuen ja viestisuodattimien lisääminen bottiin

В edellinen julkaisu 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 ensimmäinen osa.

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.

Sähkebotin kirjoittaminen R:ssä (osa 2): Komentojen tuen ja viestisuodattimien lisääminen bottiin

Kaikki artikkelit sarjasta "Sähköbotin kirjoittaminen R:ssä"

  1. Luomme botin ja käytämme sitä viestien lähettämiseen sähkeissä
  2. Lisää komentotuki ja viestisuodattimet bottiin

Pitoisuus

Jos olet kiinnostunut data-analyysistä, saatat olla kiinnostunut minun sähke и youtube kanavia. Suurin osa sisällöstä on omistettu R-kielelle.

  1. Päivittäjäluokka
  2. Käsittelijät - käsittelijät
  3. Lisää ensimmäinen komento bottiin, komentokäsittelijään
  4. Tekstiviestien prosessori ja suodattimet
  5. Komentojen lisääminen parametreilla
  6. Suorita botti taustalla
  7. Johtopäätös

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 ensimmäinen artikkeli).

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.

Sähkebotin kirjoittaminen R:ssä (osa 2): Komentojen tuen ja viestisuodattimien lisääminen bottiin

Nyt bottimme ymmärtää komennon /hi, ja osaa tervehtiä meitä.

Kaavamaisesti tällaisen yksinkertaisen botin rakennusprosessi voidaan kuvata seuraavasti.

Sähkebotin kirjoittaminen R:ssä (osa 2): Komentojen tuen ja viestisuodattimien lisääminen bottiin

  1. Luo luokasta esiintymä Updater;
  2. 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;
  3. 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 sen hi_hendler <- CommandHandler('hi', say_hello). Ensimmäinen funktion argumentti CommandHandler() voit määrittää komennon meidän tapauksessamme hi, 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;
  4. 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 luokkaan Dispatcher, löydät tämän menetelmän seuraavasti: updater$dispatcher$add_handler();
  5. 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 ensimmäinen artikkeli).

Yritetään nyt lähettää botille useita viestejä, jotka sisältävät aiemmin luetellut tervehdyssanat:
Sähkebotin kirjoittaminen R:ssä (osa 2): Komentojen tuen ja viestisuodattimien lisääminen bottiin

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_hnd

Kuten 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ää isdayoff.ru.

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 ensimmäinen artikkeli).

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.

Sähkebotin kirjoittaminen R:ssä (osa 2): Komentojen tuen ja viestisuodattimien lisääminen bottiin

Suorita botti taustalla

Viimeinen vaihe, joka meidän on suoritettava, on käynnistää botti taustalla.

Voit tehdä tämän noudattamalla alla kuvattua algoritmia:

  1. Tallenna bot-koodi tiedostoon, jonka tunniste on R. Kun työskentelet RStudiossa, tämä tehdään valikon kautta filee, tiimi Tallenna nimellä….
  2. Lisää polku bin-kansioon, joka puolestaan ​​sijaitsee kansiossa, johon asensit R-kielen, Path-muuttuja, ohjeet täällä.
  3. 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.
  4. 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 täällä.
  5. Napsauta ajastimen oikeasta yläkulmasta "Luo tehtävä...".
  6. Anna "Yleiset"-välilehdellä tehtävälle mukautettu nimi ja vaihda kytkin "Suorita kaikille käyttäjille" -tilaan.
  7. Siirry "Toiminnot" -välilehteen, napsauta "Luo". Napsauta "Ohjelma tai komentosarja" -kentässä "Selaa" ja etsi toisessa vaiheessa luotu bat tiedosto ja napsauta OK.
  8. Napsauta OK ja kirjoita tarvittaessa käyttöjärjestelmätilisi salasana.
  9. 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 sähke и youtube kanavia.

Lähde: will.com

Osta luotettava isännöinti sivustoille, joissa on DDoS-suojaus, VPS VDS -palvelimet 🔥 Osta luotettavaa verkkosivustojen hostingia DDoS-suojauksella, VPS VDS -palvelimilla | ProHoster