Skrive en telegram-bot i R (del 2): ​​Legge til kommandostøtte og meldingsfiltre til boten

В tidligere utgivelse vi fant ut hvordan vi lager en bot, initialiserte en forekomst av klassen Bot og ble kjent med metodene for å sende meldinger ved å bruke den.

I denne artikkelen fortsetter jeg dette emnet, så jeg anbefaler å begynne å lese denne artikkelen først etter å ha lest første del.

Denne gangen vil vi finne ut hvordan vi kan gjenopplive boten vår og legge til kommandostøtte til den, og også bli kjent med klassen Updater.

I løpet av artikkelen vil vi skrive flere enkle roboter, sistnevnte vil, basert på en gitt dato og landskode, bestemme om en dag i et gitt land er en helg eller en arbeidsdag i henhold til produksjonskalenderen. Men som før er formålet med artikkelen å gjøre deg kjent med pakkegrensesnittet telegram.bot å løse dine egne problemer.

Skrive en telegram-bot i R (del 2): ​​Legge til kommandostøtte og meldingsfiltre til boten

Alle artikler fra serien "Skrive en telegram-bot i R"

  1. Vi lager en bot og bruker den til å sende meldinger i telegram
  2. Legg til kommandostøtte og meldingsfiltre til boten

Innhold

Hvis du er interessert i dataanalyse, kan du være interessert i min telegram и youtube kanaler. Det meste av innholdet er dedikert til R-språket.

  1. Oppdateringsklasse
  2. Håndtere - handlere
  3. Legg til den første kommandoen til boten, kommandobehandler
  4. Tekstmeldingsprosessor og filtre
  5. Legge til kommandoer med parametere
  6. Kjør boten i bakgrunnen
  7. Konklusjon

Oppdateringsklasse

Updater er en klasse som gjør det lettere for deg å utvikle en telegram-bot, og bruker klassen under panseret Dispetcher. Klasseoppgave Updater er å motta oppdateringer fra boten (i forrige artikkel brukte vi metoden til dette formålet getUpdates()), og overføre dem videre til Dispetcher.

I sin tur Dispetcher inneholder behandlerne du opprettet, dvs. klasseobjekter Handler.

Håndtere - handlere

Med handlere du legger til Dispetcher bot-reaksjoner på ulike hendelser. På tidspunktet for skriving av denne artikkelen i telegram.bot Følgende typer behandlere er lagt til:

  • MessageHandler — Meldingsbehandler
  • CommandHandler — Kommandobehandler
  • CallbackQueryHandler — Databehandler for tastaturer sendt fra Inline
  • ErrorHandler — Feilbehandler når du ber om oppdateringer fra boten

Legg til den første kommandoen til boten, kommandobehandler

Hvis du aldri har brukt roboter før og ikke vet hva en kommando er, må kommandoer til boten sendes med en skråstrek / som et prefiks.

Vi starter med enkle kommandoer, dvs. la oss lære boten vår å si hei på kommando /hi.

Kode 1: Lære boten å si hei

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

Kjør kodeeksemplet ovenfor, etter å ha erstattet 'DIN BOTTOKEN' med den virkelige tokenen du mottok da du opprettet boten via BotFader (Jeg snakket om å lage en bot i første artikkel).

metode start_polling() klasse Updater, som brukes på slutten av koden, starter en endeløs løkke med forespørsel og behandling av oppdateringer fra boten.

La oss nå åpne Telegram og skrive den første kommandoen til boten vår /hi.

Skrive en telegram-bot i R (del 2): ​​Legge til kommandostøtte og meldingsfiltre til boten

Nå forstår boten vår kommandoen /hi, og vet hvordan de skal hilse på oss.

Skjematisk kan prosessen med å bygge en så enkel bot avbildes som følger.

Skrive en telegram-bot i R (del 2): ​​Legge til kommandostøtte og meldingsfiltre til boten

  1. Lag en forekomst av klassen Updater;
  2. Vi lager metoder, d.v.s. funksjoner som boten vår vil utføre. I kodeeksemplet er dette en funksjon say_hello(). Funksjonene du skal bruke som botmetoder må ha to nødvendige argumenter - bot и Oppdater, og en valgfri - args. Argument bot, dette er din bot, med dens hjelp kan du svare på meldinger, sende meldinger eller bruke andre metoder som er tilgjengelige for boten. Argument Oppdater dette er hva boten mottok fra brukeren, faktisk det vi mottok i den første artikkelen ved å bruke metoden getUpdates(). Argument args lar deg behandle tilleggsdata sendt av brukeren sammen med kommandoen, vi kommer tilbake til dette emnet litt senere;
  3. Vi lager behandlere, dvs. Vi knytter noen brukerhandlinger til metodene som ble opprettet i forrige trinn. I hovedsak er en handler en trigger, en hendelse som kaller en bot-funksjon. I vårt eksempel er en slik trigger å sende en kommando /hi, og implementeres av teamet hi_hendler <- CommandHandler('hi', say_hello). Første funksjonsargument CommandHandler() lar deg spesifisere en kommando, i vårt tilfelle hi, som boten vil svare på. Det andre argumentet lar deg spesifisere bot-metoden, vi vil kalle metoden say_hello, som vil bli utført hvis brukeren ringte kommandoen spesifisert i det første argumentet;
  4. Deretter legger vi til den opprettede behandleren til dispatcheren til klasseforekomsten vår Updater. Du kan legge til behandlere på flere måter; i eksemplet ovenfor brukte jeg den enkleste ved å bruke tegnet +, dvs. updater <- updater + hi_hendler. Det samme kan gjøres ved hjelp av metoden add_handler(), som tilhører klassen Dispatcher, kan du finne denne metoden slik: updater$dispatcher$add_handler();
  5. Start boten ved å bruke kommandoen start_polling().

Tekstmeldingsprosessor og filtre

Vi fant ut hvordan vi sender kommandoer til boten, men noen ganger trenger vi at boten ikke bare svarer på kommandoer, men også på noen vanlige tekstmeldinger. For å gjøre dette må du bruke meldingsbehandlere − MessageHandler.

Normal MessageHandler vil svare på absolutt alle innkommende meldinger. Derfor brukes meldingsbehandlere ofte sammen med filtre. La oss lære roboten å si hei ikke bare på kommando /hi, men også når ett av følgende ord vises i meldingen som sendes til boten: hello, hello, salute, hai, bonjour.

Foreløpig vil vi ikke skrive noen nye metoder, fordi... Vi har allerede en metode som boten hilser oss på. Alt vi trenger å gjøre er å lage det nødvendige filteret og meldingsbehandleren.

Kode 2: Legg til en tekstmeldingsbehandler og filter

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

Kjør kodeeksemplet ovenfor, etter å ha erstattet 'DIN BOTTOKEN' med den virkelige tokenen du mottok da du opprettet boten via BotFader (Jeg snakket om å lage en bot i første artikkel).

La oss nå prøve å sende boten flere meldinger som inneholder hilsenordene som er oppført tidligere:
Skrive en telegram-bot i R (del 2): ​​Legge til kommandostøtte og meldingsfiltre til boten

Så først av alt lærte vi boten ikke bare å si hei, men å svare på en hilsen. Vi gjorde dette ved å bruke argumentet svar_på_meldings-id, som er tilgjengelig i metoden sendMessage(), der du må overføre ID-en til meldingen du vil svare på. Du kan få meldings-ID-en slik: update$message$message_id.

Men det viktigste vi gjorde var å legge til et filter til boten ved å bruke funksjonen BaseFilter():

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

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

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

)

Som du kanskje har lagt merke til, må filtre legges til objektet Meldingsfiltre, som i utgangspunktet allerede inneholder et lite sett med ferdige filtre. I vårt eksempel, til objektet Meldingsfiltre vi la til et element hi, dette er et nytt filter.

I funksjon BaseFilter() du må bestå filterfunksjonen. I hovedsak er et filter bare en funksjon som mottar en meldingsforekomst og returnerer TRUE eller FALSK. I vårt eksempel skrev vi en enkel funksjon som ved å bruke den grunnleggende funksjonen grepl() sjekker meldingsteksten og om den samsvarer med det regulære uttrykket привет|здравствуй|салют|хай|бонжур returnerer TRUE.

Deretter lager vi en meldingsbehandler hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi). Første funksjonsargument MessageHandler() er metoden som vil kalle behandleren, og det andre argumentet er filteret som det vil bli kalt. I vårt tilfelle er dette filteret vi har laget MessageFilters$hi.

Vel, til slutt legger vi til ekspeditøren den opprettede behandleren hei_txt_hnd.

updater <- updater + 
             hi_hendler +
             hi_txt_hnd

Som jeg skrev ovenfor, i pakken telegram.bot og objekt Meldingsfiltre Det er allerede et sett med innebygde filtre som du kan bruke:

  • alle — Alle meldinger
  • tekst — Tekstmeldinger
  • kommando — Kommandoer, dvs. meldinger som begynner med /
  • svar — Meldinger som er et svar på en annen melding
  • lyd — Meldinger som inneholder en lydfil
  • dokument — Meldinger med et sendt dokument
  • foto - Meldinger med sendte bilder
  • klistremerke — Meldinger med et sendt klistremerke
  • video — Meldinger med video
  • stemme – talemeldinger
  • kontakt — Meldinger som inneholder brukerens telegraminnhold
  • plassering — Meldinger med geolokalisering
  • spillested — videresendte meldinger
  • spill — spill

Hvis du vil kombinere noen filtre i en behandler, bruk bare skiltet | - som en logisk ELLER, og signer & like logisk И. Hvis du for eksempel vil at roboten skal kalle den samme metoden når den mottar en video, et bilde eller et dokument, bruk følgende eksempel for å lage en meldingsbehandler:

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

Legge til kommandoer med parametere

Vi vet allerede hva kommandoer er, hvordan man lager dem, og hvordan man tvinger boten til å utføre ønsket kommando. Men i noen tilfeller, i tillegg til kommandonavnet, må vi sende noen data for å utføre det.

Nedenfor er et eksempel på en bot som, gitt en gitt dato og land, returnerer deg dagstypen fra produksjonskalenderen.

Boten nedenfor bruker produksjonskalender-API isdayoff.ru.

Kode 3: Bot som rapporterer etter dato og land

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

Kjør kodeeksemplet ovenfor, etter å ha erstattet 'DIN BOTTOKEN' med den virkelige tokenen du mottok da du opprettet boten via BotFader (Jeg snakket om å lage en bot i første artikkel).

Vi opprettet en bot som bare har én metode i arsenalet sitt check_date, kalles denne metoden av kommandoen med samme navn.

Men, i tillegg til kommandonavnet, krever denne metoden at du oppgir to parametere, landskoden og datoen. Deretter sjekker boten om en gitt dag i det angitte landet er en helg, en forkortet dag eller en arbeidsdag i henhold til den offisielle produksjonskalenderen.

For at metoden vi lager skal godta flere parametere sammen med kommandoen, bruk argumentet pass_args = TRUE i funksjon CommandHandler(), og når du oppretter en metode, i tillegg til de nødvendige argumentene bot, Oppdater lag en valgfri en - args. Metoden som er opprettet på denne måten vil godta parameterne du sender til boten etter kommandonavnet. Parametrene må skilles med et mellomrom, de vil bli sendt til metoden som en tekstvektor.

La oss starte og teste boten vår.

Skrive en telegram-bot i R (del 2): ​​Legge til kommandostøtte og meldingsfiltre til boten

Kjør boten i bakgrunnen

Det siste trinnet vi må fullføre er å starte boten i bakgrunnen.

For å gjøre dette, følg algoritmen beskrevet nedenfor:

  1. Lagre bot-koden til en fil med filtypen R. Når du arbeider i RStudio, gjøres dette gjennom menyen filet, team Lagre som….
  2. Legg til banen til bin-mappen, som igjen ligger i mappen der du installerte R-språket, til Path-variabelen, instruksjoner her.
  3. Lag en vanlig tekstfil der du skriver 1 linje: R CMD BATCH C:UsersAlseyDocumentsmy_bot.R... I stedet C:UsersAlseyDocumentsmy_bot.R skriv stien til bot-skriptet ditt. Samtidig er det viktig at det ikke er kyrilliske tegn eller mellomrom underveis, fordi dette kan forårsake problemer når du kjører boten. Lagre den, og erstatt utvidelsen med txtbat.
  4. Åpne Windows Task Scheduler, det er mange måter å gjøre dette på, for eksempel åpne en hvilken som helst mappe og skriv inn adressen %windir%system32taskschd.msc /s. Andre lanseringsmetoder kan bli funnet her.
  5. I menyen øverst til høyre i planleggeren klikker du på "Opprett oppgave...".
  6. På "Generelt"-fanen gir du oppgaven et tilpasset navn, og bytt bryteren til tilstanden "Kjør for alle brukere".
  7. Gå til fanen "Handlinger", klikk på "Opprett". I feltet "Program eller skript", klikk "Bla gjennom", finn den som ble opprettet i det andre trinnet bat fil og klikk OK.
  8. Klikk OK og skriv om nødvendig inn passordet for operativsystemkontoen din.
  9. Finn den opprettede oppgaven i planleggeren, velg den og klikk på "Kjør"-knappen i nedre høyre hjørne.

Boten vår kjører i bakgrunnen og vil fungere til du stopper oppgaven, eller slår av PC-en eller serveren den ble lansert på.

Konklusjon

I denne artikkelen fant vi ut hvordan du skriver en fullverdig bot som ikke bare kan sende meldinger, men også svare på innkommende meldinger og kommandoer. Kunnskapen du oppnår er allerede nok til å løse de fleste problemene dine.

Den neste artikkelen vil snakke om hvordan du legger til et tastatur til boten for mer praktisk arbeid.

Abonner på min telegram и youtube kanaler.

Kilde: www.habr.com

Legg til en kommentar