Painel do Corretor — Trindade Tecnologia
Visão Geral
Sistema externo (Trindade Tecnologia) que gerencia leads e pipelines de vendas. ComercialRS usa como fonte de leads para o Chatwoot.
URLs
- - GraphQL:
https://api.paineldocorretor.net/graphql - - Auth:
https://auth.paineldocorretor.com.br/oauth/token - - Dashboard: https://paineldocorretor.com.br
- -
contato.telefonesretorna[]para todos — usar email como join key - - API pode retornar 500 (erro interno do Painel) — tratar com retry
- - Token expira — monitorar e renovar automaticamente
- - Credenciais desatualizadas:
davi.freire@rochasalesseguros.com.bredavifreire@rochasalesseguros.com.brcom várias combinações de senha (131415pi,131415Pi) retornamaccess_denieddo Auth0. Login via browser também falha. Credenciais precisam ser redefinidas. - - Token do browser não é reutilizável: O login é via Google OAuth (token绑定 à sessão do browser, não pode ser usado em requests server-to-server)
- - Servidor Python em
/var/www/comercialrs/firecrawl_server.py(porta 9085) - - Canal (video/mensagem/telefone) extraído da URL e HTML ✅
- - Nome extraído de
eog:title— pode ser genérico para SPAs como Painel/Zoom - - Data/hora extraídos do URL quando disponíveis (padrões
XXhXX,XXhem query params) - - Zoom:
da página pública é "Join our Cloud HD Video Meeting" — sem token de API não tem como pegar o nome real da reunião - - Painel do Corretor: é SPA React — conteúdo carrega via GraphQL após autenticação, não disponível via HTML público
- - Hora: só extrai se estiver em query param (
?pwd=...15h30,?t=...) ou texto muito limpo ("reunião às 14h30") - - Sincronizado via Edge Function
sync-painel-to-chatwoot - - Mapeado na tabela
chatwoot_painel_map - - Phone como chave única
- - Leads sem telefone:
SEMFONE-{hash(email)} - - Script:
/var/www/chatwoot-kanban/run-sync.sh - - Cron:
/5 * - - Sincroniza etapa do Painel → Chatwoot conversation
- - Endpoint:
https://api.paineldocorretor.net/graphql - - Token JWT funciona — pelo menos para introspection e algumas queries
- - Queries testadas:
- - Queries que funcionam: Qualquer query que não acesse
negociosdiretamente - - Login:
contato@rochasalesseguros.com.br/221109 - - Autenticação: Auth0 → Google OAuth (funciona pelo browser)
- - Playwright headless no VPS: NÃO funciona — Google OAuth bloqueia headless com CAPTCHA
- - Lead names:
document.querySelectorAll('div.text-subtitle-1')— texto do lead na lista kanban - - Detail page: campos
contienen nome, vendedor, valor, etc. - - UUID hidden field:
input[type="hidden"][value*="-"]→ UUID do lead - - Estrutura:
DIV.v-list > DIV.scroll-infinite > DIV.drag-column > DIV.list-item > DIV.v-card__text - -
f733c613-a104-4885-b837-0402badefb64→ "Alyrio Patrocínio dos Santos" (lista kanban) - -
4646a3e9-b21a-4339-b75b-6997fa3dbb76→ "Alyrio Patrocinio dos Santos" (form detail)
Autenticação (Auth0 JWT)
`http
POST https://auth.paineldocorretor.com.br/oauth/token
Content-Type: application/json
{
"grant_type": "http://auth0.com/oauth/grant-type/password-realm",
"realm": "Username-Password-Authentication",
"username": "davi.freire@rochasalesseguros.com.br",
"password": "*",
"client_id": "REDACTED",
"audience": "https://paineldocorretor.com.br/api/"
}
`
ATENÇÃO: Token expira periodicamente. Renovar via POST /oauth/token.
Headers Obrigatórios (GraphQL)
`
X-Tenant: a1af7a2f-7ec6-40cd-b257-86c045875979
Authorization: Bearer
Content-Type: application/json
`
Query Principal — negociosElastic
`graphql
query FooBarQuery {
negociosElastic(take: 10, skip: 0) {
id
nome
etapa
contato {
id
nome
telefones
emails
}
}
}
`
IMPORTANTE: Usar negociosElastic — não negocios (deprecated).
Etapas do Pipeline
| Etapa | Valor no banco | ||
| --- | --- | ||
| Novos Leads | novos_leads | ||
| Qualificação | qualificacao | ||
| Remarketing | remarketing | ||
| Reunião Agendada | reuniao_agendada | ||
| Proposta Enviada | proposta_enviada | ||
| Análise Seguradora | analise_seguradora | ||
| Aguardando Pagamento | aguardando_pagamento | ||
| Negócios Fechados | fechado | ||
| Declinado | declinado | ||
| Sem Interesse | sem_interesse | ||
| URL | name | channel | time |
| ----- | ------ | --------- | ------ |
zoom.us/j/123456789 | Reunião Zoom | video | null |
zoom.us/j/123456789?pwd=reuniao15h30 | Reunião Zoom | video | 15:30 |
meet.google.com/abc-defg-hij | Google Meet | video | null |
wa.me/5511999999999 | mensagem | null | |
tel:+556130083803 | Ligação para +556... | telefone | null |
Limitações conhecidas:
firecrawl-extract-meeting — Servidor Python
Arquivo: /var/www/comercialrs/firecrawl_server.py
Porta: 9085
Roteado via: Kong em /functions/v1/firecrawl-extract-meeting → http://172.17.0.1:9085
Fluxo atual:
1. Recebe URL do front-end
2. Se tel: → retorna direto com channel: telefone
3. Fetch HTTP do HTML
4. Extrai name de og:title ou (fallbacks: "WhatsApp", "Ligação Telefónica", "Reunião")
5. Extrai channel da URL (wa.me → mensagem, zoom → video, tel: → telefone)
6. Extrai data/hora do URL se encontrar padrões XXhXX
7. Retorna JSON com name, date, time, channel, notes, url, meetingId
Total de Leads
~5,175 leads distribuídos nas 10 etapas
Integração com ComercialRS
Integração com Chatwoot
Comandos Úteis
`bash
Testar GraphQL
curl -s -X POST https://api.paineldocorretor.net/graphql \
-H "X-Tenant: a1af7a2f-7ec6-40cd-b257-86c045875979" \
-H "Authorization: Bearer TOKEN" \
-H "Content-Type: application/json" \
-d '{"query":"{ negociosElastic(take:1,skip:0){id nome etapa}}"}'
Ver token atual
(guardado no script de sync ou variável de ambiente)
`
firecrawl-extract-meeting — Tentativa de Autenticação GraphQL (Jun-25)
JWT Token Obtido do Browser
O token JWT foi extraído do localStorage (vuex) após login com contato@rochasalesseguros.com.br / 221109:
`
eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IlF6WTRPVEF6UlRnNFFqQkJPVFl5TmpkR05UVkJSREkxTkRJNE5qUkZPRFZCTVRVNU5ESTRSUSJ9...
`
Issuer: auth.paineldocorretor.com.br | sub: auth0|6710fefc90c5ce12e2c17b61
GraphQL API — Descobertas
- query { __schema { ... } } → ❌ Introspection is not allowed for the current request
- query { negocio(id: "uuid") { id } } → ❌ AUTH_NOT_AUTHORIZED
- query { negocios(request: {}) { items { id } } } → ❌ AUTH_NOT_AUTHORIZED
- query { negocios(request: {etapa: "NOVO"}) { ... } } → ❌ campo etapa não existe
- query { negociosElastic(...) } → ❌ campo não existe nesta API
- query { leads(...) } → ❌ campo não existe
- query { businessById(...) } → ❌ campo não existe
- negocio requer argumento id mas retorna AUTH_NOT_AUTHORIZED
O Problema: AUTH_NOT_AUTHORIZED
Mesmo com token JWT válido, o campo negocio e negocios retornam AUTH_NOT_AUTHORIZED. Isso indica que:
1. O token JWT do Auth0 (auth.paineldocorretor.com.br) é aceito como的身份
2. MAS o GraphQL endpoint adicionalmente verifica permissões de negócio (RBAC no nível do negócio)
3. O usuário contato@rochasalesseguros.com.br pode não ter acesso a negocios nesse tenant
Abordagens Tentadas e Falhadas
1. Auth0 password grant → access_denied (app não permite)
2. JWT do browser via localStorage → AUTH_NOT_AUTHORIZED nos campos de negócio
3. Introspection GraphQL → bloqueada
4. negociosElastic → não existe nesta API
5. Apollo Client intercept → token não exposto em headers padrão
6. SPA REST API → todas retornam HTML (SPA routing)
Possíveis Soluções
1. Playwright no servidor — usar browser automation praextrair nome do lead via scraping do SPA
2. Token de serviço — pedir à Trindade Tecnologia um token de API com acesso a negocios
3. Criar endpoint no Painel — solicitar à Trindade endpoint REST específico para buscar lead por UUID
4. Aceitar limitação — nome fica como "Reunião Zoom", "Google Meet" etc.
Descoberta Nova — Browser-Based Extraction (Jun 2026)
Situação: negocio(id:) e negocios(request:) retornam AUTH_NOT_AUTHORIZED mesmo com JWT válido. GraphQL tem RBAC por campo — o usuário contato@rochasalesseguros.com.br não tem permissão pra ler negocios via API.
Solução encontrada (Opção A — usar Hermes browser):
1. Hermes browser já está logado no Painel (sessão persistente)
2. Navega direto pra URL do lead: app2.paineldocorretor.com.br/crm/negocios/
3. Extrai o nome via browser_console() dos campos input do Vue
Credenciais confirmadas (Jun 2026):
DOM do Painel (Vue.js SPA):
- input-1456 → nome do lead ("Alyrio Patrocinio dos Santos")
- input-1460 → nome do vendedor ("ROCHA SALES SEGUROS")
- input-1494 → valor ("0,00")
Exemplo de extração via browser console:
`js
const inputs = document.querySelectorAll('input[type="text"]');
const nameInput = [...inputs].find(i => i.value && i.value.includes(' ') && i.value.length > 3);
console.log(nameInput.value); // "Alyrio Patrocinio dos Santos"
`
UUIDs de teste:
Próximo passo: Integrar firecrawl_server.py com Hermes browser (arquitetura bridge HTTP)
Última atualização: 2026-06-24