Kunyora teregiramu bot muR (chikamu 3): Maitiro ekuwedzera kiyibhodhi rutsigiro kune bot

Ichi ndicho chinyorwa chechitatu munhevedzano "Kunyora teregiramu bot muR". Muzvinyorwa zvakapfuura, takadzidza kugadzira teregiramu bot, kutumira mameseji kuburikidza nayo, yakawedzera mirairo uye meseji mafirita kune bot. Naizvozvo, usati watanga kuverenga chinyorwa ichi, ndinokurudzira zvikuru kuti uverenge yapfuura, nokuti Pano ini handisi kuzogara pane zvakambotsanangurwa zvekutanga zvekuvaka bot.

Muchikamu chino, tichavandudza kushandiswa kwebhoti yedu nekuwedzera keyboard, iyo ichaita kuti bot interface intuitive uye nyore kushandisa.

Kunyora teregiramu bot muR (chikamu 3): Maitiro ekuwedzera kiyibhodhi rutsigiro kune bot

Zvese zvinyorwa kubva munhevedzano "Kunyora teregiramu bot muR"

  1. Isu tinogadzira bot uye tinoishandisa kutumira mameseji muteregiramu
  2. Wedzera rutsigiro rwekuraira uye meseji mafirita kune bot
  3. Maitiro ekuwedzera kiibhodhi rutsigiro kune bot

Zviri mukati

Kana iwe uchifarira kuongorora data, unogona kunge uchifarira zvangu teregiramu и YouTube channels. Zvizhinji zvemukati zvakatsaurirwa kumutauro weR.

  1. Ndeapi marudzi emakiyibhodhi ayo telegraph bot inotsigira?
  2. Pindura kiibhodhi
  3. Inline keyboard
    3.1. Muenzaniso webhoti iri nyore nerutsigiro rweInLine mabhatani
    3.2. Muenzaniso webhoti inoshuma mamiriro ekunze aripo eguta rakasarudzwa
    3.3. Muenzaniso webhoti inoratidza runyorwa rwezvinyorwa zvichangoburwa zvine zvinongedzo kune yakatsanangurwa Hub kubva habr.com
  4. mhedziso

Ndeapi marudzi emakiyibhodhi ayo telegraph bot inotsigira?

Panguva yekunyora uku telegram.bot inokubvumira kuti ugadzire marudzi maviri emakibhodhi:

  • Pindura - Iyo huru, yenguva dzose keyboard, iyo iri pasi pemeseji mameseji ekuisa pani. Khibhobho yakadaro inongotumira meseji kune bot, uye sechinyorwa ichatumira iwo mavara akanyorwa pane bhatani pacharo.
  • Inline - Kiyibhodhi yakabatana neyakananga bot meseji. Iyi kiyibhodhi inotumira iyo bot data ine chekuita nebhatani rakadzvanywa; iyi data inogona kusiyana nemavara akanyorwa pabhatani pacharo. Uye mabhatani akadaro anogadziriswa kuburikidza CallbackQueryHandler.

Kuti bot ivhure keyboard, zvinodikanwa kana uchitumira meseji kuburikidza nenzira sendMessage(), pfuura iyo yakambogadzirwa kiibhodhi senharo reply_markup.

Pasi apa tichatarisa mienzaniso yakawanda.

Pindura kiibhodhi

Sezvandanyora pamusoro, iyi ndiyo hombe bot control keyboard.

Muenzaniso wekugadzira Reply keyboard kubva kune yepamutemo rubatsiro

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)

Izvo zviri pamusoro apa muenzaniso kubva kune yepamutemo rubatsiro rwepakeji telegram.bot. Kuti ugadzire keyboard, shandisa basa racho ReplyKeyboardMarkup(), iyo inotora runyoro rwezvinyorwa zvemabhatani anogadzirwa nebasa KeyboardButton().

Sei mukati ReplyKeyboardMarkup() Iwe unofanirwa kupasa kwete rondedzero chete, asi rondedzero yezvinyorwa? Icho chokwadi ndechekuti iwe unopfuura iyo huru rondedzero, uye mairi unotsanangura mutsara wega wega mabhatani mune akasiyana rondedzero, nekuti. Unogona kuisa mabhatani akati wandei mumutsara mumwe.

Kupokana resize_keyboard inokutendera kuti uzvisarudzire otomatiki saizi yakakwana yemabhatani ekhibhodi, uye nharo one_time_keyboard inokutendera iwe kuviga kiibhodhi mushure mekudzvanya bhatani rega rega.

Ngatinyorei bot iri nyore rinenge riine mabhatani matatu:

  • Chat ID - Kumbira chat ID yenhaurirano ne bot
  • Zita rangu - Kumbira zita rako
  • Kupinda kwangu - Kumbira zita rako rekushandisa muteregiramu

Code 1: Nyore bot ine Reply keyboard

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

Mhanya iyo kodhi muenzaniso uri pamusoro, mushure mekutsiva 'YAKO BOT TOKEN' nechiratidzo chaicho chawakagamuchira paunenge uchigadzira bot kuburikidza. BotFather (Ndakataura nezve kugadzira bot mukati chinyorwa chekutanga).

Mushure mekutangisa, ipa bot murairo /start, nokuti Izvi ndizvo chaizvo zvatakatsanangura kuvhura keyboard.

Kunyora teregiramu bot muR (chikamu 3): Maitiro ekuwedzera kiyibhodhi rutsigiro kune bot

Kana panguva ino zvakakuomera kuti utarise iyo yakapihwa kodhi muenzaniso, nekugadzira nzira, mafirita uye mabati, saka iwe unofanirwa kudzokera kune yakapfuura. chinyorwa, umo ndakatsanangura zvose izvi zvakadzama.

Isu takagadzira 4 nzira:

  • tanga - Tangisa kiibhodhi
  • chat_id - Kumbira chat ID
  • my_name - Kumbira zita rako
  • my_username - Kumbira kupinda kwako

Kupikisa MessageFilters akawedzera mafirita matatu meseji zvichibva pane zvinyorwa zvavo:

  • chat_id - Mameseji ane mavara "Чат ID"
  • zita - Mameseji ane mavara "Моё имя"
  • username - Mameseji ane mavara "Мой логин"

Uye isu takagadzira 4 vanobata izvo, zvichibva pane yakapihwa mirairo uye mafirita, ichaita nzira dzakatarwa.

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

Iyo keyboard pachayo inogadzirwa mukati menzira start() team ReplyKeyboardMarkup().

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

Kwatiri isu, takaisa mabhatani ese pasi peumwe neumwe, asi isu tinogona kuaronga mumutsara mumwe nekuita shanduko kune rondedzero yemabhatani rondedzero. Nokuti mutsara mumwe mukati mekhibhodi unogadzirwa kuburikidza nested rondedzero yemabhatani, saka kuitira kuti tiratidze mabhatani edu mumutsara mumwe isu tinoda kunyorazve chikamu chekodhi yekuvaka iyo keyboard seizvi:

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

Kunyora teregiramu bot muR (chikamu 3): Maitiro ekuwedzera kiyibhodhi rutsigiro kune bot

Iyo keyboard inotumirwa kune chat uchishandisa nzira sendMessage(), mukukakavadzana reply_markup.

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

Inline keyboard

Sezvandakanyora pamusoro, iyo Inline keyboard yakasungirirwa kune chaiyo meseji. Zvakatonyanya kuoma kushanda nazvo pane iyo main keyboard.

Pakutanga, iwe unofanirwa kuwedzera nzira kune bot yekudaidza iyo Inline keyboard.

Kuti upindure kune Inline bhatani tinya, unogona zvakare kushandisa bot nzira answerCallbackQuery(), iyo inogona kuratidza chiziviso mune telegraph interface kumushandisi anodzvanya bhatani reInline.

Iyo data yakatumirwa kubva kuInline bhatani haisi mavara, saka kuti uigadzirise iwe unofanirwa kugadzira yakakosha mubati uchishandisa iwo murairo CallbackQueryHandler().

Iyo kodhi yekuvaka Inline keyboard iyo inopihwa mune yepamutemo rubatsiro rwepakeji telegram.bot.

Kodhi yekuvaka Inline keyboard kubva kune yepamutemo rubatsiro

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

Iwe unofanirwa kuvaka Inline keyboard uchishandisa rairo InlineKeyboardMarkup(), pamusimboti wakafanana neReply keyboard. IN InlineKeyboardMarkup() zvinodikanwa kupfuudza runyorwa rwezvinyorwa zveInline mabhatani, bhatani rega rega rinogadzirwa nebasa InlineKeyboardButton().

Bhatani remukati rinogona kupfuudza imwe data kune bot uchishandisa nharo callback_data, kana kuvhura chero peji reHTML rataurwa uchishandisa nharo url.

Mhedzisiro yacho ichave rondedzero umo chimwe nechimwe chinhu zvakare chinyorwa cheInline mabhatani anoda kusanganiswa kuita mutsetse mumwe.

Tevere tichatarisa mienzaniso yakati wandei ye bots ine Inline mabhatani.

Muenzaniso webhoti iri nyore nerutsigiro rweInLine mabhatani

Chekutanga, isu tichanyora bot yekuyedza kuongororwa kwecovid-19. Nokuraira /test, ichakutumira keyboard ine mabhatani maviri, zvichienderana nebhatani rakadzvanywa ichakutumira meseji ine zvabuda pakuyedzwa kwako.

Code 2: Iyo yakapfava bot ine Inline keyboard

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

Mhanya iyo kodhi muenzaniso uri pamusoro, mushure mekutsiva 'YAKO BOT TOKEN' nechiratidzo chaicho chawakagamuchira paunenge uchigadzira bot kuburikidza. BotFather (Ndakataura nezve kugadzira bot mukati chinyorwa chekutanga).

Mhinduro:
Kunyora teregiramu bot muR (chikamu 3): Maitiro ekuwedzera kiyibhodhi rutsigiro kune bot

Isu takagadzira nzira mbiri:

  • bvunzo -Kutumira kuChat Inline keyboard
  • answer_cb -Kugadzirisa data yakatumirwa kubva kukhibhodi.

Iyo data ichatumirwa kubva kune yega bhatani inotsanangurwa mukupokana callback_data, pakugadzira bhatani. Iwe unogona kugamuchira iyo data yakatumirwa kubva bhatani uchishandisa kuvaka update$callback_query$data, mukati menzira answer_cb.

Kuti bot iite kune Inline keyboard, nzira answer_cb zvakagadziriswa nemubatsiri akakosha: CallbackQueryHandler(answer_cb). Iyo inomhanyisa nzira yakatsanangurwa kana bhatani reInline radzvanywa. Handler CallbackQueryHandler inotora nharo mbiri:

  • callback -Nzira iyo inofanirwa kuitwa
  • pattern -Sefa nedata rakasungirirwa kubhatani uchishandisa nharo callback_data.

Saizvozvowo, kushandisa nharo pattern Tinogona kunyora imwe nzira yekudzvanya bhatani rega rega:

Code 3: Nzira dzakasiyana dzebhatani rega rega reInline

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

Mhanya iyo kodhi muenzaniso uri pamusoro, mushure mekutsiva 'YAKO BOT TOKEN' nechiratidzo chaicho chawakagamuchira paunenge uchigadzira bot kuburikidza. BotFather (Ndakataura nezve kugadzira bot mukati chinyorwa chekutanga).

Iye zvino takanyora nzira mbiri dzakasiyana i.e. nzira imwe, yekudzvanya bhatani rega rega, uye yakashandisa nharo pattern, pakugadzira vabati vavo:

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

Nzira yekodhi inopera answer_cb team bot$answerCallbackQuery(callback_query_id = update$callback_query$id), iyo inoudza bot kuti data kubva kuinline keyboard yagamuchirwa.

Muenzaniso webhoti inoshuma mamiriro ekunze aripo eguta rakasarudzwa

Ngatiedzei kunyora bot inokumbira data yemamiriro ekunze.

Mufungo webasa rawo uchave wakadai. Pakutanga neboka /start Unodaidza kiibhodhi huru, ine bhatani rekuti “Mamiriro ekunze” chete. Nekudzvanya bhatani iri unogashira meseji ine Inline keyboard yekusarudza guta raunoda kuziva mamiriro ekunze aripo. Sarudza rimwe remaguta uye uwane mamiriro ekunze aripo.

Mumuenzaniso uyu wekodhi isu tichashandisa akati wandei mamwe mapakeji:

  • httr - pasuru yekushanda nezvikumbiro zveHTTP, pahwaro hwekuti basa nechero API rakavakwa. Muchiitiko chedu isu tichashandisa iyo yemahara API openweathermap.org.
  • stringr - pasuru yekushanda nemavara, kwatiri isu tichaishandisa kugadzira meseji nezve mamiriro ekunze muguta rakasarudzwa.

Code 4: Bot inoshuma mamiriro ekunze aripo eguta rakasarudzwa

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

Mhanya iyo kodhi muenzaniso uri pamusoro, mushure mekutsiva 'YAKO BOT TOKEN' nechiratidzo chaicho chawakagamuchira paunenge uchigadzira bot kuburikidza. BotFather (Ndakataura nezve kugadzira bot mukati chinyorwa chekutanga).

Nekuda kweizvozvo, bot yedu ichashanda seizvi:
Kunyora teregiramu bot muR (chikamu 3): Maitiro ekuwedzera kiyibhodhi rutsigiro kune bot

Schematically, iyi bot inogona kuratidzwa seizvi:
Kunyora teregiramu bot muR (chikamu 3): Maitiro ekuwedzera kiyibhodhi rutsigiro kune bot

Isu takagadzira nzira nhatu dziripo mukati memamiriro ekunze bot yedu:

  • kutanga -Tangisa iyo huru bot keyboard
  • mamiriro okunze -Tangisa Inline keyboard kuti usarudze guta
  • answer_cb -Iyo nzira huru inokumbira mamiriro ekunze kubva kuAPI yeguta rakapihwa uye inotumira kune chat.

Method kutanga tinoivhura nemurairo /start, iyo inoshandiswa nemubati CommandHandler('start', start).

Kuita nzira mamiriro okunze takagadzira sefa yezita rimwechete:

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

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

}
)

Uye isu tinodaidza iyi nzira neinotevera meseji inobata: MessageHandler(weather, filters = MessageFilters$weather).

Uye pakupedzisira, nzira yedu huru answer_cb inopindirana nekudzvanya mabhatani eInline, ayo anoitwa neakakosha anobata: CallbackQueryHandler(answer_cb).

Mukati menzira answer_cb, tinoverenga data yakatumirwa kubva kukhibhodi uye kuinyora kune inoshanduka city: city <- update$callback_query$data. Ipapo isu tinokumbira data yemamiriro ekunze kubva kuAPI, kugadzira uye kutumira meseji, uye pakupedzisira shandisa nzira answerCallbackQuery kuitira kuzivisa bot kuti takagadzirisa kudzvanya kweInline bhatani.

Muenzaniso webhoti inoratidza runyorwa rwezvinyorwa zvichangoburwa zvine zvinongedzo kune yakatsanangurwa Hub kubva www.habr.com.

Ini ndinopa iyi bot kuti ndikuratidze maitiro ekuratidza Inline mabhatani anotungamira kumapeji ewebhu.

Iyo logic yeiyi bot yakafanana neyakapfuura; pekutanga isu tinotangisa iyo huru keyboard nekuraira /start. Tevere, bhoti inotipa runyoro rwemahubhu matanhatu ekusarudza kubva, isu tinosarudza hubhu yatiri kufarira, uye tinogamuchira zvinyorwa zvishanu zvazvino kubva kuHub yakasarudzwa.

Sezvaunonzwisisa, munyaya iyi tinoda kuwana runyoro rwezvinyorwa, uye nokuda kweizvi tichashandisa purogiramu inokosha habR, iyo inokutendera kuti ukumbire zvinyorwa kubva kuHabra uye dzimwe nhamba pazviri muR.

Isa package habR zvinongogoneka kubva github, iyo iwe yauchazoda imwe pasuru devtools. Kuisa, shandisa kodhi iri pazasi.

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

Zvino ngatitarisei kodhi yekuvaka iyo bot inotsanangurwa pamusoro apa:

Code 5: Bot inoratidza runyoro rwezvinyorwa zvichangoburwa paHub yakasarudzwa

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

Mhanya iyo kodhi muenzaniso uri pamusoro, mushure mekutsiva 'YAKO BOT TOKEN' nechiratidzo chaicho chawakagamuchira paunenge uchigadzira bot kuburikidza. BotFather (Ndakataura nezve kugadzira bot mukati chinyorwa chekutanga).

Nekuda kweizvozvo, isu tichawana iyi mhedzisiro:
Kunyora teregiramu bot muR (chikamu 3): Maitiro ekuwedzera kiyibhodhi rutsigiro kune bot

Isu takaomesera rondedzero yeHubs iripo yekusarudzwa mune iyo nzira 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)
}

Isu tinowana rondedzero yezvinyorwa kubva kune yakatsanangurwa Hub nemurairo habr_hub_posts(), kubva pasuru habR. Panguva imwecheteyo, isu tinonongedza kuti hatidi runyoro rwezvinyorwa zvenguva yese, asi peji yekutanga pane iyo 20 zvinyorwa zviripo. Kubva patafura inoguma uchishandisa murairo head() Isu tinosiya chete epamusoro 5, ayo ari ekupedzisira zvinyorwa.

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

Iyo logic yakafanana neiyo yapfuura bot, asi mune ino kesi tinogadzira iyo Inline keyboard ine runyorwa rwezvinyorwa zvine simba uchishandisa basa. lapply().

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

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

Isu tinoisa musoro wechinyorwa mumabhatani mavara posts$title[x], uye mukukakavadzana url link kuchinyorwa: url = posts$link[x].

Tevere, tinogadzira sefa, zvibatiso uye totanga bot yedu.

mhedziso

Iye zvino mabhoti aunonyora achave akanyanya nyore kushandisa, nekuda kwekuti achadzorwa kubva pane keyboard, pane nekupinda mirairo. Zvirinani, kana uchidyidzana nebhoti kuburikidza ne-smartphone, iyo keyboard inorerutsa maitiro ekuishandisa.

Muchikamu chinotevera tichaona nzira yekuvaka nhaurirano ine musoro nebhoti uye kushanda nedatabase.

Source: www.habr.com

Voeg