""" ⚠⚠⚠ ATENÇÃO ⚠⚠⚠ O método de login com e-mail/senha será descontinuado em breve. Para automações e consumo contínuo da API, utilize SEMPRE um TOKEN_API_FIXO. Gere seu token de API no painel da sua conta antes que o login tradicional seja desativado. ⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠⚠ 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 `TOKEN_API_FIXO` pelo seu token pessoal (recomendado para automações). - **Login com e-mail e senha**: Preencha `EMAIL` e `SENHA` com suas credenciais (caso não use 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: - 12/11/2025 Contato: - ctt@plexa.com.br """ import requests import json import time # ===================== CONFIGURAÇÃO ===================== LOGIN_ENDPOINT = 'https://plexa.com.br/api/login' ENDPOINT_DESEJADO = 'https://api.plexa.com.br/json/dividendo' MESES_DESEJADO = 12 LISTA_DE_TIKERS = ['AFHI11', 'BTLG11', 'CACR11', 'CRAA11', 'CPSH11', 'CDII11', 'HGRU11'] MAX_REQUISICOES = 50 INTERVALO_REQUISICOES = 61 # segundos EMAIL = 'SEU_EMAIL_AQUI' # Somente se não usar token fixo SENHA = 'SUA_SENHA_AQUI' # Somente se não usar token fixo TOKEN_API_FIXO = '' # Insira seu token de API fixo aqui (se usar) # =================== AUTENTICAÇÃO ===================== TOKEN = TOKEN_API_FIXO or None DADOS_OBTIDOS = [] if not TOKEN: print("Obtendo token via login...") login_data = { 'usuEmail': EMAIL, 'usuSenha': SENHA, } login_headers = { 'Content-Type': 'application/json' } response = requests.post(LOGIN_ENDPOINT, headers=login_headers, json=login_data) if response.status_code == 200: data = response.json() if 'accessToken' in data: TOKEN = data['accessToken'] print("Token obtido com sucesso.") else: print(data.get('msg', 'Erro desconhecido no login')) exit() else: print(f'Erro no login: {response.status_code}') exit() # ================== PROCESSAMENTO ===================== if TOKEN: headers = { 'Authorization': f'Bearer {TOKEN}', 'Content-Type': 'application/json' } # Requisição única if ENDPOINT_DESEJADO == 'https://api.plexa.com.br/json/fundo': response = requests.get(ENDPOINT_DESEJADO, headers=headers) if response.status_code == 200: r = response.json() if r.get('ok'): DADOS_OBTIDOS = r.get('data') print(json.dumps(DADOS_OBTIDOS, indent=4)) else: print(r.get('msg')) else: print(f'Erro na requisição: {response.status_code}') # Requisições em lote else: def process_batch(tickers): resultados = [] for ticker in tickers: try: url = f"{ENDPOINT_DESEJADO}/{ticker}/{MESES_DESEJADO}" r = requests.get(url, headers=headers) r_json = r.json() if r_json.get("ok"): resultados.append(r_json["data"]) else: print(f"Erro em {ticker}: {r_json.get('msg', 'Erro na requisição')}") resultados.append(None) except Exception as e: print(f"Erro em {ticker}: {e}") resultados.append(None) return resultados for i in range(0, len(LISTA_DE_TIKERS), MAX_REQUISICOES): batch = LISTA_DE_TIKERS[i:i + MAX_REQUISICOES] dados_batch = process_batch(batch) DADOS_OBTIDOS.extend([d for d in dados_batch if d is not None]) # Filtra None print(f"Lote {i // MAX_REQUISICOES + 1} processado.") print(json.dumps(dados_batch, indent=4)) if i + MAX_REQUISICOES < len(LISTA_DE_TIKERS): print(f"Aguardando {INTERVALO_REQUISICOES} segundos antes do próximo lote...") time.sleep(INTERVALO_REQUISICOES) # Daqui em diante, você pode trabalhar à vontade com a variável DADOS_OBTIDOS.