как получить username и другие данные пользователя, когда он запустил бот. Задача их передать в БД

Сразу скажу что новичок. Буду благодарен за реальную подсказку.

В общем суть: Работает FSM Пользователь вводит текст допустим это Email идет проверка на валид

все ок и запись в БД sqlite

но надо здесь же пока FSM не финишировала передать в БД username id и другое.

код вот

class FSMPartnerbaze1(StatesGroup):
    name = State()# Начало ввода почты
# @dp.message_handler(content_types=['text'], text='Марафон', state=None)
async def cm_start(message: types.Message):
    await FSMPartnerbaze1.name.set()
    await message.answer('Пожалуйста, укажите Вашу почту. Она нужна для корректной работы с Вами!')
print("FSM запущена")



# Ловим ответ и пишем в словарь
# @dp.message_handler(state=FSMPartnerbaze1.name)  #временно для понимания
async def get_email(message: types.Message, state: FSMContext):
    async with state.proxy() as data:
        
        data['name'] = message.text
        email = message.text
        await state.update_data(
            {'email': email}
        )

        regex = re.compile(r'([A-Za-z0-9]+[.-_])*[A-Za-z0-9]+@[A-Za-z0-9-]+(\.[A-Z|a-z]{2,})+')

        if re.fullmatch(regex, email):
            print("Valid email")

            await sqlite_db.sql_add_command(state)
            await state.finish()

в Sqlite_db.py

import sqlite3 as sq


def sql_start():

    global base, cur
    base = sq.connect('db.db', check_same_thread=False)
    cur = base.cursor()
    if base:
        print('Подключился к БД')
    base.execute('CREATE TABLE IF NOT EXISTS test(username, name TEXT)')
    base.commit()

async def sql_add_command(state):

    async with state.proxy() as data:
        cur.execute('INSERT INTO test VALUES (?,?)', tuple(data.values()))
        base.commit()

Я правильно понимаю, что как только открыли словарь

async with state.proxy() as data:

мы можем после него писать методы, аргументы, значения и все это как бы сохраняется в словаре?

или реализация иная?

вот нашел такой код


conn = sqlite3.connect('db.db', check_same_thread=False)
cursor = conn.cursor()

@dp.message_handler(commands=['start'])
async def start_message(message):
    await bot.send_message(message.chat.id, 'Добро пожаловать')


def db_table_val(user_id: int, user_name: str, user_surname: str, username: str):
    cursor.execute('INSERT or IGNORE into test (user_id, user_name, user_surname, username) VALUES (?, ?, ?, ?)', (user_id, user_name, user_surname, username))
    conn.commit()

@dp.message_handler(content_types=['text'])
async def get_text_messages(message):
    if message.text.lower() == 'привет':
        await bot.send_message(message.from_user.id, 'Привет! Ваше имя добавленно в базу данных!')
    us_id = message.from_user.id
    us_name = message.from_user.first_name
    us_sname = message.from_user.last_name
    username = message.from_user.username
    db_table_val(user_id=us_id, user_name=us_name, user_surname=us_sname, username=username)

я так полагаю его как то и можно применить?


Ответы (1 шт):

Автор решения: oleksandrigo

Штош. Начнем с этого.

async with state.proxy() as data:

Если вы используете эту конструкцию открытия даты, то делать вот так не нужно

await state.update_data({'email': email})

В дате у вас словарь. Вы можете работать с ним как с обычным словарем. И записывать данные в нем как в обычный словарь.

@dp.message_handler(state=FSMPartnerbaze1.name)  #временно для понимания
async def get_email(message: types.Message, state: FSMContext):
    async with state.proxy() as data:
        
        data['name'] = message.text
        email = message.text
        await state.update_data(
            {'email': email}
        )

        regex = re.compile(r'([A-Za-z0-9]+[.-_])*[A-Za-z0-9]+@[A-Za-z0-9-]+(\.[A-Z|a-z]{2,})+')

        if re.fullmatch(regex, email):
            print("Valid email")

            await sqlite_db.sql_add_command(state)
            await state.finish()

Далее. Вот вообще не понял Этого хендлера, вы делаете стейт, юзер вводит е-мейл, вы его записываете в стейт сразу же (не проверяя на валидность), потом все таки проверяете его и если все ок кидаете в бд.

В итоге вопрос. Зачем вам записывать его в стейт, если вообще не намерены юзать?

И не забывайте что после state.finish() данные удалятся.

А теперь по поводу юзернейма. message.from_user.id - id message.from_user.username - юзернейм message.from_user.last_name - Имя/фамилия

→ Ссылка