Skrivning af en telegram-bot i R (del 2): ​​Tilføjelse af kommandostøtte og beskedfiltre til botten

В tidligere udgivelse vi fandt ud af, hvordan man opretter en bot, initialiserede en forekomst af klassen Bot og blev fortrolig med metoderne til at sende beskeder ved hjælp af det.

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

Denne gang vil vi finde ud af, hvordan vi genopliver vores bot og tilføjer kommandostøtte til den, og også stifte bekendtskab med klassen Updater.

I løbet af artiklen vil vi skrive flere simple bots, sidstnævnte vil ud fra en given dato og landekode afgøre om en dag i et givet land er en weekend eller en arbejdsdag ifølge produktionskalenderen. Men som før er formålet med artiklen at gøre dig bekendt med pakkegrænsefladen telegram.bot at løse dine egne problemer.

Skrivning af en telegram-bot i R (del 2): ​​Tilføjelse af kommandostøtte og beskedfiltre til botten

Alle artikler fra serien "Skriv en telegrambot i R"

  1. Vi opretter en bot og bruger den til at sende beskeder i telegram
  2. Tilføj kommandostøtte og beskedfiltre til botten

Indhold

Hvis du er interesseret i dataanalyse, er du måske interesseret i min telegram и youtube kanaler. Det meste af indholdet er afsat til R-sproget.

  1. Opdateringsklasse
  2. Håndtere - handlere
  3. Tilføj den første kommando til botten, kommandohandler
  4. Tekstbeskedprocessor og filtre
  5. Tilføjelse af kommandoer med parametre
  6. Kør botten i baggrunden
  7. Konklusion

Opdateringsklasse

Updater er en klasse der gør det nemmere for dig at udvikle en telegram bot, og bruger klassen under motorhjelmen Dispetcher. Klasseopgave Updater er at modtage opdateringer fra botten (i den forrige artikel brugte vi metoden til dette formål getUpdates()), og overfør dem videre til Dispetcher.

Til gengæld Dispetcher indeholder de handlere du har oprettet, dvs. klasseobjekter Handler.

Håndtere - handlere

Med handlere du tilføjer til Dispetcher bot-reaktioner på forskellige begivenheder. På tidspunktet for skrivning af denne artikel i telegram.bot Følgende typer behandlere er blevet tilføjet:

  • MessageHandler — Beskedhåndtering
  • CommandHandler — Kommandobehandler
  • CallbackQueryHandler — Databehandler for tastaturer sendt fra Inline
  • ErrorHandler — Fejlhåndtering ved anmodning om opdateringer fra botten

Tilføj den første kommando til botten, kommandohandler

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

Vi starter med simple kommandoer, dvs. lad os lære vores bot at sige hej på kommando /hi.

Kode 1: At lære botten at sige hej

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

Kør kodeeksemplet ovenfor, efter at have erstattet 'DIN BOTTOKEN' med den rigtige token, du modtog, da du oprettede botten via BotFader (Jeg talte om at oprette en bot i første artikel).

fremgangsmåde start_polling() klasse Updater, som bruges i slutningen af ​​koden, starter en endeløs løkke af anmodning og behandling af opdateringer fra botten.

Lad os nu åbne Telegram og skrive den første kommando til vores bot /hi.

Skrivning af en telegram-bot i R (del 2): ​​Tilføjelse af kommandostøtte og beskedfiltre til botten

Nu forstår vores bot kommandoen /hi, og ved, hvordan man hilser på os.

Skematisk kan processen med at bygge en sådan simpel bot afbildes som følger.

Skrivning af en telegram-bot i R (del 2): ​​Tilføjelse af kommandostøtte og beskedfiltre til botten

  1. Opret en forekomst af klassen Updater;
  2. Vi skaber metoder, dvs. funktioner, som vores bot vil udføre. I kodeeksemplet er dette en funktion say_hello(). De funktioner, du vil bruge som bot-metoder, skal have to påkrævede argumenter - bot и opdatering, og en valgfri - args. Argument bot, dette er din bot, med dens hjælp kan du svare på beskeder, sende beskeder eller bruge andre metoder, der er tilgængelige for botten. Argument opdatering dette er hvad botten modtog fra brugeren, faktisk hvad vi modtog i den første artikel ved hjælp af metoden getUpdates(). Argument args giver dig mulighed for at behandle yderligere data sendt af brugeren sammen med kommandoen, vi vender tilbage til dette emne lidt senere;
  3. Vi opretter handlere, dvs. Vi knytter nogle brugerhandlinger til de metoder, der blev oprettet i det foregående trin. Grundlæggende er en handler en trigger, en hændelse, der kalder en bot-funktion. I vores eksempel er en sådan trigger at sende en kommando /hi, og implementeres af teamet hi_hendler <- CommandHandler('hi', say_hello). Første funktionsargument CommandHandler() giver dig mulighed for at angive en kommando, i vores tilfælde hi, som botten vil reagere på. Det andet argument giver dig mulighed for at angive bot-metoden, vi vil kalde metoden say_hello, som vil blive udført, hvis brugeren kaldte kommandoen angivet i det første argument;
  4. Dernæst tilføjer vi den oprettede handler til dispatcheren af ​​vores klasseinstans Updater. Du kan tilføje handlere på flere måder; i eksemplet ovenfor brugte jeg den enkleste ved at bruge tegnet +, dvs. updater <- updater + hi_hendler. Det samme kan gøres ved hjælp af metoden add_handler(), som hører til klassen Dispatcher, kan du finde denne metode som denne: updater$dispatcher$add_handler();
  5. Start botten ved hjælp af kommandoen start_polling().

Tekstbeskedprocessor og filtre

Vi fandt ud af, hvordan man sender kommandoer til botten, men nogle gange har vi brug for, at botten ikke kun reagerer på kommandoer, men også på nogle almindelige tekstbeskeder. For at gøre dette skal du bruge meddelelsesbehandlere − MessageHandler.

Normal MessageHandler vil svare på absolut alle indgående beskeder. Derfor bruges beskedhåndtering ofte sammen med filtre. Lad os lære botten at sige hej ikke kun på kommando /hi, men også når et af følgende ord vises i den besked, der sendes til botten: hej, hej, hilsen, hai, bonjour.

For nu vil vi ikke skrive nogen nye metoder, fordi... Vi har allerede en metode, hvorved botten hilser os. Alt, hvad vi skal gøre, er at oprette det nødvendige filter og meddelelseshåndtering.

Kode 2: Tilføj en tekstbeskedbehandler 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()

Kør kodeeksemplet ovenfor, efter at have erstattet 'DIN BOTTOKEN' med den rigtige token, du modtog, da du oprettede botten via BotFader (Jeg talte om at oprette en bot i første artikel).

Lad os nu prøve at sende botten flere beskeder, der indeholder de hilsener, der er anført tidligere:
Skrivning af en telegram-bot i R (del 2): ​​Tilføjelse af kommandostøtte og beskedfiltre til botten

Så først og fremmest lærte vi botten ikke bare at sige hej, men at svare på en hilsen. Det gjorde vi ved at bruge argumentet svar_på_meddelelses-id, som er tilgængelig i metoden sendMessage(), hvor du skal overføre id'et for den besked, du vil svare på. Du kan få besked-id'et sådan her: update$message$message_id.

Men det vigtigste, vi gjorde, var at tilføje et filter 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 Meddelelsesfiltre, som i første omgang allerede indeholder et lille sæt færdige filtre. I vores eksempel til objektet Meddelelsesfiltre vi tilføjede et element hi, dette er et nyt filter.

I funktion BaseFilter() du skal bestå filterfunktionen. Grundlæggende er et filter blot en funktion, der modtager en meddelelsesforekomst og returnerer TRUE eller FALSK. I vores eksempel skrev vi en simpel funktion, der ved hjælp af den grundlæggende funktion grepl() kontrollerer beskedteksten, og om den matcher det regulære udtryk привет|здравствуй|салют|хай|бонжур vender tilbage TRUE.

Dernæst opretter vi en beskedhåndtering hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi). Første funktionsargument MessageHandler() er den metode, der kalder behandleren, og det andet argument er det filter, som det vil blive kaldt. I vores tilfælde er dette det filter, vi har oprettet MessageFilters$hi.

Nå, i sidste ende tilføjer vi den oprettede handler til afsenderen hej_txt_hnd.

updater <- updater + 
             hi_hendler +
             hi_txt_hnd

Som jeg skrev ovenfor, i pakken telegram.bot og objekt Meddelelsesfiltre Der er allerede et sæt indbyggede filtre, som du kan bruge:

  • alle — Alle beskeder
  • tekst — SMS-beskeder
  • kommando — Kommandoer, dvs. beskeder, der starter med /
  • svar — Beskeder, der er et svar på en anden besked
  • lyd — Beskeder, der indeholder en lydfil
  • dokument — Beskeder med et sendt dokument
  • foto - Beskeder med sendte billeder
  • mærkat — Beskeder med et sendt mærkat
  • video — Beskeder med video
  • stemme - Talebeskeder
  • kontakt — Beskeder, der indeholder brugerens telegramindhold
  • placering — Beskeder med geoplacering
  • mødested — videresendte beskeder
  • spil — Spil

Hvis du vil kombinere nogle filtre i én handler, skal du bare bruge tegnet | - som en logisk OR, og underskriv & som logisk И. Hvis du f.eks. ønsker, at botten skal kalde den samme metode, når den modtager en video, et billede eller et dokument, skal du bruge følgende eksempel til at oprette en meddelelsesbehandler:

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 tvinger botten til at udføre den ønskede kommando. Men i nogle tilfælde skal vi ud over kommandonavnet videregive nogle data for at udføre det.

Nedenfor er et eksempel på en bot, der givet en given dato og land returnerer dagtypen fra produktionskalenderen.

Botten nedenfor bruger produktionskalender-API'en isdayoff.ru.

Kode 3: Bot, der rapporterer efter 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()

Kør kodeeksemplet ovenfor, efter at have erstattet 'DIN BOTTOKEN' med den rigtige token, du modtog, da du oprettede botten via BotFader (Jeg talte om at oprette en bot i første artikel).

Vi skabte en bot, der kun har én metode i sit arsenal check_date, kaldes denne metode af kommandoen af ​​samme navn.

Men ud over kommandonavnet kræver denne metode, at du indtaster to parametre, landekoden og datoen. Derefter tjekker botten, om en given dag i det angivne land er en weekend, en forkortet dag eller en arbejdsdag i henhold til den officielle produktionskalender.

For at den metode, vi opretter, kan acceptere yderligere parametre sammen med kommandoen, skal du bruge argumentet pass_args = TRUE i funktion CommandHandler(), og ved oprettelse af en metode, ud over de nødvendige argumenter bot, opdatering opret en valgfri - args. Metoden, der er oprettet på denne måde, vil acceptere de parametre, som du sender til botten efter kommandonavnet. Parametrene skal adskilles med et mellemrum, de vil blive sendt til metoden som en tekstvektor.

Lad os starte og teste vores bot.

Skrivning af en telegram-bot i R (del 2): ​​Tilføjelse af kommandostøtte og beskedfiltre til botten

Kør botten i baggrunden

Det sidste trin, vi skal fuldføre, er at starte botten i baggrunden.

For at gøre dette skal du følge algoritmen beskrevet nedenfor:

  1. Gem bot-koden i en fil med filtypenavnet R. Når du arbejder i RStudio, sker dette via menuen File (Felt), hold Gem som….
  2. Tilføj stien til bin-mappen, som igen er placeret i den mappe, hvor du installerede R-sproget, til stien-variablen, instruktioner her.
  3. Opret en almindelig tekstfil, hvori skriv 1 linje: R CMD BATCH C:UsersAlseyDocumentsmy_bot.R. I stedet for C:UsersAlseyDocumentsmy_bot.R skriv stien til dit bot-script. Samtidig er det vigtigt, at der ikke er kyrilliske tegn eller mellemrum undervejs, pga dette kan forårsage problemer, når du kører botten. Gem den, og udskift dens forlængelse med txtbatte.
  4. Åbn Windows Task Scheduler, der er mange måder at gøre dette på, for eksempel åbne en hvilken som helst mappe og indtast adressen %windir%system32taskschd.msc /s. Andre lanceringsmetoder kan findes her.
  5. Klik på "Opret opgave..." i menuen øverst til højre i planlægningsprogrammet.
  6. Giv din opgave et brugerdefineret navn på fanen "Generelt", og skift kontakten til tilstanden "Kør for alle brugere".
  7. Gå til fanen "Handlinger", klik på "Opret". I feltet "Program eller script", klik på "Gennemse", find den, der blev oprettet i andet trin batte fil og klik på OK.
  8. Klik på OK, og indtast om nødvendigt adgangskoden til din operativsystemkonto.
  9. Find den oprettede opgave i skemalæggeren, vælg den og klik på knappen "Kør" i nederste højre hjørne.

Vores bot kører i baggrunden og vil arbejde, indtil du stopper opgaven eller slukker for din pc eller server, som den blev lanceret på.

Konklusion

I denne artikel fandt vi ud af, hvordan man skriver en fuldgyldig bot, der ikke kun kan sende beskeder, men også svare på indgående beskeder og kommandoer. Den opnåede viden er allerede nok til at løse de fleste af dine problemer.

Den næste artikel vil tale om, hvordan man tilføjer et tastatur til botten for mere bekvemt arbejde.

Abonner på min telegram и youtube kanaler.

Kilde: www.habr.com

Tilføj en kommentar