HOME FORUMS MEMBERS RECENT POSTS LOG IN  
× Авторизация
Имя пользователя:
Пароль:
Нет аккаунта? Регистрация
Баннер 1   Баннер 2
НОВЫЕ ТОРГОВАЯ НОВОСТИ ЧАТ
loading...
Скрыть
Вернуться   ANTICHAT > ПРОГРАММИРОВАНИЕ > Общие вопросы программирования
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #1  
Старый 29.10.2023, 21:49
Michael_Komas
Новичок
Регистрация: 29.09.2019
Сообщений: 15
С нами: 3486475

Репутация: 3
По умолчанию

Есть код, для регистрации пользователя в боте и последующим заносом его в локальную БД, отправка сообщения в чат о регистрации нового пользователя.

Выход в главное меню не работает, т.к. используется 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
)
 
Ответить с цитированием

  #2  
Старый 29.10.2023, 22:02
SeregaIvanovis
Участник форума
Регистрация: 10.10.2023
Сообщений: 115
С нами: 1367017

Репутация: 33
По умолчанию

Цитата:
Сообщение от Michael_Komas  

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

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

  #3  
Старый 29.10.2023, 22:41
Michael_Komas
Новичок
Регистрация: 29.09.2019
Сообщений: 15
С нами: 3486475

Репутация: 3
По умолчанию

Цитата:
Сообщение от SeregaIvanovis  

так у тебя тут на старт ето проверяется а тебя обработку текста нужно

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

  #4  
Старый 07.11.2023, 11:10
Michael_Komas
Новичок
Регистрация: 29.09.2019
Сообщений: 15
С нами: 3486475

Репутация: 3
По умолчанию

Проблема все еще не решена. Up
 
Ответить с цитированием

  #5  
Старый 07.11.2023, 11:26
SeregaIvanovis
Участник форума
Регистрация: 10.10.2023
Сообщений: 115
С нами: 1367017

Репутация: 33
По умолчанию

Цитата:
Сообщение от Michael_Komas  

Проблема все еще не решена. Up
можеш дать файлик на бх *** че увидеш

и тут питон разроботчиков мало тебе на Хабр(не реклама)
 
Ответить с цитированием
Ответ





Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT ™ © 2001- Antichat Kft.