የቴሌግራም ቦት በ R ውስጥ መጻፍ (ክፍል 3): የቁልፍ ሰሌዳ ድጋፍን ወደ ቦት እንዴት ማከል እንደሚቻል

ይህ በ"Telegram bot in R" ተከታታይ ውስጥ ሦስተኛው መጣጥፍ ነው። በቀደሙት ህትመቶች የቴሌግራም ቦትን እንዴት መፍጠር እንደምንችል ተምረናል፣ በእሱ በኩል መልዕክቶችን መላክ ፣ ትዕዛዞችን እና የመልእክት ማጣሪያዎችን ወደ ቦት ጨምረናል። ስለዚህ ይህንን ጽሑፍ ከማንበብዎ በፊት እራስዎን በደንብ እንዲያውቁት እመክራለሁ። ቀዳሚ, ምክንያቱም እዚህ ቀደም ሲል በተገለጹት የቦት ግንባታ መሰረታዊ ነገሮች ላይ አላቆምም።

በዚህ ጽሁፍ የቦትን በይነገጽ በቀላሉ የሚታወቅ እና ለአጠቃቀም ቀላል የሚያደርገውን ኪቦርድ በመጨመር የቦታችንን ተጠቃሚነት እናሻሽላለን።

የቴሌግራም ቦት በ R ውስጥ መጻፍ (ክፍል 3): የቁልፍ ሰሌዳ ድጋፍን ወደ ቦት እንዴት ማከል እንደሚቻል

ከተከታታዩ ሁሉም መጣጥፎች "የቴሌግራም ቦት በ R ውስጥ መጻፍ"

  1. ቦት ይፍጠሩ እና ወደ ቴሌግራም መልእክት ለመላክ ይጠቀሙበት
  2. የትእዛዝ ድጋፍ እና የመልእክት ማጣሪያዎችን ወደ ቦት ያክሉ
  3. የቁልፍ ሰሌዳ ድጋፍን ወደ ቦት እንዴት ማከል እንደሚቻል

ይዘቶች

የውሂብ ትንተና ላይ ፍላጎት ካሎት የእኔን ሊፈልጉ ይችላሉ ቴሌግራም и youtube ቻናሎች. አብዛኛው ይዘቱ ለ R ቋንቋ የተወሰነ ነው።

  1. የቴሌግራም ቦት ምን አይነት የቁልፍ ሰሌዳዎችን ይደግፋል?
  2. የቁልፍ ሰሌዳ ምላሽ ይስጡ
  3. የውስጠ-መስመር ቁልፍ ሰሌዳ
    3.1. ለInLine አዝራሮች ድጋፍ ያለው የቀላል ቦት ምሳሌ
    3.2. ለተመረጠ ከተማ የአሁኑን የአየር ሁኔታ የሚዘግብ የቦት ምሳሌ
    3.3. ከ habr.com በተጠቀሰው ሀቡ መሰረት የቅርብ ጊዜዎቹን መጣጥፎች ዝርዝር ከአገናኞች ጋር የሚያሳይ የቦት ምሳሌ
  4. መደምደሚያ

የቴሌግራም ቦት ምን አይነት የቁልፍ ሰሌዳዎችን ይደግፋል?

ይህ ጽሑፍ በተጻፈበት ጊዜ telegram.bot ሁለት ዓይነት የቁልፍ ሰሌዳዎች እንዲፈጥሩ ይፈቅድልዎታል-

  • መልስ - በመልእክት የጽሑፍ ግቤት ፓነል ስር የሚገኘው ዋናው ፣ መደበኛ የቁልፍ ሰሌዳ። እንዲህ ዓይነቱ ቁልፍ ሰሌዳ በቀላሉ ወደ ቦቱ የጽሑፍ መልእክት ይልካል, እና እንደ ጽሑፍ በራሱ አዝራሩ ላይ የተጻፈውን ጽሑፍ ይልካል.
  • መስመር ውስጥ - የቁልፍ ሰሌዳ ከአንድ የተወሰነ የቦት መልእክት ጋር የተሳሰረ። ይህ ቁልፍ ሰሌዳ ከተጫነው ቁልፍ ጋር ወደተገናኘው የ bot ውሂብ ይልካል ፣ ይህ መረጃ በአዝራሩ ላይ ከተጻፈው ጽሑፍ ሊለያይ ይችላል። እና እንደዚህ ያሉ አዝራሮች በሂደት ይከናወናሉ የመልሶ ጥሪ ጥሪ ሃንደርለር.

ቦት ቁልፍ ሰሌዳውን ለመክፈት በስልቱ በኩል መልእክት ሲላክ አስፈላጊ ነው 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 አዝራሮች ያሉት ቀላል ቦት እንፃፍ፡-

  • የውይይት መታወቂያ - ከቦት ጋር የውይይቱን የውይይት መታወቂያ ይጠይቁ
  • ስሜ - ስምህን ጠይቅ
  • የእኔ መግቢያ - የተጠቃሚ ስምዎን በቴሌግራም ይጠይቁ

ኮድ 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 TOKEN' በመተካት ቦትአባት (ቦት ውስጥ ስለመፍጠር ተናገርኩ። የመጀመሪያው ጽሑፍ).

ከተጀመረ በኋላ ለቦቱ ትዕዛዝ ይስጡ /start, ምክንያቱም የቁልፍ ሰሌዳውን ለመክፈት የገለጽነው ያ ነው።

የቴሌግራም ቦት በ R ውስጥ መጻፍ (ክፍል 3): የቁልፍ ሰሌዳ ድጋፍን ወደ ቦት እንዴት ማከል እንደሚቻል

በአሁኑ ጊዜ የተሰጠውን ኮድ ምሳሌ ለመተንተን አስቸጋሪ ከሆነ ዘዴዎችን ፣ ማጣሪያዎችን እና ተቆጣጣሪዎችን በመፍጠር ወደ ቀድሞው መመለስ አለብዎት። ጽሑፍ, ይህን ሁሉ በዝርዝር የገለጽኩበት.

4 ዘዴዎችን ፈጠርን-

  • ጀምር - የቁልፍ ሰሌዳ ጅምር
  • chat_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)

ትዕዛዙን በመጠቀም የ Inline ቁልፍ ሰሌዳ መገንባት አስፈላጊ ነው InlineKeyboardMarkup(), ልክ እንደ የመልስ ቁልፍ ሰሌዳው በተመሳሳይ መንገድ. ውስጥ InlineKeyboardMarkup() ዝርዝርን ማለፍ አስፈላጊ ነው ፣ የመስመር ውስጥ የአዝራሮች ዝርዝሮች ፣ እያንዳንዱ ነጠላ ቁልፍ የተፈጠረው በአንድ ተግባር ነው። InlineKeyboardButton().

የውስጠ-መስመር አዝራር ወይም ክርክር በመጠቀም የተወሰነ ውሂብ ወደ ቦት ማስተላለፍ ይችላል። callback_data፣ ወይም ማንኛውንም የኤችቲኤምኤል ገጽ ከክርክሩ ጋር ይክፈቱ url.

ውጤቱም እያንዳንዱ አካል በአንድ ረድፍ ውስጥ መቀላቀል የሚያስፈልጋቸው የውስጠ-መስመር አዝራሮች ዝርዝር የሆነበት ዝርዝር ይሆናል።

በመቀጠል፣ በርካታ የቦቶች ምሳሌዎችን በመስመር ላይ አዝራሮች እንመለከታለን።

ለInLine አዝራሮች ድጋፍ ያለው የቀላል ቦት ምሳሌ

ለመጀመር፣ ለኮቪድ-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 TOKEN' በመተካት ቦትአባት (ቦት ውስጥ ስለመፍጠር ተናገርኩ። የመጀመሪያው ጽሑፍ).

ውጤት:
የቴሌግራም ቦት በ R ውስጥ መጻፍ (ክፍል 3): የቁልፍ ሰሌዳ ድጋፍን ወደ ቦት እንዴት ማከል እንደሚቻል

ሁለት ዘዴዎችን ፈጠርን-

  • ሙከራ - ውይይት ወደ የመስመር ላይ ቁልፍ ሰሌዳ ለመላክ
  • መልስ_ሲቢ - ከቁልፍ ሰሌዳ የተላከውን መረጃ ለማስኬድ።

ከእያንዳንዱ አዝራር የሚላከው መረጃ በክርክሩ ውስጥ ተገልጿል callback_data, አዝራሩን ሲፈጥሩ. ግንባታውን ተጠቅመው ከአዝራሩ የተላከውን መረጃ ማግኘት ይችላሉ። update$callback_query$data, ዘዴው ውስጥ መልስ_ሲቢ.

ቦት ለውስጥ መስመር ቁልፍ ሰሌዳ ምላሽ እንዲሰጥ ለማድረግ ዘዴው መልስ_ሲቢ በልዩ ተቆጣጣሪ የተሰራ፡- CallbackQueryHandler(answer_cb). የውስጠ-መስመር ቁልፍን በመጫን የተገለጸውን ዘዴ የሚጀምረው። ተቆጣጣሪ የመልሶ ጥሪ ጥሪ ሃንደርለር ሁለት ክርክሮችን ይወስዳል፡-

  • 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 TOKEN' በመተካት ቦትአባት (ቦት ውስጥ ስለመፍጠር ተናገርኩ። የመጀመሪያው ጽሑፍ).

አሁን 2 የተለያዩ ዘዴዎችን ጽፈናል ማለትም. አንድ ዘዴ በአንድ ጊዜ, በእያንዳንዱ አዝራር ላይ ጠቅ በማድረግ, እና ክርክሩን ተጠቅሟል patternተቆጣጣሪዎቻቸውን ሲፈጥሩ፡-

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

ዘዴ ኮድ ያበቃል መልስ_ሲቢ ቡድን bot$answerCallbackQuery(callback_query_id = update$callback_query$id), ይህም መረጃ ከውስጥ መስመር ቁልፍ ሰሌዳ እንደደረሰ ለቦት ይነግረዋል.

ለተመረጠ ከተማ የአሁኑን የአየር ሁኔታ የሚዘግብ የቦት ምሳሌ

የአየር ሁኔታ መረጃን የሚጠይቅ ቦት ለመጻፍ እንሞክር።

የሥራው ሎጂክ እንደሚከተለው ይሆናል. መጀመሪያ ላይ በቡድኑ /start አንድ ቁልፍ ብቻ "የአየር ሁኔታ" ያለበትን ዋናውን ቁልፍ ሰሌዳ ትጠራለህ. ይህንን ቁልፍ በመጫን የአሁኑን የአየር ሁኔታ ለማወቅ የሚፈልጉትን ከተማ ለመምረጥ ከውስጥ ቁልፍ ሰሌዳ ጋር መልእክት ያገኛሉ ። ከከተሞች ውስጥ አንዱን ይምረጡ እና የአሁኑን የአየር ሁኔታ ያግኙ።

በዚህ ኮድ ምሳሌ ውስጥ ጥቂት ተጨማሪ ፓኬጆችን እንጠቀማለን፡-

  • httr - ከማንኛውም ኤፒአይ ጋር አብሮ በተሰራው መሠረት ከኤችቲቲፒ ጥያቄዎች ጋር ለመስራት ጥቅል። በእኛ ሁኔታ ነፃውን ኤፒአይ እንጠቀማለን። 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 TOKEN' በመተካት ቦትአባት (ቦት ውስጥ ስለመፍጠር ተናገርኩ። የመጀመሪያው ጽሑፍ).

በውጤቱም, የእኛ ቦት እንደዚህ ይሰራል:
የቴሌግራም ቦት በ R ውስጥ መጻፍ (ክፍል 3): የቁልፍ ሰሌዳ ድጋፍን ወደ ቦት እንዴት ማከል እንደሚቻል

በስርዓተ-ነገር፣ ይህ ቦት በሚከተለው መንገድ መሳል ይቻላል፡-
የቴሌግራም ቦት በ R ውስጥ መጻፍ (ክፍል 3): የቁልፍ ሰሌዳ ድጋፍን ወደ ቦት እንዴት ማከል እንደሚቻል

በእኛ የአየር ሁኔታ ቦት ውስጥ የሚገኙ 3 ዘዴዎችን ፈጥረናል፡-

  • መጀመሪያ - የቦቱን ዋና ቁልፍ ሰሌዳ በማስጀመር ላይ
  • የአየር ሁኔታ - ከተማ ለመምረጥ የውስጥ ቁልፍ ሰሌዳውን ያስጀምሩ
  • መልስ_ሲቢ - ለተወሰነ ከተማ በኤፒአይ ውስጥ የአየር ሁኔታን የሚጠይቅ ዋና ዘዴ እና ወደ ቻቱ ይልካል።

ዘዴ መጀመሪያ ቡድን እየመራን ነው። /start, እሱም በተቆጣጣሪው የሚተገበረው CommandHandler('start', start).

ዘዴን ለማስኬድ የአየር ሁኔታ ተመሳሳይ ስም ማጣሪያ ፈጠርን-

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

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

}
)

እና ይህንን ዘዴ በሚከተለው የመልእክት ተቆጣጣሪ እንጠራዋለን- MessageHandler(weather, filters = MessageFilters$weather).

እና በመጨረሻም የእኛ ዋና ዘዴ መልስ_ሲቢ በልዩ ተቆጣጣሪ የሚተገበረውን የውስጠ-መስመር ቁልፎችን ለመጫን ምላሽ ይሰጣል፡- CallbackQueryHandler(answer_cb).

ዘዴ ውስጥ መልስ_ሲቢ, ከቁልፍ ሰሌዳ የተላከውን ውሂብ እናነባለን እና ወደ ተለዋዋጭ እንጽፋለን city: city <- update$callback_query$data. ከዚያ በኋላ የአየር ሁኔታ መረጃን ከኤፒአይ እንጠይቃለን, ቅጽ እና መልእክት እንልካለን እና በመጨረሻም ዘዴውን እንጠቀማለን answerCallbackQuery የውስጠ-መስመር ቁልፍን ጠቅ እንዳደረግን ለቦቱ ለማሳወቅ።

በተጠቀሰው Habu ከ አገናኞች ጋር በጣም የቅርብ ጊዜ መጣጥፎችን ዝርዝር የሚያሳይ የቦት ምሳሌ hab.com.

ይህን ቦት ያመጣሁት ወደ ድረ-ገጾች የሚወስዱ የውስጠ-መስመር ቁልፎችን እንዴት እንደሚያሳዩ ለማሳየት ነው።

የዚህ ቦት አመክንዮ ከቀዳሚው ጋር ተመሳሳይ ነው ፣ መጀመሪያ ላይ ዋናውን ቁልፍ ሰሌዳ በትእዛዙ እንጀምራለን /start. በመቀጠል ቦቱ የምንመርጣቸውን የ6 ማዕከሎች ዝርዝር ይሰጠናል፣ የምንፈልገውን ማዕከል እንመርጣለን እና ከተመረጠው Hub 5 የቅርብ ጊዜ ህትመቶችን እናገኛለን።

እንደተረዱት, በዚህ ጉዳይ ላይ የጽሁፎችን ዝርዝር ማግኘት አለብን, ለዚህም ልዩ ጥቅል እንጠቀማለን habRከሀብራ መጣጥፎችን እንዲጠይቁ እና በእነሱ ላይ አንዳንድ ስታቲስቲክስ በአር.

ጥቅል ጫን 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 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].

በመቀጠል ማጣሪያን, ተቆጣጣሪዎችን እንፈጥራለን እና የእኛን ቦት እንሰራለን.

መደምደሚያ

አሁን የሚጽፏቸው ቦቶች ከቁልፍ ሰሌዳው ስለሚቆጣጠሩ እንጂ ትዕዛዞችን በማስገባት ለመጠቀም የበለጠ አመቺ ይሆናሉ። ቢያንስ በስማርትፎን በኩል ከቦት ጋር ሲገናኙ የቁልፍ ሰሌዳ አጠቃቀሙን ሂደት በእጅጉ ያቃልላል።

በሚቀጥለው ጽሁፍ ከቦት ጋር አመክንዮአዊ ውይይት እንዴት እንደሚገነባ እና ከመረጃ ቋቶች ጋር እንዴት እንደሚሰራ እንረዳለን።

ምንጭ: hab.com

አስተያየት ያክሉ