R хэл дээр телеграм бот бичих (3-р хэсэг): Бот дээр гарын тусламжийг хэрхэн нэмэх вэ

Энэ бол "R-д телеграм бот бичих" цувралын гурав дахь нийтлэл юм. Өмнөх нийтлэлүүдээс бид хэрхэн телеграм бот үүсгэх, түүгээр дамжуулан мессеж илгээх, бот руу команд, мессежийн шүүлтүүр нэмэх талаар сурсан. Тиймээс, та энэ нийтлэлийг уншиж эхлэхээсээ өмнө уншихыг зөвлөж байна өмнөх, учир нь Энд би өмнө нь тайлбарласан бот бүтээх үндсүүдийн талаар цаашид ярихгүй.

Энэ нийтлэлд бид гарыг нэмж ботын ашиглалтыг сайжруулах бөгөөд энэ нь роботын интерфейсийг ойлгомжтой, ашиглахад хялбар болгоно.

R хэл дээр телеграм бот бичих (3-р хэсэг): Бот дээр гарын тусламжийг хэрхэн нэмэх вэ

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

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

Агуулга

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

  1. Telegram робот ямар төрлийн гарыг дэмждэг вэ?
  2. Хариулах гар
  3. Inline гар
    3.1. InLine товчлууруудыг дэмждэг энгийн ботын жишээ
    3.2. Сонгосон хотын цаг агаарын мэдээг гаргадаг ботын жишээ
    3.3. habr.com сайтаас заасан Hub-ийн холбоос бүхий хамгийн сүүлийн үеийн нийтлэлүүдийн жагсаалтыг харуулдаг ботын жишээ.
  4. дүгнэлт

Telegram робот ямар төрлийн гарыг дэмждэг вэ?

Үүнийг бичиж байх үед telegram.bot хоёр төрлийн гар үүсгэх боломжийг танд олгоно:

  • Хариулах - Мессежийн текст оруулах самбарын доор байрлах үндсэн, ердийн гар. Ийм гар нь зүгээр л бот руу текст мессеж илгээдэг бөгөөд текстийн хувьд товчлуур дээр бичсэн текстийг өөрөө илгээх болно.
  • Inline - Тодорхой ботын мессежтэй холбоотой гар. Энэ гар нь дарагдсан товчлууртай холбоотой ботын өгөгдлийг илгээдэг бөгөөд энэ өгөгдөл нь товчлуур дээр бичсэн текстээс ялгаатай байж болно. Мөн ийм товчлууруудыг дамжуулан боловсруулдаг CallbackQueryHandler.

Бот гарыг нээхийн тулд энэ аргаар мессеж илгээх шаардлагатай sendMessage(), өмнө үүсгэсэн гарыг аргумент болгон дамжуулна reply_markup.

Доор бид хэд хэдэн жишээг авч үзэх болно.

Хариулах гар

Миний дээр бичсэнчлэн энэ бол үндсэн роботын удирдлагын гар юм.

Албан ёсны тусламжаас Reply гар үүсгэх жишээ

bot <- Bot(token = "TOKEN")
chat_id <- "CHAT_ID"

# Create Custom Keyboard
text <- "Aren't those custom keyboards cool?"
RKM <- ReplyKeyboardMarkup(
  keyboard = list(
    list(KeyboardButton("Yes, they certainly are!")),
    list(KeyboardButton("I'm not quite sure")),
    list(KeyboardButton("No..."))
  ),
  resize_keyboard = FALSE,
  one_time_keyboard = TRUE
)

# Send Custom Keyboard
bot$sendMessage(chat_id, text, reply_markup = RKM)

Дээрх нь багцын албан ёсны тусламжийн жишээ юм telegram.bot. Гар үүсгэхийн тулд функцийг ашиглана уу ReplyKeyboardMarkup(), энэ нь эргээд функцээр үүсгэгдсэн товчлууруудын жагсаалтыг авдаг KeyboardButton().

Яагаад? ReplyKeyboardMarkup() Та зөвхөн жагсаалт биш, харин жагсаалтын жагсаалтыг дамжуулах шаардлагатай юу? Үнэн хэрэгтээ та үндсэн жагсаалтыг дамжуулж, үүн дотор товчлуурын мөр бүрийг тусад нь жагсаалтад тодорхойлдог, учир нь Та хэд хэдэн товчлуурыг нэг мөрөнд байрлуулж болно.

баталгаа resize_keyboard гарны товчлууруудын оновчтой хэмжээ, аргументыг автоматаар сонгох боломжийг танд олгоно one_time_keyboard товчлуур дарах бүрийн дараа гарыг нуух боломжийг танд олгоно.

3 товчлууртай энгийн бот бичье.

  • Чат ID - Боттой харилцах чатын ID-г хүсэх
  • Миний нэр - Нэрээ асуу
  • Миний нэвтрэх - Telegram дээр хэрэглэгчийн нэрээ асуугаарай

Код 1: Хариулах гартай энгийн робот

library(telegram.bot)

# создаём экземпляр класса Updater
updater <- Updater('ТОКЕН ВАШЕГО БОТА')

# создаём методы
## метод для запуска клавиатуры
start <- function(bot, update) {

  # создаём клавиатуру
  RKM <- ReplyKeyboardMarkup(
    keyboard = list(
      list(KeyboardButton("Чат ID")),
      list(KeyboardButton("Моё имя")),
      list(KeyboardButton("Мой логин"))
    ),
    resize_keyboard = FALSE,
    one_time_keyboard = TRUE
  )

  # отправляем клавиатуру
  bot$sendMessage(update$message$chat_id,
                  text = 'Выберите команду', 
                  reply_markup = RKM)

}

## метод возвразающий id чата
chat_id <- function(bot, update) {

  bot$sendMessage(update$message$chat_id, 
                  text = paste0("Чат id этого диалога: ", update$message$chat_id),
                  parse_mode = "Markdown")

}

## метод возвращающий имя
my_name <- function(bot, update) {

  bot$sendMessage(update$message$chat_id, 
                  text = paste0("Вас зовут ", update$message$from$first_name),
                  parse_mode = "Markdown")

}

## метод возвращающий логин
my_username <- function(bot, update) {

  bot$sendMessage(update$message$chat_id, 
                  text = paste0("Ваш логин ", update$message$from$username),
                  parse_mode = "Markdown")

}

# создаём фильтры
## сообщения с текстом Чат ID
MessageFilters$chat_id <- BaseFilter(function(message) {

  # проверяем текст сообщения
  message$text == "Чат ID"

}
)

## сообщения с текстом Моё имя
MessageFilters$name <- BaseFilter(function(message) {

  # проверяем текст сообщения
  message$text == "Моё имя"

}
)

## сообщения с текстом Мой логин
MessageFilters$username <- BaseFilter(function(message) {

  # проверяем текст сообщения
  message$text == "Мой логин"
)

# создаём обработчики
h_start    <- CommandHandler('start', start)
h_chat_id  <- MessageHandler(chat_id, filters = MessageFilters$chat_id)
h_name     <- MessageHandler(my_name, filters = MessageFilters$name)
h_username <- MessageHandler(my_username, filters = MessageFilters$username)

# добавляем обработчики в диспетчер
updater <- updater + 
            h_start +
            h_chat_id +
            h_name +
            h_username

# запускаем бота 
updater$start_polling()

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

Эхлүүлсний дараа ботод команд өгнө /start, учир нь Энэ бол гарыг эхлүүлэхийн тулд бидний тодорхойлсон зүйл юм.

R хэл дээр телеграм бот бичих (3-р хэсэг): Бот дээр гарын тусламжийг хэрхэн нэмэх вэ

Хэрэв одоогоор танд өгөгдсөн кодын жишээг арга, шүүлтүүр, боловсруулагч үүсгэх замаар задлан шинжлэхэд хэцүү байгаа бол та өмнөх рүүгээ буцах хэрэгтэй. нийтлэл, үүнд би энэ бүхнийг нарийвчлан тодорхойлсон.

Бид 4 аргыг боловсруулсан:

  • эхлүүлэх — Гарыг ажиллуулна уу
  • chat_id — Чатын ID-г хүсэх
  • my_name — Нэрээ асууна уу
  • my_username — Нэвтрэхийг хүсэх

Эсэргүүцэх MessageFilters Текст дээрээ үндэслэн 3 мессеж шүүлтүүр нэмсэн:

  • chat_id — Текст бүхий мессежүүд "Чат ID"
  • нэр — Текст бүхий мессежүүд "Моё имя"
  • хэрэглэгчийн нэр — Текст бүхий мессежүүд "Мой логин"

Мөн бид өгөгдсөн командууд болон шүүлтүүрүүд дээр үндэслэн заасан аргуудыг гүйцэтгэх 4 зохицуулагчийг бүтээсэн.

# создаём обработчики
h_start    <- CommandHandler('start', start)
h_chat_id  <- MessageHandler(chat_id, filters = MessageFilters$chat_id)
h_name     <- MessageHandler(my_name, filters = MessageFilters$name)
h_username <- MessageHandler(my_username, filters = MessageFilters$username)

Гар нь өөрөө аргын дотор үүсгэгддэг start() баг ReplyKeyboardMarkup().

RKM <- ReplyKeyboardMarkup(
    keyboard = list(
      list(KeyboardButton("Чат ID")),
      list(KeyboardButton("Моё имя")),
      list(KeyboardButton("Мой логин"))
    ),
    resize_keyboard = FALSE,
    one_time_keyboard = TRUE
)

Манай тохиолдолд бид бүх товчлууруудыг бие биенийхээ доор байрлуулсан боловч товчлуурын жагсаалтын жагсаалтад өөрчлөлт оруулснаар тэдгээрийг нэг эгнээнд байрлуулж болно. Учир нь Гарны доторх нэг мөр нь үүрлэсэн товчлууруудын жагсаалтаар үүсгэгдсэн бөгөөд дараа нь товчлууруудаа нэг мөрөнд харуулахын тулд бид гарыг бүтээх кодын хэсгийг дараах байдлаар дахин бичих хэрэгтэй.

RKM <- ReplyKeyboardMarkup(
    keyboard = list(
      list(
          KeyboardButton("Чат ID"),
          KeyboardButton("Моё имя"),
          KeyboardButton("Мой логин")
     )
    ),
    resize_keyboard = FALSE,
    one_time_keyboard = TRUE
)

R хэл дээр телеграм бот бичих (3-р хэсэг): Бот дээр гарын тусламжийг хэрхэн нэмэх вэ

Уг аргыг ашиглан гарыг чат руу илгээдэг sendMessage(), маргаанд reply_markup.

  bot$sendMessage(update$message$chat_id,
                  text = 'Выберите команду', 
                  reply_markup = RKM)

Inline гар

Миний дээр бичсэнчлэн Inline гар нь тодорхой мессежтэй холбоотой байдаг. Энэ нь үндсэн гартай харьцуулахад арай илүү хэцүү байдаг.

Эхлээд та Inline гарыг дуудах аргыг bot-д нэмэх хэрэгтэй.

Inline товчлуур дээр дарахад хариу өгөхийн тулд та роботын аргыг ашиглаж болно answerCallbackQuery(), энэ нь Inline товчийг дарсан хэрэглэгчдэд телеграмын интерфейс дэх мэдэгдлийг харуулах боломжтой.

Inline товчлуураас илгээсэн өгөгдөл нь текст биш тул үүнийг боловсруулахын тулд та командыг ашиглан тусгай зохицуулагч үүсгэх хэрэгтэй CallbackQueryHandler().

Inline гар бүтээх кодыг багцын албан ёсны тусламжид өгсөн болно telegram.bot.

Албан ёсны тусламжаас Inline гар бүтээх код

# Initialize bot
bot <- Bot(token = "TOKEN")
chat_id <- "CHAT_ID"

# Create Inline Keyboard
text <- "Could you type their phone number, please?"
IKM <- InlineKeyboardMarkup(
  inline_keyboard = list(
    list(
      InlineKeyboardButton(1),
      InlineKeyboardButton(2),
      InlineKeyboardButton(3)
    ),
    list(
      InlineKeyboardButton(4),
      InlineKeyboardButton(5),
      InlineKeyboardButton(6)
    ),
    list(
      InlineKeyboardButton(7),
      InlineKeyboardButton(8),
      InlineKeyboardButton(9)
    ),
    list(
      InlineKeyboardButton("*"),
      InlineKeyboardButton(0),
      InlineKeyboardButton("#")
    )
  )
)

# Send Inline Keyboard
bot$sendMessage(chat_id, text, reply_markup = IKM)

Та тушаалыг ашиглан Inline гар бүтээх хэрэгтэй InlineKeyboardMarkup(), Хариулах гартай ижил зарчим дээр. IN InlineKeyboardMarkup() Inline товчлууруудын жагсаалтын жагсаалтыг дамжуулах шаардлагатай бөгөөд тус бүр товчлуур бүрийг функцээр үүсгэнэ InlineKeyboardButton().

Дотор товчлуур нь аргумент ашиглан зарим өгөгдлийг робот руу дамжуулж болно callback_data, эсвэл аргументыг ашиглан заасан дурын HTML хуудсыг нээнэ үү url.

Үр дүн нь элемент бүрийг нэг мөрөнд нэгтгэх шаардлагатай Inline товчлууруудын жагсаалт болох жагсаалт байх болно.

Дараа нь бид Inline товчлуур бүхий роботуудын хэд хэдэн жишээг үзэх болно.

InLine товчлууруудыг дэмждэг энгийн ботын жишээ

Эхлээд бид covid-19-ийн экспресс шинжилгээнд зориулж робот бичих болно. Тушаалаар /test, энэ нь танд хоёр товчлуур бүхий гар илгээх бөгөөд дарагдсан товчлуураас хамааран танд туршилтын үр дүнгийн мессежийг илгээх болно.

Код 2: Inline гартай хамгийн энгийн робот

library(telegram.bot)

# создаём экземпляр класса Updater
updater <- Updater('ТОКЕН ВАШЕГО БОТА')

# метод для отправки InLine клавиатуры
test <- function(bot, update) {

  # создаём InLine клавиатуру
  IKM <- InlineKeyboardMarkup(
    inline_keyboard = list(
      list(
        InlineKeyboardButton("Да", callback_data = 'yes'),
        InlineKeyboardButton("Нет", callback_data = 'no')
      )
    )
  )

  # Отправляем клавиатуру в чат
  bot$sendMessage(update$message$chat_id, 
                  text = "Вы болете коронавирусом?", 
                  reply_markup = IKM)
}

# метод для обработки нажатия кнопки
answer_cb <- function(bot, update) {

  # полученные данные с кнопки
  data <- update$callback_query$data

  # получаем имя пользователя, нажавшего кнопку
  uname <- update$effective_user()$first_name

  # обработка результата
  if ( data == 'no' ) {

    msg <- paste0(uname, ", поздравляю, ваш тест на covid-19 отрицательный.")

  } else {

    msg <- paste0(uname, ", к сожалени ваш тест на covid-19 положительный.")

  }

  # Отправка сообщения
  bot$sendMessage(chat_id = update$from_chat_id(),
                  text = msg)

  # сообщаем боту, что запрос с кнопки принят
  bot$answerCallbackQuery(callback_query_id = update$callback_query$id) 
}

# создаём обработчики
inline_h      <- CommandHandler('test', test)
query_handler <- CallbackQueryHandler(answer_cb)

# добавляем обработчики в диспетчер
updater <- updater + inline_h + query_handler

# запускаем бота
updater$start_polling()

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

Үр дүн:
R хэл дээр телеграм бот бичих (3-р хэсэг): Бот дээр гарын тусламжийг хэрхэн нэмэх вэ

Бид хоёр аргыг бий болгосон:

  • туршилтын — Чатад илгээх Inline гар
  • answer_cb — Гараас илгээсэн өгөгдлийг боловсруулах.

Товч тус бүрээс илгээгдэх өгөгдлийг аргумент дээр зааж өгсөн болно callback_data, товчлуур үүсгэх үед. Та бүтэц ашиглан товчлуураас илгээсэн өгөгдлийг хүлээн авах боломжтой update$callback_query$data, аргын дотор answer_cb.

Inline гарт хариу үйлдэл үзүүлэх роботын хувьд арга answer_cb тусгай зохицуулагчаар боловсруулсан: CallbackQueryHandler(answer_cb). Inline товчийг дарахад заасан аргыг ажиллуулдаг. Ажиллагч CallbackQueryHandler хоёр аргумент авдаг:

  • callback - Ажиллуулах шаардлагатай арга
  • pattern — Товчлууртай холбогдсон өгөгдлийг аргумент ашиглан шүүнэ callback_data.

Үүний дагуу аргументыг ашиглан pattern Бид товчлуур бүрийг дарах тусдаа аргыг бичиж болно:

Код 3: Inline товчлуур бүрийн хувьд тусдаа аргууд

library(telegram.bot)

# создаём экземпляр класса Updater
updater <- Updater('ТОКЕН ВАШЕГО БОТА')

# метод для отправки InLine клавиатуры
test <- function(bot, update) {  

  # создаём InLine клавиатуру
  IKM <- InlineKeyboardMarkup(
    inline_keyboard = list(
      list(
        InlineKeyboardButton("Да", callback_data = 'yes'),
        InlineKeyboardButton("Нет", callback_data = 'no')
      )
    )
  )

  # Отправляем клавиатуру в чат
  bot$sendMessage(update$message$chat_id, 
                  text = "Вы болете коронавирусом?", 
                  reply_markup = IKM)
}

# метод для обработки нажатия кнопки Да
answer_cb_yes <- function(bot, update) {

  # получаем имя пользователя, нажавшего кнопку
  uname <- update$effective_user()$first_name

  # обработка результата
  msg <- paste0(uname, ", к сожалени ваш текст на covid-19 положительный.")

  # Отправка сообщения
  bot$sendMessage(chat_id = update$from_chat_id(),
                  text = msg)

  # сообщаем боту, что запрос с кнопки принят
  bot$answerCallbackQuery(callback_query_id = update$callback_query$id) 
}

# метод для обработки нажатия кнопки Нет
answer_cb_no <- function(bot, update) {

  # получаем имя пользователя, нажавшего кнопку
  uname <- update$effective_user()$first_name

  msg <- paste0(uname, ", поздравляю, ваш текст на covid-19 отрицательный.")

  # Отправка сообщения
  bot$sendMessage(chat_id = update$from_chat_id(),
                  text = msg)

  # сообщаем боту, что запрос с кнопки принят
  bot$answerCallbackQuery(callback_query_id = update$callback_query$id) 
}

# создаём обработчики
inline_h          <- CommandHandler('test', test)
query_handler_yes <- CallbackQueryHandler(answer_cb_yes, pattern = 'yes')
query_handler_no  <- CallbackQueryHandler(answer_cb_no, pattern = 'no')

# добавляем обработчики в диспетчер
updater <- updater + 
            inline_h + 
            query_handler_yes +
            query_handler_no

# запускаем бота
updater$start_polling()

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

Одоо бид 2 тусдаа аргыг бичсэн, өөрөөр хэлбэл. нэг арга, товчлуур бүрийн хувьд дараад аргументыг ашигласан pattern, тэдгээрийн зохицуулагчийг үүсгэх үед:

query_handler_yes <- CallbackQueryHandler(answer_cb_yes, pattern = 'yes')
query_handler_no  <- CallbackQueryHandler(answer_cb_no, pattern = 'no')

Аргын код дуусна answer_cb баг bot$answerCallbackQuery(callback_query_id = update$callback_query$id), энэ нь шугаман гараас өгөгдөл хүлээн авсныг роботт хэлдэг.

Сонгосон хотын цаг агаарын мэдээг гаргадаг ботын жишээ

Цаг агаарын мэдээлэл шаарддаг робот бичихийг оролдъё.

Түүний ажлын логик нь дараах байдалтай байна. Эхэндээ багаараа /start та зөвхөн нэг "Цаг агаар" товчлууртай үндсэн гарыг дуудна. Энэ товчлуур дээр дарснаар та одоогийн цаг агаарыг мэдэхийг хүсч буй хотыг сонгох Inline гартай мессеж хүлээн авах болно. Хотуудаас аль нэгийг нь сонгоод одоогийн цаг агаарын мэдээллийг аваарай.

Энэ кодын жишээнд бид хэд хэдэн нэмэлт багцуудыг ашиглах болно:

  • httr - HTTP хүсэлтүүдтэй ажиллах багц бөгөөд үүний үндсэн дээр ямар ч API-тай ажиллах боломжтой болно. Манай тохиолдолд бид үнэгүй API ашиглах болно openweathermap.org.
  • stringr — тексттэй ажиллах багц, бидний тохиолдолд бид үүнийг сонгосон хотын цаг агаарын тухай мессеж үүсгэхэд ашиглах болно.

Код 4: Сонгосон хотын цаг агаарын мэдээг гаргадаг робот

library(telegram.bot)
library(httr)
library(stringr)

# создаём экземпляр класса Updater
updater <- Updater('ТОКЕН ВАШЕГО БОТА')

# создаём методы
## метод для запуска основной клавиатуры
start <- function(bot, update) {

  # создаём клавиатуру
  RKM <- ReplyKeyboardMarkup(
    keyboard = list(
      list(
        KeyboardButton("Погода")
      )
    ),
    resize_keyboard = TRUE,
    one_time_keyboard = TRUE
  )

  # отправляем клавиатуру
  bot$sendMessage(update$message$chat_id,
                  text = 'Выберите команду', 
                  reply_markup = RKM)

}

## Метод вызова Inine клавиатуры
weather <- function(bot, update) {

  IKM <- InlineKeyboardMarkup(
    inline_keyboard = list(
      list(
        InlineKeyboardButton(text = 'Москва', callback_data = 'New York,us'),
        InlineKeyboardButton(text = 'Санкт-Петербург', callback_data = 'Saint Petersburg'),
        InlineKeyboardButton(text = 'Нью-Йорк', callback_data = 'New York')
      ),
      list(
        InlineKeyboardButton(text = 'Екатеринбург', callback_data = 'Yekaterinburg,ru'),
        InlineKeyboardButton(text = 'Берлин', callback_data = 'Berlin,de'),
        InlineKeyboardButton(text = 'Париж', callback_data = 'Paris,fr')
      ),
      list(
        InlineKeyboardButton(text = 'Рим', callback_data = 'Rome,it'),
        InlineKeyboardButton(text = 'Одесса', callback_data = 'Odessa,ua'),
        InlineKeyboardButton(text = 'Киев', callback_data = 'Kyiv,fr')
      ),
      list(
        InlineKeyboardButton(text = 'Токио', callback_data = 'Tokyo'),
        InlineKeyboardButton(text = 'Амстердам', callback_data = 'Amsterdam,nl'),
        InlineKeyboardButton(text = 'Вашингтон', callback_data = 'Washington,us')
      )
    )
  )

  # Send Inline Keyboard
  bot$sendMessage(chat_id = update$message$chat_id, 
                  text = "Выберите город", 
                  reply_markup = IKM)
}

# метод для сообщения погоды
answer_cb <- function(bot, update) {

  # получаем из сообщения город
  city <- update$callback_query$data

  # отправляем запрос
  ans <- GET('https://api.openweathermap.org/data/2.5/weather', 
             query = list(q     = city,
                          lang  = 'ru',
                          units = 'metric',
                          appid = '4776568ccea136ffe4cda9f1969af340')) 

  # парсим ответ
  result <- content(ans)

  # формируем сообщение
  msg <- str_glue("{result$name} погода:n",
                  "Текущая температура: {result$main$temp}n",
                  "Скорость ветра: {result$wind$speed}n",
                  "Описание: {result$weather[[1]]$description}")

  # отправляем информацию о погоде
  bot$sendMessage(chat_id = update$from_chat_id(),
                  text    = msg)

  bot$answerCallbackQuery(callback_query_id = update$callback_query$id) 
}

# создаём фильтры
## сообщения с текстом Погода
MessageFilters$weather <- BaseFilter(function(message) {

  # проверяем текст сообщения
  message$text == "Погода"

}
)

# создаём обработчики
h_start         <- CommandHandler('start', start)
h_weather       <- MessageHandler(weather, filters = MessageFilters$weather)
h_query_handler <- CallbackQueryHandler(answer_cb)

# добавляем обработчики в диспетчер
updater <- updater + 
              h_start +
              h_weather +
              h_query_handler

# запускаем бота
updater$start_polling()

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

Үүний үр дүнд манай робот дараах байдлаар ажиллах болно.
R хэл дээр телеграм бот бичих (3-р хэсэг): Бот дээр гарын тусламжийг хэрхэн нэмэх вэ

Схемийн хувьд энэ роботыг дараах байдлаар дүрсэлж болно.
R хэл дээр телеграм бот бичих (3-р хэсэг): Бот дээр гарын тусламжийг хэрхэн нэмэх вэ

Бид цаг агаарын робот дотроо 3 аргыг бий болгосон:

  • эхлэх — Үндсэн робот гарыг ажиллуулна уу
  • цаг агаар — Хот сонгохын тулд Inline гарыг ажиллуул
  • answer_cb — Тухайн хотын API-аас цаг агаарыг асууж, чат руу илгээдэг гол арга.

арга эхлэх Бид үүнийг тушаалаар ажиллуулна /start, үүнийг зохицуулагч хэрэгжүүлдэг CommandHandler('start', start).

Аргыг ажиллуулахын тулд цаг агаар Бид ижил нэртэй шүүлтүүр үүсгэсэн:

# создаём фильтры
## сообщения с текстом Погода
MessageFilters$weather <- BaseFilter(function(message) {

  # проверяем текст сообщения
  message$text == "Погода"

}
)

Мөн бид энэ аргыг дараах мессеж зохицуулагчаар дууддаг: MessageHandler(weather, filters = MessageFilters$weather).

Эцэст нь хэлэхэд бидний гол арга answer_cb Тусгай зохицуулагчийн хэрэгжүүлдэг Inline товчийг дарахад хариу үйлдэл үзүүлдэг. CallbackQueryHandler(answer_cb).

Арга дотор answer_cb, бид гарнаас илгээсэн өгөгдлийг уншиж, хувьсагч руу бичдэг city: city <- update$callback_query$data. Дараа нь бид API-аас цаг агаарын мэдээллийг хүсч, мессеж үүсгэж, илгээж, эцэст нь энэ аргыг ашигладаг answerCallbackQuery Бид Inline товчийг товшилтоор боловсруулсныг роботт мэдэгдэхийн тулд.

Заасан Hub-ийн холбоос бүхий хамгийн сүүлийн үеийн нийтлэлүүдийн жагсаалтыг харуулдаг ботын жишээ www.habr.com.

Вэб хуудсууд руу хөтөлдөг Inline товчлууруудыг хэрхэн харуулахыг танд харуулахын тулд би энэ роботыг толилуулж байна.

Энэ роботын логик нь өмнөхтэй төстэй бөгөөд эхлээд бид үндсэн гарыг тушаалаар ажиллуулдаг /start. Дараа нь bot нь бидэнд сонгох боломжтой 6 төвийн жагсаалтыг өгч, бид сонирхож буй төвөө сонгож, сонгосон Hub-аас хамгийн сүүлийн үеийн 5 хэвлэлийг хүлээн авдаг.

Таны ойлгож байгаагаар энэ тохиолдолд бид нийтлэлийн жагсаалтыг авах шаардлагатай бөгөөд үүний тулд бид тусгай багц ашиглах болно habR, энэ нь Хабрагаас нийтлэл, тэдгээрийн талаархи зарим статистик мэдээллийг R-д авах хүсэлт гаргах боломжийг олгодог.

Багцыг суулгана уу habR зөвхөн github-аас боломжтой бөгөөд үүнд танд нэмэлт багц хэрэгтэй болно devtools. Суулгахын тулд доорх кодыг ашиглана уу.

install.packages('devtools')
devtools::install_github('selesnow/habR')

Одоо дээр дурдсан роботыг бүтээх кодыг харцгаая.

Код 5: Сонгосон Hub дээрх хамгийн сүүлийн нийтлэлүүдийн жагсаалтыг харуулдаг робот

library(telegram.bot)
library(habR)

# создаём экземпляр класса Updater
updater <- Updater('ТОКЕН ВАШЕГО БОТА')

# создаём методы
## метод для запуска основной клавиатуры
start <- function(bot, update) {

  # создаём клавиатуру
  RKM <- ReplyKeyboardMarkup(
    keyboard = list(
      list(
        KeyboardButton("Список статей")
      )
    ),
    resize_keyboard = TRUE,
    one_time_keyboard = TRUE
  )

  # отправляем клавиатуру
  bot$sendMessage(update$message$chat_id,
                  text = 'Выберите команду', 
                  reply_markup = RKM)

}

## Метод вызова Inine клавиатуры
habs <- function(bot, update) {

  IKM <- InlineKeyboardMarkup(
    inline_keyboard = list(
      list(
        InlineKeyboardButton(text = 'R', callback_data = 'R'),
        InlineKeyboardButton(text = 'Data Mining', callback_data = 'data_mining'),
        InlineKeyboardButton(text = 'Data Engineering', callback_data = 'data_engineering')
      ),
      list(
        InlineKeyboardButton(text = 'Big Data', callback_data = 'bigdata'),
        InlineKeyboardButton(text = 'Python', callback_data = 'python'),
        InlineKeyboardButton(text = 'Визуализация данных', callback_data = 'data_visualization')
      )
    )
  )

  # Send Inline Keyboard
  bot$sendMessage(chat_id = update$message$chat_id, 
                  text = "Выберите Хаб", 
                  reply_markup = IKM)
}

# метод для сообщения погоды
answer_cb <- function(bot, update) {

  # получаем из сообщения город
  hub <- update$callback_query$data

  # сообщение о том, что данные по кнопке получены
  bot$answerCallbackQuery(callback_query_id = update$callback_query$id, 
                          text = 'Подождите несколько минут, запрос обрабатывается') 

  # сообщение о том, что надо подождать пока бот получит данные
  mid <- bot$sendMessage(chat_id = update$from_chat_id(),
                         text    = "Подождите несколько минут пока, я соберу данные по выбранному Хабу")

  # парсим Хабр
  posts <- head(habr_hub_posts(hub, 1), 5)

  # удаляем сообщение о том, что надо подождать
  bot$deleteMessage(update$from_chat_id(), mid$message_id) 

  # формируем список кнопок
  keys <- lapply(1:5, function(x) list(InlineKeyboardButton(posts$title[x], url = posts$link[x])))

  # формируем клавиатуру
  IKM <- InlineKeyboardMarkup(
    inline_keyboard =  keys 
    )

  # отправляем информацию о погоде
  bot$sendMessage(chat_id = update$from_chat_id(),
                  text    = paste0("5 наиболее свежих статей из Хаба ", hub),
                  reply_markup = IKM)

}

# создаём фильтры
## сообщения с текстом Погода
MessageFilters$hubs <- BaseFilter(function(message) {

  # проверяем текст сообщения
  message$text == "Список статей"

}
)

# создаём обработчики
h_start         <- CommandHandler('start', start)
h_hubs          <- MessageHandler(habs, filters = MessageFilters$hubs)
h_query_handler <- CallbackQueryHandler(answer_cb)

# добавляем обработчики в диспетчер
updater <- updater + 
  h_start +
  h_hubs  +
  h_query_handler

# запускаем бота
updater$start_polling()

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

Үүний үр дүнд бид дараах үр дүнг авах болно.
R хэл дээр телеграм бот бичих (3-р хэсэг): Бот дээр гарын тусламжийг хэрхэн нэмэх вэ

Бид аргад сонгох боломжтой төвүүдийн жагсаалтыг хатуу кодлосон habs:

## Метод вызова Inine клавиатуры
habs <- function(bot, update) {

  IKM <- InlineKeyboardMarkup(
    inline_keyboard = list(
      list(
        InlineKeyboardButton(text = 'R', callback_data = 'r'),
        InlineKeyboardButton(text = 'Data Mining', callback_data = 'data_mining'),
        InlineKeyboardButton(text = 'Data Engineering', callback_data = 'data_engineering')
      ),
      list(
        InlineKeyboardButton(text = 'Big Data', callback_data = 'bigdata'),
        InlineKeyboardButton(text = 'Python', callback_data = 'python'),
        InlineKeyboardButton(text = 'Визуализация данных', callback_data = 'data_visualization')
      )
    )
  )

  # Send Inline Keyboard
  bot$sendMessage(chat_id = update$message$chat_id, 
                  text = "Выберите Хаб", 
                  reply_markup = IKM)
}

Бид заасан Hub-аас нийтлэлүүдийн жагсаалтыг тушаалаар авдаг habr_hub_posts(), багцаас habR. Үүний зэрэгцээ бид бүхэл бүтэн хугацаанд нийтлэлийн жагсаалт шаардлагагүй, зөвхөн 20 нийтлэл байрладаг эхний хуудас хэрэгтэй гэдгийг онцлон тэмдэглэв. Үүссэн хүснэгтээс тушаалыг ашиглан head() Бид хамгийн сүүлийн үеийн нийтлэл болох шилдэг 5-ыг л үлдээж байна.

  # парсим Хабр
  posts <- head(habr_hub_posts(hub, 1), 5)

Логик нь өмнөх роботтой маш төстэй боловч энэ тохиолдолд бид функцийг ашиглан нийтлэлийн жагсаалт бүхий Inline гар үүсгэдэг. lapply().

  # формируем список кнопок
  keys <- lapply(1:5, function(x) list(InlineKeyboardButton(posts$title[x], url = posts$link[x])))

  # формируем клавиатуру
  IKM <- InlineKeyboardMarkup(
    inline_keyboard =  keys 
    )

Бид нийтлэлийн гарчгийг товчлуурын текстэнд оруулна posts$title[x], мөн маргаанд url нийтлэлийн холбоос: url = posts$link[x].

Дараа нь бид шүүлтүүр, зохицуулагч үүсгэж, роботоо ажиллуулна.

дүгнэлт

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

Дараагийн өгүүллээр бид боттой логик харилцан яриа үүсгэх, мэдээллийн сантай хэрхэн ажиллах талаар олж мэдэх болно.

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

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