import logging
import os
import random
from typing import Optional

import aiohttp
import asyncio
from aiogram import Bot, Dispatcher, types
from aiogram.contrib.middlewares.logging import LoggingMiddleware  # Добавлен импорт
from aiogram.utils.exceptions import BotBlocked, ChatNotFound, NetworkError
from dotenv import load_dotenv

# Загрузить переменные окружения из .env файла
load_dotenv()

# Получить токен из переменных окружения
BOT_TOKEN = os.getenv("BOT_TOKEN")
if not BOT_TOKEN:
    raise ValueError("Необходим BOT_TOKEN в переменных окружения")

# Настройка логирования
logging.basicConfig(
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    level=logging.INFO)
logger = logging.getLogger(__name__)


class Rule34Client:

    def __init__(self, session: aiohttp.ClientSession):
        self.base_url = "https://rule34.xxx/index.php"
        self.headers = {
            "User-Agent": ("Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
                           "AppleWebKit/537.36 (KHTML, like Gecko) "
                           "Chrome/91.0.4472.124 Safari/537.36"),
            "Accept":
            "application/json",
            "Accept-Language":
            "en-US,en;q=0.9",
            "Referer":
            "https://rule34.xxx/"
        }
        self.session = session

    async def get_random_image(self,
                               tags: str = "random",
                               limit: int = 100) -> Optional[str]:
        params = {
            "page": "dapi",
            "s": "post",
            "q": "index",
            "json": "1",
            "limit": str(limit),
            "tags": tags
        }
        try:
            async with self.session.get(self.base_url,
                                        params=params,
                                        headers=self.headers,
                                        timeout=10) as response:
                if response.status != 200:
                    logger.error(
                        f"HTTP ошибка: {response.status} для тегов: {tags}")
                    return None
                try:
                    data = await response.json()
                except aiohttp.ContentTypeError:
                    logger.error(f"Неверный формат ответа для тегов: {tags}")
                    return None
                if data:
                    selected = random.choice(
                        data)  # Выбираем случайное изображение из полученных
                    file_url = selected.get('file_url')
                    if file_url:
                        return file_url
                    else:
                        logger.warning(
                            f"Нет поля 'file_url' в данных для тегов: {tags}")
                        return None
                else:
                    logger.warning(
                        f"Нет данных в ответе от API Rule34 для тегов: {tags}")
                    return None
        except aiohttp.ClientError as e:
            logger.error(f"Клиентская ошибка при получении изображения: {e}")
            return None
        except asyncio.TimeoutError:
            logger.error("Запрос к API Rule34 превысил время ожидания.")
            return None

# Создание бота и диспетчера
bot = Bot(token=BOT_TOKEN)
dp = Dispatcher(bot)
dp.middleware.setup(LoggingMiddleware())

# Инициализация Rule34Client
rule34_client: Optional[Rule34Client] = None


@dp.message_handler(commands=['start'])
async def start_command(message: types.Message):
    welcome_text = (
        "Привет! Я бот для отправки случайных изображений с Rule34.\n"
        "Используйте команду /rule, чтобы получить случайное изображение.\n"
        "Используйте команду /tag с тегами, чтобы получить изображение по тегам.\n"
        "Пример: /tag cat eyes blue")
    await message.reply(welcome_text)


@dp.message_handler(commands=['rule'])
async def rule_command(message: types.Message):
    await message.reply("Получаю случайное изображение...")

    if not rule34_client:
        logger.error("Rule34Client не инициализирован.")
        await message.reply("Внутренняя ошибка. Попробуйте позже.")
        return

    image_url = await rule34_client.get_random_image()

    if image_url:
        try:
            await bot.send_photo(chat_id=message.chat.id, photo=image_url)
            logger.info(
                f"Отправлено изображение: {image_url} пользователю {message.chat.id}"
            )
        except (BotBlocked, ChatNotFound, NetworkError) as e:
            logger.error(f"Ошибка при отправке изображения: {e}")
            await message.reply("Не удалось отправить изображение.")
    else:
        await message.reply(
            "Не удалось получить изображение. Попробуйте позже.")


@dp.message_handler(commands=['tag'])
async def tag_command(message: types.Message):
    args = message.get_args()

    if not args:
        await message.reply("Пожалуйста, укажите один или несколько тегов.\n"
                            "Пример использования:\n/tag cat eyes blue")
        return

    tags = ' '.join(args.split())
    await message.reply(f"Получаю изображение с тегами: {tags}...")

    if not rule34_client:
        logger.error("Rule34Client не инициализирован.")
        await message.reply("Внутренняя ошибка. Попробуйте позже.")
        return

    image_url = await rule34_client.get_random_image(tags=tags)

    if image_url:
        try:
            await bot.send_photo(chat_id=message.chat.id, photo=image_url)
            logger.info(
                f"Отправлено изображение с тегами {tags}: {image_url} пользователю {message.chat.id}"
            )
        except (BotBlocked, ChatNotFound, NetworkError) as e:
            logger.error(f"Ошибка при отправке изображения: {e}")
            await message.reply("Не удалось отправить изображение.")
    else:
        await message.reply(
            "Не удалось найти изображение с указанными тегами.\n"
            "Попробуйте другие теги.")


@dp.errors_handler()
async def global_error_handler(update: types.Update, exception):
    logger.error(f"Обнаружена ошибка: {exception}", exc_info=True)
    try:
        if isinstance(update, types.Message):
            await update.reply(
                "Произошла ошибка. Пожалуйста, попробуйте позже.")
    except Exception as e:
        logger.error(f"Ошибка при отправке сообщения об ошибке: {e}")
    return True  # Ошибка считается обработанной


async def on_startup(dp: Dispatcher):
    global rule34_client
    logger.info("Настройка Rule34Client")
    session = aiohttp.ClientSession()
    rule34_client = Rule34Client(session)
    logger.info("Rule34Client инициализирован")


async def on_shutdown(dp: Dispatcher):
    global rule34_client
    logger.info("Закрытие Rule34Client")
    if rule34_client:
        await rule34_client.session.close()
        logger.info("Rule34Client закрыт")


if __name__ == '__main__':
    from aiogram import executor

    # Запуск бота с обработкой событий старта и остановки
    executor.start_polling(
        dp,
        on_startup=on_startup,
        on_shutdown=on_shutdown,
        skip_updates=True  # Пропустить накопившиеся апдейты
    )


Я создал бота на телеграм и запустил его на Replit но денег у меня к сожаления нету что мне делать P.S. Я написал бота на python aiogram