Чат-бот Telegram Python. Последовательный диалог с Inline кнопками
Всем привет!
Как правильно в библиотеке pyTelegramBotAPI реализовать вывод кнопок типа InlineKeyboardMarkup в зависимости от того на какую кнопку нажал пользователь в предыдущем сообщении? С кнопками типа ReplyKeyboardMarkup вроде проще, там отлично работает bot.register_next_step_handler, где в параметрах можно передать функцию которая будет обрабатывать ответ с предыдущих кнопок. Почему-то с InlineKeyboardMarkup у меня не получается это реализовать и приходится играться с if. Возможно я не то передаю в параметрах.
Написал топорный код, он работает, но я чувствую что он не совсем правильный:
import config
import telebot
import pandas as pd
from telebot import types # кнопки
from string import Template
from datetime import datetime
import pymssql
permissions = config.permissions
bot = telebot.TeleBot(config.API_BOT_TOKEN)
user_dict = {}
class User:
def __init__(self, city):
self.city = city
self.district = None
self.budgetmax = None
self.rooms = None
self.phone = None
@bot.message_handler(commands=['start'])
def city_message(message):
markup = telebot.types.InlineKeyboardMarkup()
markup.add(telebot.types.InlineKeyboardButton(text='Алматы', callback_data='city_almaty'))
markup.add(telebot.types.InlineKeyboardButton(text='Нур-Султан', callback_data='city_astana'))
bot.send_message(message.chat.id, 'В каком городе вы живете?', reply_markup=markup)
@bot.callback_query_handler(func=lambda call: True)
def query(call):
chat_id = call.from_user.id
button_text = call.data
bot.edit_message_reply_markup(call.from_user.id, message_id=call.message.message_id, reply_markup='')
if 'city' in str(call.data):
user_dict[chat_id] = User(button_text)
if call.data == 'city_almaty':
markup = telebot.types.InlineKeyboardMarkup()
button1 = (telebot.types.InlineKeyboardButton(text='Алатауский', callback_data='district_Алатауский'))
button2 = (telebot.types.InlineKeyboardButton(text='Алмалинский', callback_data='district_Алмалинский'))
button3 = (telebot.types.InlineKeyboardButton(text='Ауэзовский', callback_data='district_Ауэзовский'))
button4 = (telebot.types.InlineKeyboardButton(text='Бостандыкский', callback_data='district_Бостандыкский'))
button5 = (telebot.types.InlineKeyboardButton(text='Жетысуский', callback_data='district_Жетысуский'))
button6 = (telebot.types.InlineKeyboardButton(text='Медеуский', callback_data='district_Медеуский'))
button7 = (telebot.types.InlineKeyboardButton(text='Наурызбайский', callback_data='district_Наурызбайский'))
button8 = (telebot.types.InlineKeyboardButton(text='Турксибский', callback_data='district_Турксибский'))
markup.add(button1, button2, button3, button4, button5, button6, button7, button8)
if call.data == 'city_astana':
markup = telebot.types.InlineKeyboardMarkup()
button1 = (telebot.types.InlineKeyboardButton(text='Алатауский', callback_data='district_Алматинский'))
button2 = (telebot.types.InlineKeyboardButton(text='Алмалинский', callback_data='district_Сарыаркинский'))
button3 = (telebot.types.InlineKeyboardButton(text='Ауэзовский', callback_data='district_Есильский'))
button4 = (telebot.types.InlineKeyboardButton(text='Бостандыкский', callback_data='district_Байконурский'))
markup.add(button1, button2, button3, button4)
bot.send_message(call.from_user.id, 'В каком районе Вы живете?', reply_markup=markup)
if 'district' in str(call.data):
user = user_dict[chat_id]
user.district = button_text
markup = telebot.types.InlineKeyboardMarkup()
markup.add(telebot.types.InlineKeyboardButton(text='До 10 млн', callback_data='10000000'))
markup.add(telebot.types.InlineKeyboardButton(text='До 15 млн', callback_data='15000000'))
markup.add(telebot.types.InlineKeyboardButton(text='До 20 млн', callback_data='20000000'))
markup.add(telebot.types.InlineKeyboardButton(text='До 30 млн', callback_data='30000000'))
bot.send_message(call.from_user.id, 'Какой у Вас бюджет?', reply_markup=markup)
if '00000' in str(call.data):
user = user_dict[chat_id]
user.budgetmax = int(call.data)
markup = telebot.types.InlineKeyboardMarkup()
button1 = (telebot.types.InlineKeyboardButton(text='1 комнатная', callback_data='rooms_1'))
button2 = (telebot.types.InlineKeyboardButton(text='2х-комнатная', callback_data='rooms_2'))
button3 = (telebot.types.InlineKeyboardButton(text='3х-комнатная', callback_data='rooms_3'))
button4 = (telebot.types.InlineKeyboardButton(text='4х-комнатная и больше', callback_data='rooms_4+'))
markup.add(button1, button2, button3, button4)
bot.send_message(call.from_user.id, 'Сколько комнат?', reply_markup=markup)
def process_phone_step(message):
chat_id = message.chat.id
user = user_dict[chat_id]
user.phone = message.text
bot.send_message(chat_id, getRegData(user, 'Ваша данные', message.from_user.first_name), parse_mode="Markdown")
write_to_db_step(chat_id)
if 'rooms' in str(call.data):
user = user_dict[chat_id]
user.rooms = call.data
msg = bot.send_message(call.from_user.id, 'Укажите Вашь номер телефона в формате 7777777777')
bot.register_next_step_handler(msg, process_phone_step)
def getRegData(user, title, name):
t = Template(
'$title *$name* \nГород: *$city* \nРайон: *$district* \nМакс. бюджет: *$budgetmax* \nКомнат: *$rooms* \nВаш телефон: *$phone* \n\n' +
'Теперь Вы будете регулярно получать обновления по новостройкам с указанными параметрами\n' +
'Если Вы хотите изменить параметры, нажмите на ссылку /change')
return t.substitute({
'title': title,
'name': name,
'city': user.city,
'district': user.district,
'budgetmax': user.budgetmax,
'rooms': user.rooms,
'phone': user.phone,
})
if __name__ == '__main__':
bot.polling(none_stop=True)