Бот для генерации изображений

Бот для генерации изображений

Сегодня создадим телеграм бота на базе API от OpenAI для генерации изображений по текстовому описанию, использовать будем их модели DALL·E 2 и DALL·E 3, приступим

Создаем бота

Для начала, перейдем в BotFather и создадим нового бота

Создание телеграм бота с помощью BotFather
Создание телеграм бота с помощью BotFather

после будет доступен токен бота, копируем и идем дальше.

API OpenAI

Переходим на платформу OpenAI в раздел API Keys и создаем новый ключ

Создание API ключа на платформе OpenAI
Создание API ключа на платформе OpenAI

В графе name указываете имя ключа, я написал "create img", далее получаетет ключ API Open AI.

Пишем код

Использовать будем python

import telebot from openai import OpenAI from config import * import requests import db import os # Создание экземпляра бота с использованием вашего токена bot = telebot.TeleBot(BOT_TOKEN) # Инициализация клиента OpenAI client = OpenAI(api_key=AI_TOKEN) # Создание таблиц в базе данных db.create_tables() # Создание папки, если ее нет if not os.path.exists(IMAGE_FOLDER): os.makedirs(IMAGE_FOLDER) # Обработчик команды /start @bot.message_handler(commands=['start']) def send_welcome(message): # Запись данных пользователя в базу данных db.add_user(message.chat.id) bot.reply_to(message, "Привет! Я могу создать обои по текстовому описанию для твоего телефона.") # Обработчик команды /stats @bot.message_handler(commands=['stats']) def show_stats(message): # Проверка, является ли пользователь администратором if message.from_user.id == ADMIN_ID: # Получение количества пользователей из базы данных total_users = db.get_total_users() bot.reply_to(message, f"Количество пользователей, воспользовавшихся ботом: {total_users}") else: bot.reply_to(message, "У вас нет прав на выполнение этой команды.") # Обработчик текстовых сообщений @bot.message_handler(func=lambda message: True) def generate_image(message): # Проверка длины сообщения if len(message.text) < 10: bot.send_message(message.chat.id, "Введите текст длиной не менее 10 символов.") return # Отправка оповещения о начале процесса генерации bot.send_message(message.chat.id, "Создаю обои, пожалуйста ожидайте...") # Генерация изображения с использованием OpenAI try: response = client.images.generate( model="dall-e-3", prompt=message.text, size="1024x1024", # 1024x1024, 1024x1792, 1792x1024 quality="standard", # standard, hd n=1, ) # -------------------------------------------------- # Model | Quality | Resolution | Price # -------------------------------------------------- # DALL·E 3 | Standard | 1024×1024 | $0.040 / image # -------------------------------------------------- # DALL·E 3 | Standard | 1024×1792 | $0.080 / image # -------------------------------------------------- # DALL·E 3 | Standard | 1792×1024 | $0.080 / image # -------------------------------------------------- # DALL·E 3 | HD | 1024×1024 | $0.080 / image # -------------------------------------------------- # DALL·E 3 | HD | 1024×1792 | $0.120 / image # -------------------------------------------------- # DALL·E 3 | HD | 1792×1024 | $0.120 / image # -------------------------------------------------- # DALL·E 2 | | 1024×1024 | $0.020 / image # -------------------------------------------------- # DALL·E 2 | | 512×512 | $0.018 / image # -------------------------------------------------- # DALL·E 2 | | 256×256 | $0.016 / image # -------------------------------------------------- # Получение URL сгенерированного изображения image_url = response.data[0].url # print(image_url) # Скачивание изображения и сохранение в папку images image_path = os.path.join(IMAGE_FOLDER, f"{message.chat.id}_{message.message_id}.png") with requests.get(image_url, stream=True) as r: if r.status_code == 200: with open(image_path, 'wb') as f: f.write(r.content) else: bot.send_message(message.chat.id, "Не удалось загрузить изображение.") # Запись данных об изображении в базу данных db.add_image(message.chat.id, message.text, image_path) # Отправка изображения пользователю with open(image_path, 'rb') as photo: bot.send_photo(message.chat.id, photo, reply_to_message_id=message.message_id) except Exception as e: # bot.send_message(message.chat.id, f"Произошла ошибка: {str(e)}") bot.send_message(message.chat.id, f"Произошла ошибка, прошу прощения за предоcтавленные неудобства, попробуйте еще раз или свяжитесь с разработчиком @king_triton") # Запуск бота bot.infinity_polling(interval=0)

1. Импорт библиотек: Код импортирует необходимые библиотеки, такие как telebot для работы с API Telegram, OpenAI для использования сервиса генерации изображений, requests для работы с HTTP-запросами, db для взаимодействия с базой данных, и os для работы с операционной системой.
2. Инициализация бота и клиента OpenAI: Создаются экземпляры бота и клиента OpenAI с использованием предоставленных токенов.
3. Создание таблиц в базе данных и папки: Проверяется наличие таблиц в базе данных и папки для сохранения изображений, и при необходимости они создаются.
4. Обработчик команды /start: При получении команды /start бот регистрирует пользователя в базе данных и приветствует его.
5. Обработчик команды /stats: При получении команды /stats бот отображает общее количество пользователей, которые воспользовались им, если отправитель сообщения является администратором.
6. Обработчик текстовых сообщений: Если бот получает текстовое сообщение, он проверяет его длину и, если она больше 10 символов, создает изображение на основе текста с использованием сервиса OpenAI. Затем бот отправляет сгенерированное изображение пользователю и сохраняет его в базе данных.
7. Запуск бота: Бот запускается в режиме бесконечного опроса, чтобы он мог реагировать на входящие сообщения пользователя.

Пару слов

Я создавал этого бота для генерации "обоев" на телефон, но эта тематика на сильно популярна, поэтому я выложил исходный код в открытый доступ, код можно модифицировать под свои нужны он очень прост, спасибо за внимание!

P.S. Посмотреть работу бота можно в tiktok.

Начать дискуссию