په R کې د ټیلیګرام بوټ لیکل (3 برخه): په بوټ کې د کیبورډ ملاتړ اضافه کولو څرنګوالی

دا د لړۍ دریمه مقاله ده "په R کې د ټیلیګرام بوټ لیکل". په تیرو خپرونو کې، موږ زده کړل چې څنګه د ټیلیګرام بوټ جوړ کړو، د هغې له لارې پیغامونه واستوو، بوټ ته کمانډونه او د پیغام فلټرونه اضافه کړو. له همدې امله ، مخکې لدې چې تاسو د دې مقالې لوستل پیل کړئ ، زه په کلکه وړاندیز کوم چې تاسو یې ولولئ پخوانیځکه دلته زه به نور د بوټ جوړونې دمخه بیان شوي اساساتو باندې پاتې نه شم.

پدې مقاله کې ، موږ به د کیبورډ اضافه کولو سره زموږ د بوټ کارولو وړتیا ته وده ورکړو ، کوم چې به د بوټ انٹرفیس په زړه پوري او کارول اسانه کړي.

په R کې د ټیلیګرام بوټ لیکل (3 برخه): په بوټ کې د کیبورډ ملاتړ اضافه کولو څرنګوالی

د لړۍ ټولې مقالې "په R کې د ټیلیګرام بوټ لیکل"

  1. موږ یو بوټ جوړوو او په ټیلیګرام کې د پیغامونو لیږلو لپاره یې کاروو
  2. بوټ ته د کمانډ ملاتړ او پیغام فلټرونه اضافه کړئ
  3. په بوټ کې د کیبورډ ملاتړ اضافه کولو څرنګوالی

منځپانګې

که تاسو د معلوماتو تحلیل سره علاقه لرئ ، تاسو ممکن زما سره علاقه ولرئ telegram и یوتیوب چینلونه ډیری مینځپانګه د R ژبې ته وقف شوې ده.

  1. د ټیلیګرام بوټ کوم ډول کیبورډونه ملاتړ کوي؟
  2. کیبورډ ته ځواب ورکړئ
  3. انلاین کیبورډ
    3.1. د انلاین بټونو لپاره د ملاتړ سره د ساده بوټ مثال
    3.2. د بوټ یوه بیلګه چې د ټاکل شوي ښار لپاره اوسني هوا راپور ورکوي
    3.3. د بوټ یوه بیلګه چې د habr.com څخه ټاکل شوي هب ته لینکونو سره د وروستي مقالو لیست ښیې
  4. پایلې

د ټیلیګرام بوټ کوم ډول کیبورډونه ملاتړ کوي؟

د دې لیکلو په وخت کې telegram.bot تاسو ته اجازه درکوي دوه ډوله کیبورډونه جوړ کړئ:

  • ځواب - اصلي، منظم کیبورډ، کوم چې د پیغام متن ان پټ پینل لاندې موقعیت لري. دا ډول کیبورډ په ساده ډول بوټ ته یو متن پیغام لیږي، او د متن په توګه دا به هغه متن واستوي چې پخپله تڼۍ کې لیکل شوی وي.
  • انلاین - کیبورډ د ځانګړي بوټ پیغام سره تړاو لري. دا کیبورډ د بټ ډیټا لیږي چې د تڼۍ فشار سره تړاو لري؛ دا ډاټا ممکن پخپله تڼۍ کې لیکل شوي متن سره توپیر ولري. او دا ډول بټن د لارې پروسس کیږي CallbackQueryHandler.

د بوټ لپاره د کیبورډ خلاصولو لپاره ، دا اړینه ده کله چې د میتود له لارې پیغام واستوئ sendMessage()، مخکې جوړ شوی کیبورډ د دلیل په توګه تیر کړئ reply_markup.

لاندې به موږ څو مثالونه وګورو.

کیبورډ ته ځواب ورکړئ

لکه څنګه چې ما پورته لیکلي، دا د اصلي بوټ کنټرول کیبورډ دی.

د رسمي مرستې څخه د ځواب کیبورډ رامینځته کولو مثال

bot <- Bot(token = "TOKEN")
chat_id <- "CHAT_ID"

# Create Custom Keyboard
text <- "Aren't those custom keyboards cool?"
RKM <- ReplyKeyboardMarkup(
  keyboard = list(
    list(KeyboardButton("Yes, they certainly are!")),
    list(KeyboardButton("I'm not quite sure")),
    list(KeyboardButton("No..."))
  ),
  resize_keyboard = FALSE,
  one_time_keyboard = TRUE
)

# Send Custom Keyboard
bot$sendMessage(chat_id, text, reply_markup = RKM)

پورته د بسته بندۍ رسمي مرستې څخه یوه بیلګه ده telegram.bot. د کیبورډ جوړولو لپاره، فنکشن وکاروئ ReplyKeyboardMarkup()، کوم چې په پایله کې د بټونو لیست لیست اخلي چې د فنکشن لخوا رامینځته شوي KeyboardButton().

ولې دننه ReplyKeyboardMarkup() ایا تاسو اړتیا لرئ نه یوازې یو لیست تیر کړئ، مګر د لیستونو لیست؟ حقیقت دا دی چې تاسو اصلي لیست تیر کړئ، او پدې کې تاسو د بټونو هر قطار په جلا لیستونو کې تعریف کړئ، ځکه چې تاسو کولی شئ په یو قطار کې څو تڼۍ ځای په ځای کړئ.

دلیل resize_keyboard تاسو ته اجازه درکوي په اتوماتيک ډول د کیبورډ بټنونو مطلوب اندازه غوره کړئ، او دلیل one_time_keyboard تاسو ته اجازه درکوي د هرې تڼۍ فشار وروسته کیبورډ پټ کړئ.

راځئ یو ساده بوټ ولیکو چې 3 بټنونه به ولري:

  • د چټ ID - د بوټ سره د خبرو اترو د چیٹ ID غوښتنه وکړئ
  • زما نوم - د خپل نوم غوښتنه وکړئ
  • زما ننوت - په ټیلیګرام کې د خپل کارن نوم غوښتنه وکړئ

کوډ 1: د ځواب کیبورډ سره ساده بوټ

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

پورته د کوډ مثال پرمخ وړئ ، د ریښتیني نښه سره د 'ستاسو بوټ ټوکن' ځای په ځای کولو وروسته چې تاسو د دې له لارې د بوټ رامینځته کولو پرمهال ترلاسه کوئ. بوټ فیتر (ما د بوټ جوړولو په اړه خبرې وکړې لومړۍ مقاله).

د پیل کولو وروسته، بوټ ته امر ورکړئ /startځکه دا دقیقا هغه څه دي چې موږ د کیبورډ لانچ کولو لپاره تعریف کړل.

په R کې د ټیلیګرام بوټ لیکل (3 برخه): په بوټ کې د کیبورډ ملاتړ اضافه کولو څرنګوالی

که په اوس وخت کې ستاسو لپاره د میتودونو ، فلټرونو او هینډلرونو رامینځته کولو سره د ورکړل شوي کوډ مثال تجزیه کول ستونزمن وي ، نو تاسو باید پخواني ته بیرته راشئ. مقالې، په کوم کې چې ما دا ټول په تفصیل سره بیان کړل.

موږ 4 میتودونه جوړ کړل:

  • پیل - کیبورډ لانچ کړئ
  • chat_id - د چیٹ ID غوښتنه وکړئ
  • زما_نوم - د خپل نوم غوښتنه وکړئ
  • my_username - د ننوتلو غوښتنه وکړئ

اعتراض کول د پیغام فلټرونه د دوی د متن پراساس 3 پیغام فلټرونه اضافه کړل:

  • chat_id - د متن سره پیغامونه "Чат ID"
  • نوم - د متن سره پیغامونه "Моё имя"
  • کارن نوم - د متن سره پیغامونه "Мой логин"

او موږ 4 هینډلرونه رامینځته کړل چې د ورکړل شوي کمانډونو او فلټرونو پراساس به ټاکل شوي میتودونه اجرا کړي.

# создаём обработчики
h_start    <- CommandHandler('start', start)
h_chat_id  <- MessageHandler(chat_id, filters = MessageFilters$chat_id)
h_name     <- MessageHandler(my_name, filters = MessageFilters$name)
h_username <- MessageHandler(my_username, filters = MessageFilters$username)

کیبورډ پخپله د میتود دننه رامینځته شوی start() ډله ReplyKeyboardMarkup().

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

زموږ په قضیه کې، موږ ټول بټونه د یو بل لاندې ځای پرځای کړل، مګر موږ کولی شو د تڼۍ لیستونو لیست کې بدلونونو سره په یو قطار کې تنظیم کړو. ځکه د کیبورډ دننه یو قطار د بټنونو د ځړول شوي لیست له لارې رامینځته کیږي، بیا د دې لپاره چې زموږ بټنونه په یوه قطار کې ښکاره شي موږ باید د کیبورډ جوړولو لپاره د کوډ یوه برخه بیا لیکو:

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

په R کې د ټیلیګرام بوټ لیکل (3 برخه): په بوټ کې د کیبورډ ملاتړ اضافه کولو څرنګوالی

کیبورډ د میتود په کارولو سره چیٹ ته لیږل کیږي sendMessage()په استدلال کې reply_markup.

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

انلاین کیبورډ

لکه څنګه چې ما پورته لیکلي، د انلاین کیبورډ په یو ځانګړي پیغام پورې تړلی دی. د اصلي کیبورډ په پرتله کار کول یو څه ډیر ستونزمن دي.

په پیل کې ، تاسو اړتیا لرئ د انلاین کیبورډ زنګ وهلو لپاره بوټ ته میتود اضافه کړئ.

د انلاین تڼۍ کلیک ته ځواب ویلو لپاره، تاسو کولی شئ د بوټ میتود هم وکاروئ answerCallbackQuery()، کوم چې کولی شي د ټیلیګرام انٹرفیس کې یو خبرتیا هغه کارونکي ته ښکاره کړي چې د انلاین تڼۍ فشاروي.

د انلاین تڼۍ څخه لیږل شوي ډاټا متن نه دی، نو د دې پروسس کولو لپاره تاسو اړتیا لرئ چې د کمانډ په کارولو سره یو ځانګړی هینډلر جوړ کړئ CallbackQueryHandler().

د انلاین کیبورډ جوړولو لپاره کوډ کوم چې د کڅوړې په رسمي مرسته کې ورکړل شوی telegram.bot.

د رسمي مرستې څخه د انلاین کیبورډ جوړولو لپاره کوډ

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

تاسو اړتیا لرئ د کمانډ په کارولو سره انلاین کیبورډ جوړ کړئ InlineKeyboardMarkup()د ځواب کیبورډ په څیر په ورته اصولو کې. IN InlineKeyboardMarkup() دا اړینه ده چې د انلاین بټونو لیستونو لیست تیر کړئ، هر انفرادي تڼۍ د فنکشن لخوا رامینځته کیږي InlineKeyboardButton().

یو انلاین تڼۍ کولی شي د دلیل په کارولو سره بوټ ته ځینې معلومات انتقال کړي callback_data، یا د دلیل په کارولو سره مشخص شوی HTML پاڼه خلاص کړئ url.

پایله به یو لیست وي په کوم کې چې هر عنصر د انلاین بټونو لیست هم دی چې اړتیا لري په یو قطار کې یوځای شي.

بیا به موږ د انلاین بټونو سره د بوټونو ډیری مثالونه وګورو.

د انلاین بټونو لپاره د ملاتړ سره د ساده بوټ مثال

لومړی ، موږ به د کوویډ - 19 لپاره د څرګند ازموینې لپاره بوټ ولیکو. د امر په واسطه /test، دا به تاسو ته د دوه بټونو سره کیبورډ واستوي ، د فشار شوي تڼۍ پورې اړه لري دا به تاسو ته ستاسو د ازموینې پایلو سره یو پیغام واستوي.

کوډ 2: د انلاین کیبورډ سره ترټولو ساده بوټ

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

پورته د کوډ مثال پرمخ وړئ ، د ریښتیني نښه سره د 'ستاسو بوټ ټوکن' ځای په ځای کولو وروسته چې تاسو د دې له لارې د بوټ رامینځته کولو پرمهال ترلاسه کوئ. بوټ فیتر (ما د بوټ جوړولو په اړه خبرې وکړې لومړۍ مقاله).

پایلې:
په R کې د ټیلیګرام بوټ لیکل (3 برخه): په بوټ کې د کیبورډ ملاتړ اضافه کولو څرنګوالی

موږ دوه میتودونه جوړ کړل:

  • ازموینه - چیټ انلاین کیبورډ ته لیږلو لپاره
  • ځواب_cb - د کیبورډ څخه لیږل شوي ډیټا پروسس کولو لپاره.

هغه معلومات چې د هرې تڼۍ څخه لیږل کیږي په دلیل کې مشخص شوي callback_data، کله چې تڼۍ رامینځته کړئ. تاسو کولی شئ د ساختمان په کارولو سره د تڼۍ څخه لیږل شوي معلومات ترلاسه کړئ update$callback_query$data، د میتود دننه ځواب_cb.

د بوټ لپاره د انلاین کیبورډ ته عکس العمل ښودلو لپاره ، میتود ځواب_cb د ځانګړي سمبالونکي لخوا پروسس شوی: CallbackQueryHandler(answer_cb). کوم چې ټاکل شوی میتود پرمخ وړي کله چې د انلاین تڼۍ کلیک کیږي. سمبالونکی CallbackQueryHandler دوه دلیلونه اخلي:

  • callback - هغه طریقه چې باید پرمخ وړل شي
  • pattern - د ډیټا لخوا فلټر کړئ چې د دلیل په کارولو سره تڼۍ ته پابند وي callback_data.

په دې اساس، د استدلال په کارولو سره pattern موږ کولی شو د هرې تڼۍ فشارولو لپاره جلا طریقه ولیکو:

کوډ 3: د هر انلاین تڼۍ لپاره جلا میتودونه

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

پورته د کوډ مثال پرمخ وړئ ، د ریښتیني نښه سره د 'ستاسو بوټ ټوکن' ځای په ځای کولو وروسته چې تاسو د دې له لارې د بوټ رامینځته کولو پرمهال ترلاسه کوئ. بوټ فیتر (ما د بوټ جوړولو په اړه خبرې وکړې لومړۍ مقاله).

اوس موږ 2 جلا میتودونه لیکلي دي لکه یوه طریقه، د هرې تڼۍ فشار لپاره، او دلیل کارول pattern، کله چې د دوی سمبالونکي رامینځته کوي:

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

د میتود کوډ پای ته رسیږي ځواب_cb ډله bot$answerCallbackQuery(callback_query_id = update$callback_query$id)، کوم چې بوټ ته وايي چې د انلاین کیبورډ څخه ډاټا ترلاسه شوې.

د بوټ یوه بیلګه چې د ټاکل شوي ښار لپاره اوسني هوا راپور ورکوي

راځئ هڅه وکړو چې یو بوټ ولیکئ چې د هوا ډیټا غوښتنه کوي.

د دې کار منطق به په لاندې ډول وي. په پیل کې د ټیم لخوا /start تاسو اصلي کیبورډ ته زنګ ووهئ، کوم چې یوازې یو "هوا" تڼۍ لري. د دې تڼۍ په کلیک کولو سره به تاسو د انلاین کیبورډ سره یو پیغام ترلاسه کړئ ترڅو هغه ښار غوره کړئ چې تاسو غواړئ اوسنی هوا ومومئ. یو له ښارونو څخه غوره کړئ او اوسنی هوا ترلاسه کړئ.

د دې کوډ مثال کې به موږ څو اضافي کڅوړې وکاروو:

  • httr - د HTTP غوښتنو سره کار کولو لپاره یوه بسته ، د کوم پراساس چې د هر API سره کار جوړ شوی. زموږ په قضیه کې به موږ وړیا API وکاروو openweathermap.org.
  • stringr - د متن سره د کار کولو لپاره یوه کڅوړه، زموږ په قضیه کې به موږ دا په ټاکل شوي ښار کې د هوا په اړه پیغام چمتو کولو لپاره وکاروو.

کوډ 4: یو بوټ چې د ټاکل شوي ښار لپاره اوسني هوا راپور ورکوي

library(telegram.bot)
library(httr)
library(stringr)

# создаём экземпляр класса Updater
updater <- Updater('ТОКЕН ВАШЕГО БОТА')

# создаём методы
## метод для запуска основной клавиатуры
start <- function(bot, update) {

  # создаём клавиатуру
  RKM <- ReplyKeyboardMarkup(
    keyboard = list(
      list(
        KeyboardButton("Погода")
      )
    ),
    resize_keyboard = TRUE,
    one_time_keyboard = TRUE
  )

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

}

## Метод вызова Inine клавиатуры
weather <- function(bot, update) {

  IKM <- InlineKeyboardMarkup(
    inline_keyboard = list(
      list(
        InlineKeyboardButton(text = 'Москва', callback_data = 'New York,us'),
        InlineKeyboardButton(text = 'Санкт-Петербург', callback_data = 'Saint Petersburg'),
        InlineKeyboardButton(text = 'Нью-Йорк', callback_data = 'New York')
      ),
      list(
        InlineKeyboardButton(text = 'Екатеринбург', callback_data = 'Yekaterinburg,ru'),
        InlineKeyboardButton(text = 'Берлин', callback_data = 'Berlin,de'),
        InlineKeyboardButton(text = 'Париж', callback_data = 'Paris,fr')
      ),
      list(
        InlineKeyboardButton(text = 'Рим', callback_data = 'Rome,it'),
        InlineKeyboardButton(text = 'Одесса', callback_data = 'Odessa,ua'),
        InlineKeyboardButton(text = 'Киев', callback_data = 'Kyiv,fr')
      ),
      list(
        InlineKeyboardButton(text = 'Токио', callback_data = 'Tokyo'),
        InlineKeyboardButton(text = 'Амстердам', callback_data = 'Amsterdam,nl'),
        InlineKeyboardButton(text = 'Вашингтон', callback_data = 'Washington,us')
      )
    )
  )

  # Send Inline Keyboard
  bot$sendMessage(chat_id = update$message$chat_id, 
                  text = "Выберите город", 
                  reply_markup = IKM)
}

# метод для сообщения погоды
answer_cb <- function(bot, update) {

  # получаем из сообщения город
  city <- update$callback_query$data

  # отправляем запрос
  ans <- GET('https://api.openweathermap.org/data/2.5/weather', 
             query = list(q     = city,
                          lang  = 'ru',
                          units = 'metric',
                          appid = '4776568ccea136ffe4cda9f1969af340')) 

  # парсим ответ
  result <- content(ans)

  # формируем сообщение
  msg <- str_glue("{result$name} погода:n",
                  "Текущая температура: {result$main$temp}n",
                  "Скорость ветра: {result$wind$speed}n",
                  "Описание: {result$weather[[1]]$description}")

  # отправляем информацию о погоде
  bot$sendMessage(chat_id = update$from_chat_id(),
                  text    = msg)

  bot$answerCallbackQuery(callback_query_id = update$callback_query$id) 
}

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

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

}
)

# создаём обработчики
h_start         <- CommandHandler('start', start)
h_weather       <- MessageHandler(weather, filters = MessageFilters$weather)
h_query_handler <- CallbackQueryHandler(answer_cb)

# добавляем обработчики в диспетчер
updater <- updater + 
              h_start +
              h_weather +
              h_query_handler

# запускаем бота
updater$start_polling()

پورته د کوډ مثال پرمخ وړئ ، د ریښتیني نښه سره د 'ستاسو بوټ ټوکن' ځای په ځای کولو وروسته چې تاسو د دې له لارې د بوټ رامینځته کولو پرمهال ترلاسه کوئ. بوټ فیتر (ما د بوټ جوړولو په اړه خبرې وکړې لومړۍ مقاله).

د پایلې په توګه، زموږ بوټ به داسې کار وکړي:
په R کې د ټیلیګرام بوټ لیکل (3 برخه): په بوټ کې د کیبورډ ملاتړ اضافه کولو څرنګوالی

په سکیماتیکه توګه، دا بوټ د دې په څیر ښودل کیدی شي:
په R کې د ټیلیګرام بوټ لیکل (3 برخه): په بوټ کې د کیبورډ ملاتړ اضافه کولو څرنګوالی

موږ زموږ د هوا بوټ دننه 3 میتودونه رامینځته کړي دي:

  • پیل - اصلي بوټ کیبورډ لانچ کړئ
  • د هوا - د ښار غوره کولو لپاره انلاین کیبورډ لانچ کړئ
  • ځواب_cb - اصلي میتود چې د ورکړل شوي ښار لپاره د API څخه هوا غوښتنه کوي او چیټ ته یې لیږي.

میتود پیل موږ یې د کمانډ سره پیل کوو /start، کوم چې د سمبالونکي لخوا پلي کیږي CommandHandler('start', start).

د میتود چلولو لپاره د هوا موږ د ورته نوم فلټر جوړ کړ:

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

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

}
)

او موږ دا طریقه د لاندې پیغام سمبالونکي سره بولو: MessageHandler(weather, filters = MessageFilters$weather).

او په پای کې، زموږ اصلي میتود ځواب_cb د انلاین تڼیو فشارولو ته غبرګون ښیې، کوم چې د ځانګړي هینډلر لخوا پلي کیږي: CallbackQueryHandler(answer_cb).

د یوې طریقې دننه ځواب_cbموږ د کیبورډ څخه لیږل شوي ډاټا لوستلو او یو متغیر ته یې لیکو city: city <- update$callback_query$data. بیا موږ د API څخه د هوا ډیټا غوښتنه کوو ، پیغام تولید او لیږو ، او په پای کې میتود وکاروو answerCallbackQuery د دې لپاره چې بوټ ته خبر ورکړئ چې موږ د انلاین تڼۍ کلیک پروسس کړی.

د بوټ یوه بیلګه چې د وروستي مقالو لیست ښیې چې د ځانګړي شوي مرکز لینکونو سره www.habr.com.

زه دا بوټ وړاندې کوم چې تاسو ته وښایئ چې څنګه د انلاین بټونو ښودلو لپاره کوم چې ویب پاڼو ته ځي.

د دې بوټ منطق د تیر سره ورته دی؛ په پیل کې موږ اصلي کیبورډ د کمانډ سره پیل کوو /start. بیا ، بوټ موږ ته د غوره کولو لپاره د 6 مرکزونو لیست راکوي ، موږ هغه مرکز غوره کوو چې موږ یې علاقه لرو ، او د ټاکل شوي مرکز څخه 5 خورا وروستي خپرونې ترلاسه کوو.

لکه څنګه چې تاسو پوهیږئ، پدې حالت کې موږ اړتیا لرو د مقالو لیست ترلاسه کړو، او د دې لپاره به موږ یو ځانګړی کڅوړه وکاروو habR، کوم چې تاسو ته اجازه درکوي د هابرا څخه د مقالو غوښتنه وکړئ او په R کې د دوی په اړه ځینې احصایې.

کڅوړه نصب کړئ habR یوازې د ګیتوب څخه امکان لري ، د کوم لپاره چې تاسو به اضافي کڅوړې ته اړتیا ولرئ devtools. د نصبولو لپاره، لاندې کوډ وکاروئ.

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

اوس راځئ چې پورته تشریح شوي بوټ جوړولو لپاره کوډ وګورو:

کوډ 5: یو بوټ چې په ټاکل شوي مرکز کې د وروستي مقالو لیست ښیې

library(telegram.bot)
library(habR)

# создаём экземпляр класса Updater
updater <- Updater('ТОКЕН ВАШЕГО БОТА')

# создаём методы
## метод для запуска основной клавиатуры
start <- function(bot, update) {

  # создаём клавиатуру
  RKM <- ReplyKeyboardMarkup(
    keyboard = list(
      list(
        KeyboardButton("Список статей")
      )
    ),
    resize_keyboard = TRUE,
    one_time_keyboard = TRUE
  )

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

}

## Метод вызова Inine клавиатуры
habs <- function(bot, update) {

  IKM <- InlineKeyboardMarkup(
    inline_keyboard = list(
      list(
        InlineKeyboardButton(text = 'R', callback_data = 'R'),
        InlineKeyboardButton(text = 'Data Mining', callback_data = 'data_mining'),
        InlineKeyboardButton(text = 'Data Engineering', callback_data = 'data_engineering')
      ),
      list(
        InlineKeyboardButton(text = 'Big Data', callback_data = 'bigdata'),
        InlineKeyboardButton(text = 'Python', callback_data = 'python'),
        InlineKeyboardButton(text = 'Визуализация данных', callback_data = 'data_visualization')
      )
    )
  )

  # Send Inline Keyboard
  bot$sendMessage(chat_id = update$message$chat_id, 
                  text = "Выберите Хаб", 
                  reply_markup = IKM)
}

# метод для сообщения погоды
answer_cb <- function(bot, update) {

  # получаем из сообщения город
  hub <- update$callback_query$data

  # сообщение о том, что данные по кнопке получены
  bot$answerCallbackQuery(callback_query_id = update$callback_query$id, 
                          text = 'Подождите несколько минут, запрос обрабатывается') 

  # сообщение о том, что надо подождать пока бот получит данные
  mid <- bot$sendMessage(chat_id = update$from_chat_id(),
                         text    = "Подождите несколько минут пока, я соберу данные по выбранному Хабу")

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

  # удаляем сообщение о том, что надо подождать
  bot$deleteMessage(update$from_chat_id(), mid$message_id) 

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

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

  # отправляем информацию о погоде
  bot$sendMessage(chat_id = update$from_chat_id(),
                  text    = paste0("5 наиболее свежих статей из Хаба ", hub),
                  reply_markup = IKM)

}

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

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

}
)

# создаём обработчики
h_start         <- CommandHandler('start', start)
h_hubs          <- MessageHandler(habs, filters = MessageFilters$hubs)
h_query_handler <- CallbackQueryHandler(answer_cb)

# добавляем обработчики в диспетчер
updater <- updater + 
  h_start +
  h_hubs  +
  h_query_handler

# запускаем бота
updater$start_polling()

پورته د کوډ مثال پرمخ وړئ ، د ریښتیني نښه سره د 'ستاسو بوټ ټوکن' ځای په ځای کولو وروسته چې تاسو د دې له لارې د بوټ رامینځته کولو پرمهال ترلاسه کوئ. بوټ فیتر (ما د بوټ جوړولو په اړه خبرې وکړې لومړۍ مقاله).

د پایلې په توګه، موږ به دا پایله ترلاسه کړو:
په R کې د ټیلیګرام بوټ لیکل (3 برخه): په بوټ کې د کیبورډ ملاتړ اضافه کولو څرنګوالی

موږ په میتود کې د انتخاب لپاره د موجود مرکزونو لیست هارډ کوډ کړی habs:

## Метод вызова Inine клавиатуры
habs <- function(bot, update) {

  IKM <- InlineKeyboardMarkup(
    inline_keyboard = list(
      list(
        InlineKeyboardButton(text = 'R', callback_data = 'r'),
        InlineKeyboardButton(text = 'Data Mining', callback_data = 'data_mining'),
        InlineKeyboardButton(text = 'Data Engineering', callback_data = 'data_engineering')
      ),
      list(
        InlineKeyboardButton(text = 'Big Data', callback_data = 'bigdata'),
        InlineKeyboardButton(text = 'Python', callback_data = 'python'),
        InlineKeyboardButton(text = 'Визуализация данных', callback_data = 'data_visualization')
      )
    )
  )

  # Send Inline Keyboard
  bot$sendMessage(chat_id = update$message$chat_id, 
                  text = "Выберите Хаб", 
                  reply_markup = IKM)
}

موږ د کمانډ سره د ټاکل شوي مرکز څخه د مقالو لیست ترلاسه کوو habr_hub_posts()، له کڅوړې څخه habR. په ورته وخت کې، موږ په ګوته کوو چې موږ د ټول وخت لپاره د مقالو لیست ته اړتیا نلرو، مګر یوازې لومړی پاڼه چې 20 مقالې موقعیت لري. د کمانډ په کارولو سره د پایلې شوي میز څخه head() موږ یوازې 5 غوره پریږدو، کوم چې خورا وروستي مقالې دي.

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

منطق د تیرو بوټو سره ډیر ورته دی، مګر پدې حالت کې موږ د فنکشن په کارولو سره په متحرک ډول د مقالو لیست سره انلاین کیبورډ رامینځته کوو. lapply().

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

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

موږ د مقالې سرلیک د تڼۍ متن کې دننه کوو posts$title[x]، او په دلیل کې url د مقالې لینک: url = posts$link[x].

بیا، موږ یو فلټر، سمبالونکي جوړوو او زموږ بوټ پیل کوو.

پایلې

اوس هغه بوټونه چې تاسو یې لیکئ د کارولو لپاره به خورا اسانه وي ، د دې حقیقت له امله چې دوی به د کمانډ داخلولو پرځای د کیبورډ څخه کنټرول شي. لږترلږه ، کله چې د سمارټ فون له لارې د بوټ سره متقابل عمل وکړئ ، کیبورډ به د دې کارولو پروسه د پام وړ ساده کړي.

په راتلونکې مقاله کې به موږ معلومه کړو چې څنګه د بوټ سره منطقي ډیالوګ رامینځته کړو او د ډیټابیسونو سره کار وکړو.

سرچینه: www.habr.com

Add a comment