Vi skriver en telegram-bot i R (del 2): Tilføj botten support til kommandoer og filter for beskeder

I den forrige publikation Vi har forstået, hvordan man opretter en bot, og initialiseret en forekomst af klassen Bot og vi har gjort os bekendt med metoderne til at sende beskeder ved hjælp af den.

I denne artikel fortsætter jeg dette emne, så jeg anbefaler, at du kun begynder at læse denne artikel efter at have læst første del.

Denne gang vil vi finde ud af, hvordan vi gør vores bot livlig og tilføjer support til kommandoer, samt lære klassen Updater.

I løbet af artiklen vil vi skrive flere simple bots; den sidste vil bestemme, om en dag i et givet land er en helligdag eller arbejdsdag ifølge produktionskalenderen. Men som tidligere er formålet med artiklen at introducere dig til grænsefladen af pakken telegram.bot til at løse dine egne opgaver.

Vi skriver en telegram-bot i R (del 2): Tilføj botten support til kommandoer og filter for beskeder

Alle artikler i serien "Vi skriver en telegram-bot i R"

  1. Vi opretter en bot og sender beskeder til telegram ved hjælp af den
  2. Vi tilføjer botten støtte til kommandoer og filtre for beskeder

Indhold

Hvis du er interesseret i dataanalyse, kan mine telegram og youtube kanaler være interessante. Størstedelen af indholdet er dedikeret til R-sprog.

  1. Klasse Updater
  2. Handlers — behandlere
  3. Vi tilføjer den første kommando til botten, kommandobehandleren
  4. Behandler for tekstbeskeder og filtre
  5. Tilføjelse af kommandoer med parametre
  6. Vi kører botten i baggrunden
  7. Konklusion

Klasse Updater

Updater — er en klasse, der forenkler udviklingen af en telegram-bot for dig og bruger i baggrunden klassen Dispetcher. Formålet med klassen Updater er at modtage opdateringer fra botten (i den forrige artikel brugte vi metoden getUpdates()), og sende dem videre til Dispetcher.

På sin side Dispetcher indeholder de behandlere, som du har oprettet, d.v.s. objekter af klassen Handler.

Handlers — behandlere

Ved hjælp af behandlere tilføjer du Dispetcher botens reaktioner på forskellige hændelser. På tidspunktet for skriveriet af artiklen er telegram.bot følgende typer behandlere blevet tilføjet:

  • MessageHandler — Behandler for beskeder
  • CommandHandler — Behandler for kommandoer
  • CallbackQueryHandler — Behandler for data sendt fra Inline tastaturer
  • ErrorHandler — Behandler for fejl ved anmodning om opdateringer fra botten

Vi tilføjer den første kommando til botten, kommandobehandleren

Hvis du aldrig før har brugt bots, og ikke ved, hvad en kommando er, så skal kommandoer til botten sendes med en skråstreg / som præfiks.

Lad os starte med enkle kommandoer, d.v.s. lære vores bot at hilse ved kommandoen /hi.

Kode 1: Lærer botten at hilse

library(telegram.bot)

# Opretter en instans af klassen Updater
updater <- Updater('DIN BOTS TOKEN')

# Skriv en metode til at byde velkommen
say_hello <- function(bot, update) {

  # Brugernavn, som vi skal hilse på
  user_name <- update$message$from$first_name

  # Sender en velkomstbesked
  bot$sendMessage(update$message$chat_id, 
                  text = paste0("Mit venlige hilsner, ", user_name, "!"), 
                  parse_mode = "Markdown")

}

# Opretter en handler
hi_hendler <- CommandHandler('hi', say_hello)

# Tilføjer handleren til dispatcher
updater <- updater + hi_hendler

# Starter botten
updater$start_polling()

Kør ovenstående kodeeksempel, efter at have erstattet ‘DIN BOTS TOKEN’ med den faktiske token, du fik, da du oprettede botten gennem BotFather (jeg har fortalt om oprettelsen af botten i den første artikel).

Metoden start_polling() klassen Updater, som bruges i slutningen af koden, starter en uendelig løkke af forespørgsler og behandling af opdateringer fra botten.

Nu åbner vi Telegram og skriver den første kommando til vores bot /hi.

Vi skriver en telegram-bot i R (del 2): Tilføj botten support til kommandoer og filter for beskeder

Nu forstår vores bot kommandoen /hi, og kan hilse på os.

Schematic kan processen med at opbygge en så simpel bot illustreres således.

Vi skriver en telegram-bot i R (del 2): Tilføj botten support til kommandoer og filter for beskeder

  1. Opretter en instans af klassen Updater;
  2. Opretter metoder, dvs. funktioner, som vores bot skal udføre. I kodeeksemplet er det funktionen say_hello(). Funktioner, som du vil bruge som botmetoder, skal have to obligatoriske argumenter — bot og opdatering, og et valgfrit — args. Argumentet bot, det er din bot, som du kan bruge til at svare på beskeder, sende beskeder eller anvende andre tilgængelige metoder for botten. Argumentet opdatering det, som botten modtog fra brugeren, i det væsentlige det, vi modtog i den første artikel ved hjælp af metoden getUpdates(). Argumentet args giver dig mulighed for at behandle yderligere data sendt af brugeren sammen med kommandoen, dette emne vender vi tilbage til lidt senere;
  3. Opretter handlere, dvs. binder brugerens handlinger til de metoder, der blev oprettet i det foregående trin. I princippet er en handler et trigger, en begivenhed, der udløser en funktion i botten. I vores eksempel er triggeren at sende kommandoen /hi, og realiseres med kommandoen hi_hendler <- CommandHandler('hi', say_hello). Det første argument i funktionen CommandHandler() giver dig mulighed for at angive kommandoen, i vores tilfælde hi, som botten vil reagere på. Det andet argument giver mulighed for at angive botens metode, vi vil kalde metoden say_hello, der udføres, hvis brugeren kalder den angivne kommando i første argument;
  4. Dernæst tilføjer vi den oprettede håndterer til dispatcher for vores klasseinstans Updater. Håndtere kan tilføjes på flere måder, i eksemplet ovenfor brugte jeg den enkleste metode, ved hjælp af tegnet +, dvs. updater <- updater + hi_hendler. Det samme kan gøres med metoden add_handler(), som tilhører klassen Dispatcher, kan vi finde denne metode sådan: updater$dispatcher$add_handler();
  5. Vi starter botten med kommandoen start_polling().

Behandler for tekstbeskeder og filtre

Vi har set, hvordan man sender kommandoer til botten, men nogle gange er det nødvendigt, at botten reagerer ikke kun på kommandoer, men også på almindelige tekstbeskeder. For dette skal vi bruge beskedhåndtere — MessageHandler.

Normal MessageHandler vil reagere på alle indkomne beskeder. Derfor bruges beskedhåndtere ofte sammen med filtre. Lad os lære botten at hilse ikke kun på kommandoen /hi, men også altid, når en af følgende ord findes i den besked, der sendes til botten: hej, goddag, salut, hej, bonjour.

Indtil videre vil vi ikke skrive nye metoder, da vi allerede har en metode, som botten hilsner med. Vi skal kun oprette det nødvendige filter og beskedhåndterer.

Kode 2: Tilføj håndterer for tekstbeskeder og filter

library(telegram.bot)

# Opretter en instans af klassen Updater
updater <- Updater('DIN BOTS TOKEN')

# Skriver metode for hilsen
## hilsningskommando
say_hello <- function(bot, update) {

  # Brugerens navn, som skal hilses
  user_name <- update$message$from$first_name

  # Sender hilsningsbesked
  bot$sendMessage(update$message$chat_id, 
                  text = paste0("Min respekt, ", user_name, "!"),
                  parse_mode = "Markdown",
                  reply_to_message_id = update$message$message_id)

}

# Opretter filtre
MessageFilters$hi <- BaseFilter(function(message) {

  # Tjekker, om teksten i beskeden indeholder ordene: hej, goddag, salut, hej, bonjour
  grepl(x           = message$text, 
        pattern     = 'hej|goddag|salut|hej|bonjour',
        ignore.case = TRUE)
  }
)

# Opretter håndterer
hi_hendler <- CommandHandler('hi', say_hello) # håndterer hi-kommandoen
hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi)

# Tilføjer håndterere til dispatcher
updater <- updater + 
             hi_hendler +
             hi_txt_hnd

# Starter botten
updater$start_polling()

Kør ovenstående kodeeksempel, efter at have erstattet ‘DIN BOTS TOKEN’ med den faktiske token, du fik, da du oprettede botten gennem BotFather (jeg har fortalt om oprettelsen af botten i den første artikel).

Lad os nu prøve at sende botten et par beskeder, hvor de tidligere nævnte hilseord vil blive brugt:
Vi skriver en telegram-bot i R (del 2): Tilføj botten support til kommandoer og filter for beskeder

Så først har vi lært botten ikke bare at hilse, men også at svare på hilsner. Det gjorde vi ved hjælp af argumentet reply_to_message_id, som er tilgængeligt i metoden sendMessage(), hvor ID'et på den besked, som der skal svares på, skal videregives. ID'et på beskeden kan hentes sådan her: update$message$message_id.

Men det vigtigste, vi har gjort — er, at vi har tilføjet en filterfunktion til botten ved hjælp af funktionen BaseFilter():

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

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

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

)

Som du måske har bemærket, skal filtre tilføjes til objektet MessageFilters, som i forvejen indeholder et lille udvalg af færdige filtre. I vores eksempel tilføjede vi et element til objektet MessageFilters , dette er det nye filter. hiI funktionen

skal du videregive filterfunktionen. Grundlæggende er et filter blot en funktion, der modtager en beskedinstans og returnerer BaseFilter() TRUE FALSE eller . I vores eksempel har vi skrevet en simpel funktion, der ved hjælp af den grundlæggende funktiongrepl() tjekker beskedens tekst, og hvis den matcher det regulære udtryk hej|goddag|salut|hallo|bonjour Derefter opretter vi en beskedhåndterer returnerer FALSE.

hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi) MessageHandler(). Det første argument i funktionen — metoden, der vil kalde håndtereren, og det andet argument — er filteret, hvormed det vil blive kaldt. I vores tilfælde er det det filter, vi har oprettet MessageFilters$hi Og til sidst tilføjer vi den netop oprettede håndterer til dispatcher.

hi_txt_hnd updater <- updater + hi_hendler + hi_txt_hnd.

Som jeg tidligere har nævnt, er der allerede et sæt indbyggede filtre i pakken

og objektet telegram.bot som du kan bruge: MessageFilters all — Alle beskeder

  • text — Tekstbeskeder
  • command — Kommandoer, dvs. beskeder der starter med
  • reply — Beskeder, der svarer på en anden besked /
  • audio — Beskeder, der indeholder en lydfil
  • document — Beskeder med vedhæftede dokumenter
  • photo — Beskeder med vedhæftede billeder
  • sticker — Beskeder med vedhæftede klistermærker
  • video — Beskeder med video
  • voice — Voice-beskeder
  • contact — Beskeder, der indeholder kontaktinformation for Telegram-brugere
  • location — Beskeder med geolokation
  • venue — Videresendte beskeder
  • game — Spil
  • Hvis du vil kombinere nogle filtre i én håndterer, skal du blot bruge symbolet

— som en logisk | ELLER ., og tegn & som logisk Og. For eksempel, hvis du ønsker, at bots skal kalde den samme metode, når den modtager en video, billede eller dokument, kan du bruge følgende eksempel til at oprette en beskedbehandler:

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

Tilføjelse af kommandoer med parametre

Vi ved allerede, hvad kommandoer er, hvordan man opretter dem, og hvordan man får botten til at udføre den ønskede kommando. Men i nogle tilfælde, udover navnet på kommandoen, er det nødvendigt at overføre nogle data for at udføre den.

Nedenfor er et eksempel på en bot, der returnerer dig typen af dag fra produktionskalenderen baseret på en given dato og land.

Den bot, der er vist nedenfor, bruger API'et til produktionskalenderen isdayoff.ru.

Kode 3: Bot, der rapporterer baseret på dato og land

library(telegram.bot)

# Opretter en instans af klassen Updater
updater <- Updater('1165649194:AAFkDqIzQ6Wq5GV0YU7PmEZcv1gmWIFIB_8')

# Skriver en metode til velkomst
## velkomstkommando
check_date <- function(bot, update, args) {

  # Indgående data
  day     <- args[1]  # dato
  country <- args[2]  # land

  # Kontrol af de indtastede parametre
  if ( !grepl('\d{4}-\d{2}-\d{2}', day) ) {

    # Send brugerdefineret tastatur
    bot$sendMessage(update$message$chat_id, 
                    text = paste0(day, " - ugyldig dato, indtast dato i formatet ÅÅÅÅ-MM-DD"),
                    parse_mode = "Markdown")

  } else {
    day <- as.Date(day)
    # Konverterer til POSIXtl format
    y <- format(day, "%Y")
    m <- format(day, "%m")
    d <- format(day, "%d")

  }

  # Land til kontrol
  ## Kontrollerer om landet er angivet
  ## hvis det ikke er angivet, sætter vi det til ru
  if ( ! country %in% c('ru', 'ua', 'by', 'kz', 'us') ) {

    # Send brugerdefineret tastatur
    bot$sendMessage(update$message$chat_id, 
                    text = paste0(country, " - ugyldig landekode, mulige værdier: ru, by, kz, ua, us. Data forespørgsel for Rusland."),
                    parse_mode = "Markdown")

    country <- 'ru'

  }

  # Forespørgsel af data fra API
  # Sammensætning af HTTP forespørsel
  url <- paste0("https://isdayoff.ru/api/getdata?",
                "year=",  y, "&",
                "month=", m, "&",
                "day=",   d, "&",
                "cc=",    country, "&",
                "pre=1&",
                "covid=1")

  # Modtager svar
  res <- readLines(url)

  # Fortolkning af svaret
  out <- switch(res, 
                "0"   = "Arbejdsdag",
                "1"   = "Fridag",
                "2"   = "Forkortet arbejdsdag",
                "4"   = "covid-19",
                "100" = "Fejl i datoen",
                "101" = "Data ikke fundet",
                "199" = "Tjeneste fejl")

  # Sender besked
  bot$sendMessage(update$message$chat_id, 
                  text = paste0(day, " - ", out),
                  parse_mode = "Markdown")

}

# Opretter en behandler
date_hendler <- CommandHandler('check_date', check_date, pass_args = TRUE)

# Tilføjer behandler til dispatcher
updater <- updater + date_hendler

# Starter botten
updater$start_polling()

Kør ovenstående kodeeksempel, efter at have erstattet ‘DIN BOTS TOKEN’ med den faktiske token, du fik, da du oprettede botten gennem BotFather (jeg har fortalt om oprettelsen af botten i den første artikel).

Vi har skabt en bot, som kun har én metode i sin arsenal check_date, metoden kaldes af den tilsvarende kommando.

Men ud over kommandoens navn forventer denne metode, at du indtaster to parametre: landekode og dato. Derefter kontrollerer botten, om den angivne dag i det angivne land er en fridag, forkortet dag eller arbejdsdag ifølge den officielle produktionskalender.

For at den metode, vi opretter, kan tage ekstra parametre sammen med kommandoen, skal du bruge argumentet pass_args = TRUE i funktionen CommandHandler(), og når du opretter metoden, skal du ud over de obligatoriske argumenter bot, opdatering oprette en valgfri — argsDen metode, der er oprettet på denne måde, vil tage de parametre, du sender til botten efter kommandoens navn. Parametrene skal adskilles med mellemrum, og de vil blive sendt til metoden som en tekstvektor.

Lad os starte og teste vores bot.

Vi skriver en telegram-bot i R (del 2): Tilføj botten support til kommandoer og filter for beskeder

Vi kører botten i baggrunden

Det sidste skridt, vi skal udføre, er at køre botten i baggrunden.

For at gøre dette skal du følge den nedenfor beskrevne algoritme:

  1. Gem botkoden i en fil med R-udvidelsen. Når du arbejder i RStudio, gøres dette via menuen Fil, med kommandoen Gem som….
  2. Tilføj stien til bin-mappen, som igen ligger i mappen, hvor du har installeret R, til variablen Path. Instruktionen her.
  3. Opret en almindelig tekstfil, hvor du skriver 1 linje: R CMD BATCH C:UsersAlseyDocumentsmy_bot.R. I stedet for C:UsersAlseyDocumentsmy_bot.R skal du skrive stien til dit bot-script. Det er vigtigt, at der ikke optræder kyrilliske tegn og mellemrum i stien, da dette kan forårsage problemer ved opstart af botten. Gem den, og skift dens udvidelse til txt og få en fungerende kommando. bat.
  4. Åbn Windows Opgavestyring, der er mange måder at gøre dette på, for eksempel ved at åbne en hvilken som helst mappe og indtaste %windir%system32taskschd.msc /s. Andre måder at starte det på kan findes her.
  5. I det øverste højre hjørne af Opgavestyring skal du klikke på "Opret opgave…".
  6. På fanen "Generelt" skal du angive et vilkårligt navn til din opgave, og skifte kontakten til "Kør for alle brugere".
  7. Gå til fanen "Handlinger", klik på "Opret". I feltet "Program eller script" skal du klikke på "Gennemse", finde den fil, der blev oprettet i andet skridt bat , og klik på OK.
  8. Klik på OK, og indtast eventuelt din adgangskode til din operativsystemkonto.
  9. Find den oprettede opgave i Opgavestyring, marker den, og klik på knappen "Udfør" i nederste højre hjørne.

Vores bot kører i baggrunden og vil være aktiv, indtil du stopper opgaven, eller slukker for din PC eller server, hvor den blev startet.

Konklusion

I denne artikel har vi gennemgået, hvordan man skriver en fuldgyldig bot, der ikke kun kan sende beskeder, men også reagere på indkommende beskeder og kommandoer. Den viden, du har fået, er allerede tilstrækkelig til at løse de fleste af dine opgaver.

I den næste artikel vil vi tale om, hvordan man tilføjer et tastatur til botten for bedre funktionalitet.

Tilmeld dig mine telegram og youtube kanaler.

Kilde: habr.com

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster