Учимся писать ботов: Inline-клавиатуры. Часть 1.

Учимся писать ботов: Inline-клавиатуры. Часть 1.

t.me/PishemBota

Всем привет! Сегодня я, наконец-таки, продолжаю серию постов про написание ботов для Telegram.

Сегодня пост про Inline-клавиатуры.

Как сделать Callback-клавиатуру?

Согласно документации для Telegram Bot API - Callback-клавиатура это:

Делать клавиатуру мы будем на основе старого доброго первого бота:

import telebot

TOKEN = "<ваштокен>"
bot = telebot.TeleBot(TOKEN)

@bot.message_handler(commands=['start'])
def start(m):
  bot.send_message(m.chat.id, 'Привет, человек!')

bot.polling()

Импортируем туда types из модуля telebot (telegrambotapi):

import telebot
from telebot import types

Меняем функцию start на такую:

def start(m):
  keyboard = types.InlineKeyboardMarkup()
  keyboard.add(types.InlineKeyboardButton(text='<Текст>',
    callback_data="<Обратный текст>"))

  bot.send_message(m.chat.id, 'Привет, человек!',reply_markup=keyboard)

В итоге у нас должен быть такой код:

import telebot
from telebot import types

@bot.message_handler(commands=['start'])
def start(m):
  keyboard = types.InlineKeyboardMarkup()
  keyboard.add(types.InlineKeyboardButton(text='<Текст>',
    callback_data="<Обратный текст>"))

  bot.send_message(m.chat.id, 'Привет, человек!',reply_markup=keyboard)

bot.polling()

И такой ответ на start в телеграмме:

Как сделать ответную часть для Callback-клавиатуры?

Меняем функцию start на эту, в которой я определил m.chat.id глобальным (чуть позже будет понятно зачем) и добавил отправление на следующую функцию (при желании kb_reply можно заменить на другое название):

def start(m):
  global cid
  cid = m.chat.id

  keyboard = types.InlineKeyboardMarkup()
  keyboard.add(types.InlineKeyboardButton(text='<Текст>',
    callback_data = '<Обратный текст>'))

  msg = bot.send_message(m.chat.id,'Привет,человек!',
    reply_markup=keyboard)

  bot.register_next_step_handler(msg, kb_reply)

Создаем новую функцию и прописываем для неё специальный хэндлер:

@bot.callback_query_handler(func=lambda c: True)
def kb_reply(с): # не менять данные в скобках

Вписываем туда логику if:

  if c.data == '<Обратный текст>':

И делаем задачу для логики if, к примеру сделаем отправку определенного текста:

  if c.data == '<Обратный текст>':
    bot.send_message(cid, '<Текст для ответа>')

Обратите внимание на то, что мы используем cid вместо m.chat.id. Сделано это потому что невозможно нормально использовать и callback методы, и message методы.


Уже завтра (!) выйдет вторая часть, где я рассмотрю и другие варианты инлайна, большее количество кнопок и их работу.


Report Page