Назад к блогу

Прокси для Discord ботов: как настроить автоматизацию без банов и rate limits

Полное руководство по настройке прокси для Discord ботов: выбор типа прокси, настройка ротации IP, обход rate limits и защита от банов при автоматизации.

📅20 января 2026 г.

Discord активно борется с автоматизацией и ботами, используя продвинутые системы обнаружения: анализ IP-адресов, паттернов поведения и rate limits. Если вы запускаете ботов для модерации, рассылок или автоматизации действий в серверах, без правильно настроенных прокси вы столкнетесь с блокировками уже в первые часы работы. В этом руководстве разберем, какие прокси подходят для Discord, как настроить ротацию IP и обойти защитные механизмы платформы.

Почему Discord блокирует ботов и как работает защита

Discord использует многоуровневую систему защиты от автоматизации, которая анализирует несколько параметров одновременно. Платформа не просто проверяет количество запросов с одного IP — она строит профиль поведения каждого подключения и сравнивает его с паттернами нормальных пользователей.

Основные механизмы обнаружения ботов в Discord:

  • Rate Limits (лимиты частоты запросов) — Discord устанавливает жесткие ограничения на количество действий в единицу времени. Например, не более 5 сообщений за 5 секунд с одного аккаунта, не более 50 запросов к API в минуту. Превышение лимитов приводит к временной блокировке (HTTP 429).
  • Анализ IP-адресов — если с одного IP работает несколько ботов или наблюдается подозрительная активность (быстрая смена аккаунтов, массовые действия), Discord может заблокировать весь IP-адрес на несколько часов или дней.
  • Fingerprinting подключений — платформа анализирует технические параметры: User-Agent, заголовки запросов, версию библиотеки, время отклика. Если параметры не соответствуют обычному клиенту Discord, аккаунт помечается как подозрительный.
  • Поведенческий анализ — Discord отслеживает паттерны действий: слишком быстрые реакции, идеальные интервалы между сообщениями, отсутствие случайности в действиях. Боты, работающие по жесткому алгоритму, выявляются быстрее.

Типичные сценарии блокировки без прокси:

  • Запуск 3-5 ботов с одного домашнего IP — блокировка IP в течение 2-6 часов после начала работы
  • Массовая рассылка приглашений на сервер — бан аккаунта и IP уже после 10-15 отправленных приглашений
  • Автоматическая модерация (удаление сообщений, выдача ролей) — блокировка при превышении 100 действий в час с одного IP
  • Парсинг участников серверов — обнаружение и бан после сканирования 200-300 профилей

Прокси решают эти проблемы, распределяя запросы между разными IP-адресами и создавая видимость обычных пользователей из разных локаций. Но важно правильно выбрать тип прокси и настроить ротацию — неправильная конфигурация может привести к еще более быстрым банам.

Какие типы прокси подходят для Discord ботов

Выбор типа прокси зависит от ваших задач: количества ботов, частоты запросов, бюджета и требуемого уровня анонимности. Рассмотрим три основных типа прокси и их применение для Discord.

Тип прокси Преимущества Недостатки Подходит для
Прокси дата-центров Высокая скорость (пинг 10-50 мс), низкая цена ($1-3 за IP/месяц), стабильность Discord легко распознает IP дата-центров, высокий риск блокировки при массовых действиях Тестирование, легкая автоматизация (1-2 бота), задачи без массовых запросов
Резидентные прокси Реальные IP домашних пользователей, минимальный риск блокировки, большой пул адресов (миллионы IP) Средняя скорость (пинг 100-300 мс), выше цена ($5-15 за ГБ трафика), нестабильность некоторых IP Массовые рассылки, парсинг серверов, работа с 5+ ботами, долгосрочные проекты
Мобильные прокси IP мобильных операторов (4G/5G), максимальное доверие Discord, динамическая смена IP Высокая цена ($50-150 за IP/месяц), меньший пул адресов, возможны разрывы соединения Критически важные аккаунты, обход жестких блокировок, работа с аккаунтами высокой ценности

Рекомендации по выбору для разных задач:

Модерация и управление сервером (1-3 бота): Резидентные прокси с фиксированными IP. Один бот — один IP, без ротации. Это создает стабильный профиль подключения, который Discord воспринимает как обычного пользователя-администратора.

Массовые рассылки и инвайты (10+ ботов): Резидентные прокси с ротацией каждые 5-10 минут. Распределяйте нагрузку: не более 20 действий в час с одного IP. Используйте пул из 50+ IP-адресов для 10 ботов.

Парсинг участников и серверов: Резидентные прокси с быстрой ротацией (каждые 1-3 минуты) или мобильные прокси. Парсинг — одна из самых рискованных активностей, Discord легко вычисляет паттерны сканирования. Используйте случайные задержки между запросами (30-120 секунд).

Тестирование и разработка: Прокси дата-центров достаточно для отладки функционала. Но перед запуском в продакшн обязательно переключитесь на резидентные — поведение Discord может сильно отличаться для разных типов IP.

Важный момент: Discord особенно строго относится к IP-адресам из определенных стран и регионов. IP из России, Китая, Вьетнама, Индии попадают под более жесткие проверки из-за высокой активности спамеров. Если ваша целевая аудитория находится в США или Европе, используйте прокси из этих регионов — это снизит вероятность блокировок на 40-60%.

Как обойти rate limits Discord через прокси

Rate limits в Discord — это ограничения на количество запросов к API в единицу времени. Они бывают двух типов: глобальные (для всего приложения) и per-route (для конкретных эндпоинтов). Прокси помогают распределить нагрузку между разными IP, но это не означает, что можно игнорировать лимиты — Discord отслеживает активность на уровне токена бота.

Основные rate limits Discord API:

  • Отправка сообщений: 5 сообщений за 5 секунд в один канал, 50 сообщений за 10 секунд глобально для бота
  • Создание/удаление каналов: 50 запросов за 10 минут
  • Изменение ролей участников: 10 запросов за 10 секунд
  • Получение списка участников: 1 запрос в секунду (самый строгий лимит)
  • Отправка DM (личных сообщений): 5 DM за 5 секунд, блокировка за массовые рассылки незнакомым пользователям

Когда вы превышаете лимит, Discord возвращает HTTP 429 (Too Many Requests) с заголовком Retry-After, указывающим время ожидания в секундах. Правильная обработка этого ответа критически важна.

Стратегия обхода rate limits с прокси:

# Пример на Python (discord.py) с ротацией прокси при rate limit

import discord
from discord.ext import commands
import aiohttp
import asyncio
import random

class ProxyRotator:
    def __init__(self, proxy_list):
        self.proxies = proxy_list  # ['http://user:pass@ip:port', ...]
        self.current_index = 0
        self.failed_proxies = set()
    
    def get_next_proxy(self):
        # Пропускаем неработающие прокси
        available = [p for p in self.proxies if p not in self.failed_proxies]
        if not available:
            self.failed_proxies.clear()  # Сброс после полного цикла
            available = self.proxies
        
        proxy = available[self.current_index % len(available)]
        self.current_index += 1
        return proxy
    
    def mark_failed(self, proxy):
        self.failed_proxies.add(proxy)

# Инициализация
proxy_rotator = ProxyRotator([
    'http://user1:pass1@192.168.1.1:8080',
    'http://user2:pass2@192.168.1.2:8080',
    # ... добавьте 10-20 прокси для стабильной работы
])

intents = discord.Intents.default()
bot = commands.Bot(command_prefix='!', intents=intents)

async def send_with_retry(channel, message, max_retries=3):
    """Отправка сообщения с автоматической обработкой rate limits"""
    for attempt in range(max_retries):
        try:
            # Получаем новый прокси при каждой попытке
            proxy = proxy_rotator.get_next_proxy()
            
            # Discord.py использует aiohttp внутри, настраиваем прокси
            connector = aiohttp.TCPConnector()
            async with aiohttp.ClientSession(connector=connector) as session:
                bot.http.connector = connector
                bot.http.proxy = proxy
                
                await channel.send(message)
                return True
                
        except discord.HTTPException as e:
            if e.status == 429:  # Rate limit
                retry_after = e.retry_after if hasattr(e, 'retry_after') else 5
                print(f"Rate limit! Ждем {retry_after} сек, смена прокси...")
                
                # Помечаем прокси как временно недоступный
                proxy_rotator.mark_failed(proxy)
                
                # Добавляем случайность к задержке
                await asyncio.sleep(retry_after + random.uniform(1, 3))
            else:
                print(f"Ошибка отправки: {e}")
                await asyncio.sleep(2)
    
    return False

@bot.event
async def on_ready():
    print(f'Бот запущен: {bot.user}')

# Пример использования
@bot.command()
async def массовая_рассылка(ctx):
    channels = ctx.guild.text_channels[:5]  # Первые 5 каналов
    
    for channel in channels:
        success = await send_with_retry(channel, "Тестовое сообщение")
        if success:
            print(f"Отправлено в {channel.name}")
        
        # Случайная задержка между каналами
        await asyncio.sleep(random.uniform(3, 7))
    

Ключевые принципы обхода rate limits:

  • Всегда обрабатывайте HTTP 429: Не игнорируйте заголовок Retry-After. Discord увеличивает время блокировки при повторных нарушениях (с 5 секунд до 60 и выше).
  • Добавляйте случайность: Задержки между запросами должны быть случайными (например, 2-5 секунд вместо фиксированных 3 секунд). Это имитирует поведение человека.
  • Распределяйте нагрузку: Если у вас 10 ботов и 20 прокси, назначьте каждому боту 2 прокси для ротации. Не используйте один прокси для всех ботов.
  • Мониторьте качество прокси: Некоторые IP могут быть уже заблокированы Discord. Автоматически исключайте прокси, которые постоянно получают 403 или 429.

Стратегии ротации IP для разных задач

Ротация прокси — это не просто случайная смена IP каждые N минут. Правильная стратегия зависит от типа активности бота и требований Discord к стабильности подключения. Рассмотрим четыре основных подхода.

1. Фиксированный IP (без ротации)

Когда использовать: Модерационные боты, боты для управления сервером, музыкальные боты, боты с постоянным присутствием на сервере.

Логика: Один бот = один IP-адрес на весь срок работы (недели, месяцы). Discord воспринимает такое подключение как обычного пользователя-администратора, который всегда заходит с одного места.

Настройка:

# Python (discord.py) - фиксированный прокси
import discord
from discord.ext import commands

PROXY = 'http://username:password@192.168.1.100:8080'

intents = discord.Intents.default()
bot = commands.Bot(command_prefix='!', intents=intents, proxy=PROXY)

# Прокси будет использоваться для всех запросов этого бота
bot.run('YOUR_BOT_TOKEN')
    

Преимущества: Максимальная стабильность, минимальный риск блокировки по IP, простая настройка.

Недостатки: Если IP попадет в блокировку, придется менять прокси вручную и пересоздавать сессию бота.

2. Ротация по времени

Когда использовать: Боты для рассылок, боты с умеренной активностью (10-50 действий в час), парсинг данных с низкой частотой.

Логика: IP меняется каждые 5-15 минут по таймеру, независимо от количества запросов. Это имитирует пользователя, который переподключается к интернету (например, мобильный интернет с динамическим IP).

Рекомендуемые интервалы:

  • Низкая активность (5-10 действий/час): ротация каждые 10-15 минут
  • Средняя активность (20-40 действий/час): ротация каждые 5-7 минут
  • Высокая активность (50+ действий/час): ротация каждые 2-3 минуты + дополнительная ротация при rate limit
# JavaScript (discord.js) - ротация по времени
const { Client, GatewayIntentBits } = require('discord.js');
const HttpsProxyAgent = require('https-proxy-agent');

const proxies = [
    'http://user1:pass1@ip1:port',
    'http://user2:pass2@ip2:port',
    'http://user3:pass3@ip3:port',
];

let currentProxyIndex = 0;

function getProxyAgent() {
    const proxy = proxies[currentProxyIndex];
    currentProxyIndex = (currentProxyIndex + 1) % proxies.length;
    return new HttpsProxyAgent(proxy);
}

const client = new Client({
    intents: [GatewayIntentBits.Guilds, GatewayIntentBits.GuildMessages],
    rest: { agent: getProxyAgent() }
});

// Ротация каждые 5 минут
setInterval(() => {
    console.log('Смена прокси...');
    client.rest.setAgent(getProxyAgent());
}, 5 * 60 * 1000);

client.login('YOUR_BOT_TOKEN');
    

3. Ротация по количеству запросов

Когда использовать: Массовый парсинг, скрапинг участников серверов, автоматические инвайты.

Логика: IP меняется после N выполненных запросов (например, каждые 20-50 запросов). Это позволяет равномерно распределить нагрузку и не превысить невидимые лимиты Discord на количество действий с одного IP.

Рекомендуемые значения N:

  • Парсинг участников: 30-50 запросов на IP (чтобы избежать обнаружения паттерна сканирования)
  • Отправка DM: 10-15 сообщений на IP (Discord особенно строго относится к массовым DM)
  • Создание инвайтов: 20-30 инвайтов на IP

4. Адаптивная ротация (при ошибках)

Когда использовать: Критически важные боты, работа с аккаунтами высокой ценности, обход жестких блокировок.

Логика: IP меняется автоматически при получении ошибок 429 (rate limit), 403 (forbidden), или таймаутах. Система запоминает "плохие" IP и временно исключает их из ротации.

# Python - адаптивная ротация с blacklist
import time
from collections import defaultdict

class AdaptiveProxyRotator:
    def __init__(self, proxies):
        self.proxies = proxies
        self.current = 0
        self.error_count = defaultdict(int)
        self.blacklist_until = {}  # {proxy: timestamp}
    
    def get_proxy(self):
        now = time.time()
        
        # Фильтруем прокси в blacklist
        available = [
            p for p in self.proxies 
            if p not in self.blacklist_until or self.blacklist_until[p] < now
        ]
        
        if not available:
            # Если все в blacklist, сбрасываем и ждем
            print("Все прокси в blacklist, ожидание 60 сек...")
            time.sleep(60)
            self.blacklist_until.clear()
            available = self.proxies
        
        proxy = available[self.current % len(available)]
        self.current += 1
        return proxy
    
    def report_error(self, proxy, error_type):
        self.error_count[proxy] += 1
        
        # Временная блокировка при многократных ошибках
        if self.error_count[proxy] >= 3:
            blacklist_duration = 300  # 5 минут
            self.blacklist_until[proxy] = time.time() + blacklist_duration
            print(f"Прокси {proxy} в blacklist на {blacklist_duration} сек")
            self.error_count[proxy] = 0  # Сброс счетчика
    
    def report_success(self, proxy):
        # Успешный запрос - сброс счетчика ошибок
        if proxy in self.error_count:
            self.error_count[proxy] = max(0, self.error_count[proxy] - 1)
    

Комбинированный подход (рекомендуется): Используйте базовую ротацию по времени (каждые 5-10 минут) + адаптивную ротацию при ошибках. Это обеспечивает стабильность и быструю реакцию на проблемы.

Настройка прокси в популярных библиотеках: discord.py и discord.js

Рассмотрим пошаговую настройку прокси в двух самых популярных библиотеках для создания Discord ботов. Эти примеры подходят для большинства задач и легко адаптируются под ваши нужды.

Discord.py (Python)

Discord.py использует aiohttp для HTTP-запросов. Прокси настраивается через параметр proxy при создании клиента или через прямую настройку HTTP-сессии.

Шаг 1: Установка зависимостей

pip install discord.py aiohttp aiohttp-socks
# aiohttp-socks нужен для SOCKS5 прокси, для HTTP/HTTPS он не обязателен
    

Шаг 2: Базовая настройка с одним прокси

import discord
from discord.ext import commands

# Формат прокси: protocol://username:password@ip:port
PROXY = 'http://user:pass@192.168.1.100:8080'

intents = discord.Intents.default()
intents.message_content = True  # Для чтения сообщений

bot = commands.Bot(
    command_prefix='!',
    intents=intents,
    proxy=PROXY  # Прокси для всех HTTP-запросов
)

@bot.event
async def on_ready():
    print(f'Бот {bot.user} подключен через прокси!')

@bot.command()
async def ping(ctx):
    await ctx.send(f'Понг! Задержка: {round(bot.latency * 1000)}ms')

bot.run('YOUR_BOT_TOKEN')
    

Шаг 3: Настройка с ротацией прокси

import discord
from discord.ext import commands, tasks
import aiohttp
import random

PROXIES = [
    'http://user1:pass1@ip1:port',
    'http://user2:pass2@ip2:port',
    'http://user3:pass3@ip3:port',
]

class ProxyBot(commands.Bot):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.current_proxy = random.choice(PROXIES)
        self.proxy_rotation.start()
    
    @tasks.loop(minutes=5)  # Ротация каждые 5 минут
    async def proxy_rotation(self):
        old_proxy = self.current_proxy
        self.current_proxy = random.choice([p for p in PROXIES if p != old_proxy])
        
        # Пересоздаем HTTP-сессию с новым прокси
        await self.http.close()
        connector = aiohttp.TCPConnector(limit=0)
        self.http.connector = connector
        self.http.__session = aiohttp.ClientSession(connector=connector)
        
        print(f'Прокси изменен: {old_proxy} -> {self.current_proxy}')
    
    async def close(self):
        self.proxy_rotation.cancel()
        await super().close()

intents = discord.Intents.default()
bot = ProxyBot(command_prefix='!', intents=intents)

bot.run('YOUR_BOT_TOKEN')
    

Discord.js (Node.js)

Discord.js не имеет встроенной поддержки прокси, поэтому используется библиотека https-proxy-agent или socks-proxy-agent.

Шаг 1: Установка зависимостей

npm install discord.js https-proxy-agent
# Для SOCKS5: npm install socks-proxy-agent
    

Шаг 2: Базовая настройка

const { Client, GatewayIntentBits } = require('discord.js');
const { HttpsProxyAgent } = require('https-proxy-agent');

const PROXY = 'http://user:pass@192.168.1.100:8080';
const agent = new HttpsProxyAgent(PROXY);

const client = new Client({
    intents: [
        GatewayIntentBits.Guilds,
        GatewayIntentBits.GuildMessages,
        GatewayIntentBits.MessageContent
    ],
    rest: { agent: agent }  // Прокси для REST API запросов
});

client.on('ready', () => {
    console.log(`Бот ${client.user.tag} подключен через прокси!`);
});

client.on('messageCreate', async (message) => {
    if (message.content === '!ping') {
        await message.reply(`Понг! WebSocket задержка: ${client.ws.ping}ms`);
    }
});

client.login('YOUR_BOT_TOKEN');
    

Шаг 3: Ротация прокси

const { Client, GatewayIntentBits } = require('discord.js');
const { HttpsProxyAgent } = require('https-proxy-agent');

const PROXIES = [
    'http://user1:pass1@ip1:port',
    'http://user2:pass2@ip2:port',
    'http://user3:pass3@ip3:port',
];

let currentProxyIndex = 0;

function getNextProxy() {
    const proxy = PROXIES[currentProxyIndex];
    currentProxyIndex = (currentProxyIndex + 1) % PROXIES.length;
    return new HttpsProxyAgent(proxy);
}

const client = new Client({
    intents: [GatewayIntentBits.Guilds, GatewayIntentBits.GuildMessages],
    rest: { agent: getNextProxy() }
});

// Ротация каждые 10 минут
setInterval(() => {
    const newAgent = getNextProxy();
    client.rest.setAgent(newAgent);
    console.log('Прокси изменен');
}, 10 * 60 * 1000);

client.on('ready', () => {
    console.log(`Бот ${client.user.tag} запущен`);
});

client.login('YOUR_BOT_TOKEN');
    

Важно: WebSocket-подключение (для получения событий в реальном времени) не всегда поддерживает прокси. Если у вас проблемы с подключением через WebSocket, используйте только HTTP прокси для REST API запросов, а WebSocket оставьте без прокси. Для критичных случаев рассмотрите использование VPN вместо прокси для WebSocket-соединения.

Типичные ошибки и как их избежать

Даже с правильно настроенными прокси можно получить бан, если допустить распространенные ошибки. Рассмотрим самые критичные из них и способы решения.

Ошибка 1: Использование одного прокси для всех ботов

Проблема: Вы запускаете 5-10 ботов через один IP-адрес. Discord видит одновременную активность нескольких аккаунтов с одного IP и блокирует все аккаунты + сам IP.

Решение: Правило "один бот — один уникальный IP" для стабильной работы. Если у вас 10 ботов, используйте минимум 10 разных прокси. Для критичных проектов добавьте 50-100% запас (15-20 прокси на 10 ботов) для ротации.

Ошибка 2: Слишком быстрая ротация IP

Проблема: Вы меняете IP каждые 30-60 секунд, думая, что это защитит от блокировки. На самом деле Discord воспринимает частую смену IP как подозрительную активность — обычный пользователь не переподключается к интернету каждую минуту.

Решение: Минимальный интервал ротации — 3-5 минут. Оптимально — 5-15 минут в зависимости от интенсивности запросов. Исключение — адаптивная ротация при получении rate limit (429).

Ошибка 3: Игнорирование геолокации прокси

Проблема: Ваш бот "живет" на сервере в США, но использует прокси из России, Китая или Индии. Discord видит несоответствие между заявленной локацией сервера и IP-адресом, что повышает подозрительность.

Решение: Используйте прокси из той же страны/региона, где находится ваш сервер Discord или целевая аудитория. Для международных проектов выбирайте прокси из США или Европы — они имеют лучшую репутацию у Discord.

Ошибка 4: Отсутствие обработки ошибок

Проблема: Бот получает HTTP 429 (rate limit) и продолжает отправлять запросы, усугубляя ситуацию. Discord увеличивает время блокировки с каждой попыткой.

Решение: Всегда обрабатывайте коды ошибок:

  • 429 (Too Many Requests): Читайте заголовок Retry-After и ждите указанное время + 1-3 секунды. Смените прокси.
  • 403 (Forbidden): IP или токен заблокирован. Смените прокси, проверьте валидность токена.
  • 401 (Unauthorized): Невалидный токен бота. Проверьте токен в Discord Developer Portal.
  • 502/504 (Gateway errors): Проблемы с прокси или Discord API. Подождите 10-30 секунд, смените прокси.

Ошибка 5: Использование публичных или дешевых прокси

Проблема: Бесплатные или дешевые прокси ($0.5-1 за IP) часто уже заблокированы Discord, потому что их использовали тысячи других ботов и спамеров.

Решение: Инвестируйте в качественные резидентные прокси от надежных провайдеров. Проверяйте репутацию IP перед использованием (сервисы типа AbuseIPDB, IPQualityScore). Один качественный прокси за $5-10 лучше, чем 10 заблокированных за $1.

Ошибка 6: Одинаковый User-Agent для всех ботов

Проблема: Все ваши боты используют стандартный User-Agent библиотеки (например, "DiscordBot (discord.py 2.0)"). Discord легко группирует такие подключения и вычисляет массовую автоматизацию.

Решение: Варьируйте User-Agent между ботами. Используйте реалистичные значения:

# Python - кастомный User-Agent
import discord

class CustomBot(discord.Client):
    async def request(self, *args, **kwargs):
        # Переопределяем User-Agent
        if 'headers' not in kwargs:
            kwargs['headers'] = {}
        kwargs['headers']['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) Discord/1.0.9015'
        return await super().request(*args, **kwargs)
    

Мониторинг работы ботов и обработка ошибок

Правильный мониторинг позволяет обнаружить проблемы до того, как они приведут к массовым банам. Рассмотрим ключевые метрики и инструменты для отслеживания работы Discord ботов через прокси.

Метрики для отслеживания

Метрика Что отслеживать Критичные значения
Частота ошибок 429 Количество rate limit ошибок в час >10 в час — пересмотрите стратегию запросов
Частота ошибок 403 Блокировки IP или токенов >3 в день — прокси скомпрометирован
Задержка (latency) Время отклика прокси + Discord API >1000ms — медленный прокси, замените
Успешность запросов Процент успешных запросов (HTTP 200-299) <85% — проблемы с прокси или логикой бота
Время работы прокси Как долго прокси используется без проблем <24 часа — возможно IP попал в блокировку

Пример системы логирования

# Python - продвинутое логирование с метриками
import logging
import time
from collections import defaultdict
import json

class BotMonitor:
    def __init__(self):
        self.metrics = {
            'requests_total': 0,
            'requests_success': 0,
            'errors_429': 0,
            'errors_403': 0,
            'errors_other': 0,
            'proxy_switches': 0,
            'avg_latency': []
        }
        self.proxy_stats = defaultdict(lambda: {
            'requests': 0,
            'errors': 0,
            'last_error': None
        })
        
        # Настройка логгера
        logging.basicConfig(
            level=logging.INFO,
            format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
            handlers=[
                logging.FileHandler('bot_monitor.log'),
                logging.StreamHandler()
            ]
        )
        self.logger = logging.getLogger('BotMonitor')
    
    def log_request(self, proxy, status_code, latency):
        self.metrics['requests_total'] += 1
        self.metrics['avg_latency'].append(latency)
        self.proxy_stats[proxy]['requests'] += 1
        
        if 200 <= status_code < 300:
            self.metrics['requests_success'] += 1
        elif status_code == 429:
            self.metrics['errors_429'] += 1
            self.proxy_stats[proxy]['errors'] += 1
            self.logger.warning(f'Rate limit на прокси {proxy}')
        elif status_code == 403:
            self.metrics['errors_403'] += 1
            self.proxy_stats[proxy]['errors'] += 1
            self.proxy_stats[proxy]['last_error'] = time.time()
            self.logger.error(f'Прокси {proxy} заблокирован (403)')
        else:
            self.metrics['errors_other'] += 1
            self.logger.error(f'Ошибка {status_code} на прокси {proxy}')
    
    def log_proxy_switch(self, old_proxy, new_proxy):
        self.metrics['proxy_switches'] += 1
        self.logger.info(f'Смена прокси: {old_proxy} -> {new_proxy}')
    
    def get_report(self):
        total = self.metrics['requests_total']
        if total == 0:
            return "Нет данных"
        
        success_rate = (self.metrics['requests_success'] / total) * 100
        avg_latency = sum(self.metrics['avg_latency']) / len(self.metrics['avg_latency'])
        
        report = f"""
=== ОТЧЕТ МОНИТОРИНГА БОТА ===
Всего запросов: {total}
Успешных: {self.metrics['requests_success']} ({success_rate:.1f}%)
Ошибок 429 (rate limit): {self.metrics['errors_429']}
Ошибок 403 (блокировка): {self.metrics['errors_403']}
Других ошибок: {self.metrics['errors_other']}
Средняя задержка: {avg_latency:.0f}ms
Смен прокси: {self.metrics['proxy_switches']}

=== СТАТИСТИКА ПО ПРОКСИ ===
"""
        for proxy, stats in self.proxy_stats.items():
            error_rate = (stats['errors'] / stats['requests'] * 100) if stats['requests'] > 0 else 0
            report += f"{proxy}: {stats['requests']} запросов, {stats['errors']} ошибок ({error_rate:.1f}%)\