Переход к следующему шагу (Telebot)

Michael_Komas

Новичок
Автор темы
15
1
Есть код, для регистрации пользователя в боте и последующим заносом его в локальную БД, отправка сообщения в чат о регистрации нового пользователя.
Выход в главное меню не работает, т.к. используется bot.register_next_step_handler(), т.е. даже если после нажатия "Регистрация пользователя" вернуться в главное меню, ввести ".", то бот напишет "Неверное ФИО...", каким образом тут можно реализовать выход в главное меню, сохранив весь функционал и кнопки?

Python:
from telebot import types
import re
from datetime import date
import pyodbc
import data

# API токен бота
bot = data.bot_token

# Чат, куда отправляются данные после регистрации
to_chat = data.id_chat

# Подключение к БД
conn_str = data.sql
conn = pyodbc.connect(conn_str)
cursor = conn.cursor()

# Запрос для сохранения данных
SQL_Querry = data.query

user_data = {}

def check_full_name(full_name):
    # Регулярное выражение для проверки ФИО
    pattern = r'^[А-ЯЁ][а-яё]+ [А-ЯЁ][а-яё]+( [А-ЯЁ][а-яё]+)?$'

    # Функция search() модуля re для проверки соответствия
    if re.match(pattern, full_name):
        return True
    else:
        return False


@bot.message_handler(commands=['start'])

# Сохранение ФИО, получение соц.сети
def save_full_name(message):
    chat_id = message.chat.id
    full_name = message.text
    # Проверяем, соответствует ли ФИО формату
    if not check_full_name(full_name):
        markup = types.InlineKeyboardMarkup()
        markup.add(types.InlineKeyboardButton('Главное меню', callback_data='start_menu'))
        bot.send_message(chat_id, "Неверный формат ФИО. Пожалуйста, введите ФИО в формате 'Иванов Иван Иванович' или без отчества:", reply_markup=markup)
        bot.register_next_step_handler(message, save_full_name)  # Рекурсивно вызываем функцию для повторного ввода ФИО
        return
        
    user_data[chat_id] = {"full_name": full_name}
    markup = types.InlineKeyboardMarkup()
    markup.add(types.InlineKeyboardButton('Главное меню', callback_data='start_menu'))
    bot.send_message(chat_id, "Отлично! Теперь введите ссылку на соц.сеть:", reply_markup=markup)
    return

# Сохранение ссылки на соц.сеть, получение города
def save_phone_number(message):
    chat_id = message.chat.id
    social_networks = message.text
    user_data[chat_id]["social_networks"] = social_networks
    markup = types.InlineKeyboardMarkup()
    markup.add(types.InlineKeyboardButton('Главное меню', callback_data='start_menu'))
    bot.send_message(chat_id, "Пожалуйста, введите город для работы:", reply_markup=markup)
    return

# Функция сохранение города и отправка данных на обработку
def save_city(message):
    try:
        chat_id = message.chat.id
        user_data[chat_id]["city"] = message.text
        markup = types.InlineKeyboardMarkup()
        markup.add(types.InlineKeyboardButton('Главное меню', callback_data='start_menu'))
        yes = types.InlineKeyboardButton('Да', callback_data='send_data')
        no = types.InlineKeyboardButton('Нет', callback_data='not_send_data')
        markup.row(yes, no)
        msg = bot.send_message(chat_id, "Отправить все полученные данные на обработку?", reply_markup=markup)
    except:
        bot.send_message(chat_id, "Пожалуйста, выберите кнопку из меню.")
    return

# Функция для сохранения номера телефона и отправки данных в чат
def send_data(chat_id):
    try:
        full_name = user_data[chat_id]["full_name"]
        social_networks = user_data[chat_id]["social_networks"]
        city = user_data[chat_id]["city"]
        current_date = date.today()
        data = f"ФИО: {full_name}\nСсылка на соц.сеть: {social_networks}\nГород: {city}\nДата регистрации по ссылке: {current_date} "
        markup = types.InlineKeyboardMarkup()
        markup.add(types.InlineKeyboardButton('Главное меню', callback_data='start_menu'))
        bot.send_message(to_chat, data)
        bot.send_message(chat_id, "Ответ записан.", reply_markup=markup)
        cursor.execute(SQL_Querry, (full_name, social_networks, city))
        cursor.commit()
    except:
        bot.send_message(chat_id, "Пожалуйста, выберите кнопку из меню.")
    return


@bot.callback_query_handler(func=lambda callback: True)

def callback_message(callback):

    # Если выбрано "Регистрация пользователя, получаем его ФИО"
    if callback.data == "reg_user":
        chat_id = callback.message.chat.id
        markup = types.InlineKeyboardMarkup()
        markup.add(types.InlineKeyboardButton('Главное меню', callback_data='start_menu'))
        bot.send_message(chat_id, "Пожалуйста, введите ФИО:", reply_markup=markup)
        bot.register_next_step_handler(callback.message, save_full_name)

    #Если выбрано "Главное меню", возвращаемся на начальный экран
    elif callback.data == "start_menu":
        try:
            markup = types.InlineKeyboardMarkup()
            markup.add(types.InlineKeyboardButton('Регистрация пользователя', callback_data='reg_user'))
            bot.send_message(callback.message.chat.id, 'Выберите тему вопроса в меню:', reply_markup=markup)
        except:
            bot.send_message(chat_id, "Пожалуйста, выберите кнопку из меню.")
        return

    # Если пользователь согласен отправить данные, подтвердив регистрацию. (Вносится в БД)
    elif callback.data == "send_data":
        chat_id = callback.message.chat.id
        send_data(chat_id)

    # Если пользователь откажется отправить данные, отменив регистрацию. (Не вносится в БД)
    elif callback.data == "not_send_data":
        chat_id = callback.message.chat.id
        markup = types.InlineKeyboardMarkup()
        markup.add(types.InlineKeyboardButton('Главное меню', callback_data='start_menu'))
        bot.send_message(chat_id, "Данные не будут отправлены.", reply_markup=markup)
    
if __name__ == '__main__':
    bot.polling(non_stop= True)
 

SeregaIvanovis

Активный
118
33
@bot.message_handler(commands=['start']) # Сохранение ФИО, получение соц.сети def save_full_name(message)
так у тебя тут на старт ето проверяется а тебя обработку текста нужно

Вот так каждое сообщение будет обрабатовать @bot.message_handler()
 

Michael_Komas

Новичок
Автор темы
15
1
так у тебя тут на старт ето проверяется а тебя обработку текста нужно

Вот так каждое сообщение будет обрабатовать @bot.message_handler()
При любом вводе символов вместо нажатия на кнопку будет выдаваться регистрация ФИО, вот в чем проблема.