9.7 KiB
Integração do Sistema de Proxies
Este documento descreve como o sistema de proxies foi integrado à API do YouTube.
Visão Geral
O sistema de proxies foi implementado para melhorar a confiabilidade da API, usando proxies armazenados em um banco de dados PostgreSQL. Quando um proxy falha, ele é automaticamente removido e outro proxy é testado.
Arquitetura
Arquivos Criados
-
database.py: Módulo de conexão e operações com PostgreSQL
get_db_connection(): Cria conexão com o bancoget_latest_proxy(): Busca o melhor proxy disponível (baseado em métricas)delete_proxy(proxy_id): Marca um proxy como inativo e incrementa failure_countmark_proxy_success(proxy_id): Marca sucesso e incrementa success_countformat_proxy_url(proxy): Formata proxy no padrão yt_dlp (com suporte a autenticação)
-
proxy_manager.py: Lógica de retry automático com proxies
is_proxy_error(error_msg): Identifica se um erro é relacionado a proxyexecute_with_proxy_retry(): Executa operações com retry automático
Estrutura da Tabela de Proxies
CREATE TABLE proxies (
id SERIAL PRIMARY KEY,
ip_address VARCHAR(255) NOT NULL,
port INTEGER NOT NULL,
protocol VARCHAR(10) NOT NULL DEFAULT 'http',
username VARCHAR(255), -- Autenticação (opcional)
password VARCHAR(255), -- Autenticação (opcional)
country_code VARCHAR(10), -- Código do país (ex: US, BR)
country_name VARCHAR(100), -- Nome do país
city VARCHAR(100), -- Cidade
is_active BOOLEAN DEFAULT TRUE, -- Proxy está ativo?
is_anonymous BOOLEAN DEFAULT FALSE, -- Proxy é anônimo?
response_time_ms INTEGER, -- Tempo de resposta em ms
last_checked_at TIMESTAMP, -- Última verificação
last_successful_at TIMESTAMP, -- Último sucesso
failure_count INTEGER DEFAULT 0, -- Contador de falhas
success_count INTEGER DEFAULT 0, -- Contador de sucessos
usage VARCHAR(50), -- Uso do proxy
source VARCHAR(100), -- Fonte do proxy
notes TEXT, -- Notas adicionais
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Configuração
1. Variáveis de Ambiente
Crie um arquivo .env baseado no .env.example:
DB_HOST=seu_host_postgresql
DB_PORT=5432
DB_NAME=seu_banco
DB_USER=seu_usuario
DB_PASSWORD=sua_senha
2. Docker Compose
O docker-compose.yml já está configurado para carregar as variáveis de ambiente. Use:
docker-compose up -d --build
Como Funciona
Fluxo de Execução
-
Seleção Inteligente de Proxy: A cada requisição, o sistema busca o melhor proxy disponível baseado em:
- Proxies ativos (
is_active = TRUE) - Último sucesso mais recente (
last_successful_at DESC) - Menor tempo de resposta (
response_time_ms ASC) - Maior taxa de sucesso (
success_count / (success_count + failure_count)) - Mais recentemente adicionado (
created_at DESC)
- Proxies ativos (
-
Tentativa de Execução: Tenta executar a operação usando o proxy selecionado
- Suporta autenticação automática se o proxy tiver
usernameepassword - Formato:
protocol://username:password@ip_address:port - Timeout configurado: 8 segundos para conexão com proxy
- Suporta autenticação automática se o proxy tiver
-
Detecção de Erro: Se houver erro relacionado a proxy (timeout, connection refused, etc.)
-
Desativação do Proxy: O proxy com problema é marcado como inativo
is_active = FALSEfailure_countincrementadolast_checked_ateupdated_atatualizados- Nota: O proxy NÃO é deletado, apenas desativado
-
Atualização de Sucesso: Quando a operação é bem-sucedida
success_countincrementadolast_successful_atatualizadois_active = TRUE(reativa o proxy se estava inativo)last_checked_ateupdated_atatualizados
-
Retry: Busca outro proxy ativo e tenta novamente
-
Limite de Tentativas: Máximo de 10 tentativas (configurável)
Performance e Timeout
- Socket Timeout: 8 segundos por tentativa de proxy
- Retry do yt_dlp: Desabilitado (
retries: 0) - Vantagem: Ao detectar erro, troca IMEDIATAMENTE de proxy sem tentar novamente no mesmo
- Comportamento:
- ❌ ANTES: Proxy ruim → tenta 3x no mesmo → 24 segundos perdidos → troca
- ✅ AGORA: Proxy ruim → erro após 8s → remove → busca outro → 8 segundos
- Tempo máximo de espera: ~80 segundos (10 proxies × 8 segundos cada)
- Nota: Se precisar de timeout diferente, altere
socket_timeoutnas opções do yt_dlp
Palavras-chave de Erro de Proxy
O sistema identifica erros de proxy por estas palavras-chave:
- proxy
- connection
- timeout
- timed out
- refused
- unreachable
- unable to connect
- network
- failed to connect
- connection reset
- read timed out
- http error 407 (proxy authentication)
- tunnel connection failed
Erros NÃO Tratados como Proxy
Estes erros NÃO resultam em troca de proxy (são erros legítimos do vídeo):
- "requested format is not available" - Formato solicitado não existe
- "video unavailable" - Vídeo indisponível/removido
- "private video" - Vídeo privado
- "age restricted" - Vídeo com restrição de idade
Quando esses erros ocorrem, o sistema não descarta o proxy e retorna o erro imediatamente.
Endpoints Integrados
Todos os endpoints que usam yt_dlp foram integrados:
- GET /get-video-metadata: Obtém metadados de vídeos
- GET /download-video: Download de vídeos
- GET /search: Busca de vídeos
- GET /list-formats: Lista formatos disponíveis
Tratamento de Erros
- ProxyError (503): Todos os proxies falharam ou não há proxies disponíveis
- Exception (500): Erros não relacionados a proxy
Alimentando o Banco de Proxies
Para adicionar proxies ao banco, você pode usar o serviço de scraper de proxies que já foi criado.
Exemplos de Inserção Manual
Proxies sem autenticação:
INSERT INTO proxies (ip_address, port, protocol, is_active, is_anonymous, country_code)
VALUES
('123.456.789.10', 8080, 'http', TRUE, FALSE, 'US'),
('98.765.432.10', 3128, 'https', TRUE, TRUE, 'BR'),
('45.67.89.100', 1080, 'socks5', TRUE, TRUE, 'DE');
Proxies com autenticação:
INSERT INTO proxies (ip_address, port, protocol, username, password, is_active)
VALUES
('premium-proxy.example.com', 8080, 'http', 'user123', 'pass456', TRUE),
('secure-proxy.example.com', 3128, 'https', 'myuser', 'mypass', TRUE);
Integração com Scraper
Quando o serviço de scraper adicionar novos proxies, deve incluir:
ip_address,port,protocol(obrigatórios)country_code,country_name,city(se disponível)is_anonymous(se detectado)response_time_ms(tempo de resposta inicial)source(fonte do scraper)is_active = TRUEpor padrão
Monitoramento
O sistema imprime logs úteis no console:
Tentativa 1: Usando proxy http://41.65.160.173:8080 (ID: 42)
Erro na tentativa 1: Connection to 41.65.160.173 timed out
Erro identificado como erro de proxy. Removendo proxy ID 42
Proxy 42 desativado: True
Tentativa 2: Usando proxy http://98.765.432.10:3128 (ID: 43)
Operação concluída com sucesso na tentativa 2
Proxy (id 43) marcado como sucesso
Importante: Não haverá mais mensagens como "Retrying (1/3)..." porque desabilitamos o retry interno do yt_dlp. Cada erro resulta em troca imediata de proxy.
Vantagens
- Alta Disponibilidade: Se um proxy falhar, outro é usado automaticamente
- Seleção Inteligente: Proxies são escolhidos baseado em performance e histórico
- Auto-recuperação: Proxies são desativados quando falham, mas podem ser reativados em sucesso futuro
- Métricas Automáticas: Sistema rastreia sucesso/falha e tempo de resposta automaticamente
- Suporte a Autenticação: Proxies com username/password são suportados automaticamente
- Sem Intervenção Manual: O sistema gerencia proxies de forma autônoma
- Preservação de Dados: Proxies não são deletados, apenas desativados
- Fácil Integração: Novo serviço de scraper pode adicionar proxies facilmente
Monitoramento e Análise
Queries Úteis
Ver estatísticas de proxies:
SELECT
COUNT(*) as total,
COUNT(*) FILTER (WHERE is_active = TRUE) as ativos,
COUNT(*) FILTER (WHERE is_active = FALSE) as inativos,
AVG(response_time_ms) as tempo_resposta_medio,
SUM(success_count) as total_sucessos,
SUM(failure_count) as total_falhas
FROM proxies;
Ver top 10 melhores proxies:
SELECT
ip_address, port, protocol,
success_count, failure_count,
ROUND((success_count::FLOAT / NULLIF(success_count + failure_count, 0) * 100), 2) as taxa_sucesso,
response_time_ms,
last_successful_at
FROM proxies
WHERE is_active = TRUE
ORDER BY
last_successful_at DESC NULLS LAST,
response_time_ms ASC NULLS LAST
LIMIT 10;
Reativar proxies desativados há mais de 24h (útil para retry):
UPDATE proxies
SET is_active = TRUE, updated_at = NOW()
WHERE is_active = FALSE
AND updated_at < NOW() - INTERVAL '24 hours';
Próximos Passos Sugeridos
- ✅ Integrar com o serviço de scraper de proxies
- ✅ Implementar métricas de sucesso/falha por proxy (CONCLUÍDO)
- ✅ Implementar sistema de priorização de proxies (CONCLUÍDO)
- Criar endpoint de administração para visualizar estatísticas de proxies
- Implementar job periódico para reativar proxies após período de cooldown
- Adicionar alertas quando número de proxies ativos cair abaixo de threshold