@web3fan

Как авторизовать пользователя через user_id?

Вобщем, хочу сделать в боте авторизацию по Telegram ID, чтобы каждому пользователю отображалось его имя, которое он задаст.
import telebot
import sqlite3
with sqlite3.connect("data.db") as db:
    cursor = db.cursor()
    query = """CREATE TABLE IF NOT EXISTS users(
        user_id INTEGER PRIMARY KEY,
        name VARCHAR(30),
        busies TEXT(500),
        admin NOT NULL DEFAULT 1
    )"""
    cursor.executescript(query)

@bot.message_handler(commands=['start'])
def greeting_message(message):
    startmsg = bot.send_message(message.chat.id, "Привет, напиши своё имя")
    bot.register_next_step_handler(startmsg, busy)

def busy(message):
    db = sqlite3.connect("data.db")
    cursor = db.cursor()
    name = None
    try:
        cursor.execute("INSERT INTO users(user_id,name) VALUES(?, ?);", (message.from_user.id, message.text))
        cursor.execute("SELECT name FROM users WHERE user_id = ?;",(message.from_user.id,))
        db.commit()
        name = cursor.fetchone()
    except sqlite3.Error as e:
        print("Error: ", e)
    bot.send_message(message.chat.id, f"Здравствуй, {name})

И проблема в этой строчке кажется
cursor.execute("SELECT name FROM users WHERE user_id = ?;",(message.from_user.id,))

SQLite после выполнения кода возвращает ошибку: UNIQUE constraint failed: users.user_id
  • Вопрос задан
  • 102 просмотра
Пригласить эксперта
Ответы на вопрос 1
@BiStudiOfficial
Python разработчик, работаю с aiogram. Unity C#
создаешь файл db.py
с таким содержанием:
import sqlite3

class Database:
    def __init__(self, db_file):
        self.connection = sqlite3.connect(db_file)
        self.cursor = self.connection.cursor()

    def add_user(self, user_id):
        with self.connection:
            return self.cursor.execute("INSERT OR IGNORE INTO `users` (`user_id`) VALUES (?)", (user_id,))

для добавления пользователя напиши строчку (ниже она)
db.add_user(message.from_user.id)
так же в файл с самим ботом добавь:
from db import Database
db = Database('database.db')
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы