Qorista bot telegram ee R (qaybta 3): Sida loogu daro taageerada kiiboodhka bot

Tani waa maqaalkii saddexaad ee taxanaha "Qoritaanka bot telegram ee R". Daabacaadadii hore, waxaan ku baranay sida loo sameeyo bot telegram, u dir fariimaha iyada oo loo marayo, amarrada iyo filtarrada fariinta lagu daro bot-ka. Sidaa darteed, ka hor inta aanad bilaabin akhrinta maqaalkan, waxaan aad ugu talinayaa inaad akhrido hore, sababtoo ah Halkan kuma sii joogi doono aasaaskii hore ee lagu sharraxay ee dhismaha bot.

Maqaalkan, waxaanu hagaajin doonaa isticmaalka bot-kayaga anagoo ku darayna kiiboodhka, kaas oo ka dhigi doona interface bot mid dareen leh oo sahlan in la isticmaalo.

Qorista bot telegram ee R (qaybta 3): Sida loogu daro taageerada kiiboodhka bot

Dhammaan maqaallada taxanaha ah "Qoritaanka bot telegram ee R"

  1. Waxaan abuurnaa bot waxaana u isticmaalnaa si aan farriimaha ugu dirno telegram
  2. Ku dar taageerada amarka iyo filtarrada fariinta bot-ka
  3. Sida loogu daro taageerada kiiboodhka bot

Tusmo

Haddii aad xiisaynayso falanqaynta xogta, waxaa laga yaabaa inaad xiisaynayso aniga telegram и youtube kanaalada. Inta badan waxa ku jira waxa u heellan luqadda R.

  1. Waa maxay noocyada kiiboodhka uu taageero bot telegram?
  2. Kiiboodhka ka jawaab
  3. Kiiboodhka khadka tooska ah
    3.1. Tusaale bot fudud oo taageero u ah badhamada InLine
    3.2. Tusaalaha bot ee ka warbixinaya cimilada hadda ee magaalo la doortay
    3.3. Tusaalaha bot-ka soo bandhigaya liiska maqaalladii ugu dambeeyay ee leh xiriirinta Hubka la cayimay ee habr.com
  4. gunaanad

Waa maxay noocyada kiiboodhka uu taageero bot telegram?

Waqtiga qoraalkan telegram.bot Waxay kuu ogolaanaysaa inaad abuurto laba nooc oo kiiboodhka ah:

  • Jawaab - Kiiboodhka ugu weyn, ee caadiga ah, kaas oo ku yaal hoosta guddiga gelinta qoraalka. Keyboard-ka noocan oo kale ah wuxuu si fudud ugu diraa fariin qoraal ah bot-ka, qoraal ahaana wuxuu u diri doonaa qoraalka ku qoran badhanka laftiisa.
  • Inline - kiiboodhka la xidhiidha fariin gaar ah oo bot ah. Kiiboodhkani waxa uu soo diraa xogta bot-ka ee la xidhiidha badhanka la riixay, xogtani waxa ay ka duwanaan kartaa qoraalka ku qoran badhanka laftiisa. Oo badhamada noocan oo kale ah ayaa lagu farsameeyaa CallbackQueryHandler.

Si bot-ku u furo kumbuyuutarka, waa lagama maarmaan marka fariin loo dirayo habka sendMessage(), u gudbi kiiboodhka hore loo abuuray dood ahaan reply_markup.

Hoos waxaan ku eegi doonaa dhawr tusaale.

Kiiboodhka ka jawaab

Sida aan kor ku qoray, kani waa kiiboodhka ugu weyn ee kantaroolka bot.

Tusaale ahaan abuurista kiiboodhka jawaabta ee caawimada rasmiga ah

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)

Kor ku xusan waa tusaale ka yimid caawimaadda rasmiga ah ee xirmada telegram.bot. Si aad u abuurto kiiboodhka, isticmaal shaqada ReplyKeyboardMarkup(), taas oo iyaduna qaadata liiska badhamada ay samaysay shaqadu KeyboardButton().

Maxay tahay sababta ReplyKeyboardMarkup() Ma u baahan tahay inaad dhaafto liis oo keliya, laakiin liiska liisaska? Xaqiiqdu waxay tahay inaad gudubto liiska ugu muhiimsan, oo aad ku qeexdo saf kasta oo badhamada liisaska kala duwan, sababtoo ah Waxaad ku dhejin kartaa dhowr badhan hal saf.

dood resize_keyboard Waxay kuu ogolaaneysaa inaad si toos ah u doorato cabbirka ugu fiican ee badhamada kiiboodhka, iyo doodda one_time_keyboard Waxay kuu ogolaanaysaa inaad qariso kiiboodhka ka dib batoon kasta oo la riixo.

Aan qorno bot fudud oo yeelan doona 3 badhan:

  • Aqoonsiga wada sheekaysiga - Codso aqoonsiga wada hadalka bot
  • Magacayga - Codso magacaaga
  • Gelitaankayga - Codso magacaaga isticmaale ee telegram

Koodhka 1: Bot fudud oo leh kiiboodhka jawaabta

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

Orod tusaalaha koodka sare, ka dib markii aad ku bedesho 'BOT TOKENKA' calaamada dhabta ah ee aad heshay markii aad samaynaysay bot-ka BotAabbe (Waxaan ka hadlay abuurista bot maqaalka koowaad).

Ka dib markaad bilowdo, sii bot amar /start, sababtoo ah Tani waa sida saxda ah ee aan u qeexnay inaan furno kiiboodhka.

Qorista bot telegram ee R (qaybta 3): Sida loogu daro taageerada kiiboodhka bot

Haddii hadda ay kugu adag tahay inaad kala qaybiso tusaalaha koodhka la bixiyay, iyadoo la abuurayo habab, filtarrada iyo maamulayaasha, markaa waa inaad ku noqotaa kii hore. maqaal, taas oo aan ku sifeeyay waxaas oo dhan si faahfaahsan.

Waxaan abuurnay 4 hab:

  • bilow - Fur kumbuyuutarka
  • chat_id - Codso aqoonsiga wada sheekaysiga
  • my_name - Codso magacaaga
  • my_username - Codso galidaada

In la diido Filters Message ku daray 3 fariimo filtarrada ku salaysan qoraalkooda:

  • chat_id - Fariimo qoraal ah "Чат ID"
  • magac - Farriimo qoraal ah "Моё имя"
  • username - Farriimo qoraal ah "Мой логин"

Oo waxaan abuurnay 4 maamulayaal, oo ku saleysan amarada la bixiyay iyo filtarrada, waxay fulin doonaan hababka la cayimay.

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

Kiiboodhka laftiisa ayaa lagu dhex abuuray habka start() kooxda ReplyKeyboardMarkup().

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

Xaaladeena, waxaan dhignay dhammaan badhamada midba midka kale, laakiin waxaan ku habeyn karnaa hal saf annagoo isbeddel ku samaynayna liiska badhanka. Sababtoo ah hal saf oo ku dhex jira kiiboodhka waxa lagu dhex abuuraa liis buul ah oo badhanno ah, ka dib si aanu badhamadayada ugu soo bandhigno hal saf waxaan u baahanahay in aan dib u qorno qayb ka mid ah code-ka lagu dhisayo kiiboodhka sidan oo kale.

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

Qorista bot telegram ee R (qaybta 3): Sida loogu daro taageerada kiiboodhka bot

Kiiboodhka waxaa loo diraa sheekeysiga iyadoo la adeegsanayo habka sendMessage(), ee doodda reply_markup.

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

Kiiboodhka khadka tooska ah

Sida aan kor ku qoray, kiiboodhka Inline-ku waxa uu ku xidhan yahay fariin gaar ah. Way adag tahay in lagu shaqeeyo marka loo eego kiiboodhka weyn.

Ugu horreyntii, waxaad u baahan tahay inaad ku darto hab bot si aad u wacdo kiiboodhka khadka.

Si aad uga jawaabto badhanka Inline-ka guji, waxa kale oo aad isticmaali kartaa habka bot answerCallbackQuery(), kaas oo soo bandhigi kara ogeysiin ku dhex jira interface-ka telegramka isticmaalaha oo riixaya badhanka Inline-ka.

Xogta laga soo diray badhanka Inline maaha qoraal, markaa si aad u habayso waxaad u baahan tahay inaad abuurto maamule gaar ah adoo isticmaalaya amarka CallbackQueryHandler().

Koodhka lagu dhisayo kiiboodhka khadka ah kaas oo lagu bixiyo caawimada rasmiga ah ee xidhmada telegram.bot.

Koodhka lagu dhisayo kiiboodhka khadka tooska ah ee caawinta rasmiga ah

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

Waxaad u baahan tahay inaad dhisto kiiboodhka khadka tooska ah adoo isticmaalaya amarka InlineKeyboardMarkup(), isla mabda'a kiiboodhka jawaabta. IN InlineKeyboardMarkup() Waa lagama maarmaan in la gudbiyo liiska liisaska badhanka Inline, badhan kasta oo shakhsi ah ayaa abuuray shaqada InlineKeyboardButton().

Badhanka dhexda ah ayaa ama u gudbin kara xogta bot-ka isagoo isticmaalaya dood callback_data, ama fur bog kasta oo HTML ah oo lagu cayimay adoo isticmaalaya doodda url.

Natiijadu waxay noqon doontaa liis ay element kasta sidoo kale waa liiska badhamada Inline ee u baahan in la isku daro hal saf.

Marka xigta waxaan eegi doonaa dhowr tusaale oo bots ah oo leh badhamada Inline-ka.

Tusaale bot fudud oo taageero u ah badhamada InLine

Marka hore, waxaanu u qori doonaa bot si loogu baadho Covid-19. Amarka /test, waxay kuu soo diri doontaa kiiboodhka laba badhan, iyadoo ku xidhan badhanka la riixo waxay kuu soo diri doontaa fariin ay ku jirto natiijada tijaabadaada.

Koodhka 2: Botka ugu fudud ee leh kiiboodhka khadka

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

Orod tusaalaha koodka sare, ka dib markii aad ku bedesho 'BOT TOKENKA' calaamada dhabta ah ee aad heshay markii aad samaynaysay bot-ka BotAabbe (Waxaan ka hadlay abuurista bot maqaalka koowaad).

Natiijada:
Qorista bot telegram ee R (qaybta 3): Sida loogu daro taageerada kiiboodhka bot

Waxaan abuurnay laba hab:

  • imtixaanka - Si aad u dirto si aad ugu sheekeysato kiiboodhka khadka tooska ah
  • jawaab_cb - Si loo habeeyo xogta laga soo diray kiiboodhka.

Xogta laga soo diri doono badhan kasta waxay ku qeexan tahay doodda callback_data, marka la abuurayo badhan. Waxaad ka heli kartaa xogta laga soo diray badhanka adigoo isticmaalaya dhismaha update$callback_query$data, gudaha habka jawaab_cb.

Si bot-ku uga falceliyo kiiboodhka khadka, habka jawaab_cb waxaa farsameeyay gacanle gaar ah: CallbackQueryHandler(answer_cb). Kaas oo socodsiiya habka la cayimay marka badhanka Inline-ka la riixo. Xakameeyaha CallbackQueryHandler waxay qaadataa laba doodood:

  • callback - Habka loo baahan yahay in la socodsiiyo
  • pattern - Ku shaandhayso xogta ku xidhan badhanka adoo isticmaalaya dood callback_data.

Sida waafaqsan, isticmaalka doodda pattern Waxaan u qori karnaa hab gaar ah oo lagu riixayo badhan kasta:

Xeerka 3: Hababka kala soocida badhan kasta oo khadka

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

Orod tusaalaha koodka sare, ka dib markii aad ku bedesho 'BOT TOKENKA' calaamada dhabta ah ee aad heshay markii aad samaynaysay bot-ka BotAabbe (Waxaan ka hadlay abuurista bot maqaalka koowaad).

Hadda waxaan qornay 2 hab oo kala duwan i.e. hal hab, ee badhan kasta riix, oo loo isticmaalo doodda pattern, marka la abuurayo maamulayaashooda:

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

Habka koodku wuu dhamaanayaa jawaab_cb kooxda bot$answerCallbackQuery(callback_query_id = update$callback_query$id), kaas oo u sheegaya bot in xogta laga helay kiiboodhka khadka dhexda ah la helay.

Tusaalaha bot ee ka warbixinaya cimilada hadda ee magaalo la doortay

Aan isku dayno inaan qorno bot codsata xogta cimilada.

Macnaha shaqadeedu waxay noqon doontaa sida soo socota. Markii hore kooxda /start waxaad wacdaa kiiboodhka muhiimka ah, kaas oo leh hal badhanka "Cimilada" kaliya. Markaad gujiso badhankan waxaad heli doontaa fariin leh kiiboodhka Inline si aad u doorato magaalada aad rabto inaad u ogaato cimilada hadda. Dooro mid ka mid ah magaalooyinka oo hel cimilada hadda jirta.

Tusaalaha koodka waxaan ku isticmaali doonaa dhowr xirmo oo dheeri ah:

  • httr - xirmo loogu talagalay la shaqeynta codsiyada HTTP, taas oo ku saleysan shaqada API kasta la dhisay. Xaaladeena waxaan isticmaali doonaa API-ga bilaashka ah openweathermap.org.
  • stringr - xirmo loogu talagalay la shaqeynta qoraalka, xaaladdeenna waxaan u isticmaali doonnaa si aan u abuurno farriin ku saabsan cimilada magaalada la doortay.

Xeerka 4: Bot ka warbixinaya cimilada hadda ee magaalada la doortay

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

Orod tusaalaha koodka sare, ka dib markii aad ku bedesho 'BOT TOKENKA' calaamada dhabta ah ee aad heshay markii aad samaynaysay bot-ka BotAabbe (Waxaan ka hadlay abuurista bot maqaalka koowaad).

Natiijo ahaan, bot-kayagu wuxuu u shaqayn doonaa sidan oo kale:
Qorista bot telegram ee R (qaybta 3): Sida loogu daro taageerada kiiboodhka bot

Nidaam ahaan, bot-kan waxa loo sawiri karaa sidan:
Qorista bot telegram ee R (qaybta 3): Sida loogu daro taageerada kiiboodhka bot

Waxaan abuurnay 3 hab oo laga heli karo gudaha bot-ka cimilada:

  • bilow — Fur furaha kiiboodhka bot-ka
  • cimilada - Fur kiiboodhka khadka tooska ah si aad u doorato magaalo
  • jawaab_cb - Habka ugu muhiimsan ee ka codsada cimilada API ee magaalo la siiyay oo u soo diraya sheekada.

Habka bilow waxaanu ku bilaabaynaa amarka /start, Kaas oo uu fuliyo qofka gacanta ku haya CommandHandler('start', start).

Si loo socodsiiyo hab cimilada Waxaan abuurnay shaandhooyin isku magac ah:

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

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

}
)

Oo habkan waxaan ugu yeernaa maamulaha fariinta soo socota: MessageHandler(weather, filters = MessageFilters$weather).

Iyo dhamaadka, habkayaga ugu weyn jawaab_cb waxay ka falcelisaa marka la riixo badhamada Inline-ka, kaas oo uu fuliyo hawlwadeen gaar ah: CallbackQueryHandler(answer_cb).

Gudaha hab jawaab_cb, waxaanu akhrinay xogta laga soo diray kiiboodhka waxaanu u qoraynaa doorsoome city: city <- update$callback_query$data. Kadibna waxaanu ka codsanaa xogta cimilada API-ga, abuurnaa oo dirnaa fariin, oo ugu dambeyntii isticmaal habka answerCallbackQuery si aan u ogaysiiyo bot-ka in aanu farsamaynay dhagsii badhanka Inline-ka.

Tusaalaha bot-ka ee soo bandhigaya liiska maqaalladii ugu dambeeyay ee leh xiriirinta Hubka la cayimay www.habr.com.

Waxaan soo bandhigay bot-kan si aan ku tuso sida loo muujiyo badhamada Inline-ka ee u horseedaya bogagga shabakadda.

Macnaha bot-kani waxa uu la mid yahay kii hore; marka hore waxaanu ku bilaabaynaa kiiboodhka ugu muhiimsan ee amarka /start. Marka xigta, botku wuxuu na siinayaa liis ah 6 hub oo aan ka dooran karno, waxaanu dooranaa xuddunta aan xiisayno, waxaanan ka helnaa 5 daabacaad ee ugu dambeeyay Hub la doortay.

Sida aad fahamsan tahay, kiiskan waxaan u baahanahay inaan helno liiska maqaallada, taasna waxaan u isticmaali doonaa xirmo gaar ah habR, kaas oo kuu ogolaanaya inaad ka codsato maqaallada Habra iyo tirokoobyada iyaga ku saabsan ee R.

Ku rakib xirmo habR kaliya suurtagal ka ah github, kaas oo aad u baahan doonto xirmo dheeraad ah devtools. Si aad u rakibto, isticmaal koodka hoose.

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

Hadda aan eegno xeerka lagu dhisayo bot-ka kor lagu tilmaamay:

Xeerka 5: Bot oo soo bandhigaya liiska maqaalladii ugu dambeeyay ee Hub la doortay

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

Orod tusaalaha koodka sare, ka dib markii aad ku bedesho 'BOT TOKENKA' calaamada dhabta ah ee aad heshay markii aad samaynaysay bot-ka BotAabbe (Waxaan ka hadlay abuurista bot maqaalka koowaad).

Natiijo ahaan, waxaan heli doonaa natiijadan:
Qorista bot telegram ee R (qaybta 3): Sida loogu daro taageerada kiiboodhka bot

Waxaan si adag u dhignay liiska Hubs ee loo heli karo xulashada habka 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)
}

Waxaan ka helnaa liiska maqaallada Hubka la cayimay oo leh amarka habr_hub_posts(), laga bilaabo xirmada habR. Isla mar ahaantaana, waxaan tilmaamaynaa inaanan u baahnayn liis maqaallo ah waqtiga oo dhan, laakiin kaliya loo baahan yahay bogga koowaad oo ay ku yaalliin 20 maqaal. Laga soo bilaabo miiska natiijada adoo isticmaalaya amarka head() Waxaan ka tageynaa kaliya 5 ee ugu sarreeya, kuwaas oo ah maqaalladii ugu dambeeyay.

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

Macquulku wuxuu aad ugu eg yahay botkii hore, laakiin kiiskan waxaan soo saareynaa kiiboodhka khadka tooska ah oo leh liis maqaallo si firfircoon u isticmaalaya shaqada lapply().

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

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

Waxaan gelineynaa cinwaanka maqaalka qoraalka badhanka posts$title[x], iyo doodda url isku xirka maqaalka: url = posts$link[x].

Marka xigta, waxaan abuurnaa shaandheyn, gacan-qabayaal oo aan bilowno bot-keena.

gunaanad

Hadda bots-yada aad qorto waxay noqon doonaan kuwo aad ugu habboon in la isticmaalo, sababtoo ah xaqiiqda ah in lagaa xakameyn doono kumbuyuutarka, halkii aad geli lahayd amarrada. Ugu yaraan, marka aad la falgaliso bot-ka casriga ah, kiiboodhka ayaa si weyn u fududayn doona habka loo isticmaalo.

Maqaalka soo socda waxaan ku ogaan doonaa sida loo dhiso wadahadal macquul ah oo leh bot iyo la shaqeynta xogta macluumaadka.

Source: www.habr.com

Add a comment