[英]Python telegram bot, how to store and show users data for each users?
您好,我是 python 和电报 api 的新人,所以我有一些问题。 我正在使用用户配置文件创建电报机器人(python 电报 api)。 我已经创建了数据库(mysql.connector)并在注册后将所有用户信息存储在那里。 我还创建了用户 class。当用户键入 /start 我检查它是否存在,如果存在,我将填写此 class。然后我使用此 class 显示一些个人资料信息(照片、姓名、年龄等)如果用户点击按钮(我的个人资料)。 所以问题是当我同时有 2 个用户时。 首先输入“/start”并登录,想看自己的个人资料,一切正常。 但是当第二个用户做同样的事情时,我得到了第一个用户点击(我的个人资料)时,他或她得到了最后一个为两个用户加载的输入“/ start”的个人资料。 如何解决这个问题? 始终检查和加载数据的解决方案听起来不太好,我想对“类用户”做一些事情,但我不知道要为每个用户 session 设置唯一性。有什么解决方案吗? 如果需要,我可以提供更多代码,只问。
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)
你能告诉我你正在使用什么电报 api package 吗?
我认为,您问题的核心是使用全局变量user
来存储用户数据。 每次调用check_auth
时实例化并返回一个新Users
是最佳实践。
话虽如此,
user
,则必须先使用语句global user
;让我知道这是否解决了您的问题。
C
我从用户那里得到 email 并将其保存在一个元组中:) 我只想为他们自己显示用户数据️我的机器人实际上向每个人显示。 任何人都可以
我已经通过向数据库发出请求,获取数据并将其推送到 class,然后关闭与数据库的连接并向用户显示来解决此问题
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.