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