Добрый день, пишу бота на python, aiogram 3. Написал код, работает всё кроме отправки обработанного файла пользователю

import asyncio
import os

from aiogram import F, Bot, Dispatcher, types
from aiogram.enums import ParseMode
from aiogram.client.default import DefaultBotProperties
from aiogram.filters import CommandStart, StateFilter
from aiogram.fsm.state import State, StatesGroup
from aiogram.fsm.context import FSMContext
import pandas as pd

from dotenv import find_dotenv, load_dotenv

load_dotenv(find_dotenv())

bot = Bot(token=os.getenv('TOKEN'), default=DefaultBotProperties(parse_mode=ParseMode.HTML))
dp = Dispatcher()


### FSM ###
class Form(StatesGroup):
    waiting_for_file = State()


@dp.message(StateFilter(None), CommandStart())
async def cmd_start(message: types.Message, state: FSMContext):
    await message.answer("Добрый день, пожалуйста, отправьте файл .xlsx для обработки.")
    await state.set_state(Form.waiting_for_file)


@dp.message(Form.waiting_for_file, F.document)
async def handle_file(message: types.Message, state: FSMContext):
    file_id = message.document.file_id
    file_info = await bot.get_file(file_id)
    file_path = file_info.file_path

    # Создаем директорию для отчета, если она не существует
    reports_path = 'reports'

    if not os.path.exists(reports_path):
        os.makedirs(reports_path)

    # Скачиваем файл
    await bot.download_file(file_path, f"reports/{message.document.file_name}")

    # Обработка файла
    input_file = f"reports/{message.document.file_name}"
    output_file = f"reports/processed_{message.document.file_name}"

    # Пример обработки: читаем и сохраняем обратно, можно адаптировать под свои нужды
    df = pd.read_excel(input_file)
    # Пример обработки: просто добавим новый столбец
    df['New Column'] = df.iloc[:, 0] * 2  # Пример: перемножить первый столбец на 2
    df.to_excel(output_file, index=False)

    await message.answer("Ваш файл обработан")

    with open(output_file, 'rb') as file:
        await bot.send_document(message.chat.id, file, caption="Вот ваш обработанный файл.")

    await state.clear()
    Form.waiting_for_file = None

### Некорректный ввод ###
@dp.message(Form.waiting_for_file)
async def handle_file2(message: types.Message):
    await message.answer("Пожалуйста, отправьте только файл .xlsx.")



async def on_shutdown(bot):
    print('Бот прилёг отдохнуть, пожалуйста напишите администратуру')

async def main():

    await bot.delete_webhook(drop_pending_updates=True)
    await dp.start_polling(bot, allowed_updates=dp.resolve_used_update_types())

asyncio.run(main())

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

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

Недавно тоже столкнулся с такой проблемой. В Aiogram v3 подход для отправки файла немного изменился.

Вам необходимо использовать класс FSInputFile и указать в качестве аргумента путь к файлу.

А вместо bot.send_document используйте message.answer_document.

# Остальной код;

await message.answer_document(document=types.FSInputFile(path=output_file))

Контекстный менеджер with использовать не нужно в данным случае, Aiogram "под капотом" это делает за нас.

→ Ссылка