Discord está en una lucha activa contra la automatización y los bots, utilizando sistemas avanzados de detección: análisis de direcciones IP, patrones de comportamiento y límites de tasa. Si estás ejecutando bots para moderación, envíos masivos o automatización de acciones en servidores, sin proxies correctamente configurados, te enfrentarás a bloqueos en las primeras horas de funcionamiento. En esta guía, analizaremos qué proxies son adecuados para Discord, cómo configurar la rotación de IP y cómo eludir los mecanismos de protección de la plataforma.
Por qué Discord bloquea bots y cómo funciona la protección
Discord utiliza un sistema de protección contra la automatización de múltiples capas que analiza varios parámetros simultáneamente. La plataforma no solo verifica la cantidad de solicitudes desde una IP, sino que construye un perfil de comportamiento para cada conexión y lo compara con los patrones de usuarios normales.
Los principales mecanismos de detección de bots en Discord son:
- Límites de tasa — Discord establece restricciones estrictas sobre la cantidad de acciones en un período de tiempo. Por ejemplo, no más de 5 mensajes en 5 segundos desde una cuenta, no más de 50 solicitudes a la API por minuto. Superar los límites resulta en un bloqueo temporal (HTTP 429).
- Análisis de direcciones IP — si desde una IP operan varios bots o se observa actividad sospechosa (cambio rápido de cuentas, acciones masivas), Discord puede bloquear toda la dirección IP durante varias horas o días.
- Fingerprinting de conexiones — la plataforma analiza parámetros técnicos: User-Agent, encabezados de solicitudes, versión de la biblioteca, tiempo de respuesta. Si los parámetros no coinciden con un cliente normal de Discord, la cuenta se marca como sospechosa.
- Análisis de comportamiento — Discord rastrea patrones de acciones: reacciones demasiado rápidas, intervalos ideales entre mensajes, ausencia de aleatoriedad en las acciones. Los bots que operan con un algoritmo rígido son detectados más rápidamente.
Escenarios típicos de bloqueo sin proxies:
- Ejecutar 3-5 bots desde una IP doméstica — bloqueo de IP dentro de 2-6 horas después del inicio
- Envío masivo de invitaciones a un servidor — baneo de cuenta e IP después de 10-15 invitaciones enviadas
- Moderación automática (eliminación de mensajes, asignación de roles) — bloqueo al superar 100 acciones por hora desde una IP
- Parsing de miembros de servidores — detección y baneo después de escanear 200-300 perfiles
Los proxies resuelven estos problemas distribuyendo solicitudes entre diferentes direcciones IP y creando la apariencia de usuarios normales de diferentes ubicaciones. Pero es importante elegir correctamente el tipo de proxy y configurar la rotación; una configuración incorrecta puede llevar a bloqueos aún más rápidos.
Qué tipos de proxies son adecuados para bots de Discord
La elección del tipo de proxy depende de tus tareas: número de bots, frecuencia de solicitudes, presupuesto y nivel de anonimato requerido. Analicemos tres tipos principales de proxies y su aplicación para Discord.
| Tipo de proxy | Ventajas | Desventajas | Adecuado para |
|---|---|---|---|
| Proxies de centros de datos | Alta velocidad (ping 10-50 ms), bajo costo ($1-3 por IP/mes), estabilidad | Discord reconoce fácilmente las IP de centros de datos, alto riesgo de bloqueo en acciones masivas | Pruebas, automatización ligera (1-2 bots), tareas sin solicitudes masivas |
| Proxies residenciales | IP reales de usuarios domésticos, riesgo mínimo de bloqueo, gran pool de direcciones (millones de IP) | Velocidad media (ping 100-300 ms), mayor costo ($5-15 por GB de tráfico), inestabilidad de algunas IP | Envíos masivos, scraping de servidores, trabajo con 5+ bots, proyectos a largo plazo |
| Proxies móviles | IP de operadores móviles (4G/5G), máxima confianza de Discord, cambio dinámico de IP | Alto costo ($50-150 por IP/mes), menor pool de direcciones, posibles interrupciones de conexión | Cuentas críticas, eludir bloqueos estrictos, trabajar con cuentas de alto valor |
Recomendaciones para elegir según diferentes tareas:
Moderación y gestión del servidor (1-3 bots): Proxies residenciales con IP fijas. Un bot — una IP, sin rotación. Esto crea un perfil de conexión estable que Discord percibe como un usuario administrador normal.
Envíos masivos e invitaciones (10+ bots): Proxies residenciales con rotación cada 5-10 minutos. Distribuye la carga: no más de 20 acciones por hora desde una IP. Utiliza un pool de 50+ direcciones IP para 10 bots.
Parsing de miembros y servidores: Proxies residenciales con rotación rápida (cada 1-3 minutos) o proxies móviles. El scraping es una de las actividades más arriesgadas, Discord puede calcular fácilmente los patrones de escaneo. Utiliza retrasos aleatorios entre solicitudes (30-120 segundos).
Pruebas y desarrollo: Proxies de centros de datos son suficientes para depurar funcionalidades. Pero antes de lanzar en producción, asegúrate de cambiar a proxies residenciales — el comportamiento de Discord puede diferir significativamente para diferentes tipos de IP.
Un punto importante: Discord es especialmente estricto con las direcciones IP de ciertos países y regiones. Las IP de Rusia, China, Vietnam, India están sujetas a verificaciones más estrictas debido a la alta actividad de spammers. Si tu audiencia objetivo se encuentra en EE. UU. o Europa, utiliza proxies de estas regiones — esto reducirá la probabilidad de bloqueos en un 40-60%.
Cómo eludir los límites de tasa de Discord a través de proxies
Los límites de tasa en Discord son restricciones sobre la cantidad de solicitudes a la API en un período de tiempo. Existen dos tipos: globales (para toda la aplicación) y por ruta (para endpoints específicos). Los proxies ayudan a distribuir la carga entre diferentes IP, pero esto no significa que se puedan ignorar los límites — Discord rastrea la actividad a nivel de token del bot.
Principales límites de tasa de la API de Discord:
- Envío de mensajes: 5 mensajes en 5 segundos en un canal, 50 mensajes en 10 segundos globalmente para el bot
- Creación/eliminación de canales: 50 solicitudes en 10 minutos
- Cambio de roles de miembros: 10 solicitudes en 10 segundos
- Obtención de lista de miembros: 1 solicitud por segundo (el límite más estricto)
- Envío de DM (mensajes directos): 5 DM en 5 segundos, bloqueo por envíos masivos a usuarios desconocidos
Cuando superas el límite, Discord devuelve HTTP 429 (Too Many Requests) con el encabezado Retry-After, indicando el tiempo de espera en segundos. El manejo correcto de esta respuesta es crítico.
Estrategia para eludir los límites de tasa con proxies:
# Ejemplo en Python (discord.py) con rotación de proxies al alcanzar el límite de tasa
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):
# Saltar proxies no funcionales
available = [p for p in self.proxies if p not in self.failed_proxies]
if not available:
self.failed_proxies.clear() # Reiniciar después de un ciclo completo
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)
# Inicialización
proxy_rotator = ProxyRotator([
'http://user1:pass1@192.168.1.1:8080',
'http://user2:pass2@192.168.1.2:8080',
# ... añade 10-20 proxies para un funcionamiento estable
])
intents = discord.Intents.default()
bot = commands.Bot(command_prefix='!', intents=intents)
async def send_with_retry(channel, message, max_retries=3):
"""Enviar un mensaje con manejo automático de límites de tasa"""
for attempt in range(max_retries):
try:
# Obtener un nuevo proxy en cada intento
proxy = proxy_rotator.get_next_proxy()
# Discord.py utiliza aiohttp internamente, configuramos el proxy
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: # Límite de tasa
retry_after = e.retry_after if hasattr(e, 'retry_after') else 5
print(f"¡Límite de tasa! Esperando {retry_after} seg, cambiando proxy...")
# Marcar el proxy como temporalmente no disponible
proxy_rotator.mark_failed(proxy)
# Añadir aleatoriedad al retraso
await asyncio.sleep(retry_after + random.uniform(1, 3))
else:
print(f"Error al enviar: {e}")
await asyncio.sleep(2)
return False
@bot.event
async def on_ready():
print(f'Bot iniciado: {bot.user}')
# Ejemplo de uso
@bot.command()
async def envio_masivo(ctx):
channels = ctx.guild.text_channels[:5] # Primeros 5 canales
for channel in channels:
success = await send_with_retry(channel, "Mensaje de prueba")
if success:
print(f"Enviado a {channel.name}")
# Retraso aleatorio entre canales
await asyncio.sleep(random.uniform(3, 7))
Principios clave para eludir los límites de tasa:
- Siempre maneja HTTP 429: No ignores el encabezado Retry-After. Discord aumenta el tiempo de bloqueo en caso de violaciones repetidas (de 5 segundos a 60 o más).
- Añade aleatoriedad: Los retrasos entre solicitudes deben ser aleatorios (por ejemplo, 2-5 segundos en lugar de 3 segundos fijos). Esto imita el comportamiento humano.
- Distribuye la carga: Si tienes 10 bots y 20 proxies, asigna 2 proxies a cada bot para rotación. No uses un proxy para todos los bots.
- Monitorea la calidad de los proxies: Algunas IP pueden estar bloqueadas por Discord. Excluye automáticamente los proxies que constantemente reciben 403 o 429.
Estrategias de rotación de IP para diferentes tareas
La rotación de proxies no es solo un cambio aleatorio de IP cada N minutos. La estrategia correcta depende del tipo de actividad del bot y los requisitos de Discord para la estabilidad de la conexión. Analicemos cuatro enfoques principales.
1. IP fija (sin rotación)
Cuándo usar: Bots de moderación, bots de gestión de servidores, bots musicales, bots con presencia constante en el servidor.
Lógica: Un bot = una dirección IP durante todo el tiempo de funcionamiento (semanas, meses). Discord percibe tal conexión como un usuario administrador normal que siempre se conecta desde el mismo lugar.
Configuración:
# Python (discord.py) - proxy fijo
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)
# El proxy se utilizará para todas las solicitudes de este bot
bot.run('YOUR_BOT_TOKEN')
Ventajas: Máxima estabilidad, mínimo riesgo de bloqueo por IP, configuración sencilla.
Desventajas: Si la IP es bloqueada, tendrás que cambiar el proxy manualmente y recrear la sesión del bot.
2. Rotación por tiempo
Cuándo usar: Bots para envíos, bots con actividad moderada (10-50 acciones por hora), scraping de datos con baja frecuencia.
Lógica: La IP cambia cada 5-15 minutos por un temporizador, independientemente de la cantidad de solicitudes. Esto imita a un usuario que se reconecta a Internet (por ejemplo, Internet móvil con IP dinámica).
Intervalos recomendados:
- Baja actividad (5-10 acciones/hora): rotación cada 10-15 minutos
- Actividad media (20-40 acciones/hora): rotación cada 5-7 minutos
- Alta actividad (50+ acciones/hora): rotación cada 2-3 minutos + rotación adicional al alcanzar el límite de tasa
# JavaScript (discord.js) - rotación por tiempo
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() }
});
// Rotación cada 5 minutos
setInterval(() => {
console.log('Cambiando proxy...');
client.rest.setAgent(getProxyAgent());
}, 5 * 60 * 1000);
client.login('YOUR_BOT_TOKEN');
3. Rotación por cantidad de solicitudes
Cuándo usar: Scraping masivo, scraping de miembros de servidores, invitaciones automáticas.
Lógica: La IP cambia después de N solicitudes realizadas (por ejemplo, cada 20-50 solicitudes). Esto permite distribuir la carga de manera uniforme y no superar los límites invisibles de Discord sobre la cantidad de acciones desde una IP.
Valores recomendados de N:
- Scraping de miembros: 30-50 solicitudes por IP (para evitar la detección del patrón de escaneo)
- Envío de DM: 10-15 mensajes por IP (Discord es especialmente estricto con los DM masivos)
- Creación de invitaciones: 20-30 invitaciones por IP
4. Rotación adaptativa (en caso de errores)
Cuándo usar: Bots críticos, trabajo con cuentas de alto valor, eludir bloqueos estrictos.
Lógica: La IP cambia automáticamente al recibir errores 429 (límite de tasa), 403 (prohibido), o timeouts. El sistema recuerda las IP "malas" y las excluye temporalmente de la rotación.
# Python - rotación adaptativa con 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()
# Filtramos proxies en blacklist
available = [
p for p in self.proxies
if p not in self.blacklist_until or self.blacklist_until[p] < now
]
if not available:
# Si todos están en blacklist, reiniciamos y esperamos
print("Todos los proxies en blacklist, esperando 60 seg...")
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
# Bloqueo temporal al recibir múltiples errores
if self.error_count[proxy] >= 3:
blacklist_duration = 300 # 5 minutos
self.blacklist_until[proxy] = time.time() + blacklist_duration
print(f"Proxy {proxy} en blacklist durante {blacklist_duration} seg")
self.error_count[proxy] = 0 # Reiniciar contador
def report_success(self, proxy):
# Solicitud exitosa - reiniciar contador de errores
if proxy in self.error_count:
self.error_count[proxy] = max(0, self.error_count[proxy] - 1)
Enfoque combinado (recomendado): Utiliza la rotación básica por tiempo (cada 5-10 minutos) + rotación adaptativa en caso de errores. Esto proporciona estabilidad y una rápida respuesta a problemas.
Configuración de proxies en bibliotecas populares: discord.py y discord.js
Analicemos la configuración paso a paso de proxies en las dos bibliotecas más populares para crear bots de Discord. Estos ejemplos son adecuados para la mayoría de las tareas y se adaptan fácilmente a tus necesidades.
Discord.py (Python)
Discord.py utiliza aiohttp para solicitudes HTTP. El proxy se configura a través del parámetro proxy al crear el cliente o mediante la configuración directa de la sesión HTTP.
Paso 1: Instalación de dependencias
pip install discord.py aiohttp aiohttp-socks
# aiohttp-socks es necesario para proxies SOCKS5, no es obligatorio para HTTP/HTTPS
Paso 2: Configuración básica con un proxy
import discord
from discord.ext import commands
# Formato del proxy: protocol://username:password@ip:port
PROXY = 'http://user:pass@192.168.1.100:8080'
intents = discord.Intents.default()
intents.message_content = True # Para leer mensajes
bot = commands.Bot(
command_prefix='!',
intents=intents,
proxy=PROXY # Proxy para todas las solicitudes HTTP
)
@bot.event
async def on_ready():
print(f'Bot {bot.user} conectado a través del proxy!')
@bot.command()
async def ping(ctx):
await ctx.send(f'¡Pong! Latencia: {round(bot.latency * 1000)}ms')
bot.run('YOUR_BOT_TOKEN')
Paso 3: Configuración con rotación de proxies
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) # Rotación cada 5 minutos
async def proxy_rotation(self):
old_proxy = self.current_proxy
self.current_proxy = random.choice([p for p in PROXIES if p != old_proxy])
# Recrear la sesión HTTP con el nuevo proxy
await self.http.close()
connector = aiohttp.TCPConnector(limit=0)
self.http.connector = connector
self.http.__session = aiohttp.ClientSession(connector=connector)
print(f'Proxy cambiado: {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 no tiene soporte integrado para proxies, por lo que se utiliza la biblioteca https-proxy-agent o socks-proxy-agent.
Paso 1: Instalación de dependencias
npm install discord.js https-proxy-agent
# Para SOCKS5: npm install socks-proxy-agent
Paso 2: Configuración básica
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 } // Proxy para solicitudes de la API REST
});
client.on('ready', () => {
console.log(`Bot ${client.user.tag} conectado a través del proxy!`);
});
client.on('messageCreate', async (message) => {
if (message.content === '!ping') {
await message.reply(`¡Pong! Latencia de WebSocket: ${client.ws.ping}ms`);
}
});
client.login('YOUR_BOT_TOKEN');
Paso 3: Rotación de proxies
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() }
});
// Rotación cada 10 minutos
setInterval(() => {
const newAgent = getNextProxy();
client.rest.setAgent(newAgent);
console.log('Proxy cambiado');
}, 10 * 60 * 1000);
client.on('ready', () => {
console.log(`Bot ${client.user.tag} iniciado`);
});
client.login('YOUR_BOT_TOKEN');
Importante: La conexión WebSocket (para recibir eventos en tiempo real) no siempre admite proxies. Si tienes problemas de conexión a través de WebSocket, utiliza solo proxies HTTP para solicitudes de la API REST, y deja WebSocket sin proxy. Para casos críticos, considera usar VPN en lugar de proxies para la conexión WebSocket.
Errores comunes y cómo evitarlos
Incluso con proxies correctamente configurados, se puede recibir un baneo si se cometen errores comunes. Analicemos los más críticos y las formas de resolverlos.
Error 1: Uso de un solo proxy para todos los bots
Problema: Estás ejecutando 5-10 bots a través de una única dirección IP. Discord ve la actividad simultánea de varias cuentas desde una IP y bloquea todas las cuentas + la IP misma.
Solución: Regla "un bot — una IP única" para un funcionamiento estable. Si tienes 10 bots, utiliza al menos 10 proxies diferentes. Para proyectos críticos, añade un 50-100% de reserva (15-20 proxies para 10 bots) para rotación.
Error 2: Rotación de IP demasiado rápida
Problema: Cambias la IP cada 30-60 segundos, pensando que esto protegerá contra bloqueos. En realidad, Discord percibe el cambio frecuente de IP como actividad sospechosa — un usuario normal no se reconecta a Internet cada minuto.
Solución: El intervalo mínimo de rotación debe ser de 3-5 minutos. Lo óptimo es de 5-15 minutos dependiendo de la intensidad de las solicitudes. Excepción: rotación adaptativa al recibir límite de tasa (429).
Error 3: Ignorar la geolocalización de los proxies
Problema: Tu bot "vive" en un servidor en EE. UU., pero utiliza proxies de Rusia, China o India. Discord ve la discrepancia entre la ubicación declarada del servidor y la dirección IP, lo que aumenta la sospecha.
Solución: Utiliza proxies del mismo país/región donde se encuentra tu servidor de Discord o tu audiencia objetivo. Para proyectos internacionales, elige proxies de EE. UU. o Europa — tienen mejor reputación ante Discord.
Error 4: Falta de manejo de errores
Problema: El bot recibe HTTP 429 (límite de tasa) y continúa enviando solicitudes, empeorando la situación. Discord aumenta el tiempo de bloqueo con cada intento.
Solución: Siempre maneja los códigos de error:
- 429 (Too Many Requests): Lee el encabezado Retry-After y espera el tiempo indicado + 1-3 segundos. Cambia el proxy.
- 403 (Forbidden): IP o token bloqueado. Cambia el proxy, verifica la validez del token.
- 401 (Unauthorized): Token del bot no válido. Verifica el token en el Discord Developer Portal.
- 502/504 (Gateway errors): Problemas con el proxy o la API de Discord. Espera 10-30 segundos, cambia el proxy.
Error 5: Uso de proxies públicos o baratos
Problema: Proxies gratuitos o baratos ($0.5-1 por IP) a menudo ya están bloqueados por Discord, porque han sido utilizados por miles de otros bots y spammers.
Solución: Invierte en proxies residenciales de calidad de proveedores confiables. Verifica la reputación de la IP antes de usarla (servicios como AbuseIPDB, IPQualityScore). Un proxy de calidad por $5-10 es mejor que 10 bloqueados por $1.
Error 6: User-Agent idéntico para todos los bots
Problema: Todos tus bots utilizan el User-Agent estándar de la biblioteca (por ejemplo, "DiscordBot (discord.py 2.0)"). Discord agrupa fácilmente tales conexiones y detecta la automatización masiva.
Solución: Varía el User-Agent entre los bots. Utiliza valores realistas:
# Python - User-Agent personalizado
import discord
class CustomBot(discord.Client):
async def request(self, *args, **kwargs):
# Sobrescribir 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)
Monitoreo del trabajo de los bots y manejo de errores
Un monitoreo adecuado permite detectar problemas antes de que conduzcan a bloqueos masivos. Analicemos las métricas clave y las herramientas para rastrear el trabajo de los bots de Discord a través de proxies.
Métricas para rastrear
| Métrica | Qué rastrear | Valores críticos |
|---|---|---|
| Frecuencia de errores 429 | Número de errores de límite de tasa por hora | >10 por hora — revisa la estrategia de solicitudes |
| Frecuencia de errores 403 | Bloqueos de IP o tokens | >3 por día — proxy comprometido |
| Latencia | Tiempo de respuesta del proxy + API de Discord | >1000ms — proxy lento, reemplázalo |
| Tasa de éxito de solicitudes | Porcentaje de solicitudes exitosas (HTTP 200-299) | <85% — problemas con el proxy o la lógica del bot |
| Tiempo de actividad del proxy | Cuánto tiempo se utiliza el proxy sin problemas | <24 horas — puede que la IP haya sido bloqueada |
Ejemplo de sistema de registro
# Python - registro avanzado con métricas
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
})
# Configuración del registrador
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'Límite de tasa en el proxy {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 {proxy} bloqueado (403)')
else:
self.metrics['errors_other'] += 1
self.logger.error(f'Error {status_code} en el proxy {proxy}')
def log_proxy_switch(self, old_proxy, new_proxy):
self.metrics['proxy_switches'] += 1
self.logger.info(f'Cambiando proxy: {old_proxy} -> {new_proxy}')
def get_report(self):
total = self.metrics['requests_total']
if total == 0:
return "No hay datos"
success_rate = (self.metrics['requests_success'] / total) * 100
avg_latency = sum(self.metrics['avg_latency']) / len(self.metrics['avg_latency'])
report = f"""
=== INFORME DE MONITOREO DEL BOT ===
Total de solicitudes: {total}
Exitosas: {self.metrics['requests_success']} ({success_rate:.1f}%)
Errores 429 (límite de tasa): {self.metrics['errors_429']}
Errores 403 (bloqueo): {self.metrics['errors_403']}
Otros errores: {self.metrics['errors_other']}
Latencia media: {avg_latency:.0f}ms
Cambios de proxy: {self.metrics['proxy_switches']}
=== ESTADÍSTICAS POR PROXY ===
"""
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']} solicitudes, {stats['errors']} errores ({error_rate:.1f}%)\n"
return report
Asegúrate de implementar un sistema de monitoreo para mantener tus bots funcionando sin problemas y evitar bloqueos innecesarios.