Привет. Подскажи пожалуйста с кодом. Я хотел в функции def my_profile
выводить фото пользователя. Но не получается получить фото из базы users. Поделись как это можно сделать в aiogram 3.4.1
from aiogram import Router, F
from aiogram.types import Message
from data.database import DataBase
router = Router()
db = DataBase("users_base.db", "users")
@router.message(F.text.casefold())
async def my_profile(message: Message) -> None:
if message.text == "моя анкета":
user_id = message.from_user.id
user_data = await db.get_user_data(user_id)
if user_data:
# Формируем текст анкеты
user_profile = f"Имя: {user_data['name']}\n" \
f"Возраст: {user_data['age']}\n" \
f"Город: {user_data['city']}\n" \
f"Пол: {user_data['sex']}\n" \
f"Предпочтения: {user_data['look_for']}\n" \
f"О себе: {user_data['about']}"
# Формируем сообщение с анкетой пользователя и выбором действия
reply_message = f"Ваша анкета:\n{user_profile}\n\nВыберите действие:\n" \
f"1. Заполнить анкету заново.\n" \
f"2. Изменить фото/видео.\n" \
f"3. Изменить текст анкеты.\n" \
f"4. Смотреть анкеты.\n" \
f"5. Удалить анкету."
await message.answer(reply_message)
else:
await message.answer("Ваша анкета не найдена.")
import aiosqlite
import io
class DataBase:
def __init__(self, name: str, table: str) -> None:
self.name = f"data/{name}"
self.table = table
async def create_table(self) -> None:
async with aiosqlite.connect(self.name) as db:
cursor = await db.cursor()
query = """
CREATE TABLE IF NOT EXISTS users(
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER,
name VARCHAR(20),
age VARCHAR(40),
city VARCHAR(255),
sex INTEGER(1),
look_for VARCHAR(40),
about TEXT(500),
photo BLOB
)
"""
await cursor.executescript(query)
await db.commit()
# Вывод информации о таблицах в базе данных
await cursor.execute("SELECT name FROM sqlite_master WHERE type='table';")
tables = await cursor.fetchall()
print("Tables in the database:")
for table in tables:
print(table[0])
async def insert(self, user_id, data, photo_data):
async with aiosqlite.connect(self.name) as db:
cursor = await db.cursor()
await cursor.execute(
"""
INSERT INTO users(
user_id,
name,
age,
city,
sex,
look_for,
about,
photo
) VALUES (?, ?, ?, ?, ?, ?, ?, ?)
""",
(user_id,) + tuple(data) + (photo_data,)
)
await db.commit()
x = await cursor.execute("SELECT * FROM users")
y = await x.fetchall()
for i in y:
print(i)
async def get_user_data(self, user_id: int):
async with aiosqlite.connect(self.name) as db:
cursor = await db.cursor()
await cursor.execute(
f"SELECT * FROM users WHERE user_id = ?",
(user_id,)
)
user_data = await cursor.fetchone()
if user_data:
return {
'user_id': user_data[1],
'name': user_data[2],
'age': user_data[3],
'city': user_data[4],
'sex': user_data[5],
'look_for': user_data[6],
'about': user_data[7],
'photo': io.BytesIO(user_data[8]), # Преобразуем байтовые данные в BytesIO объект
}
else:
return None
async def delete_user_data(self, user_id: int):
async with aiosqlite.connect(self.name) as db:
cursor = await db.cursor()
await cursor.execute(
"""
DELETE FROM users
WHERE user_id = ?
""",
(user_id,)
)
await db.commit()
router = Router()
db = DataBase("users_base.db", "users")
@router.message(Form.about)
async def form_about(message: Message, state: FSMContext):
await state.update_data(about=message.text)
await state.set_state(Form.photo)
await message.answer("Теперь отправь фото")
@router.message(Form.photo, F.photo)
async def form_photo(message: Message, state: FSMContext, db: DataBase):
photo_file_id = message.photo[-1].file_id
file_info = await message.bot.get_file(photo_file_id)
photo_url = f"https://api.telegram.org/file/bot{message.bot.token}/{file_info.file_path}"
async with aiohttp.ClientSession() as session:
async with session.get(photo_url) as resp:
photo_data = await resp.read()
data = await state.get_data()
user_id = message.from_user.id
await state.clear()
frm_text = []
[frm_text.append(value) for _, value in data.items()]
await db.insert(user_id, frm_text, photo_data)
await message.answer_photo(photo_file_id, "\n".join(map(str, frm_text)))
@router.message(Form.photo, ~F.photo)
async def form_photo(message: Message, state: FSMContext):
await message.answer("Отправь фото!")