Бот телеграммы Python, как хранить и отображать данные пользователей для каждого пользователя?
Здравствуйте, я новичок в Python и Telegram API, поэтому у меня есть несколько вопросов. Я создаю бота телеграммы (api телеграммы python) с профилем пользователя. Я создал базу данных (mysql.connector) и храню там всю информацию о пользователях после регистрации. Также я создал пользовательский класс. Когда пользователь вводит /start, я проверяю, существует ли он, и если да, то я заполняю этот класс. Затем я использую этот класс, чтобы показать некоторую информацию о профиле (фото, имя, возраст и т. д.), если пользователи нажимают кнопку (мой профиль). Итак, проблема в том, что у меня есть 2 пользователя одновременно. Сначала набрал «/start» и вошел в систему, хочу посмотреть свой профиль, все в порядке. Но когда второй пользователь делает то же самое, я получаю, что первые пользователи при нажатии на (мой профиль) получают последний профиль, который набрал «/start», загруженный для обоих пользователей. Как это исправить? Решение для постоянной проверки и загрузки данных звучит не очень хорошо, я бы хотел сделать что-то с «пользователями класса», но я не знаю, как сделать его уникальным для каждого сеанса пользователя. Любые решения? Если это необходимо, я могу дать больше кода, просто спросите.
class Users:
def __init__(self, id=0, name='', age=0, gender='', balance=0, telegram_id=0, photo='', sallarytext=0, sallaryvideo=0, videocall=0):
self.id = id
self.name = name
self.age = age
self.gender = gender
self.balance = balance
self.telegram_id = telegram_id
self.photo = photo
self.sallarytext = sallarytext
self.sallaryvideo = sallaryvideo
self.videocall = videocall
user = Users()
def check_auth(connection, telegram_id):
cursor = connection.cursor()
result = None
try:
cursor.execute("SELECT * FROM users WHERE telegram_id = '%s'" % telegram_id)
result = cursor.fetchall()
data = []
if result:
for row in result:
user.id = row[0]
user.name = row[1]
user.age = row[2]
user.gender = row[3]
user.telegram_id = row[4]
user.balance = row[5]
data = [user.name]
if user.gender == 'Female':
cursor.execute("SELECT * FROM photos WHERE users_id = '%s'" % user.id)
result2 = cursor.fetchall()
for row in result2:
user.photo = row[1]
user.sallarytext = row[2]
user.sallaryvideo = row[3]
user.videocall = row[4]
return data
except Error as e:
print(f"The error '{e}' occurred")
@bot.message_handler(commands=['start'])
def check_reg(message):
if message.chat.type == 'private':
telegram_id = message.from_user.id
# create_db_users(connection)
# create_db_photos(connection)
# create_db_chats(connection)
data_user = check_auth(connection, telegram_id)
if not data_user:
new_user(message) # user registration
else:
if user.gender == 'Male':
default_user_keybord(message) # show user keybord
elif user.gender == 'Female':
default_model_keybord(message)
def show_profile(message): # funtion show profile when user click on "My profile" button
profile_text = "Profile\n\nYour name: " + user.name + "\nYour age: " + str(
user.age)
menu_keybord = types.ReplyKeyboardMarkup(row_width=2, resize_keyboard=True)
button_name_age = types.KeyboardButton(text=" Change name/age")
button_back = types.KeyboardButton(text="◀️ Return")
menu_keybord.add(button_name_age, button_back)
bot.send_message(message.chat.id, profile_text, reply_markup=menu_keybord)
2 ответа
Я исправил это, выполнив запрос к базе данных, получив данные и отправив их в класс, затем закрыв соединение с базой данных и показав пользователю
Не могли бы вы сказать мне, какой именно пакет API Telegram вы используете?
Я думаю, что суть вашей проблемы заключается в использовании глобальной переменной для хранения пользовательских данных. Было бы лучше создать экземпляр и вернуть новый
Users
каждый раз, когда ты звонишь
check_auth
.
Что, как говорится,
- в Python, если вы хотите обновить глобальную переменную, скажем
user
, вы должны использовать операторglobal user
прежде чем вы это сделаете; - подумайте об использовании ORM, такого как SQLAlchemy , чтобы избавить вас от головной боли и кода.
Дайте мне знать, если это решило вашу проблему.
С