การเขียนบอทโทรเลขใน R (ตอนที่ 3): วิธีเพิ่มการรองรับคีย์บอร์ดให้กับบอท

นี่เป็นบทความที่สามในซีรีส์ "การเขียนบอตโทรเลขใน R" ในสิ่งพิมพ์ก่อนหน้านี้ เราได้เรียนรู้วิธีสร้างเทเลแกรมบอท ส่งข้อความผ่านบอท เพิ่มคำสั่งและตัวกรองข้อความให้กับบอท ดังนั้นก่อนที่คุณจะเริ่มอ่านบทความนี้ฉันขอแนะนำให้คุณอ่าน ก่อนหน้า, เพราะ ในที่นี้ฉันจะไม่ยึดติดกับพื้นฐานการสร้างบอทที่อธิบายไว้ก่อนหน้านี้อีกต่อไป

ในบทความนี้ เราจะปรับปรุงการใช้งานบอทของเราโดยการเพิ่มแป้นพิมพ์ ซึ่งจะทำให้อินเทอร์เฟซของบอทใช้งานง่ายและใช้งานง่าย

การเขียนบอทโทรเลขใน R (ตอนที่ 3): วิธีเพิ่มการรองรับคีย์บอร์ดให้กับบอท

บทความทั้งหมดจากซีรีส์ “การเขียนบอทโทรเลขใน R”

  1. เราสร้างบอทและใช้เพื่อส่งข้อความทางโทรเลข
  2. เพิ่มการสนับสนุนคำสั่งและตัวกรองข้อความให้กับบอท
  3. วิธีเพิ่มการรองรับคีย์บอร์ดให้กับบอท

Содержание

หากคุณสนใจในการวิเคราะห์ข้อมูล คุณอาจสนใจใน my โทรเลข и YouTube ช่อง. เนื้อหาส่วนใหญ่เกี่ยวกับภาษา R

  1. Telegram bot รองรับคีย์บอร์ดประเภทใดบ้าง?
  2. แป้นพิมพ์ตอบกลับ
  3. แป้นพิมพ์อินไลน์
    3.1. ตัวอย่างของบอทธรรมดาที่รองรับปุ่ม InLine
    3.2. ตัวอย่างบอทที่รายงานสภาพอากาศปัจจุบันสำหรับเมืองที่เลือก
    3.3. ตัวอย่างของบอทที่แสดงรายการบทความล่าสุดพร้อมลิงก์ไปยัง Hub ที่ระบุจาก habr.com
  4. ข้อสรุป

Telegram bot รองรับคีย์บอร์ดประเภทใดบ้าง?

ในขณะที่เขียนนี้ telegram.bot ช่วยให้คุณสร้างคีย์บอร์ดได้สองประเภท:

  • ตอบกลับ - แป้นพิมพ์หลักปกติซึ่งอยู่ใต้แผงป้อนข้อความ แป้นพิมพ์ดังกล่าวเพียงส่งข้อความไปยังบอท และในขณะที่ข้อความนั้นมันจะส่งข้อความที่เขียนบนปุ่มนั้นเอง
  • อินไลน์ - แป้นพิมพ์ที่เกี่ยวข้องกับข้อความบอทเฉพาะ แป้นพิมพ์นี้จะส่งข้อมูลบอทที่เกี่ยวข้องกับการกดปุ่ม ข้อมูลนี้อาจแตกต่างจากข้อความที่เขียนบนปุ่ม และปุ่มดังกล่าวได้รับการประมวลผลผ่าน CallbackQueryHandler.

เพื่อให้บอทเปิดคีย์บอร์ดได้ จำเป็นเมื่อส่งข้อความผ่านวิธีการนี้ sendMessage()ให้ส่งคีย์บอร์ดที่สร้างไว้ก่อนหน้านี้เป็นอาร์กิวเมนต์ reply_markup.

ด้านล่างนี้เราจะดูตัวอย่างต่างๆ

แป้นพิมพ์ตอบกลับ

อย่างที่ฉันเขียนไว้ข้างต้น นี่คือคีย์บอร์ดควบคุมบอทหลัก

ตัวอย่างการสร้างแป้นพิมพ์ตอบกลับจากวิธีใช้อย่างเป็นทางการ

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 ปุ่ม:

  • Chat ID - ขอ ID แชทของการสนทนากับบอท
  • ชื่อของฉัน - ขอชื่อของคุณ
  • การเข้าสู่ระบบของฉัน - ขอชื่อผู้ใช้ของคุณในโทรเลข

รหัส 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 — ขอข้อมูลเข้าสู่ระบบของคุณ

เพื่อคัดค้าน ตัวกรองข้อความ เพิ่มตัวกรองข้อความ 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)

แป้นพิมพ์อินไลน์

ดังที่ฉันเขียนไว้ข้างต้น แป้นพิมพ์อินไลน์จะเชื่อมโยงกับข้อความเฉพาะ การทำงานด้วยคีย์บอร์ดหลักค่อนข้างยากกว่า

ในตอนแรก คุณต้องเพิ่มวิธีการให้กับบอทเพื่อเรียกแป้นพิมพ์อินไลน์

หากต้องการตอบสนองต่อการคลิกปุ่มอินไลน์ คุณสามารถใช้วิธีบอทได้เช่นกัน answerCallbackQuery()ซึ่งสามารถแสดงการแจ้งเตือนในอินเทอร์เฟซโทรเลขให้กับผู้ใช้ที่กดปุ่มอินไลน์

ข้อมูลที่ส่งจากปุ่มอินไลน์ไม่ใช่ข้อความ ดังนั้นในการประมวลผลคุณต้องสร้างตัวจัดการพิเศษโดยใช้คำสั่ง CallbackQueryHandler().

รหัสสำหรับการสร้างแป้นพิมพ์อินไลน์ซึ่งระบุไว้ในความช่วยเหลืออย่างเป็นทางการของแพ็คเกจ telegram.bot.

รหัสสำหรับสร้างแป้นพิมพ์อินไลน์จากความช่วยเหลืออย่างเป็นทางการ

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

คุณต้องสร้างคีย์บอร์ดอินไลน์โดยใช้คำสั่ง InlineKeyboardMarkup()บนหลักการเดียวกับแป้นพิมพ์ตอบกลับ ใน InlineKeyboardMarkup() จำเป็นต้องผ่านรายการปุ่มแบบอินไลน์ แต่ละปุ่มจะถูกสร้างขึ้นโดยฟังก์ชัน InlineKeyboardButton().

ปุ่มอินไลน์สามารถส่งข้อมูลบางอย่างไปยังบอทโดยใช้อาร์กิวเมนต์ได้ callback_dataหรือเปิดหน้า HTML ใด ๆ ที่ระบุโดยใช้อาร์กิวเมนต์ url.

ผลลัพธ์จะเป็นรายการที่แต่ละองค์ประกอบเป็นรายการปุ่มอินไลน์ที่ต้องรวมเป็นแถวเดียวด้วย

ต่อไปเราจะดูตัวอย่างของบอทที่มีปุ่มอินไลน์

ตัวอย่างของบอทธรรมดาที่รองรับปุ่ม InLine

ก่อนอื่น เราจะเขียนบอทสำหรับการทดสอบด่วนสำหรับ Covid-19 ตามคำสั่ง /testมันจะส่งคีย์บอร์ดที่มีสองปุ่มให้คุณ ขึ้นอยู่กับปุ่มที่กด มันจะส่งข้อความพร้อมผลการทดสอบของคุณถึงคุณ

รหัส 2: บอทที่ง่ายที่สุดพร้อมแป้นพิมพ์อินไลน์

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 Keyboard
  • answer_cb — เพื่อประมวลผลข้อมูลที่ส่งจากคีย์บอร์ด

ข้อมูลที่จะถูกส่งจากแต่ละปุ่มระบุไว้ในอาร์กิวเมนต์ callback_dataเมื่อสร้างปุ่ม คุณสามารถรับข้อมูลที่ส่งจากปุ่มได้โดยใช้โครงสร้าง update$callback_query$data, ภายในวิธีการ answer_cb.

เพื่อให้บอทตอบสนองต่อแป้นพิมพ์อินไลน์ วิธีการ answer_cb ประมวลผลโดยตัวจัดการพิเศษ: CallbackQueryHandler(answer_cb). ซึ่งรันเมธอดที่ระบุเมื่อมีการคลิกปุ่มอินไลน์ ตัวจัดการ CallbackQueryHandler รับสองข้อโต้แย้ง:

  • callback — วิธีการที่ต้องดำเนินการ
  • pattern — กรองตามข้อมูลที่ผูกไว้กับปุ่มโดยใช้อาร์กิวเมนต์ callback_data.

ดังนั้นการใช้อาร์กิวเมนต์ pattern เราสามารถเขียนวิธีการกดแต่ละปุ่มแยกกันได้:

รหัส 3: แยกวิธีการสำหรับปุ่มอินไลน์แต่ละปุ่ม

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 คุณเรียกแป้นพิมพ์หลักซึ่งมีปุ่ม "สภาพอากาศ" เพียงปุ่มเดียว เมื่อคลิกที่ปุ่มนี้ คุณจะได้รับข้อความพร้อมแป้นพิมพ์อินไลน์เพื่อเลือกเมืองที่คุณต้องการทราบสภาพอากาศในปัจจุบัน เลือกหนึ่งในเมืองและรับสภาพอากาศปัจจุบัน

ในโค้ดตัวอย่างนี้ เราจะใช้แพ็คเกจเพิ่มเติมหลายรายการ:

  • 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 วิธีที่มีอยู่ในบอทสภาพอากาศของเรา:

  • เริ่มต้น — เปิดแป้นพิมพ์บอทหลัก
  • สภาพอากาศ — เปิดแป้นพิมพ์อินไลน์เพื่อเลือกเมือง
  • 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 เพื่อแจ้งให้บอททราบว่าเราได้ดำเนินการคลิกปุ่มอินไลน์แล้ว

ตัวอย่างของบอทที่แสดงรายการบทความล่าสุดพร้อมลิงก์ไปยังฮับที่ระบุ will.com.

ฉันนำเสนอบอทนี้เพื่อแสดงวิธีแสดงปุ่มอินไลน์ที่นำไปสู่หน้าเว็บ

ตรรกะของบอทนี้คล้ายกับอันก่อนหน้า ในตอนแรก เราจะเปิดแป้นพิมพ์หลักด้วยคำสั่ง /start. ถัดไป บอทจะแสดงรายการฮับ 6 รายการให้เราเลือก จากนั้นเราเลือกฮับที่เราสนใจ และรับสิ่งพิมพ์ล่าสุด 5 รายการจากฮับที่เลือก

ตามที่คุณเข้าใจ ในกรณีนี้ เราจำเป็นต้องได้รับรายการบทความ และสำหรับสิ่งนี้ เราจะใช้แพ็คเกจพิเศษ habRซึ่งช่วยให้คุณสามารถขอบทความจาก Habra และสถิติบางส่วนเกี่ยวกับบทความเหล่านั้นใน 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)

ตรรกะนั้นคล้ายกับบอทรุ่นก่อนมาก แต่ในกรณีนี้ เราสร้างแป้นพิมพ์อินไลน์พร้อมรายการบทความแบบไดนามิกโดยใช้ฟังก์ชันนี้ 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].

ต่อไป เราจะสร้างตัวกรอง ตัวจัดการ และเปิดใช้บอทของเรา

ข้อสรุป

ตอนนี้บอทที่คุณเขียนจะใช้งานได้สะดวกกว่ามาก เนื่องจากบอทจะถูกควบคุมจากแป้นพิมพ์ แทนที่จะป้อนคำสั่ง อย่างน้อยที่สุด เมื่อโต้ตอบกับบอทผ่านสมาร์ทโฟน แป้นพิมพ์จะทำให้กระบวนการใช้งานง่ายขึ้นอย่างมาก

ในบทความถัดไป เราจะมาดูวิธีสร้างบทสนทนาเชิงตรรกะกับบอทและทำงานกับฐานข้อมูล

ที่มา: will.com

เพิ่มความคิดเห็น