Ukubhala i-telegram bot ku-R (ingxenye 3): Ukwengeza kanjani ukusekelwa kwekhibhodi ku-bot

Lesi isihloko sesithathu ochungechungeni oluthi "Ukubhala ibhodlela yocingo ngo-R". Ezincwadini ezedlule, sifunde ukwenza i-telegraph bot, ukuthumela imiyalezo ngayo, ukwengeza imiyalo nezihlungi zemiyalezo ku-bot. Ngakho-ke, ngaphambi kokuba uqale ukufunda lesi sihloko, ngincoma kakhulu ukuthi ufunde edlule, ngoba Lapha ngeke ngisagxila ezintweni eziyisisekelo ezichazwe ngaphambilini zokwakha i-bot.

Kulesi sihloko, sizothuthukisa ukusebenziseka kwe-bot yethu ngokungeza ikhibhodi, okuzokwenza isixhumi esibonakalayo se-bot sibe enembile futhi kulula ukuyisebenzisa.

Ukubhala i-telegram bot ku-R (ingxenye 3): Ukwengeza kanjani ukusekelwa kwekhibhodi ku-bot

Zonke izindatshana ezivela ochungechungeni oluthi “Ukubhala i-telegram bot ngo-R”

  1. Sakha i-bot futhi siyisebenzisela ukuthumela imilayezo ngocingo
  2. Engeza ukwesekwa komyalo nezihlungi zemiyalezo ku-bot
  3. Ukwengeza kanjani ukwesekwa kwekhibhodi ku-bot

Okuqukethwe

Uma uthanda ukuhlaziya idatha, ungase ube nentshisekelo yami telegram и youtube iziteshi. Iningi lokuqukethwe linikezelwe olimini lwe-R.

  1. Yiziphi izinhlobo zamakhibhodi ezisekelwa i-telegram bot?
  2. Phendula ikhibhodi
  3. Ikhibhodi esemgqeni
    3.1. Isibonelo se-bot elula esekela izinkinobho ze-InLine
    3.2. Isibonelo se-bot ebika isimo sezulu samanje sedolobha elikhethiwe
    3.3. Isibonelo se-bot ebonisa uhlu lwama-athikili akamuva anezixhumanisi ze-Hub eshiwo kusuka ku-habr.com
  4. isiphetho

Yiziphi izinhlobo zamakhibhodi ezisekelwa i-telegram bot?

Ngesikhathi sokuloba telegram.bot ikuvumela ukuthi udale izinhlobo ezimbili zamakhibhodi:

  • Phendula - Ikhibhodi eyinhloko, evamile, etholakala ngaphansi kwephaneli yokufaka umbhalo womlayezo. Ikhibhodi enjalo ivele ithumele umlayezo wombhalo ku-bot, futhi njengombhalo izothumela umbhalo obhalwe enkinobho ngokwayo.
  • Okusemgqeni - Ikhibhodi ehlotshaniswa nomlayezo we-bot othize. Le khibhodi ithumela idatha ye-bot ehlotshaniswa nenkinobho ecindezelwe; le datha ingase ihluke kumbhalo obhalwe enkinobho ngokwayo. Futhi izinkinobho ezinjalo zicutshungulwa ngokusebenzisa I-CallbackQueryHandler.

Ukuze i-bot ivule ikhibhodi, kuyadingeka lapho uthumela umlayezo ngendlela sendMessage(), dlulisa ikhibhodi edalwe ngaphambilini njengengxabano reply_markup.

Ngezansi sizobheka izibonelo ezimbalwa.

Phendula ikhibhodi

Njengoba ngibhale ngenhla, lena ikhibhodi eyinhloko yokulawula i-bot.

Isibonelo sokudala ikhibhodi yokuphendula kusukela kusizo olusemthethweni

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)

Okungenhla kuyisibonelo esivela kusizo olusemthethweni lwephakheji telegram.bot. Ukuze udale ikhibhodi, sebenzisa umsebenzi ReplyKeyboardMarkup(), yona ethatha uhlu lohlu lwezinkinobho ezidalwe umsebenzi KeyboardButton().

Kungani ku ReplyKeyboardMarkup() Awudingi ukudlula nje uhlu, kodwa uhlu lohlu? Iqiniso liwukuthi udlula uhlu oluyinhloko, futhi kulo uchaza umugqa ngamunye wezinkinobho ezinhlwini ezihlukene, ngoba Ungabeka izinkinobho ezimbalwa emugqeni owodwa.

Ukuphikisana resize_keyboard ikuvumela ukuthi ukhethe ngokuzenzakalela usayizi olungile wezinkinobho zekhibhodi, kanye nokuphikisana one_time_keyboard ikuvumela ukuthi ufihle ikhibhodi ngemva kokucindezela inkinobho ngayinye.

Masibhale ibhothi elula ezoba nezinkinobho ezi-3:

  • I-ID yengxoxo - Cela i-ID yengxoxo yengxoxo ne-bot
  • Igama lami - Cela igama lakho
  • Ukungena kwami ​​- Cela igama lakho lomsebenzisi kuthelegramu

Ikhodi 1: Ibhothi elula enekhibhodi yokuphendula

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

Qalisa isibonelo sekhodi ngenhla, ngemva kokufaka i-'BOT TOKEN YAKHO' nethokheni yangempela oyitholile ngenkathi udala i-bot nge I-BotFather (Ngikhulume ngokudala i-bot ngaphakathi isihloko sokuqala).

Ngemva kokwethula, nikeza i-bot umyalo /start, ngoba Yilokhu kanye esikuchaze ukuqalisa ikhibhodi.

Ukubhala i-telegram bot ku-R (ingxenye 3): Ukwengeza kanjani ukusekelwa kwekhibhodi ku-bot

Uma okwamanje kunzima kuwe ukuhlaziya isibonelo sekhodi esinikeziwe, ngokudala izindlela, izihlungi nezibambi, kufanele ubuyele kwedlule. isihloko, lapho ngichaze ngakho konke lokhu ngokuningiliziwe.

Senze izindlela ezi-4:

  • qala — Yethula ikhibhodi
  • chat_id - Cela i-ID yengxoxo
  • my_name - Cela igama lakho
  • my_username - Cela ukungena kwakho ngemvume

Ukuphikisa Izihlungi Zomlayezo wengeze izihlungi zemilayezo emi-3 ngokusekelwe embhalweni wazo:

  • chat_id — Imilayezo enombhalo "Чат ID"
  • Igama — Imiyalezo enombhalo "Моё имя"
  • igama lomsebenzisi — Imiyalezo enombhalo "Мой логин"

Futhi sidale izibambi ezingu-4, ezisekelwe emiyalweni enikeziwe nezihlungi, zizosebenzisa izindlela ezishiwo.

# создаём обработчики
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)

Ikhibhodi ngokwayo idalwe ngaphakathi kwendlela start() iqembu ReplyKeyboardMarkup().

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

Esimweni sethu, sibeke zonke izinkinobho ngaphansi komunye nomunye, kodwa singazihlela emgqeni owodwa ngokwenza izinguquko ohlwini lwezinkinobho. Ngoba umugqa owodwa ngaphakathi kwekhibhodi wenziwa ngohlu olufakwe esidlekeni lwezinkinobho, ukuze sibonise izinkinobho zethu emugqeni owodwa sidinga ukubhala kabusha ingxenye yekhodi yokwakha ikhibhodi kanje:

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

Ukubhala i-telegram bot ku-R (ingxenye 3): Ukwengeza kanjani ukusekelwa kwekhibhodi ku-bot

Ikhibhodi ithunyelwa engxoxweni kusetshenziswa indlela sendMessage(), engxabanweni reply_markup.

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

Ikhibhodi esemgqeni

Njengoba ngibhale ngenhla, ikhibhodi ye-Inline iboshelwe emlayezo othile. Kunzima kakhulu ukusebenza ngayo kunekhibhodi eyinhloko.

Ekuqaleni, udinga ukungeza indlela ku-bot ukuze ushayele ikhibhodi eLayini.

Ukuze uphendule ngokuchofoza inkinobho ye-Inline, ungasebenzisa indlela ye-bot answerCallbackQuery(), engabonisa isaziso kusixhumi esibonakalayo setelegram kumsebenzisi ocindezela inkinobho Ephakathi.

Idatha ethunyelwe kusukela kunkinobho ye-Inline ayiwona umbhalo, ngakho-ke ukuyicubungula udinga ukwakha isibambi esikhethekile usebenzisa umyalo CallbackQueryHandler().

Ikhodi yokwakha ikhibhodi eLayini enikezwa ngosizo olusemthethweni lwephakeji telegram.bot.

Ikhodi yokwakha ikhibhodi eLayini ngosizo olusemthethweni

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

Udinga ukwakha ikhibhodi eLayini usebenzisa umyalo InlineKeyboardMarkup(), ngomgomo ofanayo nekhibhodi ethi Phendula. IN InlineKeyboardMarkup() kuyadingeka ukudlulisa uhlu lohlu lwezinkinobho ezingaphakathi, inkinobho ngayinye idalwe umsebenzi InlineKeyboardButton().

Inkinobho esemgqeni ingadlulisela idatha ethile kwi-bot isebenzisa impikiswano callback_data, noma uvule noma yiliphi ikhasi le-HTML elishiwo usebenzisa ukungqubuzana url.

Umphumela uzoba uhlu lapho ingxenye ngayinye iphinde ibe uhlu lwezinkinobho ezingaphakathi komugqa okudingeka zihlanganiswe zibe umugqa owodwa.

Okulandelayo sizobheka izibonelo ezimbalwa zama-bots anezinkinobho ze-Inline.

Isibonelo se-bot elula esekela izinkinobho ze-InLine

Okokuqala, sizobhala i-bot ukuze sihlolele i-covid-19. Ngomyalo /test, izokuthumela ikhibhodi enezinkinobho ezimbili, kuye ngokuthi inkinobho ecindezelwe izokuthumela umlayezo onemiphumela yokuhlolwa kwakho.

Ikhodi 2: I-bot elula kakhulu enekhibhodi eLayini

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

Qalisa isibonelo sekhodi ngenhla, ngemva kokufaka i-'BOT TOKEN YAKHO' nethokheni yangempela oyitholile ngenkathi udala i-bot nge I-BotFather (Ngikhulume ngokudala i-bot ngaphakathi isihloko sokuqala).

Umphumela:
Ukubhala i-telegram bot ku-R (ingxenye 3): Ukwengeza kanjani ukusekelwa kwekhibhodi ku-bot

Senze izindlela ezimbili:

  • test — Ukuthumela ukuxoxa ngekhibhodi eLayini
  • impendulo_cb — Ukucubungula idatha ethunyelwe isuka kukhibhodi.

Idatha ezothunyelwa kusukela kunkinobho ngayinye icaciswe ku-agumenti callback_data, lapho udala inkinobho. Ungathola idatha ethunyelwe kusukela inkinobho usebenzisa ukwakha update$callback_query$data, ngaphakathi kwendlela impendulo_cb.

Ukuze i-bot isabele kukhibhodi ye-Inline, indlela impendulo_cb kucutshungulwe isibambi esikhethekile: CallbackQueryHandler(answer_cb). Okusebenzisa indlela eshiwo lapho inkinobho eLayini ichofozwa. Isibambi I-CallbackQueryHandler ithatha izimpikiswano ezimbili:

  • callback - Indlela okufanele isetshenziswe
  • pattern - Hlunga ngedatha eboshelwe kwinkinobho usebenzisa impikiswano callback_data.

Ngokuvumelana nalokho, sebenzisa isixazululo pattern Singabhala indlela ehlukile yokucindezela inkinobho ngayinye:

Ikhodi 3: Izindlela ezihlukene zenkinobho ngayinye eLayini

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

Qalisa isibonelo sekhodi ngenhla, ngemva kokufaka i-'BOT TOKEN YAKHO' nethokheni yangempela oyitholile ngenkathi udala i-bot nge I-BotFather (Ngikhulume ngokudala i-bot ngaphakathi isihloko sokuqala).

Manje sesibhale izindlela ezihlukene ezi-2 i.e. indlela eyodwa, ngokucindezela inkinobho ngayinye, futhi wasebenzisa ukuphikisana pattern, lapho udala izibambi zabo:

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

Ikhodi yendlela iyaphela impendulo_cb iqembu bot$answerCallbackQuery(callback_query_id = update$callback_query$id), okutshela i-bot ukuthi idatha evela kukhibhodi esemgqeni yamukelwe.

Isibonelo se-bot ebika isimo sezulu samanje sedolobha elikhethiwe

Ake sizame ukubhala i-bot ecela idatha yesimo sezulu.

I-logic yomsebenzi wayo izoba kanje. Ekuqaleni yiqembu /start ubiza ikhibhodi eyinhloko, enenkinobho eyodwa kuphela ethi "Isimo Sezulu". Ngokuchofoza le nkinobho uzothola umlayezo onekhibhodi eLayini ukuze ukhethe idolobha ofuna ukuthola kulo isimo sezulu samanje. Khetha elinye lamadolobha futhi uthole isimo sezulu samanje.

Kulesi sibonelo sekhodi sizosebenzisa amaphakheji amaningana angeziwe:

  • httr - iphakheji yokusebenza ngezicelo ze-HTTP, ngesisekelo lapho kwakhiwa khona umsebenzi nanoma iyiphi i-API. Esimeni sethu sizosebenzisa i-API yamahhala openweathermap.org.
  • stringr - iphakheji yokusebenza ngombhalo, kithi sizoyisebenzisa ukukhiqiza umlayezo mayelana nesimo sezulu edolobheni elikhethiwe.

Ikhodi 4: I-bot ebika isimo sezulu samanje sedolobha elikhethiwe

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

Qalisa isibonelo sekhodi ngenhla, ngemva kokufaka i-'BOT TOKEN YAKHO' nethokheni yangempela oyitholile ngenkathi udala i-bot nge I-BotFather (Ngikhulume ngokudala i-bot ngaphakathi isihloko sokuqala).

Ngenxa yalokho, i-bot yethu izosebenza ngale ndlela:
Ukubhala i-telegram bot ku-R (ingxenye 3): Ukwengeza kanjani ukusekelwa kwekhibhodi ku-bot

Ngokohlelo, le bot ingavezwa kanje:
Ukubhala i-telegram bot ku-R (ingxenye 3): Ukwengeza kanjani ukusekelwa kwekhibhodi ku-bot

Senze izindlela ezi-3 ezitholakalayo ngaphakathi kwe-bot yethu yesimo sezulu:

  • isiqalo - Yethula ikhibhodi ye-bot eyinhloko
  • weather - Yethula ikhibhodi eLayini ukuze ukhethe idolobha
  • impendulo_cb - Indlela eyinhloko ecela isimo sezulu ku-API yedolobha elithile futhi iyithumele engxoxweni.

Indlela isiqalo siyethula ngomyalo /start, esetshenziswa umphathi CommandHandler('start', start).

Ukuze usebenzise indlela weather sidale isihlungi segama elifanayo:

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

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

}
)

Futhi le ndlela siyibiza ngesibambi semilayezo elandelayo: MessageHandler(weather, filters = MessageFilters$weather).

Futhi ekugcineni, indlela yethu eyinhloko impendulo_cb isabela ekucindezeleni izinkinobho ezingaphakathi komugqa, okusetshenziswa isibambi esikhethekile: CallbackQueryHandler(answer_cb).

Ngaphakathi indlela impendulo_cb, sifunda idatha ethunyelwe kusukela kukhibhodi bese siyibhala kokuguquguqukayo city: city <- update$callback_query$data. Bese sicela idatha yesimo sezulu ku-API, sikhiqize futhi sithumele umlayezo, futhi ekugcineni sisebenzise indlela answerCallbackQuery ukuze wazise i-bot ukuthi sicubungule ukuchofoza kwenkinobho ye-Inline.

Isibonelo se-bot ebonisa uhlu lwama-athikili akamuva anezixhumanisi ze-Hub eshiwo kusuka www.habr.com.

Ngethula le bot ukuze ngikubonise ukuthi ungabonisa kanjani izinkinobho eziku-inthanethi eziholela emakhasini ewebhu.

I-logic yale bot ifana neyangaphambili; ekuqaleni sethula ikhibhodi eyinhloko ngomyalo /start. Okulandelayo, i-bot isinika uhlu lwamahabhu angu-6 esingakhetha kuwo, sikhetha ihabhu esiyithandayo, futhi sithole okushicilelwe kwakamuva okungu-5 okuvela kuhabhu ekhethiwe.

Njengoba uqonda, kulokhu sidinga ukuthola uhlu lwezihloko, futhi ngenxa yalokhu sizosebenzisa iphakheji ekhethekile habR, okukuvumela ukuthi ucele ama-athikili ku-Habra kanye nezibalo ezithile kuwo ngo-R.

Faka iphakheji habR kungenzeka kuphela kusuka ku-github, lapho uzodinga iphakheji eyengeziwe devtools. Ukuze ufake, sebenzisa ikhodi engezansi.

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

Manje ake sibheke ikhodi yokwakha i-bot echazwe ngenhla:

Ikhodi 5: I-bot ebonisa uhlu lwama-athikili akamuva kakhulu kuhabhu ekhethiwe

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

Qalisa isibonelo sekhodi ngenhla, ngemva kokufaka i-'BOT TOKEN YAKHO' nethokheni yangempela oyitholile ngenkathi udala i-bot nge I-BotFather (Ngikhulume ngokudala i-bot ngaphakathi isihloko sokuqala).

Ngenxa yalokho, sizothola lo mphumela:
Ukubhala i-telegram bot ku-R (ingxenye 3): Ukwengeza kanjani ukusekelwa kwekhibhodi ku-bot

Sifake amakhodi kanzima uhlu lwamahabhu atholakalayo ukuze akhethwe ngendlela 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)
}

Sithola uhlu lwama-athikili kuhabhu eshiwo ngomyalo habr_hub_posts(), kusukela kuphakheji habR. Ngesikhathi esifanayo, sibonisa ukuthi asidingi uhlu lwezihloko zesikhathi sonke, kodwa kuphela ikhasi lokuqala lapho izihloko ezingu-20 zitholakala khona. Kusukela kuthebula eliwumphumela usebenzisa umyalo head() Sishiya kuphela ezi-5 eziphezulu, okuyizihloko zakamuva.

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

I-logic ifana kakhulu ne-bot yangaphambilini, kodwa kulokhu sikhiqiza ikhibhodi e-Inline enohlu lwama-athikili sisebenzisa ngokuguquguqukayo umsebenzi. lapply().

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

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

Sifaka isihloko se-athikili embhalweni wenkinobho posts$title[x], nasembangweni url isixhumanisi sendatshana: url = posts$link[x].

Okulandelayo, sakha isihlungi, izibambi bese sethula i-bot yethu.

isiphetho

Manje ama-bots owabhalayo azoba lula kakhulu ukuwasebenzisa, ngenxa yokuthi azolawulwa kusuka kukhibhodi, kunokuba afake imiyalo. Okungenani, lapho usebenzisana ne-bot nge-smartphone, ikhibhodi izokwenza lula kakhulu inqubo yokuyisebenzisa.

Esihlokweni esilandelayo sizobona ukuthi singayakha kanjani inkhulumomphendvulwano enengqondo nge-bot futhi sisebenze ngemininingwane yolwazi.

Source: www.habr.com

Engeza amazwana