Rubuta bot na telegram a cikin R (sashe na 3): Yadda ake ƙara tallafin madannai zuwa bot

Wannan shine labarin na uku a cikin jerin "Rubuta bot a telegram a cikin R". A cikin wallafe-wallafen da suka gabata, mun koyi yadda ake ƙirƙira bot na telegram, aika saƙonni ta hanyarsa, ƙara umarni da matattarar saƙo zuwa bot. Don haka, kafin ku fara karanta wannan labarin, ina ba da shawarar ku karanta baya, saboda Anan ba zan ƙara tsayawa kan abubuwan da aka kwatanta a baya na ginin bot ba.

A cikin wannan labarin, za mu inganta yadda ake amfani da bot ɗin mu ta ƙara madanni, wanda zai sa bot ɗin ya zama mai fahimta da sauƙin amfani.

Rubuta bot na telegram a cikin R (sashe na 3): Yadda ake ƙara tallafin madannai zuwa bot

Duk labarai daga jerin "Rubutun bot a cikin R"

  1. Muna ƙirƙirar bot kuma muna amfani da shi don aika saƙonni a cikin telegram
  2. Ƙara tallafin umarni da tacewa saƙo zuwa bot
  3. Yadda ake ƙara tallafin madannai zuwa bot

Abubuwa

Idan kuna sha'awar nazarin bayanai, kuna iya sha'awar nawa telegram и youtube tashoshi. Yawancin abun ciki an sadaukar da shi ga yaren R.

  1. Wadanne nau'ikan maɓallan madannai ne bot ɗin telegram ke tallafawa?
  2. Amsa madannai
  3. Allon madannai na layi
    3.1. Misalin bot mai sauƙi tare da goyan bayan maɓallan InLine
    3.2. Misalin bot wanda ke ba da rahoton yanayin halin yanzu don zaɓin birni
    3.3. Misali na bot wanda ke nuna jerin sabbin labarai tare da hanyoyin haɗi zuwa ƙayyadadden Hub daga habr.com
  4. ƙarshe

Wadanne nau'ikan maɓallan madannai ne bot ɗin telegram ke tallafawa?

A lokacin rubuta wannan labarin telegram.bot yana ba ku damar ƙirƙirar nau'ikan madannai guda biyu:

  • Amsa - Babban, madannai na yau da kullun, wanda ke ƙarƙashin sashin shigar da saƙon. Irin wannan maɓalli kawai yana aika saƙon rubutu zuwa bot, kuma a matsayin rubutun zai aika da rubutun da aka rubuta akan maɓallin kanta.
  • Inline - Allon madannai mai alaƙa da takamaiman saƙon bot. Wannan maballin yana aika bayanan bot ɗin da ke da alaƙa da maɓallin da aka danna; wannan bayanan na iya bambanta da rubutun da aka rubuta akan maɓallin kanta. Kuma ana sarrafa irin waɗannan maɓallan ta hanyar CallbackQueryHandler.

Domin bot ya buɗe maballin, yana da mahimmanci lokacin aika saƙo ta hanyar sendMessage(), wuce madannai da aka ƙirƙira a baya azaman hujja reply_markup.

A ƙasa za mu kalli misalai da yawa.

Amsa madannai

Kamar yadda na rubuta a sama, wannan shine babban madanni mai sarrafa bot.

Misalin ƙirƙirar madannai na Amsa daga taimakon hukuma

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)

Abin da ke sama misali ne daga taimakon hukuma na kunshin telegram.bot. Don ƙirƙirar madannai, yi amfani da aikin ReplyKeyboardMarkup(), wanda kuma yana ɗaukar jerin jerin maɓallan da aikin ya ƙirƙira KeyboardButton().

Me yasa a ciki ReplyKeyboardMarkup() Shin kuna buƙatar wuce ba jeri kawai ba, amma lissafin lissafi? Abin nufi shi ne ka wuce babban jerin sunayen, kuma a cikinsa ka ayyana kowane jere na maballin a cikin jerin daban-daban, saboda Kuna iya sanya maɓalli da yawa a jere ɗaya.

shaida resize_keyboard yana ba ka damar zaɓar mafi kyawun girman maɓallan madannai ta atomatik, da hujja one_time_keyboard yana ba ku damar ɓoye maɓalli bayan kowane latsa maɓallin.

Bari mu rubuta bot mai sauƙi wanda zai sami maɓalli 3:

  • ID na Taɗi - Nemi ID ɗin taɗi na tattaunawa tare da bot
  • Sunana - Nemi sunan ku
  • Shiga na - Nemi sunan mai amfani a cikin telegram

Lambar 1: Sauƙaƙan bot tare da madannin amsawa

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

Gudanar da misalin lambar da ke sama, bayan maye gurbin 'BOT TOKEN' tare da ainihin alamar da kuka karɓa lokacin ƙirƙirar bot ta hanyar. BotFaye (Na yi magana game da ƙirƙirar bot a ciki labarin farko).

Bayan ƙaddamarwa, ba da bot umarni /start, saboda Wannan shine ainihin abin da muka ayyana don ƙaddamar da madannai.

Rubuta bot na telegram a cikin R (sashe na 3): Yadda ake ƙara tallafin madannai zuwa bot

Idan a halin yanzu yana da wahala a gare ku don tantance misalin lambar da aka bayar, tare da ƙirƙirar hanyoyin, masu tacewa da masu sarrafa, to yakamata ku koma na baya. labarin, wanda na yi bayanin duk wannan dalla-dalla.

Mun kirkiro hanyoyi 4:

  • farawa - Kaddamar da keyboard
  • chat_id - Neman ID taɗi
  • my_name - Nemi sunan ku
  • my_username - Nemi shiga ku

Don ƙi Matatun saƙo an kara matatar saƙo guda 3 bisa ga rubutun su:

  • chat_id - Saƙonni masu rubutu "Чат ID"
  • suna - Saƙonni tare da rubutu "Моё имя"
  • sunan mai amfani - Saƙonni tare da rubutu "Мой логин"

Kuma mun ƙirƙiri masu sarrafa 4 waɗanda, bisa ga umarni da aka bayar, za su aiwatar da ƙayyadaddun hanyoyin.

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

Maɓallin madannai da kansa an ƙirƙira shi a cikin hanyar start() tawaga ReplyKeyboardMarkup().

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

A cikin yanayinmu, mun sanya duk maɓallan a ƙarƙashin juna, amma za mu iya shirya su a jere ɗaya ta yin canje-canje ga jerin maɓalli. Domin jere daya a cikin madannai ana yin ta ne ta hanyar jerin maballin da aka kafa, sannan domin nuna maballin mu a jere daya muna bukatar mu sake rubuta wani bangare na lambar don gina madannai kamar haka:

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

Rubuta bot na telegram a cikin R (sashe na 3): Yadda ake ƙara tallafin madannai zuwa bot

Ana aika da madannai zuwa hira ta amfani da hanyar sendMessage(), a cikin jayayya reply_markup.

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

Allon madannai na layi

Kamar yadda na rubuta a sama, maballin Inline yana ɗaure da takamaiman saƙo. Yana da ɗan wahalar aiki da shi fiye da babban madannai.

Da farko, kuna buƙatar ƙara hanya zuwa bot don kiran madannai na layi.

Don amsa maballin layin layi danna, Hakanan zaka iya amfani da hanyar bot answerCallbackQuery(), wanda zai iya nuna sanarwa a cikin hanyar sadarwar telegram ga mai amfani wanda ya danna maɓallin Inline.

Bayanan da aka aika daga maɓallin Layin layi ba rubutu ba ne, don haka don aiwatar da shi kuna buƙatar ƙirƙirar mai kulawa ta musamman ta amfani da umarnin CallbackQueryHandler().

Lambar don gina madannai na layi wanda aka bayar a cikin aikin taimakon fakitin telegram.bot.

Lambar don gina madannai na kan layi daga taimakon hukuma

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

Kuna buƙatar gina madannai na layi ta amfani da umarnin InlineKeyboardMarkup(), akan ka'ida ɗaya da maɓallan Amsa. IN InlineKeyboardMarkup() wajibi ne a wuce jerin jerin maɓallan Layi, kowane maɓalli ɗaya an ƙirƙira shi ta hanyar aikin InlineKeyboardButton().

Maɓallin layi na iya ko dai wuce wasu bayanai zuwa bot ta amfani da hujja callback_data, ko buɗe kowane shafin HTML da aka ƙayyade ta amfani da hujja url.

Sakamakon zai zama jeri wanda kowane nau'in kuma shine jerin maɓallan Layin Layi waɗanda ke buƙatar haɗa su cikin layi ɗaya.

Na gaba za mu kalli misalan bots da yawa tare da maɓallin Inline.

Misalin bot mai sauƙi tare da goyan bayan maɓallan InLine

Da farko, za mu rubuta bot don gwaji na musamman don COVID-19. Da umarni /test, zai aiko maka da maballin maɓalli guda biyu, gwargwadon maɓallan da aka danna zai aiko maka da saƙo tare da sakamakon gwajin da ka yi.

Lambar 2: bot mafi sauƙi tare da madannai na layi

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

Gudanar da misalin lambar da ke sama, bayan maye gurbin 'BOT TOKEN' tare da ainihin alamar da kuka karɓa lokacin ƙirƙirar bot ta hanyar. BotFaye (Na yi magana game da ƙirƙirar bot a ciki labarin farko).

Sakamako:
Rubuta bot na telegram a cikin R (sashe na 3): Yadda ake ƙara tallafin madannai zuwa bot

Mun kirkiro hanyoyi guda biyu:

  • gwajin - Don aika zuwa taɗi zuwa allon madannai na layi
  • amsa_cb - Don aiwatar da bayanan da aka aika daga madannai.

An ƙayyade bayanan da za a aika daga kowane maɓalli a cikin gardama callback_data, lokacin ƙirƙirar maɓalli. Kuna iya karɓar bayanan da aka aiko daga maɓallin ta amfani da ginin update$callback_query$data, a cikin hanyar amsa_cb.

Don bot don amsawa ga madannai na kan layi, hanya amsa_cb mai sarrafa shi ta mai kulawa ta musamman: CallbackQueryHandler(answer_cb). Wanda ke gudanar da ƙayyadaddun hanyar lokacin da aka danna maɓallin Inline. Mai kulawa CallbackQueryHandler yana ɗaukar dalilai guda biyu:

  • callback - Hanyar da ake buƙatar gudu
  • pattern - Tace ta bayanan da ke daure zuwa maɓalli ta amfani da hujja callback_data.

A sakamakon haka, yin amfani da magani pattern Za mu iya rubuta wata hanya dabam don latsa kowane maɓalli:

Lambar 3: Hanyoyi daban-daban don kowane maɓallin layi

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

Gudanar da misalin lambar da ke sama, bayan maye gurbin 'BOT TOKEN' tare da ainihin alamar da kuka karɓa lokacin ƙirƙirar bot ta hanyar. BotFaye (Na yi magana game da ƙirƙirar bot a ciki labarin farko).

Yanzu mun rubuta hanyoyi daban-daban guda 2 watau. hanya ɗaya, don kowane maɓalli danna, kuma amfani da hujja pattern, Lokacin ƙirƙirar masu sarrafa su:

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

Lambar hanya ta ƙare amsa_cb tawaga bot$answerCallbackQuery(callback_query_id = update$callback_query$id), wanda ke gaya wa bot cewa an karɓi bayanai daga madannai na layi.

Misalin bot wanda ke ba da rahoton yanayin halin yanzu don zaɓin birni

Bari mu yi ƙoƙarin rubuta bot wanda ke buƙatar bayanan yanayi.

Hankalin aikinsa zai kasance kamar haka. Da farko ta ƙungiyar /start ka kira babban madannai, wanda ke da maɓallin "Weather" ɗaya kawai. Ta danna wannan maɓallin za ku sami sako tare da maɓallin linzamin kwamfuta na layi don zaɓar garin da kuke son gano yanayin yanzu. Zaɓi ɗaya daga cikin biranen kuma sami yanayin halin yanzu.

A cikin wannan misalin lambar za mu yi amfani da ƙarin fakiti da yawa:

  • httr - kunshin don aiki tare da buƙatun HTTP, akan abin da aka gina aiki tare da kowane API. A cikin yanayinmu za mu yi amfani da API ɗin kyauta budeweathermap.org.
  • stringr - kunshin don aiki tare da rubutu, a cikin yanayinmu za mu yi amfani da shi don samar da saƙo game da yanayi a cikin birni da aka zaɓa.

Lambar 4: Bot wanda ke ba da rahoton yanayin halin yanzu na birni da aka zaɓa

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

Gudanar da misalin lambar da ke sama, bayan maye gurbin 'BOT TOKEN' tare da ainihin alamar da kuka karɓa lokacin ƙirƙirar bot ta hanyar. BotFaye (Na yi magana game da ƙirƙirar bot a ciki labarin farko).

A sakamakon haka, bot ɗinmu zai yi aiki kamar haka:
Rubuta bot na telegram a cikin R (sashe na 3): Yadda ake ƙara tallafin madannai zuwa bot

A tsari, ana iya siffanta wannan bot kamar haka:
Rubuta bot na telegram a cikin R (sashe na 3): Yadda ake ƙara tallafin madannai zuwa bot

Mun ƙirƙiri hanyoyi 3 da ake samu a cikin bot ɗin mu:

  • farko — Kaddamar da babban bot keyboard
  • weather - Kaddamar da madannai na layi don zaɓar birni
  • amsa_cb - Babban hanyar da ke buƙatar yanayi daga API don wani birni da aka ba da kuma aika shi zuwa hira.

Hanyar farko mun kaddamar da shi tare da umarni /start, wanda aka aiwatar da mai gudanarwa CommandHandler('start', start).

Don gudanar da hanya weather mun kirkiri tace mai suna iri daya:

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

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

}
)

Kuma muna kiran wannan hanyar tare da mai sarrafa saƙo mai zuwa: MessageHandler(weather, filters = MessageFilters$weather).

Kuma a ƙarshe, babban hanyar mu amsa_cb yana maida martani ga latsa maɓallan layi, waɗanda wani mai kulawa na musamman ke aiwatarwa: CallbackQueryHandler(answer_cb).

Ciki hanya amsa_cb, mun karanta bayanan da aka aiko daga madannai kuma mu rubuta su zuwa mai canzawa city: city <- update$callback_query$data. Sannan muna buƙatar bayanan yanayi daga API, samarwa da aika saƙo, kuma a ƙarshe muna amfani da hanyar answerCallbackQuery domin sanar da bot cewa mun sarrafa danna maɓallin Inline.

Misalin bot wanda ke nuna jerin sabbin labarai tare da hanyoyin haɗi zuwa ƙayyadadden Tambayoyi daga www.habr.com.

Na gabatar da wannan bot don nuna muku yadda ake nuna maɓallan Inline waɗanda ke kaiwa ga shafukan yanar gizo.

Hankalin wannan bot yayi kama da na baya; da farko mun ƙaddamar da babban madannai tare da umarni /start. Bayan haka, bot ɗin yana ba mu jerin cibiyoyi 6 da za mu zaɓa daga ciki, za mu zaɓi cibiyar da muke sha'awar, kuma mu karɓi 5 mafi kyawun wallafe-wallafe daga Hub ɗin da aka zaɓa.

Kamar yadda kuka fahimta, a cikin wannan yanayin muna buƙatar samun jerin labaran, kuma don wannan za mu yi amfani da fakiti na musamman habR, wanda ke ba ka damar neman labarai daga Habra da wasu ƙididdiga akan su a cikin R.

Shigar kunshin habR mai yiwuwa ne kawai daga github, wanda don haka zaku buƙaci ƙarin fakitin devtools. Don shigarwa, yi amfani da lambar da ke ƙasa.

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

Yanzu bari mu dubi lambar don gina bot da aka kwatanta a sama:

Lambar 5: Bot wanda ke nuna jerin labaran baya-bayan nan akan tashar da aka zaɓa

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

Gudanar da misalin lambar da ke sama, bayan maye gurbin 'BOT TOKEN' tare da ainihin alamar da kuka karɓa lokacin ƙirƙirar bot ta hanyar. BotFaye (Na yi magana game da ƙirƙirar bot a ciki labarin farko).

A sakamakon haka, za mu sami wannan sakamako:
Rubuta bot na telegram a cikin R (sashe na 3): Yadda ake ƙara tallafin madannai zuwa bot

Mun ƙididdige jerin wuraren da ke akwai don zaɓi a cikin hanyar 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)
}

Muna samun jerin labarai daga ƙayyadadden Hub tare da umarni habr_hub_posts(), daga kunshin habR. Hakazalika, muna nuna cewa ba ma buƙatar jerin labarai na tsawon lokaci, amma kawai shafi na farko da aka samo asali 20. Daga teburin da aka samo ta amfani da umarnin head() Mun bar kawai saman 5, waɗanda sune labaran baya-bayan nan.

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

Hankalin ya yi kama da bot ɗin da ya gabata, amma a wannan yanayin muna samar da maballin layi na layi tare da jerin labaran da ƙarfi ta amfani da aikin. lapply().

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

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

Mun saka taken labarin a cikin rubutun maɓalli posts$title[x], kuma a cikin jayayya url hanyar haɗi zuwa labarin: url = posts$link[x].

Na gaba, muna ƙirƙiri tacewa, masu aiki da ƙaddamar da bot ɗin mu.

ƙarshe

Yanzu bots ɗin da kuka rubuta za su fi dacewa don amfani da su, saboda gaskiyar cewa za a sarrafa su daga madannai, maimakon shigar da umarni. Aƙalla, lokacin yin hulɗa tare da bot ta wayar hannu, maballin zai sauƙaƙa tsarin amfani da shi sosai.

A cikin labarin na gaba za mu gano yadda za a gina tattaunawa mai ma'ana tare da bot kuma muyi aiki tare da bayanan bayanai.

source: www.habr.com

Add a comment