DEV-002 - Chamada Para API Do Hatchbank (VemCard)
ID: KB-DEV-002
Responsável: Thiago Amaral, TI
Status: Publicado
Última Atualização: 15/08/2025
Propósito
Instruir na chamada para API do Hatchbank. Um auxílio para a geração dos gabaritos para a Asset.
Aplica-se a
Hatchbank VemCard.
Pré-requisitos
Usuário com privilégio de administrador do site do originador.
Instruções
1. Criando O Token
Utilize uma chamada POST para a criação do JWT Token.
curl -X POST <https://backendvemcard.hatchbank.com.br/usuario/logar> \\ -H "Content-Type: application/json" \\ -d '{ "username": "[email protected]", "password": "3s$25S%D5U@w", "verificationToken": "string", "web": true }'Consiga o resultado do token.
eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ0aGlhZ28uYW1hcmFsK3ZlbWNhcmRAZmljdG9yY29uc2lnLmNvbS5iciIsImlzcyI6IjEiLCJpYXQiOjE3NTUyNjgyODcsImV4cCI6MTc1NTI4ODY3MX0.YP6Fj-IgWrIqNucHjRC-Q4FSTbRCb7JImkV0jDTgokc
2. Conseguindo Informações Da API
Utilize o método GET para a URL do backend do Hatch da VemCard.
curl -X POST "<https://backendvemcard.hatchbank.com.br/proposta/gerarGabarito>" \\ -H "Authorization: Bearer $TOKEN" \\ -H "Content-Type: application/json" \\ -d '{ "dataInicio": "2024-01-01T10:00:00", "dataFim": "2025-08-15T14:00:00", "statusProposta": "CEDIDA" }' \\ --output gabarito.xlsx
3. Automatizando
Prepare um arquivo
.envno mesmo diretório.[email protected] VEMCARD_PASSWORD=3s$25S%D5U@wUtilize o script Python para automatizar o envio.
#!/usr/bin/env python3 """ Script para gerar gabarito de propostas Executa requisição POST e mostra se funcionou ou não """ import requests import json import sys import os from typing import Optional # ======================================== # 🔧 CONFIGURAÇÕES - MODIFIQUE AQUI # ======================================== # Credenciais (obtidas de variáveis de ambiente) USERNAME = os.getenv("VEMCARD_USERNAME") PASSWORD = os.getenv("VEMCARD_PASSWORD") # URL base BASE_URL = "<https://backendvemcard.hatchbank.com.br>" # Parâmetros da requisição DATA_INICIO = "2024-01-01T10:00:00" DATA_FIM = "2025-08-15T14:00:00" STATUS_PROPOSTA = "CEDIDA" # Opções: CEDIDA, FINALIZADA, PAGA # Configurações de timeout e debug REQUEST_TIMEOUT = 30 SHOW_RESPONSE_DETAILS = True # True para mostrar detalhes da resposta, False para apenas sucesso/erro # ======================================== def validate_environment() -> bool: """ Valida se as variáveis de ambiente necessárias estão definidas Returns: bool: True se todas as variáveis estão definidas, False caso contrário """ missing_vars = [] if not USERNAME: missing_vars.append("VEMCARD_USERNAME") if not PASSWORD: missing_vars.append("VEMCARD_PASSWORD") if missing_vars: print("❌ Missing required environment variables:") for var in missing_vars: print(f" - {var}") print("\\n💡 Set them using:") print(" export VEMCARD_USERNAME='your_username'") print(" export VEMCARD_PASSWORD='your_password'") print("\\n Or create a .env file (see README)") return False return True def get_auth_token() -> Optional[str]: """ Obtém o token de autenticação Returns: str: Token de autenticação ou None se falhar """ login_url = f"{BASE_URL}/usuario/logar" payload = { "username": USERNAME, "password": PASSWORD, "verificationToken": "string", "web": True } print("🔐 Authenticating...") try: response = requests.post( login_url, headers={"Content-Type": "application/json"}, json=payload, timeout=REQUEST_TIMEOUT ) response.raise_for_status() data = response.json() token = data.get("token") if not token or token == "null": print("❌ Authentication failed - No token received") return None print("✅ Authentication successful") return token except requests.exceptions.RequestException as e: print(f"❌ Authentication failed - Request error: {e}") return None except json.JSONDecodeError as e: print(f"❌ Authentication failed - Invalid JSON response: {e}") return None def generate_gabarito(token: str) -> bool: """ Gera o gabarito com os parâmetros configurados Args: token: Token de autenticação Returns: bool: True se sucesso, False se falhou """ gabarito_url = f"{BASE_URL}/proposta/gerarGabarito" payload = { "dataInicio": DATA_INICIO, "dataFim": DATA_FIM, "statusProposta": STATUS_PROPOSTA } print(f"\\n📊 Generating gabarito...") print(f"📅 Period: {DATA_INICIO} to {DATA_FIM}") print(f"📋 Status: {STATUS_PROPOSTA}") if SHOW_RESPONSE_DETAILS: print(f"\\n🔍 Request details:") print(f"URL: {gabarito_url}") print(f"Payload: {json.dumps(payload, indent=2)}") try: response = requests.post( gabarito_url, headers={ "Authorization": f"Bearer {token}", "Content-Type": "application/json" }, json=payload, timeout=REQUEST_TIMEOUT ) # Verificar se a requisição foi bem-sucedida if response.status_code == 200: print(f"✅ Gabarito generated successfully!") if SHOW_RESPONSE_DETAILS: try: response_json = response.json() print(f"📄 Response: {json.dumps(response_json, indent=2, ensure_ascii=False)}") except json.JSONDecodeError: print(f"📄 Response (text): {response.text}") return True else: print(f"❌ Request failed with status code: {response.status_code}") if SHOW_RESPONSE_DETAILS: print(f"📄 Error response: {response.text}") return False except requests.exceptions.Timeout: print(f"❌ Request timed out after {REQUEST_TIMEOUT} seconds") return False except requests.exceptions.RequestException as e: print(f"❌ Request failed: {e}") return False def main(): """Função principal""" print("🚀 Starting gabarito generator...") print(f"🎯 Target: {BASE_URL}") # 0️⃣ Validar variáveis de ambiente if not validate_environment(): sys.exit(1) # 1️⃣ Obter token token = get_auth_token() if not token: print("\\n💥 Execution failed - Could not authenticate") sys.exit(1) # 2️⃣ Gerar gabarito success = generate_gabarito(token) # 3️⃣ Resultado final if success: print("\\n🎉 Operation completed successfully!") sys.exit(0) else: print("\\n💥 Operation failed!") sys.exit(1) if __name__ == "__main__": main()
Resultado Esperado
Um arquivo com o gabarito e status correspondente deve ser gerado no bucket da S3.
Solução de Problemas
Não se aplica.
Artigos Relacionados
Não se aplica.
Anexos
Não se aplica.
Referências
Não se aplica.
Histórico de Revisões
Data
Versão
Autor
Descrição das Mudanças
19/09/2025
v1.0
Thiago Amaral
Confecção do documento
Last updated