бот на python aiogram перестаёт работать во время выполнения функции
import asyncio
import logging
import sys
from PIL import Image
import cv2
import urllib.request
import numpy as np
from aiogram import Bot, Dispatcher, Router, F
from aiogram.enums import ParseMode
from aiogram.filters import CommandStart, Command
from aiogram.types import Message
from aiogram.utils.markdown import hbold
import urllib
from env import Swapper, CustomInputFile, TOKEN
dp = Dispatcher()
router = Router()
dp.include_router(router)
user_images = {}
is_processing = {}
@dp.message(CommandStart())
async def command_start_handler(message: Message) -> None:
await message.answer(f"Привет, {hbold(message.from_user.full_name)}!")
@dp.message(Command('swap'))
async def swap_handler(message: Message):
global is_processing
is_processing[message.from_user.id] = False
await message.answer("Отправьте два изображения для обработки.")
async def process_images(user_id, message):
image = Swapper.Swap(user_images[user_id]['image1'], user_images[user_id]['image2'])
image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
image_pil = Image.fromarray(image_rgb)
input_file = CustomInputFile(image_pil, 'image.jpg')
await message.answer_photo(input_file)
await message.answer_document(input_file)
del user_images[user_id]
@dp.message(F.photo)
async def photo_handler(message: Message):
global user_images
user_id = message.from_user.id
if user_id not in user_images:
user_images[user_id] = {'image1': None, 'image2': None}
photo_data = message.photo[-1]
photo_file = await bot.get_file(photo_data.file_id)
photo_url = f'https://api.telegram.org/file/bot{TOKEN}/{photo_file.file_path}'
req = urllib.request.urlopen(photo_url)
arr = np.asarray(bytearray(req.read()), dtype=np.uint8)
image = cv2.imdecode(arr, -1)
if user_images[user_id]['image1'] is None:
await message.answer('Отлично, отправь второе изображение, с которого ты возьмёшь лицо.')
user_images[user_id]['image1'] = image
else:
user_images[user_id]['image2'] = image
if user_images[user_id]['image1'] is not None and user_images[user_id]['image2'] is not None:
await message.answer('Отлично, изображения обрабатываются! Ожидание от 10 секунд до нескольких минут, в зависимости от лиц на изображении.')
asyncio.create_task(process_images(user_id, message))
@dp.message(F.text == 'привет')
async def ph(message: Message):
await message.answer('Привет')
async def main() -> None:
global bot
bot = Bot(TOKEN, parse_mode=ParseMode.HTML)
await dp.start_polling(bot)
if __name__ == "__main__":
logging.basicConfig(level=logging.INFO, stream=sys.stdout)
asyncio.run(main())
Вот полный код бота. Сама функция "смены лиц" в отдельном файле env, там всё работает на нейронках insightface
и GFPGAN
, обе запускаются на ЦП(за неимением CUDA).
По сути, всё работает как надо, просто в тот момент когда бот получает обе фотографии и запускает обработку - он умирает и ждёт конкретно выполнения функции, а это очень плохо, так как он перестаёт обрабатывать другие чаты. Первый раз работаю с aiogram, вроде асинхронные функции должны работать иначе...