как получить 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 шт):
Штош. Начнем с этого.
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 - Имя/фамилия