Kuandika bot ya telegramu katika R (sehemu ya 2): Kuongeza msaada wa amri na vichungi vya ujumbe kwenye roboti

В uchapishaji uliopita tulifikiria jinsi ya kuunda bot, tukaanzisha mfano wa darasa Bot na kufahamu mbinu za kutuma ujumbe kwa kutumia.

Katika makala hii ninaendelea mada hii, kwa hiyo napendekeza kuanza kusoma makala hii tu baada ya kusoma sehemu ya kwanza.

Wakati huu tutafikiria jinsi ya kufufua bot yetu na kuongeza msaada wa amri kwake, na pia kufahamiana na darasa. Updater.

Wakati wa kifungu hicho, tutaandika roboti kadhaa rahisi, za mwisho, kulingana na tarehe fulani na nambari ya nchi, itaamua ikiwa siku katika nchi fulani ni wikendi au siku ya kazi kulingana na kalenda ya uzalishaji. Lakini, kama hapo awali, madhumuni ya kifungu ni kukujulisha na kiolesura cha kifurushi telegram.bot kutatua matatizo yako mwenyewe.

Kuandika bot ya telegramu katika R (sehemu ya 2): Kuongeza msaada wa amri na vichungi vya ujumbe kwenye roboti

Nakala zote kutoka kwa safu "Kuandika bot ya telegraph katika R"

  1. Tunaunda roboti na kuitumia kutuma ujumbe kwa telegramu
  2. Ongeza msaada wa amri na vichungi vya ujumbe kwenye roboti

yaliyomo

Ikiwa una nia ya uchambuzi wa data, unaweza kupendezwa na yangu telegram и youtube njia. Maudhui mengi yamejitolea kwa lugha ya R.

  1. Darasa la kusasisha
  2. Washughulikiaji - washughulikiaji
  3. Ongeza amri ya kwanza kwenye bot, kidhibiti cha amri
  4. Kichakataji cha ujumbe wa maandishi na vichujio
  5. Kuongeza Amri na Vigezo
  6. Endesha kijibu nyuma
  7. Hitimisho

Darasa la kusasisha

Updater ni darasa ambalo hukurahisishia kutengeneza telegramu bot, na hutumia darasa chini ya kofia Dispetcher. Mgawo wa darasa Updater ni kupokea sasisho kutoka kwa bot (katika makala iliyotangulia tulitumia njia kwa kusudi hili getUpdates()), na kuzihamisha zaidi kwa Dispetcher.

Kwa upande wake Dispetcher ina vidhibiti ulivyounda, i.e. vitu vya darasa Handler.

Washughulikiaji - washughulikiaji

Na vidhibiti unavyoongeza Dispetcher majibu ya bot kwa matukio mbalimbali. Wakati wa kuandika makala hii katika telegram.bot Aina zifuatazo za washughulikiaji zimeongezwa:

  • MessageHandler - Kidhibiti cha ujumbe
  • CommandHandler - Kidhibiti cha amri
  • CallbackQueryHandler - Kidhibiti data kwa kibodi zilizotumwa kutoka kwa Inline
  • ErrorHandler - Kidhibiti cha hitilafu wakati wa kuomba sasisho kutoka kwa bot

Ongeza amri ya kwanza kwenye bot, kidhibiti cha amri

Ikiwa haujawahi kutumia roboti hapo awali na haujui amri ni nini, basi amri kwa roboti lazima zitumwe kwa kufyeka mbele. / kama kiambishi awali.

Tutaanza na amri rahisi, i.e. hebu tufundishe bot yetu kusema hello kwenye amri /hi.

Msimbo wa 1: Kufundisha roboti kusema hujambo

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

Tekeleza mfano wa msimbo hapo juu, baada ya kubadilisha 'BOT TOKEN YAKO' na tokeni halisi uliyopokea wakati wa kuunda bot kupitia. BotBaba (Nilizungumza juu ya kuunda bot ndani makala ya kwanza).

Mbinu start_polling() tabaka la Updater, ambayo hutumiwa mwishoni mwa msimbo, huanza kitanzi kisicho na mwisho cha kuomba na kusasisha sasisho kutoka kwa bot.

Sasa hebu tufungue Telegramu na tuandike amri ya kwanza kwa bot yetu /hi.

Kuandika bot ya telegramu katika R (sehemu ya 2): Kuongeza msaada wa amri na vichungi vya ujumbe kwenye roboti

Sasa bot yetu inaelewa amri /hi, na anajua kutusalimia.

Kwa utaratibu, mchakato wa kujenga bot rahisi kama hii inaweza kuonyeshwa kama ifuatavyo.

Kuandika bot ya telegramu katika R (sehemu ya 2): Kuongeza msaada wa amri na vichungi vya ujumbe kwenye roboti

  1. Unda mfano wa darasa Updater;
  2. Tunaunda mbinu, i.e. kazi ambazo bot yetu itafanya. Katika mfano wa nambari hii ni kazi say_hello(). Kazi ambazo utatumia kama njia za bot lazima ziwe na hoja mbili zinazohitajika - bot и update, na chaguo moja - args. Hoja bot, hii ni bot yako, kwa usaidizi wake unaweza kujibu ujumbe, kutuma ujumbe, au kutumia mbinu nyingine zozote zinazopatikana kwenye roboti. Hoja update hii ndio bot ilipokea kutoka kwa mtumiaji, kwa kweli, kile tulichopokea katika makala ya kwanza kwa kutumia njia getUpdates(). Hoja args hukuruhusu kuchakata data ya ziada iliyotumwa na mtumiaji pamoja na amri, tutarudi kwenye mada hii baadaye kidogo;
  3. Tunaunda washughulikiaji, i.e. Tunahusisha baadhi ya vitendo vya mtumiaji na mbinu zilizoundwa katika hatua ya awali. Kimsingi, kidhibiti ni kichochezi, tukio ambalo huita utendakazi wa roboti. Katika mfano wetu, kichochezi kama hicho ni kutuma amri /hi, na inatekelezwa na timu hi_hendler <- CommandHandler('hi', say_hello). Hoja ya kwanza ya kazi CommandHandler() hukuruhusu kutaja amri, kwa upande wetu hi, ambayo bot itajibu. Hoja ya pili inakuwezesha kutaja njia ya bot, tutaita njia say_hello, ambayo itatekelezwa ikiwa mtumiaji aliita amri iliyobainishwa katika hoja ya kwanza;
  4. Ifuatayo, tunaongeza kidhibiti iliyoundwa kwa mtumaji wa mfano wa darasa letu Updater. Unaweza kuongeza vidhibiti kwa njia kadhaa; kwa mfano hapo juu, nilitumia rahisi zaidi, kwa kutumia ishara +, i.e. updater <- updater + hi_hendler. Vile vile vinaweza kufanywa kwa kutumia njia add_handler(), ambayo ni ya darasa Dispatcher, unaweza kupata njia hii kama hii: updater$dispatcher$add_handler();
  5. Fungua bot kwa kutumia amri start_polling().

Kichakataji cha ujumbe wa maandishi na vichujio

Tuligundua jinsi ya kutuma amri kwa bot, lakini wakati mwingine tunahitaji bot kujibu sio tu kwa amri, lakini pia kwa ujumbe wa maandishi wa kawaida. Ili kufanya hivyo unahitaji kutumia vidhibiti vya ujumbe - MessageHandler.

Kawaida MessageHandler itajibu ujumbe wote unaoingia. Kwa hivyo, washughulikiaji wa ujumbe mara nyingi hutumiwa pamoja na vichungi. Wacha tufundishe bot kusema hello sio kwa amri tu /hi, lakini pia wakati wowote moja ya maneno yafuatayo yanapoonekana katika ujumbe uliotumwa kwa bot: hello, hello, salute, hai, bonjour.

Kwa sasa hatutaandika mbinu zozote mpya, kwa sababu... Tayari tunayo mbinu ambayo bot inatusalimia. Tunachohitaji kufanya ni kuunda kichujio kinachohitajika na kidhibiti cha ujumbe.

Msimbo wa 2: Ongeza kidhibiti cha ujumbe wa maandishi na kichujio

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

Tekeleza mfano wa msimbo hapo juu, baada ya kubadilisha 'BOT TOKEN YAKO' na tokeni halisi uliyopokea wakati wa kuunda bot kupitia. BotBaba (Nilizungumza juu ya kuunda bot ndani makala ya kwanza).

Sasa hebu tujaribu kutuma bot ujumbe kadhaa ulio na maneno ya salamu yaliyoorodheshwa hapo awali:
Kuandika bot ya telegramu katika R (sehemu ya 2): Kuongeza msaada wa amri na vichungi vya ujumbe kwenye roboti

Kwa hivyo, kwanza kabisa, tulifundisha bot sio tu kusema hello, lakini kujibu salamu. Tulifanya hivi kwa kutumia hoja jibu_kwa_kitambulisho_cha_ujumbe, ambayo inapatikana kwa njia sendMessage(), ambamo unahitaji kuhamisha kitambulisho cha ujumbe ambao ungependa kujibu. Unaweza kupata kitambulisho cha ujumbe kama hii: update$message$message_id.

Lakini jambo kuu tulilofanya ni kuongeza kichungi kwenye bot kwa kutumia kazi BaseFilter():

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

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

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

)

Kama unaweza kuwa umeona, vichujio vinahitaji kuongezwa kwa kitu Vichungi vya Ujumbe, ambayo hapo awali ina seti ndogo ya vichungi vilivyotengenezwa tayari. Katika mfano wetu, kwa kitu Vichungi vya Ujumbe tumeongeza kipengele hi, hiki ni kichujio kipya.

Kufanya kazi BaseFilter() unahitaji kupitisha kazi ya chujio. Kimsingi, kichungi ni chaguo la kukokotoa ambalo hupokea mfano wa ujumbe na kurejesha KWELI au UONGO. Katika mfano wetu, tuliandika kazi rahisi ambayo, kwa kutumia kazi ya msingi grepl() huangalia maandishi ya ujumbe na ikiwa inalingana na usemi wa kawaida привет|здравствуй|салют|хай|бонжур anarudi KWELI.

Ifuatayo, tunaunda kidhibiti cha ujumbe hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi). Hoja ya kwanza ya kazi MessageHandler() ni njia ambayo itaita kishughulikiaji, na hoja ya pili ni kichujio ambacho kitaitwa. Kwa upande wetu, hii ndio chujio tulichounda MessageFilters$hi.

Naam, mwishoni, tunaongeza kwa mtoaji kishughulikiaji kilichoundwa hi_txt_hnd.

updater <- updater + 
             hi_hendler +
             hi_txt_hnd

Kama nilivyoandika hapo juu, kwenye kifurushi telegram.bot na kitu Vichungi vya Ujumbe Tayari kuna seti ya vichungi vilivyojengewa ndani ambavyo unaweza kutumia:

  • wote - Ujumbe wote
  • maandishi — Ujumbe wa maandishi
  • amri - Amri, i.e. ujumbe unaoanza na /
  • jibu — Ujumbe ambao ni jibu la ujumbe mwingine
  • sauti — Ujumbe ulio na faili ya sauti
  • hati - Ujumbe na hati iliyotumwa
  • picha - Ujumbe na picha zilizotumwa
  • kibandiko — Ujumbe wenye kibandiko kilichotumwa
  • video — Ujumbe wenye video
  • sauti - Ujumbe wa sauti
  • mawasiliano - Ujumbe ulio na maudhui ya telegramu ya mtumiaji
  • eneo — Ujumbe wenye eneo la kijiografia
  • ukumbi - Ujumbe uliosambazwa
  • mchezo - Michezo

Ikiwa unataka kuchanganya baadhi ya vichujio kwenye kidhibiti kimoja tumia tu ishara | - kama mantiki Au, na ishara & kama mantiki И. Kwa mfano, ikiwa unataka roboti iite njia sawa inapopokea video, picha au hati, tumia mfano ufuatao kuunda kidhibiti cha ujumbe:

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

Kuongeza Amri na Vigezo

Tayari tunajua ni amri gani, jinsi ya kuziunda na jinsi ya kulazimisha bot kutekeleza amri inayotaka. Lakini katika hali nyingine, pamoja na jina la amri, tunahitaji kupitisha data fulani ili kuitekeleza.

Ufuatao ni mfano wa roboti ambayo, kwa kuzingatia tarehe na nchi fulani, hukuletea aina ya siku kutoka kwa kalenda ya uzalishaji.

Kijibu hapa chini kinatumia API ya kalenda ya uzalishaji isdayoff.ru.

Msimbo wa 3: Boti inayoripoti kulingana na tarehe na nchi

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

Tekeleza mfano wa msimbo hapo juu, baada ya kubadilisha 'BOT TOKEN YAKO' na tokeni halisi uliyopokea wakati wa kuunda bot kupitia. BotBaba (Nilizungumza juu ya kuunda bot ndani makala ya kwanza).

Tuliunda bot ambayo ina njia moja tu katika safu yake ya uokoaji check_date, njia hii inaitwa kwa amri ya jina moja.

Lakini, pamoja na jina la amri, njia hii inahitaji uweke vigezo viwili, msimbo wa nchi na tarehe. Kisha, mfumo wa roboti hukagua ikiwa siku fulani katika nchi maalum ni wikendi, siku iliyofupishwa au siku ya kazi kulingana na kalenda rasmi ya uzalishaji.

Ili njia tunayounda kukubali vigezo vya ziada pamoja na amri, tumia hoja pass_args = TRUE katika utendaji CommandHandler(), na wakati wa kuunda njia, pamoja na hoja zinazohitajika bot, update tengeneza chaguo - args. Njia iliyoundwa kwa njia hii itakubali vigezo unavyopitisha kwenye bot baada ya jina la amri. Vigezo lazima vitenganishwe na nafasi; vitatumwa kwa njia kama vekta ya maandishi.

Wacha tuzindue na tujaribu roboti yetu.

Kuandika bot ya telegramu katika R (sehemu ya 2): Kuongeza msaada wa amri na vichungi vya ujumbe kwenye roboti

Endesha kijibu nyuma

Hatua ya mwisho tunayohitaji kukamilisha ni kuzindua kijibu nyuma.

Ili kufanya hivyo, fuata algorithm iliyoelezwa hapa chini:

  1. Hifadhi msimbo wa bot kwenye faili na ugani R. Unapofanya kazi katika RStudio, hii inafanywa kupitia menyu File, timu Hifadhi kama ....
  2. Ongeza njia kwenye folda ya bin, ambayo kwa upande wake iko kwenye folda ambayo umeweka lugha ya R, kwa utofauti wa Njia, maagizo. hapa.
  3. Unda faili ya maandishi ya kawaida ambayo andika mstari 1: R CMD BATCH C:UsersAlseyDocumentsmy_bot.R... Badala ya C:UsersAlseyDocumentsmy_bot.R andika njia ya hati yako ya bot. Wakati huo huo, ni muhimu kwamba hakuna wahusika wa Cyrillic au nafasi njiani, kwa sababu hii inaweza kusababisha matatizo wakati wa kuendesha bot. Ihifadhi, na ubadilishe kiendelezi chake na txt juu ya popo.
  4. Fungua Mpangilio wa Kazi ya Windows, kuna njia nyingi za kufanya hivyo, kwa mfano, fungua folda yoyote na uingie kwenye anwani. %windir%system32taskschd.msc /s. Njia zingine za uzinduzi zinaweza kupatikana hapa.
  5. Katika orodha ya juu ya kulia ya kipanga ratiba, bofya "Unda kazi ...".
  6. Kwenye kichupo cha "Jumla", ipe kazi yako jina maalum, na ubadilishe swichi hadi hali ya "Run kwa watumiaji wote".
  7. Nenda kwenye kichupo cha "Vitendo", bofya "Unda". Katika uwanja wa "Programu au script", bofya "Vinjari", pata moja iliyoundwa katika hatua ya pili popo faili na ubonyeze Sawa.
  8. Bonyeza OK na, ikiwa ni lazima, ingiza nenosiri kwa akaunti yako ya mfumo wa uendeshaji.
  9. Pata kazi iliyoundwa katika mpangilio, chagua na ubofye kitufe cha "Run" kwenye kona ya chini ya kulia.

Kijibu chetu huendesha chinichini na kitafanya kazi hadi utakaposimamisha kazi, au kuzima Kompyuta yako au seva ambayo ilizinduliwa.

Hitimisho

Katika nakala hii, tuligundua jinsi ya kuandika bot kamili ambayo haiwezi kutuma ujumbe tu, bali pia kujibu ujumbe na amri zinazoingia. Ujuzi uliopatikana tayari unatosha kutatua shida zako nyingi.

Makala inayofuata itazungumzia jinsi ya kuongeza kibodi kwenye bot kwa kazi rahisi zaidi.

Jiandikishe kwa yangu telegram и youtube njia.

Chanzo: mapenzi.com

Kuongeza maoni