ПишСм telegram Π±ΠΎΡ‚Π° Π½Π° языкС R (Ρ‡Π°ΡΡ‚ΡŒ 3): Как Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π±ΠΎΡ‚Ρƒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹

Π­Ρ‚ΠΎ Ρ‚Ρ€Π΅Ρ‚ΡŒΡ ΡΡ‚Π°Ρ‚ΡŒΡ ΠΈΠ· сСрии "ПишСм telegram Π±ΠΎΡ‚Π° Π½Π° языкС R". Π’ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… публикациях ΠΌΡ‹ Π½Π°ΡƒΡ‡ΠΈΠ»ΠΈΡΡŒ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌ Π±ΠΎΡ‚Π°, ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· Π½Π΅Π³ΠΎ сообщСния, Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ Π±ΠΎΡ‚Ρƒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΈ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Ρ‹ сообщСний. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΏΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ ΠΊΠ°ΠΊ ΠΏΡ€ΠΈΡΡ‚ΡƒΠΏΠΈΡ‚ΡŒ ΠΊ Ρ‡Ρ‚Π΅Π½ΠΈΡŽ Π΄Π°Π½Π½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠΈ я ΠΊΡ€Π°ΠΉΠ½Π΅ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ с ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΌΠΈ, Ρ‚.ΠΊ. Ρ‚ΡƒΡ‚ я ΡƒΠΆΠ΅ Π½Π΅ Π±ΡƒΠ΄Ρƒ ΠΎΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ Π½Π° описанных Ρ€Π°Π½Π΅Π΅ основах ботостроСния.

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ повысим ΡŽΠ·Π°Π±ΠΈΠ»ΠΈΡ‚ΠΈ нашСго Π±ΠΎΡ‚Π° Π·Π° счёт добавлСния ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹, которая сдСлаСт интСрфСйс Π±ΠΎΡ‚Π° ΠΈΠ½Ρ‚ΡƒΠΈΡ‚ΠΈΠ²Π½ΠΎ понятным, ΠΈ простым Π² использовании.

ПишСм telegram Π±ΠΎΡ‚Π° Π½Π° языкС R (Ρ‡Π°ΡΡ‚ΡŒ 3): Как Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π±ΠΎΡ‚Ρƒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹

ВсС ΡΡ‚Π°Ρ‚ΡŒΠΈ ΠΈΠ· сСрии "ПишСм telegram Π±ΠΎΡ‚Π° Π½Π° языкС R"

  1. Π‘ΠΎΠ·Π΄Π°Ρ‘ΠΌ Π±ΠΎΡ‚Π°, ΠΈ отправляСм с Π΅Π³ΠΎ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ сообщСния Π² telegram
  2. ДобавляСм Π±ΠΎΡ‚Ρƒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ ΠΊΠΎΠΌΠ°Π½Π΄ ΠΈ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Ρ‹ сообщСний
  3. Как Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π±ΠΎΡ‚Ρƒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅

Если Π²Ρ‹ ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΡƒΠ΅Ρ‚Π΅ΡΡŒ Π°Π½Π°Π»ΠΈΠ·ΠΎΠΌ Π΄Π°Π½Π½Ρ‹Ρ… Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π²Π°ΠΌ Π±ΡƒΠ΄ΡƒΡ‚ интСрСсны ΠΌΠΎΠΈ telegram ΠΈ youtube ΠΊΠ°Π½Π°Π»Ρ‹. Π‘ΠΎΠ»ΡŒΡˆΠ°Ρ Ρ‡Π°ΡΡ‚ΡŒ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… посвящСны языку R.

  1. КакиС Ρ‚ΠΈΠΏΡ‹ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌ Π±ΠΎΡ‚
  2. Reply ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π°
  3. Inline ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π°
    3.1. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠ΅Π³ΠΎ Π±ΠΎΡ‚Π° с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ InLine ΠΊΠ½ΠΎΠΏΠΎΠΊ
    3.2. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π±ΠΎΡ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ сообщаСт Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ ΠΏΠΎΠ³ΠΎΠ΄Ρƒ ΠΏΠΎ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠΌΡƒ Π³ΠΎΡ€ΠΎΠ΄Ρƒ
    3.3. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π±ΠΎΡ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ список самых свСТих статСй со ссылками ΠΏΠΎ-ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡƒ Π₯Π°Π±Ρƒ ΠΈΠ· habr.com
  4. Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

КакиС Ρ‚ΠΈΠΏΡ‹ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌ Π±ΠΎΡ‚

На ΠΌΠΎΠΌΠ΅Π½Ρ‚ написания ΡΡ‚Π°Ρ‚ΡŒΠΈ telegram.bot позволяСт Π²Π°ΠΌ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹ Π΄Π²ΡƒΡ… Ρ‚ΠΈΠΏΠΎΠ²:

  • Reply β€” Основная, обычная ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π°, которая находится ΠΏΠΎΠ΄ панСлью Π²Π²ΠΎΠ΄Π° тСкста сообщСния. Вакая ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π° просто отправляСт Π±ΠΎΡ‚Ρƒ тСкстовоС сообщСниС, ΠΈ Π² качСствС тСкста ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ Ρ‚ΠΎΡ‚ тСкст, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ написан Π½Π° самой ΠΊΠ½ΠΎΠΏΠΊΠ΅.
  • Inline β€” ΠšΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π° привязанная ΠΊ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌΡƒ ΡΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΡŽ Π±ΠΎΡ‚Π°. Данная ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π° отправляСт Π±ΠΎΡ‚Ρƒ Π΄Π°Π½Π½Ρ‹Π΅, привязанныС ΠΊ Π½Π°ΠΆΠ°Ρ‚ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠ΅, эти Π΄Π°Π½Π½Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ тСкста, написанного Π½Π° самой ΠΊΠ½ΠΎΠΏΠΊΠ΅. И ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ½ΠΎΠΏΠΊΠΈ Ρ‡Π΅Ρ€Π΅Π· CallbackQueryHandler.

Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π±Ρ‹ Π±ΠΎΡ‚ ΠΎΡ‚ΠΊΡ€Ρ‹Π» ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρƒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ΅ сообщСния Ρ‡Π΅Ρ€Π΅Π· ΠΌΠ΅Ρ‚ΠΎΠ΄ sendMessage(), ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΡΠΎΠ·Π΄Π°Π½Π½ΡƒΡŽ Ρ€Π°Π½Π΅Π΅ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρƒ Π² Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ reply_markup.

НиТС ΠΌΡ‹ Ρ€Π°Π·Π±Π΅Ρ€Ρ‘ΠΌ нСсколько ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ².

Reply ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π°

Как я ΡƒΠΆΠ΅ писал Π²Ρ‹ΡˆΠ΅, это основная ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π° управлСния Π±ΠΎΡ‚ΠΎΠΌ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ создания 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 Π΄ΠΈΠ°Π»ΠΎΠ³Π° с Π±ΠΎΡ‚ΠΎΠΌ
  • ΠœΠΎΡ‘ имя β€” Π—Π°ΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ своё имя
  • Мой Π»ΠΎΠ³ΠΈΠ½ β€” Π—Π°ΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ своё имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π² Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌ

Код 1: ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ Π±ΠΎΡ‚ с Reply ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€ΠΎΠΉ

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

ЗапуститС ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½Ρ‹ΠΉ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π°, ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΠ² ‘Π’ΠžΠšΠ•Π Π’ΠΠ¨Π•Π“Πž Π‘ΠžΠ’Π’ Π½Π° Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ‚ΠΎΠΊΠ΅Π½, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ ΠΏΡ€ΠΈ создании Π±ΠΎΡ‚Π° Ρ‡Π΅Ρ€Π΅Π· BotFather (ΠΎ создании Π±ΠΎΡ‚Π° я рассказывал Π² ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅).

ПослС запуска Π·Π°Π΄Π°ΠΉΡ‚Π΅ Π±ΠΎΡ‚Ρƒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ /start, Ρ‚.ΠΊ. ΠΈΠΌΠ΅Π½Π½ΠΎ Π΅Ρ‘ ΠΌΡ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ»ΠΈ для запуска ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹.

ПишСм telegram Π±ΠΎΡ‚Π° Π½Π° языкС R (Ρ‡Π°ΡΡ‚ΡŒ 3): Как Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π±ΠΎΡ‚Ρƒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹

Если Π½Π° Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Π°ΠΌ слоТно Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π°, с созданиСм ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ² ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ², Ρ‚ΠΎ слСдуСт Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ ΠΊ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ я ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ всё это описал.

ΠœΡ‹ создали 4 ΠΌΠ΅Ρ‚ΠΎΠ΄Π°:

  • start β€” Запуск ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹
  • chat_id β€” Запрос ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° Ρ‡Π°Ρ‚Π°
  • my_name β€” Запрос своСго ΠΈΠΌΠ΅Π½ΠΈ
  • my_username β€” Запрос своСго Π»ΠΎΠ³ΠΈΠ½Π°

Π’ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ MessageFilters Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ 3 Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π° сообщСний, ΠΏΠΎ ΠΈΡ… тСксту:

  • chat_id β€” БообщСния с тСкстом "Π§Π°Ρ‚ ID"
  • name β€” БообщСния с тСкстом "ΠœΠΎΡ‘ имя"
  • username β€” БообщСния с тСкстом "Мой Π»ΠΎΠ³ΠΈΠ½"

И создали 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
)

ПишСм telegram Π±ΠΎΡ‚Π° Π½Π° языкС R (Ρ‡Π°ΡΡ‚ΡŒ 3): Как Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π±ΠΎΡ‚Ρƒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹

ΠžΡ‚ΠΏΡ€Π°Π²Π»ΡΠ΅Ρ‚ΡΡ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π° Π² Ρ‡Π°Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ sendMessage(), Π² Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π΅ reply_markup.

  bot$sendMessage(update$message$chat_id,
                  text = 'Π’Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ', 
                  reply_markup = RKM)

Inline ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π°

Как я ΡƒΠΆΠ΅ писал Π²Ρ‹ΡˆΠ΅, Inline ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π° привязана ΠΊ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌΡƒ ΡΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΡŽ. Π‘ Π½Π΅ΠΉ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ нСсколько слоТнСС Ρ‡Π΅ΠΌ с основной ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€ΠΎΠΉ.

Π˜Π·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π±ΠΎΡ‚Ρƒ ΠΌΠ΅Ρ‚ΠΎΠ΄, для Π²Ρ‹Π·ΠΎΠ²Π° Inline ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹.

Для ΠΎΡ‚Π²Π΅Ρ‚Π° Π½Π° Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ Inline ΠΊΠ½ΠΎΠΏΠΊΠΈ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π±ΠΎΡ‚Π° answerCallbackQuery(), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ вывСсти ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ Π² интСрфСйсС telegram, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ Π½Π°ΠΆΠ°Π²ΡˆΠ΅ΠΌΡƒ 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(), ΠΏΠΎ Ρ‚Π°ΠΊΠΎΠΌΡƒ ΠΆΠ΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡƒ, ΠΊΠ°ΠΊ ΠΈ Reply ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρƒ. Π’ InlineKeyboardMarkup() Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ список, списков Inline ΠΊΠ½ΠΎΠΏΠΎΠΊ, каТдая ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Π°Ρ ΠΊΠ½ΠΎΠΏΠΊΠ° создаётся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ InlineKeyboardButton().

Inline ΠΊΠ½ΠΎΠΏΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ‚ Π»ΠΈΠ±ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π±ΠΎΡ‚Ρƒ ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ Π΄Π°Π½Π½Ρ‹Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° 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()

ЗапуститС ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½Ρ‹ΠΉ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π°, ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΠ² ‘Π’ΠžΠšΠ•Π Π’ΠΠ¨Π•Π“Πž Π‘ΠžΠ’Π’ Π½Π° Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ‚ΠΎΠΊΠ΅Π½, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ ΠΏΡ€ΠΈ создании Π±ΠΎΡ‚Π° Ρ‡Π΅Ρ€Π΅Π· BotFather (ΠΎ создании Π±ΠΎΡ‚Π° я рассказывал Π² ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅).

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:
ПишСм telegram Π±ΠΎΡ‚Π° Π½Π° языкС R (Ρ‡Π°ΡΡ‚ΡŒ 3): Как Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π±ΠΎΡ‚Ρƒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹

ΠœΡ‹ создали Π΄Π²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π°:

  • test β€” Для ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ Π² Ρ‡Π°Ρ‚ 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()

ЗапуститС ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½Ρ‹ΠΉ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π°, ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΠ² ‘Π’ΠžΠšΠ•Π Π’ΠΠ¨Π•Π“Πž Π‘ΠžΠ’Π’ Π½Π° Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ‚ΠΎΠΊΠ΅Π½, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ ΠΏΡ€ΠΈ создании Π±ΠΎΡ‚Π° Ρ‡Π΅Ρ€Π΅Π· BotFather (ΠΎ создании Π±ΠΎΡ‚Π° я рассказывал Π² ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅).

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ написали 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), которая сообщаСт Π±ΠΎΡ‚Ρƒ, Ρ‡Ρ‚ΠΎ Π΄Π°Π½Π½Ρ‹Π΅ с inline ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Ρ‹.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π±ΠΎΡ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ сообщаСт Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ ΠΏΠΎΠ³ΠΎΠ΄Ρƒ ΠΏΠΎ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠΌΡƒ Π³ΠΎΡ€ΠΎΠ΄Ρƒ

Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π±ΠΎΡ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ ΠΎ ΠΏΠΎΠ³ΠΎΠ΄Π΅.

Π›ΠΎΠ³ΠΈΠΊΠ° Π΅Π³ΠΎ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ. Π˜Π·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ /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()

ЗапуститС ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½Ρ‹ΠΉ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π°, ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΠ² ‘Π’ΠžΠšΠ•Π Π’ΠΠ¨Π•Π“Πž Π‘ΠžΠ’Π’ Π½Π° Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ‚ΠΎΠΊΠ΅Π½, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ ΠΏΡ€ΠΈ создании Π±ΠΎΡ‚Π° Ρ‡Π΅Ρ€Π΅Π· BotFather (ΠΎ создании Π±ΠΎΡ‚Π° я рассказывал Π² ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅).

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ наш Π±ΠΎΡ‚ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊ:
ПишСм telegram Π±ΠΎΡ‚Π° Π½Π° языкС R (Ρ‡Π°ΡΡ‚ΡŒ 3): Как Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π±ΠΎΡ‚Ρƒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹

БхСматичСски Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π±ΠΎΡ‚Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΎΠ±Ρ€Π°Ρ‚ΡŒ Π²ΠΎΡ‚ Ρ‚Π°ΠΊ:
ПишСм telegram Π±ΠΎΡ‚Π° Π½Π° языкС R (Ρ‡Π°ΡΡ‚ΡŒ 3): Как Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π±ΠΎΡ‚Ρƒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹

ΠœΡ‹ создали 3 ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, доступныС Π²Π½ΡƒΡ‚Ρ€ΠΈ нашСго ΠΏΠΎΠ³ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π±ΠΎΡ‚Π°:

  • start β€” Запуск основной ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹ Π±ΠΎΡ‚Π°
  • weather β€” Запуск Inline ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹ для Π²Ρ‹Π±ΠΎΡ€Π° Π³ΠΎΡ€ΠΎΠ΄Π°
  • answer_cb β€” Основной ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎ Π·Π°Π΄Π°Π½Π½ΠΎΠΌΡƒ Π³ΠΎΡ€ΠΎΠ΄Ρƒ Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ Π² API ΠΏΠΎΠ³ΠΎΠ΄Ρƒ, ΠΈ отправляСт Π΅Ρ‘ Π² Ρ‡Π°Ρ‚.

ΠœΠ΅Ρ‚ΠΎΠ΄ start Ρƒ нас запускаСтся ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ /start, Ρ‡Ρ‚ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠΌ CommandHandler('start', start).

Для запуска ΠΌΠ΅Ρ‚ΠΎΠ΄Π° weather ΠΌΡ‹ создали ΠΎΠ΄Π½ΠΎΠΈΠΌΡ‘Π½Π½Ρ‹ΠΉ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€:

# создаём Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Ρ‹
## сообщСния с тСкстом Погода
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 ΠΊΠ½ΠΎΠΏΠΊΠΈ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π±ΠΎΡ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ список самых свСТих статСй со ссылками ΠΏΠΎ-ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡƒ Π₯Π°Π±Ρƒ ΠΈΠ· habr.com.

Π”Π°Π½Π½ΠΎΠ³ΠΎ Π±ΠΎΡ‚Π° я ΠΏΡ€ΠΈΠ²ΠΎΠΆΡƒ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π±Ρ‹ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ Π²Π°ΠΌ, ΠΊΠ°ΠΊ вывСсти Inline ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Π΅Π΄ΡƒΡ‚ Π½Π° Π²Π΅Π± страницы.

Π›ΠΎΠ³ΠΈΠΊΠ° Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π±ΠΎΡ‚Π° схоТа с ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΌ, ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ ΠΌΡ‹ запускаСм ΠΎΡΠ½ΠΎΠ²Π½ΡƒΡŽ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρƒ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ /start. Π”Π°Π»Π΅Π΅ Π±ΠΎΡ‚ Π΄Π°Ρ‘Ρ‚ Π½Π°ΠΌ Π½Π° Π²Ρ‹Π±ΠΎΡ€ список ΠΈΠ· 6 Ρ…Π°Π±ΠΎΠ², ΠΌΡ‹ Π²Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΡƒΡŽΡ‰ΠΈΠΉ нас Ρ…Π°Π±, ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ 5 самых свСТих ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΉ ΠΈΠ· Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ³ΠΎ Π₯Π°Π±Π°.

Как Π²Ρ‹ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚Π΅, Π² Π΄Π°Π½Π½ΠΎΠΌ случаС Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ список статСй, ΠΈ для этого ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠ°ΠΊΠ΅Ρ‚ habR, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Ρ‚ΡŒ ΠΈΠ· Ρ…Π°Π±Ρ€Ρ‹ ΡΡ‚Π°Ρ‚ΡŒΠΈ ΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ статистику ΠΏΠΎ Π½ΠΈΠΌ Π² R.

Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΠ°ΠΊΠ΅Ρ‚ habR ΠΌΠΎΠΆΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ· github, для Ρ‡Π΅Π³ΠΎ Π²Π°ΠΌ понадобится Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠ°ΠΊΠ΅Ρ‚ devtools. Для установки Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ΡΡŒ ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½Ρ‹ΠΌ Π½ΠΈΠΆΠ΅ ΠΊΠΎΠ΄ΠΎΠΌ.

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

Π’Π΅ΠΏΠ΅Ρ€ΡŒ рассмотрим ΠΊΠΎΠ΄ построСния описанного Π²Ρ‹ΡˆΠ΅ Π±ΠΎΡ‚Π°:

Код 5: Π‘ΠΎΡ‚ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ список Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ свСТих статСй ΠΏΠΎ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠΌΡƒ Π₯Π°Π±Ρƒ

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

ЗапуститС ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½Ρ‹ΠΉ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π°, ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΠ² ‘Π’ΠžΠšΠ•Π Π’ΠΠ¨Π•Π“Πž Π‘ΠžΠ’Π’ Π½Π° Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ‚ΠΎΠΊΠ΅Π½, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ ΠΏΡ€ΠΈ создании Π±ΠΎΡ‚Π° Ρ‡Π΅Ρ€Π΅Π· BotFather (ΠΎ создании Π±ΠΎΡ‚Π° я рассказывал Π² ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅).

Π’ ΠΈΡ‚ΠΎΠ³Π΅ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ Π²ΠΎΡ‚ Ρ‚Π°ΠΊΠΎΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:
ПишСм telegram Π±ΠΎΡ‚Π° Π½Π° языкС 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)
}

Бписок статСй ΠΈΠ· ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ Π₯Π°Π±Π° ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ 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].

Π”Π°Π»Π΅Π΅, создаём Ρ„ΠΈΠ»ΡŒΡ‚Ρ€, ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΈ запускаСм нашСго Π±ΠΎΡ‚Π°.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π’Π΅ΠΏΠ΅Ρ€ΡŒ написанныС Π²Π°ΠΌΠΈ Π±ΠΎΡ‚Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠ΄ΠΎΠ±Π½Π΅ΠΉ Π² Ρ€Π°Π±ΠΎΡ‚Π΅, Π·Π° счёт Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΈΠΌΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒΡΡ с ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹, Π° Π½Π΅ Π²Π²ΠΎΠ΄ΠΎΠΌ ΠΊΠΎΠΌΠ°Π½Π΄. Как ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ ΠΏΡ€ΠΈ взаимодСйствии с Π±ΠΎΡ‚ΠΎΠΌ Ρ‡Π΅Ρ€Π΅Π· смартфон ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π° ΠΎΡ‰ΡƒΡ‚ΠΈΠΌΠΎ упростит процСсс Π΅Π³ΠΎ использования.

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ разбСрёмся ΠΊΠ°ΠΊ ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ логичСский Π΄ΠΈΠ°Π»ΠΎΠ³ с Π±ΠΎΡ‚ΠΎΠΌ, ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Π±Π°Π·Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ….

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com