/** * 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: * - Realiza login na Plexa API com e-mail e senha pré-configurados. * - Obtém um token de acesso para autenticar as requisições. * - Permite realizar uma requisição única a um endpoint específico. * - Suporta requisições em lote para múltiplos tickers, respeitando 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: * - Substitua `SEU_EMAIL_AQUI` e `SUA_SENHA_AQUI` pelas suas credenciais da Plexa 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 seguras e nunca as compartilhe. * - O uso da API deve estar de acordo com os Termos de Serviço da Plexa API. * * Autores: * - Vlademir de Souza Bergamini * * Última atualização: * - 05/06/2025 * * Contato: * - ctt@plexa.com.br */ const LOGIN_ENDPOINT = 'https://api.plexa.com.br/site/login'; // Endpoint de login const ENDPOINT_DESEJADO = 'https://api.plexa.com.br/json/dividendo'; // Endpoint desejado const MESES_DESEJADO = 12; // quantidade de meses desejado const LISTA_DE_TIKERS = ['AFHI11', 'BTLG11', 'CACR11', 'CRAA11', 'CPSH11', 'CDII11', 'HGRU11']; // lista de exemplo const MAX_REQUISICOES = 50; // Limite de requisições por minuto [Apoiador 50, Premium 100] const INTERVALO_REQUISICOES = 61000; // 61 segundos const EMAIL = SEU_EMAIL_AQUI; // Email cadastrado no sistema const SENHA = SUA_SENHA_AQUI; // Senha de acesso ao sistema let TOKEN; // Token que será obtido para acessar o endpoint let DADOS_OBTIDOS; // variável onde os dados serão guardados // Fazer login para obter o endpoint 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; // Seu token estará aqui. } else { console.log(data.msg) // Em caso de Erro retorna o motivo } }); if (TOKEN) { // Este bloco realiza uma única requisição no endpoint desejado. if (ENDPOINT_DESEJADO === 'https://api.plexa.com.br/json/fundo') { // Este endpoint retorna os dados atuais de todos os fundos cadastrados 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; // Os dados estarão aqui console.log(DADOS_OBTIDOS); } else { console.log(r.msg); } }) } else { // Este bloco realiza requisições em lotes em intervalos de "n" requisições por minuto const processBatch = async (LISTA_DE_TIKERS) => { const promises = LISTA_DE_TIKERS.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.log(`Erro em ${TICKER}: ${error.message}`); return null; }) ); return Promise.all(promises); }; // Processar todos os lotes com intervalo for (let i = 0; i < LISTA_DE_TIKERS.length; i += MAX_REQUISICOES) { const batch = LISTA_DE_TIKERS.slice(i, i + MAX_REQUISICOES); DADOS_OBTIDOS = await processBatch(batch, (i / MAX_REQUISICOES) + 1); console.log(DADOS_OBTIDOS); // Os dados estarão aqui // Aguardar antes do próximo lote if (i + MAX_REQUISICOES < LISTA_DE_TIKERS.length) { await new Promise(resolve => setTimeout(resolve, INTERVALO_REQUISICOES)); } } } } // Daqui em diante você pode trabalar à vontade com a variável DADOS_OBTIDOS.