/** * Este script realiza autenticação na Plexa API e coleta dados de um endpoint protegido, * com suporte tanto para requisições únicas quanto em lote. * * Funcionalidades: * - Suporta dois métodos de autenticação: * 1. **Login com e-mail e senha**: Gera um *token de acesso temporário* (com tempo de vida curto). * 2. **Token de API personalizado**: Criado pelo usuário através do painel da sua conta — ideal para automações. * - Permite realizar uma requisição única a um endpoint específico. * - Suporta requisições em lote para múltiplos tickers, respeitando os limites de taxa da API: * - Divide a lista de tickers em grupos conforme o limite de requisições por minuto. * - Aguarda automaticamente entre os lotes para não exceder o limite da API. * - Os dados obtidos são armazenados na variável `DADOS_OBTIDOS` e exibidos no console. * * Como usar: * - Escolha um dos métodos de autenticação: * - **Token de API**: Substitua o valor de `TOKEN_API_FIXO` pelo seu token pessoal (recomendado para automações). * - **Login com e-mail e senha**: Preencha `EMAIL` e `SENHA`. Use apenas se não tiver um token de API. * - Ajuste `LISTA_DE_TIKERS`, `MESES_DESEJADO`, `MAX_REQUISICOES` e `INTERVALO_REQUISICOES` conforme sua necessidade e plano de acesso. * * Avisos: * - Este script é fornecido "como está". O uso é por sua conta e risco. * - Mantenha suas credenciais e tokens seguros e nunca os compartilhe. * - O uso da API deve estar de acordo com os Termos de Serviço da Plexa API. * * Última atualização: * - 03/09/2025 * * Contato: * - ctt@plexa.com.br */ // ======================== CONFIGURAÇÃO ======================== const LOGIN_ENDPOINT = 'https://api.plexa.com.br/site/login'; const ENDPOINT_DESEJADO = 'https://api.plexa.com.br/json/dividendo'; const MESES_DESEJADO = 12; const LISTA_DE_TIKERS = ['AFHI11', 'BTLG11', 'CACR11', 'CRAA11', 'CPSH11', 'CDII11', 'HGRU11']; const MAX_REQUISICOES = 50; // [Apoiador: 50, Premium: 100] const INTERVALO_REQUISICOES = 61000; // 61 segundos const EMAIL = "SEU_EMAIL_AQUI"; // Somente se usar login const SENHA = "SUA_SENHA_AQUI"; // Somente se usar login const TOKEN_API_FIXO = ""; // Se você já tem um token de API, insira aqui let TOKEN = TOKEN_API_FIXO || null; let DADOS_OBTIDOS = []; // variável onde os dados serão guardados // =================== AUTENTICAÇÃO ==================== if (!TOKEN) { console.log("Obtendo token via login..."); await fetch(LOGIN_ENDPOINT, { method: "POST", credentials: "include", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ usuEmail: EMAIL, usuSenha: SENHA }) }) .then(response => response.json()) .then(data => { if (data.accessToken) { TOKEN = data.accessToken; console.log("Token obtido com sucesso."); } else { console.error("Erro ao obter token:", data.msg); } }) .catch(err => console.error("Erro na requisição de login:", err)); } // ================== PROCESSAMENTO =================== if (TOKEN) { if (ENDPOINT_DESEJADO === 'https://api.plexa.com.br/json/fundo') { // Requisição única para endpoint de fundos await fetch(`${ENDPOINT_DESEJADO}`, { method: "GET", headers: { "Authorization": `Bearer ${TOKEN}`, "Content-Type": "application/json" } }) .then(response => response.json()) .then(r => { if (r.ok) { DADOS_OBTIDOS = r.data; console.log(DADOS_OBTIDOS); } else { console.error("Erro na resposta:", r.msg); } }); } else { // Requisições em lote const processBatch = async (tickers) => { const promises = tickers.map(TICKER => fetch(`${ENDPOINT_DESEJADO}/${TICKER}/${MESES_DESEJADO}`, { method: "GET", headers: { "Authorization": `Bearer ${TOKEN}`, "Content-Type": "application/json" } }) .then(response => response.json()) .then(r => { if (r.ok) return r.data; throw new Error(r.msg || 'Erro na requisição'); }) .catch(error => { console.error(`Erro em ${TICKER}: ${error.message}`); return null; }) ); return Promise.all(promises); }; for (let i = 0; i < LISTA_DE_TIKERS.length; i += MAX_REQUISICOES) { const batch = LISTA_DE_TIKERS.slice(i, i + MAX_REQUISICOES); const resultados = await processBatch(batch); DADOS_OBTIDOS.push(...resultados.filter(Boolean)); console.log(`Lote ${i / MAX_REQUISICOES + 1} processado.`); if (i + MAX_REQUISICOES < LISTA_DE_TIKERS.length) { console.log(`Aguardando ${INTERVALO_REQUISICOES / 1000} segundos antes do próximo lote...`); await new Promise(resolve => setTimeout(resolve, INTERVALO_REQUISICOES)); } } console.log("Todos os dados foram coletados:"); console.log(DADOS_OBTIDOS); } } else { console.error("Token de autenticação ausente. Verifique suas credenciais ou token de API."); }