R-д телеграм бот бичих (2-р хэсэг): Ботод командын дэмжлэг болон мессежийн шүүлтүүр нэмэх

В өмнөх хэвлэл Бид роботыг хэрхэн үүсгэхийг олж мэдсэн бөгөөд ангийн жишээг эхлүүлсэн Bot мөн үүнийг ашиглан мессеж илгээх аргуудтай танилцсан.

Энэ нийтлэлд би энэ сэдвийг үргэлжлүүлж байгаа тул зөвхөн уншсаны дараа энэ өгүүллийг уншиж эхлэхийг зөвлөж байна эхний хэсэг.

Энэ удаад бид роботоо хэрхэн сэргээх, түүнд командын дэмжлэг нэмэх, мөн ангитай танилцах болно. Updater.

Өгүүллийн явцад бид хэд хэдэн энгийн роботуудыг бичих болно, сүүлийнх нь тухайн улсын кодыг үндэслэн тухайн улсын нэг өдөр амралтын өдөр эсвэл үйлдвэрлэлийн хуанлийн дагуу ажлын өдөр эсэхийг тодорхойлох болно. Гэхдээ өмнөх шигээ нийтлэлийн зорилго нь багцын интерфейстэй танилцах явдал юм telegram.bot өөрийнхөө асуудлыг шийдэхийн тулд.

R-д телеграм бот бичих (2-р хэсэг): Ботод командын дэмжлэг болон мессежийн шүүлтүүр нэмэх

"R-д телеграм бот бичих" цувралын бүх нийтлэл

  1. Бид робот үүсгээд түүгээрээ телеграмм руу мессеж илгээдэг
  2. Ботод тушаалын дэмжлэг болон мессежийн шүүлтүүрийг нэмнэ үү

Агуулга

Хэрэв та өгөгдлийн шинжилгээг сонирхож байгаа бол миний мэдээллийг сонирхож магадгүй юм цахилгаан мэдээ и YouTube-ийн сувгууд. Ихэнх контент нь R хэлэнд зориулагдсан.

  1. Шинэчлэгч анги
  2. Ажиллагчид - зохицуулагчид
  3. Эхний командыг bot, тушаал зохицуулагч руу нэмнэ үү
  4. Текст мессеж процессор ба шүүлтүүрүүд
  5. Параметр бүхий тушаалуудыг нэмэх
  6. Ботыг ард ажиллуулна уу
  7. дүгнэлт

Шинэчлэгч анги

Updater Энэ нь танд телеграм ботыг хөгжүүлэхэд хялбар болгодог анги бөгөөд бүрээсний доорх ангийг ашигладаг Dispetcher. Ангийн даалгавар Updater нь bot-аас шинэчлэлтүүдийг хүлээн авах явдал юм (өмнөх нийтлэлд бид энэ зорилгоор аргыг ашигласан getUpdates()), тэдгээрийг цааш нь шилжүүлээрэй Dispetcher.

Үүний дараагаар Dispetcher таны үүсгэсэн зохицуулагчийг агуулсан, өөрөөр хэлбэл. ангийн объектууд Handler.

Ажиллагчид - зохицуулагчид

Таны нэмдэг зохицуулагчтай Dispetcher янз бүрийн үйл явдалд ботын хариу үйлдэл. Энэ нийтлэлийг бичиж байх үед telegram.bot Дараах төрлийн зохицуулагчийг нэмсэн.

  • MessageHandler - Мессеж зохицуулагч
  • CommandHandler — Тушаал зохицуулагч
  • CallbackQueryHandler — Inline-аас илгээсэн гарны өгөгдөл зохицуулагч
  • ErrorHandler — Ботоос шинэчлэлт хүсэх үед алдаа гаргагч

Эхний командыг bot, тушаал зохицуулагч руу нэмнэ үү

Хэрэв та урьд өмнө хэзээ ч бот ашиглаж байгаагүй бөгөөд тушаал гэж юу болохыг мэдэхгүй бол бот руу ташуу зураас ашиглан тушаал илгээх ёстой. / угтвар хэлбэрээр.

Бид энгийн командуудаас эхлэх болно, жишээлбэл. Ботдоо тушаалаар мэндлэхийг зааж өгье /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()

Дээрх кодын жишээг ажиллуулж, 'YOUR BOT TOKEN'-г бот үүсгэхдээ хүлээн авсан жинхэнэ жетоноор сольсоны дараа. Бот Эцэг (Би робот үүсгэх талаар ярьсан анхны нийтлэл).

арга start_polling() анги UpdaterКодын төгсгөлд хэрэглэгддэг , ботоос шинэчлэлт хүсэх, боловсруулах төгсгөлгүй давталтыг эхлүүлдэг.

Одоо Telegram-ыг нээж, эхний командыг робот руугаа бичье /hi.

R-д телеграм бот бичих (2-р хэсэг): Ботод командын дэмжлэг болон мессежийн шүүлтүүр нэмэх

Одоо манай робот тушаалыг ойлгож байна /hi, мөн бидэнтэй хэрхэн мэндлэхээ мэддэг.

Ийм энгийн робот бүтээх үйл явцыг схемийн дагуу дараах байдлаар дүрсэлж болно.

R-д телеграм бот бичих (2-р хэсэг): Ботод командын дэмжлэг болон мессежийн шүүлтүүр нэмэх

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

Текст мессеж процессор ба шүүлтүүрүүд

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

энгийн MessageHandler ирж буй бүх мессежүүдэд хариу өгөх болно. Тиймээс мессеж боловсруулагчийг ихэвчлэн шүүлтүүртэй хамт ашигладаг. Ботыг зөвхөн тушаалаар бус сайн уу гэж хэлэхийг заацгаая /hi, гэхдээ бас бот руу илгээсэн зурваст дараах үгсийн аль нэг нь гарч ирэх бүрт: hello, hello, salute, 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()

Дээрх кодын жишээг ажиллуулж, 'YOUR BOT TOKEN'-г бот үүсгэхдээ хүлээн авсан жинхэнэ жетоноор сольсоны дараа. Бот Эцэг (Би робот үүсгэх талаар ярьсан анхны нийтлэл).

Одоо өмнө нь жагсаасан мэндчилгээний үгсийг агуулсан хэд хэдэн мессежийг робот руу илгээхийг хичээцгээе.
R-д телеграм бот бичих (2-р хэсэг): Ботод командын дэмжлэг болон мессежийн шүүлтүүр нэмэх

Тиймээс, бид юуны түрүүнд ботыг зүгээр л мэндлэхийг биш, харин мэндчилгээнд хариулахыг зааж өгсөн. Бид үүнийг аргумент ашиглан хийсэн мессежийн_id-д хариулах, аргад байдаг sendMessage(), та хариу өгөхийг хүссэн мессежийнхээ ID-г шилжүүлэх шаардлагатай. Та мессежийн ID-г дараах байдлаар авч болно: update$message$message_id.

Гэхдээ бидний хийсэн гол зүйл бол функцийг ашиглан bot-д шүүлтүүр нэмэх явдал байв 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 Таны ашиглаж болох олон тооны шүүлтүүрүүд аль хэдийн байна:

  • бүгд — Бүх мессеж
  • текст — Текст мессеж
  • тушаал — Командууд, өөрөөр хэлбэл. гэж эхэлдэг мессежүүд /
  • хариулах — Өөр зурваст хариу илгээх зурвасууд
  • audio — Аудио файл агуулсан мессежүүд
  • баримт бичиг — Илгээсэн баримт бүхий мессежүүд
  • зураг - Илгээсэн зурагтай мессежүүд
  • стикер — Илгээсэн наалт бүхий мессежүүд
  • видео — Видео бүхий мессежүүд
  • дуу хоолой - Дуут мессеж
  • холбоо барих — Хэрэглэгчийн телеграмын агуулгыг агуулсан зурвасууд
  • байршил — Газарзүйн байршил бүхий мессежүүд
  • газар — Дамжуулсан зурвасууд
  • тоглоом - Тоглоом

Хэрэв та зарим шүүлтүүрийг нэг зохицуулагчд нэгтгэхийг хүсвэл тэмдгийг ашиглана уу | - логикийн хувьд Эсвэл, гарын үсэг зурна уу & логик шиг И. Жишээлбэл, хэрэв та видео, зураг эсвэл баримт бичгийг хүлээн авахдаа роботыг ижил аргаар дуудахыг хүсвэл дараах жишээг ашиглан мессеж зохицуулагчийг үүсгэнэ үү.

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

Дээрх кодын жишээг ажиллуулж, 'YOUR BOT TOKEN'-г бот үүсгэхдээ хүлээн авсан жинхэнэ жетоноор сольсоны дараа. Бот Эцэг (Би робот үүсгэх талаар ярьсан анхны нийтлэл).

Бид арсеналдаа ганцхан аргатай роботыг бүтээсэн check_date, энэ аргыг ижил нэртэй тушаалаар дууддаг.

Гэхдээ энэ арга нь тушаалын нэрээс гадна улсын код, огноо гэсэн хоёр параметрийг оруулахыг шаарддаг. Дараа нь бот нь тухайн улс орны тухайн өдөр амралтын өдөр, богиносгосон өдөр эсвэл албан ёсны үйлдвэрлэлийн хуанлийн дагуу ажлын өдөр эсэхийг шалгадаг.

Бидний үүсгэсэн арга командын хамт нэмэлт параметрүүдийг хүлээн авахын тулд аргументыг ашиглана уу pass_args = TRUE функцэд CommandHandler(), арга үүсгэх үед шаардлагатай аргументуудаас гадна bot, шинэчлэх нэмэлт нэгийг бий болгох - нум. Ийм аргаар үүсгэсэн арга нь командын нэрний дараа бот руу дамжуулах параметрүүдийг хүлээн авах болно. Параметрүүд нь хоосон зайгаар тусгаарлагдсан байх ёстой бөгөөд тэдгээр нь текст вектор хэлбэрээр арга руу илгээгдэнэ.

Ботоо ажиллуулж, туршиж үзье.

R-д телеграм бот бичих (2-р хэсэг): Ботод командын дэмжлэг болон мессежийн шүүлтүүр нэмэх

Ботыг ард ажиллуулна уу

Бидний дуусгах хамгийн сүүлийн алхам бол роботыг арын дэвсгэр дээр ажиллуулах явдал юм.

Үүнийг хийхийн тулд доор тайлбарласан алгоритмыг дагана уу.

  1. Бот кодыг R өргөтгөлтэй файлд хадгална. RStudio дээр ажиллах үед үүнийг цэсээр дамжуулан хийдэг. Файлын, баг Хадгалах ....
  2. R хэлийг суулгасан хавтсанд байгаа бин фолдерын замыг Path хувьсагч, зааварт нэмнэ үү. энд.
  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. "Үйлдэл" таб руу очоод "Create" дээр дарна уу. "Хөтөлбөр эсвэл скрипт" талбарт "Үзэх" дээр дарж, хоёр дахь алхам дээр үүсгэсэн зүйлийг олоорой Бат файлыг сонгоод OK дарна уу.
  8. "OK" дээр дарж, шаардлагатай бол үйлдлийн системийн бүртгэлийн нууц үгээ оруулна уу.
  9. Төлөвлөгчөөс үүсгэсэн даалгавраа олоод, сонгоод баруун доод буланд байрлах "Ажиллуулах" товчийг дарна уу.

Манай бот цаана нь ажилладаг бөгөөд таныг даалгавраа зогсоох, эсвэл эхлүүлсэн компьютер эсвэл серверээ унтраах хүртэл ажиллах болно.

дүгнэлт

Энэ нийтлэлд бид зөвхөн мессеж илгээхээс гадна ирж буй мессеж, командуудад хариу өгөх боломжтой бүрэн хэмжээний роботыг хэрхэн бичих талаар олж мэдсэн. Олж авсан мэдлэг нь таны ихэнх асуудлыг шийдвэрлэхэд хангалттай юм.

Дараагийн нийтлэлд илүү тохиромжтой ажиллахын тулд bot-д гар хэрхэн нэмэх талаар ярих болно.

Миний сайтад бүртгүүлээрэй цахилгаан мэдээ и YouTube-ийн сувгууд.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх