Бот телеграммы 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.

Что, как говорится,

  1. в Python, если вы хотите обновить глобальную переменную, скажем user, вы должны использовать оператор global userпрежде чем вы это сделаете;
  2. подумайте об использовании ORM, такого как SQLAlchemy , чтобы избавить вас от головной боли и кода.

Дайте мне знать, если это решило вашу проблему.

С

Другие вопросы по тегам