Ukubhala i-telegram bot kwi-R (icandelo lesi-2): Yongeza inkxaso yomyalelo kunye nezihluzi zomyalezo kwi-bot

В upapasho lwangaphambili sifumene indlela yokwenza i-bot, saqala umzekelo weklasi Bot kwaye waqhelana neendlela zokuthumela imiyalezo esebenzisa yona.

Kule nqaku ndiqhubeka nesi sihloko, ngoko ke ndincoma ukuqala ukufunda eli nqaku kuphela emva kokufunda Inxalenye yokuqala.

Ngeli xesha siza kujonga indlela yokuvuselela i-bot yethu kwaye songeze inkxaso yomyalelo kuyo, kwaye siqhelane neklasi. Updater.

Ngethuba lenqaku, siya kubhala ii-bots ezininzi ezilula, le yokugqibela iya kuthi, ngokusekelwe kumhla onikiweyo kunye nekhowudi yelizwe, inqume ukuba ngaba usuku kwilizwe elinikeziweyo luyimpelaveki okanye usuku lokusebenza ngokwekhalenda yemveliso. Kodwa, njengangaphambili, injongo yenqaku kukuqhelanisa nojongano lwephakheji telegram.bot ukusombulula ezakho iingxaki.

Ukubhala i-telegram bot kwi-R (icandelo lesi-2): Yongeza inkxaso yomyalelo kunye nezihluzi zomyalezo kwi-bot

Onke amanqaku akuluhlu oluthi "Ukubhala i-telegraph bot kwi-R"

  1. Senza ibhot kwaye siyisebenzise ukuthumela imiyalezo kwitelegram
  2. Yongeza inkxaso yomyalelo kunye nezihluzi zemiyalezo kwi-bot

Iziqulatho

Ukuba unomdla kuhlalutyo lwedatha, unokuba nomdla kum yilelegram и youtube imijelo. Uninzi lomxholo lunikezelwe kulwimi R.

  1. Iklasi yokuhlaziya
  2. Abaphangi - abaphathi
  3. Yongeza umyalelo wokuqala kwi-bot, isiphathi somyalelo
  4. Iprosesa yomyalezo obhaliweyo kunye nezihluzi
  5. Ukongeza iMiyalelo ngeeParameters
  6. Qhuba ibhot ngasemva
  7. isiphelo

Iklasi yokuhlaziya

Updater yiklasi eyenza kube lula kuwe ukuphuhlisa ibhot yetelegram, kwaye isebenzisa iklasi phantsi kwehood Dispetcher. Isabelo seklasi Updater kukufumana uhlaziyo kwi-bot (kwinqaku elidlulileyo sisebenzise indlela yale njongo getUpdates()), kwaye uwadlulisele phambili kwi Dispetcher.

Ekujikeni Dispetcher iqulathe iziphatho ozenzileyo, okt. izinto zeklasi Handler.

Abaphangi - abaphathi

Ngabaphangi abongeza kubo Dispetcher iimpendulo zebhot kwiziganeko ezahlukeneyo. Ngexesha lokubhala eli nqaku kwi telegram.bot Ezi ndidi zilandelayo zokuphatha zongeziwe:

  • MessageHandler — Isiphathi somyalezo
  • CommandHandler — Isiphathi somyalelo
  • CallbackQueryHandler — Isiphathi sedatha yeekeyboards ezithunyelwe zisuka kwi-Inline
  • I-ErrorHandler-Umphathi wempazamo xa ucela uhlaziyo kwi-bot

Yongeza umyalelo wokuqala kwi-bot, isiphathi somyalelo

Ukuba awuzange wasebenzisa i-bots ngaphambili kwaye awuwazi ukuba yintoni umyalelo, ngoko imiyalelo kwi-bot kufuneka ithunyelwe usebenzisa i-slash yangaphambili. / njengesimaphambili.

Siza kuqala ngemiyalelo elula, okt. masifundise i-bot yethu ukubulisa kumyalelo /hi.

Ikhowudi 1: Ukufundisa ibhot ukuba ithi molo

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

Qhuba umzekelo wekhowudi ngasentla, emva kokubuyisela i-'BOT TOKEN YAKHO' kunye nomqondiso wokwenyani owufumeneyo xa usenza i-bot nge. Ibhotile (Ndathetha ngokwenza i-bot ngaphakathi inqaku lokuqala).

Indlela start_polling() класса Updater, esetyenziswa ekupheleni kwekhowudi, iqala i-loop engapheliyo yokucela kunye nokuhlaziywa kokuhlaziywa kwi-bot.

Ngoku masivule iTelegram kwaye sibhale umyalelo wokuqala kwi-bot yethu /hi.

Ukubhala i-telegram bot kwi-R (icandelo lesi-2): Yongeza inkxaso yomyalelo kunye nezihluzi zomyalezo kwi-bot

Ngoku i-bot yethu iyawuqonda umyalelo /hi, yaye uyayazi indlela yokusibulisa.

Ngokucwangcisiweyo, inkqubo yokwakha i-bot elula ingabonakaliswa ngolu hlobo lulandelayo.

Ukubhala i-telegram bot kwi-R (icandelo lesi-2): Yongeza inkxaso yomyalelo kunye nezihluzi zomyalezo kwi-bot

  1. Yenza umzekelo weklasi Updater;
  2. Senza iindlela, okt. imisebenzi eya kuyenza ibhot yethu. Kumzekelo wekhowudi lo ngumsebenzi say_hello(). Imisebenzi oya kuyisebenzisa njengendlela ye-bot kufuneka ibe neengxoxo ezimbini ezifunekayo - Bot и update, kunye nokhetho olunye - args. Ingxoxo Bot, le yibhot yakho, ngoncedo lwayo unokuphendula kwimiyalezo, uthumele imiyalezo, okanye usebenzise naziphi na ezinye iindlela ezikhoyo kwi-bot. Ingxoxo update yile nto i-bot ifunyenwe kumsebenzisi, eneneni, into esiyifumene kwinqaku lokuqala sisebenzisa indlela getUpdates(). Ingxoxo args ikuvumela ukuba uqhubekisele phambili idatha eyongezelelweyo ethunyelwe ngumsebenzisi kunye nomyalelo, siya kubuyela kwesi sihloko kancinane kamva;
  3. Senza abaphangi, okt. Sinxulumanisa izenzo ezithile zabasebenzisi kunye neendlela ezidalwe kwinyathelo langaphambili. Ngokusisiseko, isibambi sisiqhushumbisi, isiganeko esibiza umsebenzi othile webhot. Kumzekelo wethu, i-trigger enjalo ithumela umyalelo /hi, kwaye iphunyezwe liqela hi_hendler <- CommandHandler('hi', say_hello). Ingxoxo yokuqala yomsebenzi CommandHandler() ikuvumela ukuba ucacise umyalelo, kwimeko yethu hi, apho i-bot iya kuphendula. Ingxabano yesibini ikuvumela ukuba ucacise indlela ye-bot, siya kubiza indlela say_hello, eya kuphunyezwa ukuba umsebenzisi ubize umyalelo oxeliweyo kwimpikiswano yokuqala;
  4. Emva koko, songeza umphathi owenziweyo kwi-dispatcher yomzekelo weklasi yethu Updater. Unokongeza abaphangi ngeendlela ezininzi kumzekelo ongasentla, ndisebenzise eyona ilula, ndisebenzisa uphawu +, o.k. updater <- updater + hi_hendler. Kunokwenziwa okufanayo ngokusebenzisa indlela add_handler(), eyeyeklasi Dispatcher, ungayifumana le ndlela ngolu hlobo: updater$dispatcher$add_handler();
  5. Qalisa ibhot usebenzisa umyalelo start_polling().

Iprosesa yomyalezo obhaliweyo kunye nezihluzi

Sifumene indlela yokuthumela imiyalelo kwi-bot, kodwa ngamanye amaxesha sifuna i-bot ukuba ingaphenduli kuphela kwimiyalelo, kodwa nakwiminye imiyalezo eqhelekileyo. Ukwenza oku kufuneka usebenzise iziphatho zomyalezo − MessageHandler.

Ngokwesiqhelo MessageHandler iya kuphendula ngokupheleleyo kuyo yonke imiyalezo engenayo. Ngoko ke, iziphatho zemiyalezo zihlala zisetyenziswa kunye nezihluzi. Masifundise i-bot ukubulisa kungekuphela nje ngomyalelo /hi, kodwa nanini na elinye lala magama alandelayo livela kumyalezo othunyelwe kwi-bot: molo, molo, salute, hai, bonjour.

Okwangoku asiyi kubhala naziphi na iindlela ezintsha, kuba... Sele sinendlela apho i-bot isibulisa ngayo. Ekuphela kwento ekufuneka siyenze kukudala isihluzo esifunekayo kunye nesiphathi somyalezo.

Ikhowudi 2: Yongeza isibambi somyalezo obhaliweyo kunye nesihluzo

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

Qhuba umzekelo wekhowudi ngasentla, emva kokubuyisela i-'BOT TOKEN YAKHO' kunye nomqondiso wokwenyani owufumeneyo xa usenza i-bot nge. Ibhotile (Ndathetha ngokwenza i-bot ngaphakathi inqaku lokuqala).

Ngoku makhe sizame ukuthumela i-bot imiyalezo emininzi equlethe amagama okubulisa adweliswe ngaphambili:
Ukubhala i-telegram bot kwi-R (icandelo lesi-2): Yongeza inkxaso yomyalelo kunye nezihluzi zomyalezo kwi-bot

Ke, okokuqala, safundisa ibhot ukuba ingabulisi nje, kodwa iphendule xa ibulisa. Senze oku sisebenzisa ingxabano phendula_kumyalezo_id, ekhoyo kwindlela sendMessage(), apho kufuneka udlulisele i id yomyalezo ofuna ukuphendula kuwo. Ungafumana id yomyalezo ngolu hlobo: update$message$message_id.

Kodwa eyona nto iphambili esiyenzileyo kukongeza isihluzi kwi-bot sisebenzisa umsebenzi BaseFilter():

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

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

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

)

Njengoko usenokuba uqaphele, izihluzi kufuneka zongezwe kwinto Izihluzi zomyalezo, leyo ekuqaleni sele iqulethe isethi encinci yezihluzo esele zenziwe. Kumzekelo wethu, ukuya kwinto Izihluzi zomyalezo songeze into hi, esi sisihluzo esitsha.

Ukusebenza BaseFilter() kufuneka ugqithise umsebenzi wokucoca. Ngokusisiseko, icebo lokucoca ngumsebenzi ofumana umzekelo womyalezo kunye nokubuyisela TRUE okanye FALSE. Kumzekelo wethu, sibhale umsebenzi olula othi, usebenzisa umsebenzi osisiseko grepl() ijonga umyalezo obhaliweyo kwaye ukuba uyahambelana nentetho eqhelekileyo привет|здравствуй|салют|хай|бонжур iimbuyekezo TRUE.

Okulandelayo senza isiphathi somyalezo hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi). Ingxoxo yokuqala yomsebenzi MessageHandler() yindlela eyakubiza umbambi, kwaye impikiswano yesibini sisihluzo eyakuthiwa ngalo. Kwimeko yethu, esi sisihluzo esisenzileyo MessageFilters$hi.

Ewe, ekugqibeleni, songeza kwi-dispatcher isiphathi esidaliweyo hi_txt_hnd.

updater <- updater + 
             hi_hendler +
             hi_txt_hnd

Njengoko ndibhale ngasentla, kwiphakheji telegram.bot kunye nokuchasa Izihluzi zomyalezo Sele kukho uluhlu lwezihluzo ezakhelweyo onokuzisebenzisa:

  • yonke - Yonke imiyalezo
  • umbhalo — Imiyalezo ebhaliweyo
  • umyalelo - Imiyalelo, okt. imiyalezo eqala ngayo /
  • phendula — Imiyalezo eyimpendulo komnye umyalezo
  • iaudio — Imiyalezo equlathe ifayile yesandi
  • uxwebhu — Imiyalezo enoxwebhu oluthunyelweyo
  • ifoto-Imiyalezo enemifanekiso ethunyelweyo
  • isincamathelisi — Imiyalezo enesitayile esithunyelweyo
  • ividiyo — Imiyalezo enevidiyo
  • ilizwi-imiyalezo yelizwi
  • umfowunelwa — Imiyalezo equlathe umxholo wetelegram yomsebenzisi
  • indawo — Imiyalezo enendawo
  • indawo - Imiyalezo egqithisiweyo
  • umdlalo - Imidlalo

Ukuba ufuna ukudibanisa ezinye izihluzi kwisiphathi esinye sebenzisa nje uphawu | - njengengqiqo Okanye, kwaye usayine & njengengqiqo И. Umzekelo, ukuba ufuna i-bot ibize ngendlela efanayo xa ifumana ividiyo, umfanekiso okanye uxwebhu, sebenzisa lo mzekelo ulandelayo ukwenza isiphathi somyalezo:

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

Ukongeza iMiyalelo ngeeParameters

Sele sisazi ukuba yeyiphi imiyalelo, indlela yokuyidala kunye nendlela yokunyanzela i-bot ukuba iphumeze umyalelo ofunekayo. Kodwa kwezinye iimeko, ukongeza kwigama lomyalelo, kufuneka sidlulise idatha ethile ukuze siyenze.

Ngezantsi ngumzekelo we-bot othi, unikwe umhla kunye nelizwe elinikiweyo, ukubuyisela uhlobo losuku oluvela kwikhalenda yemveliso.

I-bot engezantsi isebenzisa i-API yekhalenda yemveliso isdayoff.ru.

Ikhowudi 3: Ibhot ebika ngomhla kunye nelizwe

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

Qhuba umzekelo wekhowudi ngasentla, emva kokubuyisela i-'BOT TOKEN YAKHO' kunye nomqondiso wokwenyani owufumeneyo xa usenza i-bot nge. Ibhotile (Ndathetha ngokwenza i-bot ngaphakathi inqaku lokuqala).

Senze i-bot enendlela enye kuphela kwi-arsenal yayo check_date, le ndlela ibizwa ngokuba ngumyalelo wegama elifanayo.

Kodwa, ukongeza kwigama lomyalelo, le ndlela ifuna ukuba ufake iiparamitha ezimbini, ikhowudi yelizwe kunye nomhla. Okulandelayo, i-bot ihlola ukuba ngaba usuku olunikeziweyo kwilizwe elichaziweyo luyimpelaveki, usuku olufutshane, okanye usuku lokusebenza ngokwekhalenda yemveliso esemthethweni.

Ukuze indlela esiyidalayo yamkele iiparamitha ezongezelelweyo kunye nomyalelo, sebenzisa ingxabano pass_args = TRUE kumsebenzi CommandHandler(), kwaye xa udala indlela, ukongeza kwiingxoxo ezifunekayo Bot, update yenza enye oyikhethayo - args. Indlela eyenziwe ngale ndlela iya kwamkela iiparameters ozidlulayo kwi-bot emva kwegama lomyalelo. Iiparamitha kufuneka zihlulwe sisithuba;

Masiqalise kwaye sivavanye i-bot yethu.

Ukubhala i-telegram bot kwi-R (icandelo lesi-2): Yongeza inkxaso yomyalelo kunye nezihluzi zomyalezo kwi-bot

Qhuba ibhot ngasemva

Inyathelo lokugqibela ekufuneka siligqibe kukundulula ibhot ngasemva.

Ukwenza oku, landela i-algorithm echazwe ngezantsi:

  1. Gcina ikhowudi ye-bot kwifayile kunye nolwandiso lwe-R. Xa usebenza kwi-RStudio, oku kwenziwa ngemenyu ifayile, iqela Yigcine njenge ....
  2. Yongeza umendo kwincwadi eneenkcukacha yomgqomo, ethi yona ibekwe kwisilawulo ofake kuso ulwimi lwe-R, kuguquguquko lweNdlela, imiyalelo. apha.
  3. Yenza ifayile yokubhaliweyo eqhelekileyo apho ubhala umgca om-1: R CMD BATCH C:UsersAlseyDocumentsmy_bot.R. Ngaphandle kwe C:UsersAlseyDocumentsmy_bot.R bhala umendo kwiskripthi sakho sebhot. Ngexesha elifanayo, kubalulekile ukuba akukho zimpawu zeCyrillic okanye izithuba endleleni, kuba oku kunokubangela iingxaki xa uqhuba ibhot. Yigcine, kwaye ubeke endaweni yolwandiso lwayo txt phezu bat.
  4. Vula i-Windows Task Scheduler, kukho iindlela ezininzi zokwenza oku, umzekelo, vula nayiphi na ifolda kwaye ungene kwidilesi. %windir%system32taskschd.msc /s. Ezinye iindlela zokuqalisa zinokufunyanwa apha.
  5. Kwimenyu ephezulu ngasekunene yomcwangcisi, cofa "Yenza umsebenzi ...".
  6. Kwithebhu ethi "Ngokubanzi", nika umsebenzi wakho igama lesiqhelo, kwaye utshintshe iswitshi kwindawo ethi "Baleka bonke abasebenzisi".
  7. Yiya kwi "Actions" tab, cofa "Yenza". Kwintsimi ye "Program okanye iskripthi", nqakraza "Khangela", fumana enye eyenziwe kwisinyathelo sesibini bat ifayile kwaye ucofe u-OK.
  8. Cofa u-Kulungile kwaye, ukuba kuyimfuneko, faka igama eligqithisiweyo kwiakhawunti yakho yokusebenza.
  9. Fumana umsebenzi owenziweyo kumcwangcisi, ukhethe kwaye ucofe iqhosha elithi "Run" kwikona esezantsi ekunene.

I-bot yethu ibaleka ngasemva kwaye iya kusebenza de uyeke umsebenzi, okanye ucime iPC yakho okanye iseva apho yasungulwa khona.

isiphelo

Kweli nqaku, siye safumanisa indlela yokubhala i-bot epheleleyo engakwazi ukuthumela kuphela imiyalezo, kodwa iphinde iphendule imiyalezo engenayo kunye nemiyalelo. Ulwazi olufunyenweyo sele lwanele ukusombulula uninzi lweengxaki zakho.

Inqaku elilandelayo liza kuthetha malunga nendlela yokongeza ikhibhodi kwi-bot ukuze usebenze ngakumbi.

Bhalisa kweyam yilelegram и youtube imijelo.

umthombo: www.habr.com

Yongeza izimvo