Skriva en telegrambot i R (del 2): ​​Lägga till kommandostöd och meddelandefilter till boten

В tidigare publicering vi kom på hur man skapar en bot, initierade en instans av klassen Bot och blev bekant med metoderna för att skicka meddelanden med den.

I den här artikeln fortsätter jag detta ämne, så jag rekommenderar att du börjar läsa den här artikeln först efter att ha läst den första delen.

Den här gången kommer vi att ta reda på hur vi ska återuppliva vår bot och lägga till kommandostöd till den, och även bekanta oss med klassen Updater.

Under artikelns gång kommer vi att skriva flera enkla bots, de senare kommer, baserat på ett givet datum och landskod, att avgöra om en dag i ett givet land är en helg eller en arbetsdag enligt produktionskalendern. Men som tidigare är syftet med artikeln att bekanta dig med paketgränssnittet telegram.bot att lösa dina egna problem.

Skriva en telegrambot i R (del 2): ​​Lägga till kommandostöd och meddelandefilter till boten

Alla artiklar från serien "Att skriva en telegrambot i R"

  1. Vi skapar en bot och använder den för att skicka meddelanden i telegram
  2. Lägg till kommandostöd och meddelandefilter till boten

Innehåll

Om du är intresserad av dataanalys kan du vara intresserad av min telegram и Youtube kanaler. Det mesta av innehållet är tillägnat R-språket.

  1. Uppdateringsklass
  2. Hanterare - hanterare
  3. Lägg till det första kommandot till boten, kommandohanterare
  4. Textmeddelandeprocessor och filter
  5. Lägga till kommandon med parametrar
  6. Kör boten i bakgrunden
  7. Slutsats

Uppdateringsklass

Updater är en klass som gör det lättare för dig att utveckla en telegrambot, och använder klassen under huven Dispetcher. Klassuppgift Updater är att ta emot uppdateringar från boten (i föregående artikel använde vi metoden för detta ändamål getUpdates()), och överför dem vidare till Dispetcher.

I sin tur Dispetcher innehåller hanterarna du skapat, dvs. klassobjekt Handler.

Hanterare - hanterare

Med hanterare du lägger till Dispetcher bot-reaktioner på olika händelser. Vid tidpunkten för att skriva denna artikel i telegram.bot Följande typer av hanterare har lagts till:

  • MessageHandler — Meddelandehanterare
  • CommandHandler — Kommandohanterare
  • CallbackQueryHandler — Datahanterare för tangentbord skickade från Inline
  • ErrorHandler — Felhanterare när du begär uppdateringar från boten

Lägg till det första kommandot till boten, kommandohanterare

Om du aldrig har använt botar tidigare och inte vet vad ett kommando är, måste kommandon till boten skickas med ett snedstreck / som ett prefix.

Vi börjar med enkla kommandon, d.v.s. låt oss lära vår bot att säga hej på kommando /hi.

Kod 1: Lär boten att säga 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 kodexemplet ovan, efter att ha ersatt 'DIN BOTTOKEN' med den riktiga token du fick när du skapade boten via BotFader (Jag pratade om att skapa en bot i första artikeln).

metod start_polling() klass Updater, som används i slutet av koden, startar en oändlig loop av begäran och bearbetning av uppdateringar från boten.

Låt oss nu öppna Telegram och skriva det första kommandot till vår bot /hi.

Skriva en telegrambot i R (del 2): ​​Lägga till kommandostöd och meddelandefilter till boten

Nu förstår vår bot kommandot /hi, och vet hur man hälsar på oss.

Schematiskt kan processen att bygga en så enkel bot avbildas enligt följande.

Skriva en telegrambot i R (del 2): ​​Lägga till kommandostöd och meddelandefilter till boten

  1. Skapa en instans av klassen Updater;
  2. Vi skapar metoder, d.v.s. funktioner som vår bot kommer att utföra. I kodexemplet är detta en funktion say_hello(). Funktionerna som du kommer att använda som botmetoder måste ha två obligatoriska argument - bot и uppdatering, och en valfri - argumenterar. Argument bot, det här är din bot, med dess hjälp kan du svara på meddelanden, skicka meddelanden eller använda andra metoder som är tillgängliga för boten. Argument uppdatering detta är vad boten fick från användaren, faktiskt vad vi fick i den första artikeln med metoden getUpdates(). Argument argumenterar låter dig behandla ytterligare data som skickas av användaren tillsammans med kommandot, vi kommer att återkomma till detta ämne lite senare;
  3. Vi skapar hanterare, d.v.s. Vi associerar vissa användaråtgärder med metoderna som skapades i föregående steg. I huvudsak är en hanterare en trigger, en händelse som anropar någon botfunktion. I vårt exempel är en sådan trigger att skicka ett kommando /hi, och implementeras av teamet hi_hendler <- CommandHandler('hi', say_hello). Första funktionsargumentet CommandHandler() låter dig ange ett kommando, i vårt fall hi, som boten kommer att svara på. Det andra argumentet låter dig specificera botmetoden, vi kallar metoden say_hello, som kommer att köras om användaren anropade kommandot som anges i det första argumentet;
  4. Därefter lägger vi till den skapade hanteraren till dispatchern för vår klassinstans Updater. Du kan lägga till hanterare på flera sätt; i exemplet ovan använde jag den enklaste med tecknet +, d.v.s. updater <- updater + hi_hendler. Detsamma kan göras med metoden add_handler(), som tillhör klassen Dispatcher, kan du hitta den här metoden så här: updater$dispatcher$add_handler();
  5. Starta boten med kommandot start_polling().

Textmeddelandeprocessor och filter

Vi kom på hur man skickar kommandon till boten, men ibland behöver vi att boten inte bara svarar på kommandon utan också på vissa vanliga textmeddelanden. För att göra detta måste du använda meddelandehanterare − MessageHandler.

vanlig MessageHandler kommer att svara på absolut alla inkommande meddelanden. Därför används ofta meddelandehanterare tillsammans med filter. Låt oss lära boten att säga hej inte bara på kommando /hi, men också när ett av följande ord förekommer i meddelandet som skickas till boten: hej, hej, salute, hai, bonjour.

För nu kommer vi inte att skriva några nya metoder, eftersom... Vi har redan en metod som boten hälsar oss på. Allt vi behöver göra är att skapa det nödvändiga filtret och meddelandehanteraren.

Kod 2: Lägg till en textmeddelandehanterare och 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 kodexemplet ovan, efter att ha ersatt 'DIN BOTTOKEN' med den riktiga token du fick när du skapade boten via BotFader (Jag pratade om att skapa en bot i första artikeln).

Låt oss nu försöka skicka flera meddelanden till boten som innehåller hälsningsorden som listades tidigare:
Skriva en telegrambot i R (del 2): ​​Lägga till kommandostöd och meddelandefilter till boten

Så först och främst lärde vi boten att inte bara säga hej, utan att svara på en hälsning. Vi gjorde detta med hjälp av argumentet reply_to_message_id, som är tillgänglig i metoden sendMessage(), som du måste överföra id för meddelandet som du vill svara på. Du kan få meddelande-id så här: update$message$message_id.

Men det viktigaste vi gjorde var att lägga till ett filter till boten med hjälp av funktionen BaseFilter():

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

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

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

)

Som du kanske har märkt måste filter läggas till objektet Meddelandefilter, som till en början redan innehåller en liten uppsättning färdiga filter. I vårt exempel, till objektet Meddelandefilter vi lade till ett element hi, detta är ett nytt filter.

I funktion BaseFilter() du måste klara filterfunktionen. I huvudsak är ett filter bara en funktion som tar emot en meddelandeinstans och returnerar SANN eller FALSK. I vårt exempel skrev vi en enkel funktion som använder den grundläggande funktionen grepl() kontrollerar meddelandetexten och om den matchar det reguljära uttrycket привет|здравствуй|салют|хай|бонжур returnerar SANN.

Därefter skapar vi en meddelandehanterare hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi). Första funktionsargumentet MessageHandler() är metoden som kommer att anropa hanteraren, och det andra argumentet är filtret som det kommer att anropas med. I vårt fall är det här filtret vi skapade MessageFilters$hi.

Tja, i slutändan lägger vi till den skapade hanteraren till avsändaren hej_txt_hnd.

updater <- updater + 
             hi_hendler +
             hi_txt_hnd

Som jag skrev ovan, i paketet telegram.bot och objekt Meddelandefilter Det finns redan en uppsättning inbyggda filter som du kan använda:

  • alla — Alla meddelanden
  • text — SMS
  • kommando — Kommandon, d.v.s. meddelanden som börjar med /
  • svar — Meddelanden som är ett svar på ett annat meddelande
  • ljud — Meddelanden som innehåller en ljudfil
  • dokument — Meddelanden med ett skickat dokument
  • foto - Meddelanden med skickade bilder
  • klistermärke — Meddelanden med ett skickat klistermärke
  • video — Meddelanden med video
  • röst – Röstmeddelanden
  • kontakt — Meddelanden som innehåller användarens telegraminnehåll
  • plats — Meddelanden med geolokalisering
  • plats — vidarebefordrade meddelanden
  • spel — Spel

Om du vill kombinera några filter i en hanterare använder du bara tecknet | - som en logisk ELLER, och underteckna & lika logiskt И. Om du till exempel vill att boten ska anropa samma metod när den tar emot en video, bild eller dokument, använd följande exempel för att skapa en meddelandehanterare:

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

Lägga till kommandon med parametrar

Vi vet redan vad kommandon är, hur man skapar dem och hur man tvingar boten att utföra det önskade kommandot. Men i vissa fall, förutom kommandonamnet, måste vi skicka en del data för att utföra det.

Nedan är ett exempel på en bot som, givet ett givet datum och land, returnerar dagtypen från produktionskalendern.

Boten nedan använder produktionskalenderns API isdayoff.ru.

Kod 3: Bot som rapporterar efter datum och 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 kodexemplet ovan, efter att ha ersatt 'DIN BOTTOKEN' med den riktiga token du fick när du skapade boten via BotFader (Jag pratade om att skapa en bot i första artikeln).

Vi skapade en bot som bara har en metod i sin arsenal check_date, den här metoden anropas av kommandot med samma namn.

Men förutom kommandonamnet kräver denna metod att du anger två parametrar, landskoden och datumet. Därefter kontrollerar boten om en given dag i det angivna landet är en helg, en förkortad dag eller en arbetsdag enligt den officiella produktionskalendern.

För att metoden vi skapar ska acceptera ytterligare parametrar tillsammans med kommandot, använd argumentet pass_args = TRUE i funktion CommandHandler(), och när du skapar en metod, utöver de nödvändiga argumenten bot, uppdatering skapa en valfri - argumenterar. Metoden som skapas på detta sätt kommer att acceptera parametrarna som du skickar till boten efter kommandonamnet. Parametrarna måste separeras med ett mellanslag, de kommer att skickas till metoden som en textvektor.

Låt oss starta och testa vår bot.

Skriva en telegrambot i R (del 2): ​​Lägga till kommandostöd och meddelandefilter till boten

Kör boten i bakgrunden

Det sista steget vi behöver slutföra är att starta boten i bakgrunden.

För att göra detta, följ algoritmen som beskrivs nedan:

  1. Spara botkoden till en fil med filtillägget R. När du arbetar i RStudio görs detta via menyn Fil, team Spara som….
  2. Lägg till sökvägen till bin-mappen, som i sin tur finns i mappen där du installerade R-språket, till variabeln Path, instruktioner här.
  3. Skapa en vanlig textfil där du skriver 1 rad: R CMD BATCH C:UsersAlseyDocumentsmy_bot.R. Istället för C:UsersAlseyDocumentsmy_bot.R skriv sökvägen till ditt botskript. Samtidigt är det viktigt att det inte finns några kyrilliska tecken eller mellanslag längs vägen, eftersom detta kan orsaka problem när du kör boten. Spara den och ersätt dess förlängning med Textbat.
  4. Öppna Windows Task Scheduler, det finns många sätt att göra detta, till exempel öppna valfri mapp och ange adressen %windir%system32taskschd.msc /s. Andra lanseringsmetoder kan hittas här.
  5. I den övre högra menyn i schemaläggaren klickar du på "Skapa uppgift...".
  6. På fliken "Allmänt", ge din uppgift ett anpassat namn och byt omkopplaren till läget "Kör för alla användare".
  7. Gå till fliken "Åtgärder", klicka på "Skapa". I fältet "Program eller skript", klicka på "Bläddra", hitta det som skapades i det andra steget bat fil och klicka på OK.
  8. Klicka på OK och, om det behövs, ange lösenordet för ditt operativsystemkonto.
  9. Hitta den skapade uppgiften i schemaläggaren, välj den och klicka på knappen "Kör" i det nedre högra hörnet.

Vår bot körs i bakgrunden och kommer att fungera tills du stoppar uppgiften, eller stänger av din dator eller server som den lanserades på.

Slutsats

I den här artikeln kom vi på hur man skriver en fullfjädrad bot som inte bara kan skicka meddelanden utan också svara på inkommande meddelanden och kommandon. Kunskapen du fått är redan tillräckligt för att lösa de flesta av dina problem.

Nästa artikel kommer att prata om hur man lägger till ett tangentbord till boten för mer bekvämt arbete.

Prenumerera på min telegram и Youtube kanaler.

Källa: will.com

Lägg en kommentar