ПишСмо telegram Π±ΠΎΡ‚Π° мовою R (частина 3): Π―ΠΊ Π΄ΠΎΠ΄Π°Ρ‚ΠΈ Π±ΠΎΡ‚Ρƒ ΠΏΡ–Π΄Ρ‚Ρ€ΠΈΠΌΠΊΡƒ ΠΊΠ»Π°Π²Ρ–Π°Ρ‚ΡƒΡ€ΠΈ

Π¦Π΅ трСтя стаття Ρ–Π· сСрії "ПишСмо telegram Π±ΠΎΡ‚Π° мовою R". Π£ ΠΏΠΎΠΏΠ΅Ρ€Π΅Π΄Π½Ρ–Ρ… публікаціях ΠΌΠΈ навчилися ΡΡ‚Π²ΠΎΡ€ΡŽΠ²Π°Ρ‚ΠΈ Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌ Π±ΠΎΡ‚Π°, надсилати Ρ‡Π΅Ρ€Π΅Π· нього повідомлСння, Π΄ΠΎΠ΄Π°Π»ΠΈ Π±ΠΎΡ‚Ρƒ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ Ρ‚Π° Ρ„Ρ–Π»ΡŒΡ‚Ρ€ΠΈ ΠΏΠΎΠ²Ρ–Π΄ΠΎΠΌΠ»Π΅Π½ΡŒ. Π’ΠΎΠΌΡƒ ΠΏΠ΅Ρ€Π΅Π΄ Ρ‚ΠΈΠΌ як приступити Π΄ΠΎ читання Ρ†Ρ–Ρ”Ρ— статті я Π²ΠΊΡ€Π°ΠΉ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽ ознайомитися Π· ΠΏΠΎΠΏΠ΅Ρ€Π΅Π΄Π½Ρ–ΠΌΠΈ, Ρ‚.ΠΊ. Ρ‚ΡƒΡ‚ я Π²ΠΆΠ΅ Π½Π΅ зупинятиму Π½Π° описаних Ρ€Π°Π½Ρ–ΡˆΠ΅ основах ботобудування.

Π£ Ρ†Ρ–ΠΉ статті ΠΌΠΈ ΠΏΡ–Π΄Π²ΠΈΡ‰ΠΈΠΌΠΎ ΡŽΠ·Π°Π±Ρ–Π»Ρ–Ρ‚Ρ– нашого Π±ΠΎΡ‚ Π·Π° Ρ€Π°Ρ…ΡƒΠ½ΠΎΠΊ додавання ΠΊΠ»Π°Π²Ρ–Π°Ρ‚ΡƒΡ€ΠΈ, яка Π·Ρ€ΠΎΠ±ΠΈΡ‚ΡŒ інтСрфСйс Π±ΠΎΡ‚ Ρ–Π½Ρ‚ΡƒΡ—Ρ‚ΠΈΠ²Π½ΠΎ Π·Ρ€ΠΎΠ·ΡƒΠΌΡ–Π»ΠΈΠΌ, Ρ– простим Ρƒ використанні.

ПишСмо telegram Π±ΠΎΡ‚Π° мовою R (частина 3): Π―ΠΊ Π΄ΠΎΠ΄Π°Ρ‚ΠΈ Π±ΠΎΡ‚Ρƒ ΠΏΡ–Π΄Ρ‚Ρ€ΠΈΠΌΠΊΡƒ ΠΊΠ»Π°Π²Ρ–Π°Ρ‚ΡƒΡ€ΠΈ

Всі статті Ρ–Π· сСрії "ПишСмо telegram Π±ΠΎΡ‚Π° мовою R"

  1. Π‘Ρ‚Π²ΠΎΡ€ΡŽΡ”ΠΌΠΎ Π±ΠΎΡ‚Π° Ρ– відправляємо Π·Π° ΠΉΠΎΠ³ΠΎ допомогою повідомлСння Π² telegram
  2. Π”ΠΎΠ΄Π°Ρ”ΠΌΠΎ Π±ΠΎΡ‚Ρƒ ΠΏΡ–Π΄Ρ‚Ρ€ΠΈΠΌΠΊΡƒ ΠΊΠΎΠΌΠ°Π½Π΄ Ρ‚Π° Ρ„Ρ–Π»ΡŒΡ‚Ρ€ΠΈ ΠΏΠΎΠ²Ρ–Π΄ΠΎΠΌΠ»Π΅Π½ΡŒ
  3. Π―ΠΊ Π΄ΠΎΠ΄Π°Ρ‚ΠΈ Π±ΠΎΡ‚Ρƒ ΠΏΡ–Π΄Ρ‚Ρ€ΠΈΠΌΠΊΡƒ ΠΊΠ»Π°Π²Ρ–Π°Ρ‚ΡƒΡ€ΠΈ

Зміст

Π―ΠΊΡ‰ΠΎ Π²ΠΈ цікавитСся Π°Π½Π°Π»Ρ–Π·ΠΎΠΌ Π΄Π°Π½ΠΈΡ… ΠΌΠΎΠΆΠ»ΠΈΠ²ΠΎ Π²Π°ΠΌ Π±ΡƒΠ΄ΡƒΡ‚ΡŒ Ρ†Ρ–ΠΊΠ°Π²Ρ– ΠΌΠΎΡ— Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌΠ° ΠΈ 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): Π―ΠΊ Π΄ΠΎΠ΄Π°Ρ‚ΠΈ Π±ΠΎΡ‚Ρƒ ΠΏΡ–Π΄Ρ‚Ρ€ΠΈΠΌΠΊΡƒ ΠΊΠ»Π°Π²Ρ–Π°Ρ‚ΡƒΡ€ΠΈ

Ми створили Π΄Π²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ:

  • тСст β€” Для надсилання Π² Ρ‡Π°Ρ‚ 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 ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ, доступні всСрСдині нашого ΠΏΠΎΠ³ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ€ΠΎΠ±ΠΎΡ‚Π°:

  • старт - Запуск основної ΠΊΠ»Π°Π²Ρ–Π°Ρ‚ΡƒΡ€ΠΈ Ρ€ΠΎΠ±ΠΎΡ‚Π°
  • ΠΏΠΎΠ³ΠΎΠ΄Π° β€” Запуск ΠΊΠ»Π°Π²Ρ–Π°Ρ‚ΡƒΡ€ΠΈ 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 ΠΊΠ½ΠΎΠΏΠΊΠΈ.

ΠŸΡ€ΠΈΠΊΠ»Π°Π΄ Π±ΠΎΡ‚Π°, який Π²ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ список Π½Π°ΠΉΡΠ²Ρ–ΠΆΡ–ΡˆΠΈΡ… статСй Π· посиланнями Π½Π° Π²ΠΊΠ°Π·Π°Π½Π΅ Π₯Π°Π±Ρƒ Π· 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

ΠšΡƒΠΏΠΈΡ‚ΠΈ Π½Π°Π΄Ρ–ΠΉΠ½ΠΈΠΉ хостинг для сайтів Ρ–Π· захистом Π²Ρ–Π΄ DDoS, VPS VDS сСрвСри πŸ”₯ ΠšΡƒΠΏΠΈΡ‚ΠΈ Π½Π°Π΄Ρ–ΠΉΠ½ΠΈΠΉ хостинг для сайтів Ρ–Π· захистом Π²Ρ–Π΄ DDoS, VPS VDS сСрвСри | ProHoster