Задать вопрос
@AntonNaumov5

Как отправить фото из базы данных в чат бот telegram?

Привет. Подскажи пожалуйста с кодом. Я хотел в функции 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("Отправь фото!")
  • Вопрос задан
  • 384 просмотра
Подписаться 1 Простой 1 комментарий
Пригласить эксперта
Ответы на вопрос 1
Hackerman1
@Hackerman1
17 лет, плохое зрение.
Скачивай фотографию, сохраняй к ней путь в БД, и по этому пути отправляй файл человеку
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы