R тилинде телеграмма ботун жазуу (2-бөлүк): Ботко командалык колдоо жана билдирүү чыпкаларын кошуу

В мурунку жарыялоо биз ботту кантип түзүүнү түшүндүк, класстын бир мисалын инициализацияладык Bot жана аны колдонуу менен билдирүүлөрдү жөнөтүүнүн ыкмалары менен таанышты.

Бул макалада мен бул теманы улантып жатам, ошондуктан мен бул макаланы окугандан кийин гана окууну сунуштайм биринчи бөлүгү.

Бул жолу биз ботту кантип жандандырууну жана ага командалык колдоону кошууну, ошондой эле класс менен таанышабыз. Updater.

Макаланын жүрүшүндө биз бир нече жөнөкөй ботторду жазабыз, акыркысы берилген датага жана өлкөнүн кодуна таянып, кайсы бир өлкөдө бир күн дем алыш же өндүрүш календарына ылайык жумушчу күн экендигин аныктайт. Бирок, мурункудай эле, макаланын максаты - пакеттин интерфейси менен тааныштыруу telegram.bot өз көйгөйлөрүн чечүү үчүн.

R тилинде телеграмма ботун жазуу (2-бөлүк): Ботко командалык колдоо жана билдирүү чыпкаларын кошуу

"Телеграмма ботун R тилинде жазуу" сериясындагы бардык макалалар

  1. Биз бот түзүп, аны телеграммага билдирүүлөрдү жөнөтүү үчүн колдонобуз
  2. Ботко буйрук колдоону жана билдирүү чыпкаларын кошуңуз

ыраазы

Эгер сиз маалыматтарды талдоо кызыктырсаңыз, сизди менин телеграмма и YouTube каналдар. Мазмундун көбү R тилине арналган.

  1. Жаңырткыч класс
  2. Иштөөчүлөр - иштетүүчүлөр
  3. Биринчи буйрукту ботко кошуңуз, буйрук иштеткич
  4. Текст билдирүү процессору жана чыпкалары
  5. Параметрлери бар буйруктарды кошуу
  6. Ботту фондо иштетиңиз
  7. жыйынтыктоо

Жаңырткыч класс

Updater бул сизге телеграмма ботун иштеп чыгууну жеңилдеткен класс жана капоттун астындагы классты колдонот Dispetcher. Класстык тапшырма Updater боттон жаңыртууларды алуу болуп саналат (мурунку макалада биз бул үчүн ыкманы колдонгон getUpdates()), жана аларды андан ары которуштуруу Dispetcher.

Өз кезегинде, Dispetcher сиз түзгөн иштеткичтерди камтыйт, б.а. класс объектилери Handler.

Иштөөчүлөр - иштетүүчүлөр

Сиз кошо турган иштеткичтер менен Dispetcher ар кандай окуяларга боттун реакциялары. Бул макаланы жазып жаткан учурда telegram.bot Иштетүүчүлөрдүн төмөнкү түрлөрү кошулду:

  • MessageHandler — Кабарларды иштетүүчү
  • CommandHandler — Буйрук иштетүүчү
  • CallbackQueryHandler — Inlineдан жөнөтүлгөн баскычтоптор үчүн берилиштерди иштеткич
  • ErrorHandler — Боттон жаңыртууларды талап кылууда катаны иштеп чыгуучу

Биринчи буйрукту ботко кошуңуз, буйрук иштеткич

Эгерде сиз буга чейин ботторду колдонбогон болсоңуз жана буйрук деген эмне экенин билбесеңиз, анда ботко буйруктар алдыга сызык менен жөнөтүлүшү керек. / префикс катары.

Биз жөнөкөй буйруктардан баштайбыз, б.а. ботубузду буйрук боюнча салам айтууга үйрөтөлү /hi.

Код 1: Ботко салам айтууга үйрөтүү

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

Жогорудагы коддун мисалын иштетиңиз, "СЕНИН БОТ ТОКЕНИН" ботту түзүүдө алган чыныгы токенге алмаштыргандан кийин BotFather (Мен бот түзүү жөнүндө айттым биринчи макала).

ыкма start_polling() тап Updater, коддун аягында колдонулган, боттон жаңыртууларды суроонун жана иштетүүнүн чексиз циклин баштайт.

Эми Telegramды ачып, биздин ботко биринчи буйрукту жазалы /hi.

R тилинде телеграмма ботун жазуу (2-бөлүк): Ботко командалык колдоо жана билдирүү чыпкаларын кошуу

Эми биздин бот буйрукту түшүнөт /hi, жана биз менен учурашууну билет.

Мындай жөнөкөй ботту куруу процессин схемалык түрдө төмөнкүчө чагылдырууга болот.

R тилинде телеграмма ботун жазуу (2-бөлүк): Ботко командалык колдоо жана билдирүү чыпкаларын кошуу

  1. Класстын үлгүсүн түзүңүз Updater;
  2. Биз методдорду түзөбүз, б.а. биздин бот аткара турган функциялар. Код мисалында бул функция say_hello(). Сиз бот ыкмалары катары колдоно турган функциялар эки талап кылынган аргументке ээ болушу керек - бот и өзгөртүү, жана бир кошумча - args. Аргумент бот, бул сиздин ботуңуз, анын жардамы менен сиз билдирүүлөргө жооп бере аласыз, билдирүүлөрдү жөнөтө аласыз же бот үчүн жеткиликтүү болгон башка ыкмаларды колдоно аласыз. Аргумент өзгөртүү бул бот колдонуучудан алган нерсе, чындыгында, биз биринчи макалада ыкманы колдонуп алганбыз getUpdates(). Аргумент args буйрук менен бирге колдонуучу жиберген кошумча маалыматтарды иштеп чыгууга мүмкүндүк берет, биз бул темага бир аздан кийин кайрылабыз;
  3. Биз иштеткичтерди түзөбүз, б.а. Биз колдонуучунун кээ бир аракеттерин мурунку кадамда түзүлгөн ыкмалар менен байланыштырабыз. Негизи, иштеткич бул триггер, кандайдыр бир бот функциясын чакырган окуя. Биздин мисалда мындай триггер буйрук жөнөтүүдө /hi, жана коллектив тарабынан ишке ашырылып жатат hi_hendler <- CommandHandler('hi', say_hello). Биринчи функция аргументи CommandHandler() биздин учурда команданы көрсөтүүгө мүмкүндүк берет hi, ага бот жооп берет. Экинчи аргумент бот ыкмасын көрсөтүүгө мүмкүндүк берет, биз ыкманы чакырабыз say_hello, эгерде колдонуучу биринчи аргументте көрсөтүлгөн буйрукту чакырса аткарылат;
  4. Андан кийин, биз класстын инстанциясынын диспетчерине түзүлгөн иштеткичти кошобуз Updater. Сиз иштеткичтерди бир нече жол менен кошо аласыз; жогорудагы мисалда мен белгини колдонуп, эң жөнөкөйсүн колдондум +, башкача айтканда, updater <- updater + hi_hendler. Ошол эле ыкманы колдонуу менен жасоого болот add_handler(), класска таандык Dispatcher, бул ыкманы төмөнкүдөй таба аласыз: updater$dispatcher$add_handler();
  5. Буйрукту колдонуу менен ботту ишке киргизиңиз start_polling().

Текст билдирүү процессору жана чыпкалары

Биз ботко буйруктарды кантип жөнөтүүнү түшүндүк, бирок кээде бизге бот буйруктарга гана эмес, кээ бир кадимки текст кабарларына да жооп бериши керек болот. Бул үчүн сиз билдирүү иштеткичтерин колдонушуңуз керек - MessageHandler.

демейдеги MessageHandler бардык келген билдирүүлөргө жооп берет. Ошондуктан, билдирүү иштетүүчүлөр көбүнчө чыпкалар менен бирге колдонулат. Келгиле, ботко салам айтууну буйрук боюнча гана эмес, үйрөтөлү /hi, бирок ошондой эле ботко жөнөтүлгөн билдирүүдө төмөнкү сөздөрдүн бири пайда болгондо: салам, салам, салам, hai, bonjour.

Азырынча биз эч кандай жаңы ыкмаларды жазбайбыз, анткени... Бизде мурунтан эле бот бизди тосуп алган ыкма бар. Бизге керек болгон нерсе - керектүү чыпканы жана билдирүү иштеткичти түзүү.

Код 2: Текст билдирүү иштетүүчү жана чыпка кошуу

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

Жогорудагы коддун мисалын иштетиңиз, "СЕНИН БОТ ТОКЕНИН" ботту түзүүдө алган чыныгы токенге алмаштыргандан кийин BotFather (Мен бот түзүү жөнүндө айттым биринчи макала).

Эми ботко мурда саналып өткөн саламдашуу сөздөрүн камтыган бир нече билдирүүлөрдү жөнөтүүгө аракет кылалы:
R тилинде телеграмма ботун жазуу (2-бөлүк): Ботко командалык колдоо жана билдирүү чыпкаларын кошуу

Ошентип, биринчиден, ботко жөн эле салам айтууну эмес, учурашууга жооп берүүнү үйрөттүк. Биз муну аргумент аркылуу жасадык билдирүү_идентификаторуна жооп берүү, методунда бар sendMessage(), ага сиз жооп бергиңиз келген билдирүүнүн идентификаторун өткөрүшүңүз керек. Сиз билдирүү идентификаторун төмөнкүдөй ала аласыз: update$message$message_id.

Бирок биз кылган негизги нерсе бул функцияны колдонуу менен ботко чыпка кошуу болду BaseFilter():

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

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

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

)

Сиз байкагандай, объектке чыпкаларды кошуу керек MessageFilters, башында буга чейин даяр чыпкалардын чакан топтомун камтыйт. Биздин мисалда объектиге MessageFilters элементти коштук hi, бул жаңы чыпка.

Функцияда BaseFilter() чыпкалоо функциясын өтүшүңүз керек. Негизи, чыпка бул жөн гана билдирүү инстанциясын кабыл алып, кайра кайтаруучу функция ЧЫНЫГЫ же ЖАЛГАН. Биздин мисалда биз негизги функцияны колдонуп, жөнөкөй функцияны жаздык grepl() билдирүүнүн текстин текшерет жана ал кадимки туюнтмага дал келсе привет|здравствуй|салют|хай|бонжур кайтып келет ЧЫНЫГЫ.

Андан кийин биз билдирүү иштеткичти түзөбүз hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi). Биринчи функция аргументи MessageHandler() иштеткичти чакыра турган ыкма, ал эми экинчи аргумент ал чакырыла турган чыпка болуп саналат. Биздин учурда, бул биз жараткан фильтр MessageFilters$hi.

Акыр-аягы, биз диспетчерге түзүлгөн иштеткичти кошобуз hi_txt_hnd.

updater <- updater + 
             hi_hendler +
             hi_txt_hnd

Мен жогоруда жазгандай, пакетте telegram.bot жана объект MessageFilters Сиз колдоно турган орнотулган чыпкалардын топтому мурунтан эле бар:

  • баары — Бардык билдирүүлөр
  • текст — Текст кабарлар
  • команда — Буйруктар, б.а. менен башталган билдирүүлөр /
  • жооп — Башка кабарга жооп болгон кабарлар
  • аудио — Аудио файлды камтыган билдирүүлөр
  • документ — Жөнөтүлгөн документ менен билдирүүлөр
  • сүрөт - жөнөтүлгөн сүрөттөрү бар билдирүүлөр
  • стикер — Жөнөтүлгөн стикери бар билдирүүлөр
  • видео — Видеосу бар билдирүүлөр
  • үн - Үн билдирүүлөрү
  • байланыш — Колдонуучунун телеграмма мазмунун камтыган билдирүүлөр
  • жайгашкан — Геолокациясы бар билдирүүлөр
  • орун — Багытталган билдирүүлөр
  • оюн — Оюндар

Эгер сиз кээ бир чыпкаларды бир иштеткичке бириктиргиңиз келсе, жөн гана белгини колдонуңуз | - логика катары ЖЕ, жана кол коюңуз & логикалык катары И. Мисалы, эгер сиз бот видеону, сүрөттү же документти алганда, ошол эле ыкманы чакырышын кааласаңыз, билдирүү иштеткичти түзүү үчүн төмөнкү мисалды колдонуңуз:

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

Параметрлери бар буйруктарды кошуу

Буйруктар деген эмне экенин, аларды кантип түзүү керектигин жана ботту каалаган буйрукту аткарууга кантип мажбурлоо керектигин билебиз. Бирок кээ бир учурларда, команданын атынан тышкары, биз аны аткаруу үчүн кээ бир маалыматтарды өткөрүп беришибиз керек.

Төмөндө боттун мисалы келтирилген, ал берилген дата жана өлкөнү эске алуу менен өндүрүш календарынан күн түрүн кайтарып берет.

Төмөнкү бот өндүрүш календары API колдонот isdayoff.ru.

Код 3: Датасы жана өлкөсү боюнча отчет берүүчү бот

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

Жогорудагы коддун мисалын иштетиңиз, "СЕНИН БОТ ТОКЕНИН" ботту түзүүдө алган чыныгы токенге алмаштыргандан кийин BotFather (Мен бот түзүү жөнүндө айттым биринчи макала).

Биз арсеналында бир гана ыкмасы бар бот түздүк check_date, бул ыкма ошол эле аталыштагы буйрук менен чакырылат.

Бирок, команданын аталышынан тышкары, бул ыкма эки параметрди, өлкөнүн кодун жана датаны киргизүүнү талап кылат. Андан кийин, бот көрсөтүлгөн өлкөдө берилген күн дем алыш күнбү, кыскартылган күнбү же расмий өндүрүш календарына ылайык иш күнү экендигин текшерет.

Биз түзгөн ыкма команда менен бирге кошумча параметрлерди кабыл алышы үчүн аргументти колдонуңуз pass_args = TRUE функцияда CommandHandler(), жана методду түзүүдө талап кылынган аргументтерден тышкары бот, өзгөртүү кошумча түзүү - args. Ушундай жол менен түзүлгөн ыкма сиз буйруктун аталышынан кийин ботко өткөргөн параметрлерди кабыл алат. Параметрлер боштук менен бөлүнүшү керек, алар методго текст вектору катары жөнөтүлөт.

Келиңиз, ботубузду ишке киргизип, сынап көрөлү.

R тилинде телеграмма ботун жазуу (2-бөлүк): Ботко командалык колдоо жана билдирүү чыпкаларын кошуу

Ботту фондо иштетиңиз

Биз аяктообуз керек болгон акыркы кадам - ​​ботту фондо ишке киргизүү.

Бул үчүн, төмөндө сүрөттөлгөн алгоритмди аткарыңыз:

  1. Бот кодун R кеңейтүүсү бар файлга сактаңыз. RStudioда иштегенде бул меню аркылуу ишке ашырылат. File, команда Төмөнкү катары сактоо ....
  2. Path өзгөрмөсүнө, нускамаларга R тилин орноткон папкада жайгашкан бин папкасына жолду кошуңуз бул жерде.
  3. Кадимки текст файлын түзүңүз, анда 1 сап жазылат: R CMD BATCH C:UsersAlseyDocumentsmy_bot.R... Ордуна C:UsersAlseyDocumentsmy_bot.R бот скриптиңизге жол жазыңыз. Ошол эле учурда, бул жолдо эч кандай кириллица тамгалары же боштуктар бар маанилүү, анткени бул ботту иштетүүдө көйгөйлөрдү жаратышы мүмкүн. Аны сактап, кеңейтүү менен алмаштырыңыз TXT боюнча жар канат.
  4. Windows Task Scheduler ачыңыз, муну жасоонун көптөгөн жолдору бар, мисалы, каалаган папканы ачып, даректи киргизиңиз %windir%system32taskschd.msc /s. Башка ишке киргизүү ыкмаларын табууга болот бул жерде.
  5. Пландоочтун жогорку оң жагындагы менюсунда "Тапшырма түзүү..." баскычын чыкылдатыңыз.
  6. "Жалпы" өтмөгүндө тапшырмаңызга ыңгайлаштырылган ат берип, которгучту "Бардык колдонуучулар үчүн иштетүү" абалына которуңуз.
  7. "Аракеттер" өтмөгүнө өтүп, "Түзүү" баскычын чыкылдатыңыз. "Программа же скрипт" талаасында, "Көрүү" баскычын чыкылдатып, экинчи кадамда түзүлгөнүн табыңыз жар канат файл жана OK чыкылдатуу.
  8. "OK" баскычын чыкылдатып, зарыл болсо, операциялык тутумуңуздун каттоо эсебинин сырсөзүн киргизиңиз.
  9. Пландоочудан түзүлгөн тапшырманы табыңыз, аны тандап, төмөнкү оң бурчтагы "Ишке" баскычын чыкылдатыңыз.

Биздин бот фондо иштейт жана сиз тапшырманы токтотмоюнча же ал ишке киргизилген компьютериңизди же сервериңизди өчүргүчө иштейт.

жыйынтыктоо

Бул макалада биз билдирүүлөрдү гана жөнөтпөстөн, келген билдирүүлөргө жана буйруктарга жооп бере турган толук кандуу ботту кантип жазууну чечтик. Алынган билим сиздин көйгөйлөрүңүздүн көбүн чечүүгө жетиштүү.

Кийинки макалада ыңгайлуураак иштөө үчүн ботко клавиатураны кантип кошуу керектиги жөнүндө сөз болот.

Менин баракчама жазылыңыз телеграмма и YouTube каналдар.

Source: www.habr.com

Комментарий кошуу