Бот на Python, создающий аниме из фото с помощью нейросети QQ Different Dimension Me [Гайд]
В этой статье мы рассмотрим процесс создания Telegram-бота с помощью Python и библиотеки aiogram, с фокусом на использовании нейросети QQ Anime AI.
Если вы хотите выразить благодарность автору сайта, статей и курса по Django, вы можете сделать это по ссылке ниже:
Этот бот имеет уникальную возможность преобразовывать фотографии в стиле аниме, благодаря интеграции с нейросетью QQ Anime AI.
Первое, что нам необходимо, это получить токен телеграмм бота. Если у Вас он уже есть, переходите к следующему пункту.
Как получить токен телеграм бота (если уже есть, можете пропустить)
Теперь нам необходимо создать бота в телеграмме, делается это через @BotFather, начинаем диалог и вводим команду /newbot
, выбираем имя, обязательно чтоб в имени присутствовало слово: Bot
, или через подчеркивание _bot
Получаем ключ для доступа к API, на скриншоте он закрашен. Сохраняем в удобное место.
Создание виртуального окружения (если знаете как, можете пропустить)
Теперь нам необходимо создать телеграм бота работающего на основе QQ Anime AI / Different Dimension Me. Создавать бота мы будем с помощью библиотеки aiogram на Python. Поэтому через удобную для вас IDE создаете виртуальное окружение.
В примере воспользуемся IDE PyCharm.
- Нажимаем New Project, если вы уже находитесь в проекте, то File -> New Project.
- Далее выбираем Pure Python (Python проект) и путь до желаемого проекта. У меня например Ботостроение/AnimeAI. Виртуальное окружение создатся в папке venv, внутри проекта автоматически.
- Далее нажимаем Create и ждем создания проекта.
- Если у вас не создался файл main.py, просто создайте его: На папке проекта ЛКМ мышью -> New -> Python File с названием main.py
- В файле main.py мы и будем создавать нашего бота.
Создаем telegram бота с QQ Anime AI / Different Dimension Me
Теперь установим необходимые библиотеки через терминал в pyCharm для создания бота: pip install aiogram qqddm aiohttp
Результат выполнения установки:
Collecting aiogram
Using cached aiogram-2.25.1-py3-none-any.whl (203 kB)
Collecting qqddm
Using cached qqddm-0.1.1-py3-none-any.whl
Collecting aiohttp
Using cached aiohttp-3.8.4-cp311-cp311-win_amd64.whl (317 kB)
Collecting Babel<2.10.0,>=2.9.1
Using cached Babel-2.9.1-py2.py3-none-any.whl (8.8 MB)
Collecting certifi>=2021.10.8
Using cached certifi-2023.5.7-py3-none-any.whl (156 kB)
Collecting magic-filter>=1.0.9
Using cached magic_filter-1.0.9-py3-none-any.whl (9.3 kB)
Collecting httpx~=0.23.1
Using cached httpx-0.23.3-py3-none-any.whl (71 kB)
Collecting pydantic~=1.10.2
Using cached pydantic-1.10.7-cp311-cp311-win_amd64.whl (2.1 MB)
Collecting attrs>=17.3.0
Using cached attrs-23.1.0-py3-none-any.whl (61 kB)
Collecting charset-normalizer<4.0,>=2.0
Using cached charset_normalizer-3.1.0-cp311-cp311-win_amd64.whl (96 kB)
Collecting multidict<7.0,>=4.5
Using cached multidict-6.0.4-cp311-cp311-win_amd64.whl (28 kB)
Collecting async-timeout<5.0,>=4.0.0a3
Using cached async_timeout-4.0.2-py3-none-any.whl (5.8 kB)
Collecting yarl<2.0,>=1.0
Using cached yarl-1.9.2-cp311-cp311-win_amd64.whl (60 kB)
Collecting frozenlist>=1.1.1
Using cached frozenlist-1.3.3-cp311-cp311-win_amd64.whl (32 kB)
Collecting aiosignal>=1.1.2
Using cached aiosignal-1.3.1-py3-none-any.whl (7.6 kB)
Collecting pytz>=2015.7
Using cached pytz-2023.3-py2.py3-none-any.whl (502 kB)
Collecting httpcore<0.17.0,>=0.15.0
Using cached httpcore-0.16.3-py3-none-any.whl (69 kB)
Collecting rfc3986[idna2008]<2,>=1.3
Using cached rfc3986-1.5.0-py2.py3-none-any.whl (31 kB)
Collecting sniffio
Using cached sniffio-1.3.0-py3-none-any.whl (10 kB)
Collecting typing-extensions>=4.2.0
Using cached typing_extensions-4.5.0-py3-none-any.whl (27 kB)
Collecting idna>=2.0
Using cached idna-3.4-py3-none-any.whl (61 kB)
Collecting h11<0.15,>=0.13
Using cached h11-0.14.0-py3-none-any.whl (58 kB)
Collecting anyio<5.0,>=3.0
Using cached anyio-3.6.2-py3-none-any.whl (80 kB)
Installing collected packages: rfc3986, pytz, typing-extensions, sniffio, multidict, magic-filter, idna, h11, frozenlist, charset-normalizer, certifi, Babel, attrs, async-timeout, yarl, pydantic, anyio, aiosignal, httpcore, aiohttp, httpx, aiogram, qqddm
Successfully installed Babel-2.9.1 aiogram-2.25.1 aiohttp-3.8.4 aiosignal-1.3.1 anyio-3.6.2 async-timeout-4.0.2 attrs-23.1.0 certifi-2023.5.7 charset-normalizer-3.1.0 frozenlist-1.3.3 h11-0.14.0 httpcore-0.16.3 httpx-0.23.3 idna-3.4 magic-filter-1.0.9 multidict-6.0.4 pydantic-1.10.7 pytz-2023.3 qqddm-0.1.1 rfc3986-1.5.0 sniffio-1.3.0 typing-extensions-4.5.0 yarl-1.9.2
[notice] A new release of pip available: 22.3.1 -> 23.1.2
[notice] To update, run: python.exe -m pip install --upgrade pip
Теперь в файле main.py напишем следующий фрагмент кода:
from aiogram import Bot, types
from aiogram.dispatcher import Dispatcher
from aiogram.utils import executor
from qqddm import AnimeConverter, InvalidQQDDMApiResponseException, IllegalPictureQQDDMApiResponseException
from aiohttp import ClientSession
telegram_token = 'Ваш токен телеграмм'
bot = Bot(token=telegram_token)
dp = Dispatcher(bot)
anime_converter = AnimeConverter(generate_proxy='https://address:port')
@dp.message_handler(content_types=types.ContentType.PHOTO)
async def send_image(message: types.Message):
"""
Получение изображения от пользователя
"""
await message.answer_chat_action('upload_photo')
# Берем последнее (самое большое) фото
photo = message.photo[-1]
photo_id = photo.file_id
# Получаем информацию о файле из API
file_info = await bot.get_file(photo_id)
file_path = file_info.file_path
# Скачиваем файл
downloaded_file = await bot.download_file(file_path)
# Получаем байты изображения
image_bytes = downloaded_file.read()
try:
# Получаем результат
result = anime_converter.convert(picture=image_bytes)
images = [str(url) for url in result.pictures_urls]
async with ClientSession() as session:
async with session.get(images[0]) as response:
content = await response.read()
# Отправляем изображение пользователю
await message.answer_photo(content, caption='Ваше изображение готово')
except IllegalPictureQQDDMApiResponseException:
await message.answer(text='Предоставленное изображение запрещено, попробуйте другое изображение')
except InvalidQQDDMApiResponseException as ex:
await message.answer(text=f'API вернул ошибку: {ex}')
if __name__ == '__main__':
executor.start_polling(dp, skip_updates=True)
Данный код представляет собой скрипт на языке Python, использующий библиотеку aiogram для создания Telegram-бота. Этот бот принимает фотографии от пользователей, скачивает их, обрабатывает с помощью внешнего сервиса QQDDM для конвертации в аниме-стиль, и отправляет результат обратно пользователю.
Давайте разберем его по шагам:
Импортируются необходимые модули и классы:
- Bot и Dispatcher из aiogram - классы, отвечающие за создание бота и управление сообщениями и командами.
- types из aiogram - модуль, содержащий типы данных, используемые в aiogram, такие как Message, ContentType, и т.д.
- executor из aiogram.utils - модуль, предоставляющий функцию start_polling для запуска бота.
- AnimeConverter, InvalidQQDDMApiResponseException, IllegalPictureQQDDMApiResponseException из qqddm - классы и исключения, связанные с конвертацией изображений в аниме-стиль.
- ClientSession из aiohttp - класс для выполнения HTTP-запросов.
- Задается токен Telegram-бота, который получается при регистрации бота в BotFather.
- Создается объект
Bot
с использованием полученного токена. - Создается объект
Dispatcher
, связанный с созданным ранее объектомBot
. Он отвечает за обработку сообщений и команд. - Создается объект
AnimeConverter
, который будет использоваться для конвертации изображений в аниме-стиль. - В данном случае, объекту передается параметр
generate_proxy
, потому что запустив скрипт из России вы будете получать ошибку. Используйте прокси который указывает на адрес и порт прокси-сервера, либо включенный клиентский VPN на вашем компьютере, или разверните бота на VPS из стран ЕС. - Определяется функция-обработчик сообщений с типом контента
PHOTO
. Эта функция будет вызываться каждый раз, когда пользователь отправляет фотографию боту.
Внутри функции-обработчика происходит следующее:
- Отправляется действие
upload_photo
, чтобы показать пользователю, что бот загружает фото. - Из полученного сообщения извлекается последняя (самая большая) фотография и ее идентификатор.
- Запрашивается информация о файле с помощью метода
get_file
объектаbot
и получается путь к файлу. - Файл скачивается с помощью метода
download_file
объектаbot
. - Из скачанного файла получаются байты изображения.
- Происходит попытка конвертировать изображение в аниме-стиль с помощью метода
convert
объектаanime_converter
.
Если конвертация прошла успешно:
-
Получается список URL-адресов изображений.
-
Создается асинхронный HTTP-сеанс с помощью ClientSession.
-
Отправляется GET-запрос по первому URL-адресу изображения.
-
Получается содержимое ответа в виде байтов.
-
Отправляется пользователю фото с помощью метода
answer_photo
объектаmessage
. -
Если получена ошибка
IllegalPictureQQDDMApiResponseException
, отправляется пользователю сообщение о запрещенном изображении. -
Если получена ошибка
InvalidQQDDMApiResponseException
, отправляется пользователю сообщение с описанием ошибки API. -
В блоке
if __name__ == '__main__':
запускается бот с помощью функцииstart_polling
, которая принимает объектDispatcher (dp)
и флагskip_updates=True
.
Это основной код, который определяет логику бота для обработки фотографий и их конвертации в аниме-стиль с использованием внешнего сервиса QQ Anime AI / Different Dimension Me.
Проверка работы Telegram-бота QQ Anime AI / Different Dimension Me
На этом гайд окончен. Ссылка на репозиторий в GitHub.