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}%)\