Ysgrifennu bot telegram yn R (rhan 2): Ychwanegu cefnogaeth gorchymyn a hidlwyr neges i'r bot

В cyhoeddiad blaenorol fe wnaethom ddarganfod sut i greu bot, cychwyn enghraifft o'r dosbarth Bot a daeth yn gyfarwydd â'r dulliau o anfon negeseuon gan ei ddefnyddio.

Yn yr erthygl hon rwy'n parhau â'r pwnc hwn, felly rwy'n argymell dechrau darllen yr erthygl hon dim ond ar ôl darllen y rhan gyntaf.

Y tro hwn byddwn yn darganfod sut i adfywio ein bot ac ychwanegu cefnogaeth gorchymyn iddo, a hefyd dod yn gyfarwydd â'r dosbarth Updater.

Yn ystod yr erthygl, byddwn yn ysgrifennu sawl bot syml, bydd yr olaf, yn seiliedig ar ddyddiad a chod gwlad penodol, yn penderfynu a yw diwrnod mewn gwlad benodol yn benwythnos neu'n ddiwrnod gwaith yn ôl y calendr cynhyrchu. Ond, fel o'r blaen, pwrpas yr erthygl yw eich ymgyfarwyddo â'r rhyngwyneb pecyn telegram.bot i ddatrys eich problemau eich hun.

Ysgrifennu bot telegram yn R (rhan 2): Ychwanegu cefnogaeth gorchymyn a hidlwyr neges i'r bot

Pob erthygl o'r gyfres “Ysgrifennu bot telegram yn R”

  1. Rydyn ni'n creu bot ac yn ei ddefnyddio i anfon negeseuon mewn telegram
  2. Ychwanegu cefnogaeth gorchymyn a hidlwyr neges i'r bot

Cynnwys

Os oes gennych ddiddordeb mewn dadansoddi data, efallai y bydd gennych ddiddordeb yn fy telegram и youtube sianeli. Mae'r rhan fwyaf o'r cynnwys wedi'i neilltuo i'r iaith R.

  1. Dosbarth diweddaru
  2. Trinwyr - trinwyr
  3. Ychwanegwch y gorchymyn cyntaf i'r bot, triniwr gorchymyn
  4. Prosesydd neges destun a hidlwyr
  5. Ychwanegu Gorchmynion gyda Pharamedrau
  6. Rhedeg y bot yn y cefndir
  7. Casgliad

Dosbarth diweddaru

Updater yn ddosbarth sy'n ei gwneud hi'n haws i chi ddatblygu bot telegram, ac yn defnyddio'r dosbarth o dan y cwfl Dispetcher. Aseiniad dosbarth Updater yw derbyn diweddariadau gan y bot (yn yr erthygl flaenorol fe wnaethom ddefnyddio'r dull at y diben hwn getUpdates()), a'u trosglwyddo ymhellach i Dispetcher.

Yn ei dro Dispetcher yn cynnwys y trinwyr a grëwyd gennych, h.y. gwrthrychau dosbarth Handler.

Trinwyr - trinwyr

Gyda thrinwyr rydych chi'n ychwanegu atynt Dispetcher ymatebion bot i ddigwyddiadau amrywiol. Ar adeg ysgrifennu'r erthygl hon yn telegram.bot Ychwanegwyd y mathau canlynol o drinwyr:

  • MessageHandler - Triniwr negeseuon
  • CommandHandler - Triniwr gorchymyn
  • CallbackQueryHandler - Triniwr data ar gyfer bysellfyrddau a anfonwyd o Inline
  • ErrorHandler - Triniwr gwall wrth ofyn am ddiweddariadau gan y bot

Ychwanegwch y gorchymyn cyntaf i'r bot, triniwr gorchymyn

Os nad ydych erioed wedi defnyddio bots o'r blaen a ddim yn gwybod beth yw gorchymyn, yna rhaid anfon gorchmynion i'r bot gan ddefnyddio blaenslaes / fel rhagddodiad.

Byddwn yn dechrau gyda gorchmynion syml, h.y. gadewch i ni ddysgu ein bot i ddweud helo ar orchymyn /hi.

Cod 1: Dysgu'r bot i ddweud helo

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

Rhedeg yr enghraifft cod uchod, ar ôl amnewid 'EICH BOT TOKEN' gyda'r tocyn go iawn a gawsoch wrth greu'r bot trwy Tad Bot (Siaradais am greu bot yn erthygl gyntaf).

Dull start_polling() dosbarth Updater, a ddefnyddir ar ddiwedd y cod, yn cychwyn dolen ddiddiwedd o ofyn a phrosesu diweddariadau o'r bot.

Nawr gadewch i ni agor Telegram ac ysgrifennu'r gorchymyn cyntaf i'n bot /hi.

Ysgrifennu bot telegram yn R (rhan 2): Ychwanegu cefnogaeth gorchymyn a hidlwyr neges i'r bot

Nawr mae ein bot yn deall y gorchymyn /hi, ac yn gwybod sut i'n cyfarch.

Yn sgematig, gellir darlunio'r broses o adeiladu bot mor syml fel a ganlyn.

Ysgrifennu bot telegram yn R (rhan 2): Ychwanegu cefnogaeth gorchymyn a hidlwyr neges i'r bot

  1. Creu enghraifft o'r dosbarth Updater;
  2. Rydym yn creu dulliau, h.y. swyddogaethau y bydd ein bot yn eu cyflawni. Yn yr enghraifft cod mae hon yn swyddogaeth say_hello(). Rhaid i'r swyddogaethau y byddwch yn eu defnyddio fel dulliau bot fod â dwy ddadl ofynnol - bot и diweddariad, ac un dewisol - args. Dadl bot, dyma'ch bot, gyda'i help gallwch chi ateb negeseuon, anfon negeseuon, neu ddefnyddio unrhyw ddulliau eraill sydd ar gael i'r bot. Dadl diweddariad dyma'r hyn a gafodd y bot gan y defnyddiwr, mewn gwirionedd, yr hyn a gawsom yn yr erthygl gyntaf gan ddefnyddio'r dull getUpdates(). Dadl args yn eich galluogi i brosesu data ychwanegol a anfonwyd gan y defnyddiwr ynghyd â'r gorchymyn, byddwn yn dychwelyd i'r pwnc hwn ychydig yn ddiweddarach;
  3. Rydym yn creu trinwyr, h.y. Rydym yn cysylltu rhai gweithredoedd defnyddwyr â'r dulliau a grëwyd yn y cam blaenorol. Yn y bôn, mae triniwr yn sbardun, digwyddiad sy'n galw rhywfaint o swyddogaeth bot. Yn ein hesiampl, sbardun o'r fath yw anfon gorchymyn /hi, ac yn cael ei weithredu gan y tîm hi_hendler <- CommandHandler('hi', say_hello). Dadl swyddogaeth gyntaf CommandHandler() yn caniatáu ichi nodi gorchymyn, yn ein hachos ni hi, y bydd y bot yn ymateb iddo. Mae'r ail ddadl yn caniatáu ichi nodi'r dull bot, byddwn yn galw'r dull say_hello, a weithredir os galwodd y defnyddiwr y gorchymyn a nodir yn y ddadl gyntaf;
  4. Nesaf, rydyn ni'n ychwanegu'r triniwr a grëwyd at anfonwr ein hachos dosbarth Updater. Gallwch ychwanegu trinwyr mewn sawl ffordd; yn yr enghraifft uchod, defnyddiais yr un symlaf, gan ddefnyddio'r arwydd +, h.y. updater <- updater + hi_hendler. Gellir gwneud yr un peth gan ddefnyddio'r dull add_handler(), sy'n perthyn i'r dosbarth Dispatcher, gallwch ddod o hyd i'r dull hwn fel hyn: updater$dispatcher$add_handler();
  5. Lansiwch y bot gan ddefnyddio'r gorchymyn start_polling().

Prosesydd neges destun a hidlwyr

Fe wnaethon ni ddarganfod sut i anfon gorchmynion i'r bot, ond weithiau mae angen i'r bot ymateb nid yn unig i orchmynion, ond hefyd i rai negeseuon testun rheolaidd. I wneud hyn mae angen i chi ddefnyddio trinwyr negeseuon - Triniwr Neges.

Normal Triniwr Neges yn ymateb i bob neges sy'n dod i mewn. Felly, mae trinwyr negeseuon yn aml yn cael eu defnyddio ynghyd â hidlwyr. Gadewch i ni ddysgu'r bot i ddweud helo nid yn unig ar orchymyn /hi, ond hefyd pryd bynnag y bydd un o'r geiriau canlynol yn ymddangos yn y neges a anfonwyd at y bot: helo, helo, saliwt, hai, bonjour.

Am y tro ni fyddwn yn ysgrifennu unrhyw ddulliau newydd, oherwydd ... Mae gennym eisoes ddull y mae'r bot yn ein cyfarch. Y cyfan sydd angen i ni ei wneud yw creu'r hidlydd a'r peiriant trin negeseuon gofynnol.

Cod 2: Ychwanegu triniwr negeseuon testun a hidlydd

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

Rhedeg yr enghraifft cod uchod, ar ôl amnewid 'EICH BOT TOKEN' gyda'r tocyn go iawn a gawsoch wrth greu'r bot trwy Tad Bot (Siaradais am greu bot yn erthygl gyntaf).

Nawr, gadewch i ni geisio anfon sawl neges at y bot yn cynnwys y geiriau cyfarch a restrir yn gynharach:
Ysgrifennu bot telegram yn R (rhan 2): Ychwanegu cefnogaeth gorchymyn a hidlwyr neges i'r bot

Felly, yn gyntaf oll, fe wnaethon ni ddysgu'r bot nid yn unig i ddweud helo, ond i ymateb i gyfarchiad. Gwnaethom hyn gan ddefnyddio'r ddadl ateb_i_neges_id, sydd ar gael yn y dull sendMessage(), y mae angen i chi drosglwyddo id y neges yr ydych am ymateb iddi. Gallwch chi gael ID y neges fel hyn: update$message$message_id.

Ond y prif beth a wnaethom oedd ychwanegu hidlydd i'r bot gan ddefnyddio'r ffwythiant BaseFilter():

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

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

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

)

Fel efallai y byddwch wedi sylwi, mae angen ychwanegu hidlwyr at y gwrthrych MessageFilters, sydd i ddechrau eisoes yn cynnwys set fach o hidlwyr parod. Yn ein hesiampl, at y gwrthddrych MessageFilters ychwanegon ni elfen hi, mae hwn yn hidlydd newydd.

I weithredu BaseFilter() mae angen i chi basio'r swyddogaeth hidlo. Yn y bôn, dim ond swyddogaeth sy'n derbyn enghraifft neges ac yn dychwelyd yw hidlydd TRUE neu Anghywir. Yn ein hesiampl, fe wnaethom ysgrifennu swyddogaeth syml sydd, gan ddefnyddio'r swyddogaeth sylfaenol grepl() yn gwirio testun y neges ac a yw'n cyfateb i'r mynegiant arferol привет|здравствуй|салют|хай|бонжур yn dychwelyd TRUE.

Nesaf rydym yn creu triniwr negeseuon hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi). Dadl swyddogaeth gyntaf MessageHandler() yw'r dull a fydd yn galw'r triniwr, a'r ail arg yw'r hidlydd trwy ba un y caiff ei alw. Yn ein hachos ni, dyma'r hidlydd a grëwyd gennym MessageFilters$hi.

Wel, yn y diwedd, rydyn ni'n ychwanegu'r triniwr a grëwyd at yr anfonwr hi_txt_hnd.

updater <- updater + 
             hi_hendler +
             hi_txt_hnd

Fel yr ysgrifennais uchod, yn y pecyn telegram.bot a gwrthrych MessageFilters Mae set o hidlwyr adeiledig eisoes y gallwch eu defnyddio:

  • i gyd — Pob neges
  • testun — Negeseuon testun
  • gorchymyn — Gorchmynion, h.y. negeseuon sy'n dechrau /
  • ateb - Negeseuon sy'n ateb i neges arall
  • sain — Negeseuon yn cynnwys ffeil sain
  • dogfen — Negeseuon gyda dogfen a anfonwyd
  • llun - Negeseuon gyda delweddau a anfonwyd
  • sticer - Negeseuon gyda sticer wedi'i anfon
  • fideo - Negeseuon gyda fideo
  • llais - Negeseuon llais
  • cyswllt - Negeseuon sy'n cynnwys cynnwys telegram y defnyddiwr
  • lleoliad - Negeseuon gyda geolocation
  • lleoliad - Negeseuon wedi'u hanfon ymlaen
  • gem — Gemau

Os ydych chi eisiau cyfuno rhai hidlwyr mewn un triniwr defnyddiwch yr arwydd | - fel rhesymeg NEU, ac arwydd & mor rhesymegol И. Er enghraifft, os ydych chi am i'r bot alw'r un dull pan fydd yn derbyn fideo, delwedd neu ddogfen, defnyddiwch yr enghraifft ganlynol i greu triniwr neges:

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

Ychwanegu Gorchmynion gyda Pharamedrau

Rydym eisoes yn gwybod beth yw gorchmynion, sut i'w creu, a sut i orfodi'r bot i weithredu'r gorchymyn a ddymunir. Ond mewn rhai achosion, yn ychwanegol at yr enw gorchymyn, mae angen i ni basio rhywfaint o ddata i'w weithredu.

Isod mae enghraifft o bot sydd, o ystyried dyddiad a gwlad benodol, yn dychwelyd y math o ddiwrnod o'r calendr cynhyrchu i chi.

Mae'r bot isod yn defnyddio'r API calendr cynhyrchu isdayoff.ru.

Cod 3: Bot sy'n adrodd yn ôl dyddiad a gwlad

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

Rhedeg yr enghraifft cod uchod, ar ôl amnewid 'EICH BOT TOKEN' gyda'r tocyn go iawn a gawsoch wrth greu'r bot trwy Tad Bot (Siaradais am greu bot yn erthygl gyntaf).

Fe wnaethon ni greu bot sydd ag un dull yn unig yn ei arsenal check_date, gelwir y dull hwn trwy orchymyn yr un enw.

Ond, yn ychwanegol at yr enw gorchymyn, mae'r dull hwn yn gofyn ichi nodi dau baramedr, y cod gwlad a'r dyddiad. Nesaf, mae'r bot yn gwirio a yw diwrnod penodol yn y wlad benodedig yn benwythnos, yn ddiwrnod byrrach, neu'n ddiwrnod gwaith yn ôl y calendr cynhyrchu swyddogol.

Er mwyn i'r dull rydyn ni'n ei greu dderbyn paramedrau ychwanegol ynghyd â'r gorchymyn, defnyddiwch y ddadl pass_args = TRUE mewn swyddogaeth CommandHandler(), ac wrth greu dull, yn ychwanegol at y dadleuon gofynol bot, diweddariad creu un dewisol - args. Bydd y dull a grëwyd yn y modd hwn yn derbyn y paramedrau rydych chi'n eu trosglwyddo i'r bot ar ôl yr enw gorchymyn. Rhaid i'r paramedrau gael eu gwahanu gan ofod; byddant yn cael eu hanfon at y dull fel fector testun.

Gadewch i ni lansio a phrofi ein bot.

Ysgrifennu bot telegram yn R (rhan 2): Ychwanegu cefnogaeth gorchymyn a hidlwyr neges i'r bot

Rhedeg y bot yn y cefndir

Y cam olaf y mae angen i ni ei gwblhau yw lansio'r bot yn y cefndir.

I wneud hyn, dilynwch yr algorithm a ddisgrifir isod:

  1. Cadwch y cod bot i ffeil gyda'r estyniad R. Wrth weithio yn RStudio, gwneir hyn trwy'r ddewislen Ffeil, tîm Arbedwch Fel ....
  2. Ychwanegwch y llwybr i'r ffolder bin, sydd yn ei dro wedi'i leoli yn y ffolder y gwnaethoch chi osod yr iaith R ynddo, i'r newidyn Llwybr, cyfarwyddiadau yma.
  3. Creu ffeil testun rheolaidd lle ysgrifennwch 1 llinell: R CMD BATCH C:UsersAlseyDocumentsmy_bot.R... Yn lle C:UsersAlseyDocumentsmy_bot.R ysgrifennwch y llwybr i'ch sgript bot. Ar yr un pryd, mae'n bwysig nad oes unrhyw gymeriadau neu fylchau Cyrilig ar hyd y ffordd, oherwydd gall hyn achosi problemau wrth redeg y bot. Arbedwch ef, a gosodwch ei estyniad yn ei le txt ar fatio.
  4. Agor Windows Task Scheduler, mae yna lawer o ffyrdd o wneud hyn, er enghraifft, agor unrhyw ffolder a nodi'r cyfeiriad %windir%system32taskschd.msc /s. Gellir dod o hyd i ddulliau lansio eraill yma.
  5. Yn newislen dde uchaf y rhaglennydd, cliciwch "Creu tasg...".
  6. Ar y tab "Cyffredinol", rhowch enw arferol i'ch tasg, a newidiwch y switsh i'r cyflwr "Rhedeg i bob defnyddiwr".
  7. Ewch i'r tab "Camau Gweithredu", cliciwch "Creu". Yn y maes "Rhaglen neu sgript", cliciwch "Pori", darganfyddwch yr un a grëwyd yn yr ail gam fatio ffeil a chliciwch OK.
  8. Cliciwch OK ac, os oes angen, nodwch y cyfrinair ar gyfer eich cyfrif system weithredu.
  9. Dewch o hyd i'r dasg a grëwyd yn y rhaglennydd, dewiswch hi a chliciwch ar y botwm "Run" yn y gornel dde isaf.

Mae ein bot yn rhedeg yn y cefndir a bydd yn gweithio nes i chi roi'r gorau i'r dasg, neu ddiffodd eich cyfrifiadur personol neu weinydd y cafodd ei lansio arno.

Casgliad

Yn yr erthygl hon, fe wnaethom ddarganfod sut i ysgrifennu bot llawn a all nid yn unig anfon negeseuon, ond hefyd ymateb i negeseuon a gorchmynion sy'n dod i mewn. Mae'r wybodaeth a enillwyd eisoes yn ddigon i ddatrys y rhan fwyaf o'ch problemau.

Bydd yr erthygl nesaf yn sôn am sut i ychwanegu bysellfwrdd at y bot ar gyfer gwaith mwy cyfleus.

Tanysgrifiwch i fy telegram и youtube sianeli.

Ffynhonnell: hab.com

Ychwanegu sylw