@MockRey

Как решить проблему, если телеграм-бот выдаёт ошибку Task exception was never retrieved и не отправляет файл в чат повторно?

Пишу чат-бот на aiogram. В одном из хэндлеров прописал отправку ботом фотографии в чат и при запуске бота на первом запросе фото успешно отправляется. Однако при повторном и последующих запросах на отправку фотографии бот выводит в консоль ошибку:

Вывод ошибки в консоль
Task exception was never retrieved
future: <Task finished name='Task-18' coro=<Dispatcher._process_polling_updates() done, defined at /Users/andy/PycharmProjects/mfbot/venv/lib/python3.9/site-packages/aiogram/dispatcher/dispatcher.py:407> exception=ValueError('I/O operation on closed file')>
Traceback (most recent call last):
  File "/Users/andy/PycharmProjects/mfbot/venv/lib/python3.9/site-packages/aiogram/dispatcher/dispatcher.py", line 415, in _process_polling_updates
    for responses in itertools.chain.from_iterable(await self.process_updates(updates, fast)):
  File "/Users/andy/PycharmProjects/mfbot/venv/lib/python3.9/site-packages/aiogram/dispatcher/dispatcher.py", line 235, in process_updates
    return await asyncio.gather(*tasks)
  File "/Users/andy/PycharmProjects/mfbot/venv/lib/python3.9/site-packages/aiogram/dispatcher/handler.py", line 117, in notify
    response = await handler_obj.handler(*args, **partial_data)
  File "/Users/andy/PycharmProjects/mfbot/venv/lib/python3.9/site-packages/aiogram/dispatcher/dispatcher.py", line 283, in process_update
    return await self.callback_query_handlers.notify(update.callback_query)
  File "/Users/andy/PycharmProjects/mfbot/venv/lib/python3.9/site-packages/aiogram/dispatcher/handler.py", line 117, in notify
    response = await handler_obj.handler(*args, **partial_data)
  File "/Users/andy/PycharmProjects/mfbot/main.py", line 143, in picture
    await bot.send_photo(chat_id=callback.message.chat.id, photo=photo)
  File "/Users/andy/PycharmProjects/mfbot/venv/lib/python3.9/site-packages/aiogram/bot/bot.py", line 565, in send_photo
    result = await self.request(api.Methods.SEND_PHOTO, payload, files)
  File "/Users/andy/PycharmProjects/mfbot/venv/lib/python3.9/site-packages/aiogram/bot/base.py", line 236, in request
    return await api.make_request(await self.get_session(), self.server, self.__token, method, data, files,
  File "/Users/andy/PycharmProjects/mfbot/venv/lib/python3.9/site-packages/aiogram/bot/api.py", line 139, in make_request
    async with session.post(url, data=req, **kwargs) as response:
  File "/Users/andy/PycharmProjects/mfbot/venv/lib/python3.9/site-packages/aiohttp/client.py", line 1141, in __aenter__
    self._resp = await self._coro
  File "/Users/andy/PycharmProjects/mfbot/venv/lib/python3.9/site-packages/aiohttp/client.py", line 508, in _request
    req = self._request_class(
  File "/Users/andy/PycharmProjects/mfbot/venv/lib/python3.9/site-packages/aiohttp/client_reqrep.py", line 313, in __init__
    self.update_body_from_data(data)
  File "/Users/andy/PycharmProjects/mfbot/venv/lib/python3.9/site-packages/aiohttp/client_reqrep.py", line 505, in update_body_from_data
    body = body()
  File "/Users/andy/PycharmProjects/mfbot/venv/lib/python3.9/site-packages/aiohttp/formdata.py", line 170, in __call__
    return self._gen_form_data()
  File "/Users/andy/PycharmProjects/mfbot/venv/lib/python3.9/site-packages/aiohttp/formdata.py", line 163, in _gen_form_data
    self._writer.append_payload(part)
  File "/Users/andy/PycharmProjects/mfbot/venv/lib/python3.9/site-packages/aiohttp/multipart.py", line 829, in append_payload
    size = payload.size
  File "/Users/andy/PycharmProjects/mfbot/venv/lib/python3.9/site-packages/aiohttp/payload.py", line 379, in size
    return os.fstat(self._value.fileno()).st_size - self._value.tell()
ValueError: I/O operation on closed file



При этом файл в чат не отправляется, но бот продолжает функционировать. Вот мой код:

from aiogram import Bot, types
from aiogram.dispatcher import Dispatcher
from aiogram.utils import executor
from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton
from aiogram.types import InputFile

bot = Bot(token='')
dp = Dispatcher(bot)
photo = InputFile('')

kb1 = InlineKeyboardMarkup(row_width=1)
b1 = InlineKeyboardButton(text='picture', callback_data='picture')
kb1.add(b1)

@dp.callback_query_handler(text='picture')
async def picture(callback: types.CallbackQuery):
    await bot.send_photo(chat_id=callback.message.chat.id, photo=photo)
    await callback.answer()

executor.start_polling(dp)


Подскажите, как можно решить эту ошибку?
  • Вопрос задан
  • 64 просмотра
Решения вопроса 1
shurshur
@shurshur
Сисадмин, просто сисадмин...
Дело в том, что photo это file handle, после того файл один раз прочитан, его надо переоткрыть заново сначала. Так что надо считывать прям внутри обработчика, а не снаружи.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы