Como extrair campos de formulário para um novo mapeamento¶
Esta guia mostra como acelerar a criação de mapeamentos para sistemas SUS (e-SUS APS PEC, SISREG III, SEI, etc) usando
scripts/extract-form-fields.py.
Quando usar¶
Quando você precisa adicionar suporte da extensão Anotae a um novo sistema (ou nova tela do mesmo sistema), e quer obter automaticamente os seletores DOM (id, name, label, aria-label, placeholder) dos campos de formulário em vez de inspecionar manualmente um por um.
Caminho A — A partir de HTML estático¶
Passo 1: capturar HTML¶
Em qualquer formulário aberto no navegador:
- Abra o DevTools (F12)
- Aba Console
- Cole:
copy(document.documentElement.outerHTML)e pressione Enter - Crie um arquivo
formulario.htmlem qualquer pasta e cole o conteúdo
Passo 2: rodar extração¶
python scripts/extract-form-fields.py \
--input formulario.html \
--target-system "esus-aps-pec" \
--mapping-id "esus-novo-formulario" \
--output vocabularies/mappings/esus-novo-formulario.json
Saída: arquivo JSON pronto para virar mapping. Revise o campo source de cada entry (default "TBD" quando a heurística não reconhece) e edite vocabularies/mappings/esus-novo-formulario.json com os caminhos corretos do encounter (ex: encounter.soap.subjective).
Caminho B — A partir de HAR (HTTP Archive)¶
HAR é mais rico que HTML — registra todas as respostas HTML que o navegador recebeu durante uma sessão. Útil quando o formulário só aparece após login.
Passo 1: capturar HAR¶
- Abra DevTools (F12)
- Aba Network
- Limpe (🚫 Clear) e ative o gravador (●)
- Faça login + navegue até o formulário-alvo
- Botão direito em qualquer requisição → Save HAR with content
- Salva como
sessao.har
Passo 2: anonimizar o HAR (recomendado)¶
HAR contém cookies, tokens de auth e talvez body de POST com dados do paciente. Antes de versionar ou compartilhar:
python scripts/extract-form-fields.py \
--input sessao.har \
--anonymize-har \
--output sessao-anonimizada.har
O script remove:
- Todos os cookies (request e response)
- Headers Authorization, Cookie, Set-Cookie, X-Auth-Token, X-CSRF-Token
- Query params com nome token, password, senha, cpf, cns, auth, session
- Conteúdo de postData.text (substitui por <REDACTED>, mantém estrutura)
⚠️ Revise manualmente o HAR anonimizado antes de compartilhar — heurísticas podem não cobrir todos os campos sensíveis específicos do sistema.
Passo 3: extrair campos¶
python scripts/extract-form-fields.py \
--input sessao-anonimizada.har \
--target-system "sisreg" \
--mapping-id "sisreg-solicitacao" \
--output vocabularies/mappings/sisreg-solicitacao.json
O que sai¶
Arquivo JSON compatível com o resto do vocabularies/mappings/:
{
"id": "esus-novo-formulario",
"name": "TBD Mapping",
"target_system": "esus-aps-pec",
"target_version": "x.x",
"version": "0.1.0-draft",
"description": "Mapping rascunho gerado por scripts/extract-form-fields.py — REVISE 'source' e 'required' antes de usar.",
"fields": [
{
"source": "soap.subjective",
"target_selectors": [
{"type": "id", "value": "subjetivo"},
{"type": "label", "value": "Subjetivo"},
{"type": "name", "value": "subjetivo"},
{"type": "placeholder", "value": "Queixa..."}
],
"required": false,
"transform": null,
"_extractor_hints": {"tag": "textarea", "input_type": ""}
}
]
}
Heurísticas de propósito¶
O script tenta inferir o source (mapeamento para campo do encounter) por palavra-chave em id/name/aria-label/placeholder/label/title. Cobertura inicial (PT-BR + APS):
| Palavra-chave | Inferred purpose |
|---|---|
| subjetivo, queixa, anamnese, hda, antecedentes | soap.subjective |
| objetivo, exame físico, sinais vitais | soap.objective |
| avaliação, hipótese, diagnóstico | soap.assessment |
| conduta, plano, prescrição, orientação | soap.plan |
| cid / cid-10 | cid10_codes |
| ciap / ciap-2 | ciap2_codes |
| cns | professional_cns |
| cpf | professional_cpf |
| cnes | professional.cnes |
| nome completo | patient.full_name |
| nome (da) mãe | patient.mother_name |
| data (de) nascimento | patient.birth_date |
| prontuário | patient.record_number |
| justificativa | encounter.justification |
Quando a heurística falha, o script grava source: "TBD" — você revisa manualmente.
Para adicionar novas heurísticas, edite _PURPOSE_HEURISTICS em scripts/extract-form-fields.py.
Limitações¶
- Não executa JavaScript: campos renderizados dinamicamente (React/Angular após mount) só aparecem se você capturar HTML pós-render
- Não captura listeners: eventos
onChange, validaçõespatternetc não vão para o JSON - Heurísticas em PT-BR: campos com nomes em outras línguas viram
source: "TBD" <iframe>: HTML dentro de iframe não é seguido — capture o iframe separadamente
Próximos passos depois de gerar o mapping¶
- Renomear o arquivo para algo claro (
esus-aps-pec-atendimento-individual.json) - Revisar cada
source— substituir"TBD"pelo caminho correto do encounter - Marcar
required: truenos campos críticos (CIAP-2, conduta) - Remover
_extractor_hints(são só pistas para você; o engine não usa) - Testar: rodar a extensão Anotae no sistema-alvo e tentar injetar
- Se algo não bate → atualizar o mapping; se bate → commitar com mensagem
feat(mapping): suporte a <sistema/tela>
Mais¶
- Como configurar a extensão de navegador
- Integração SEI/DF
- Engine de mapping (Python):
anotae/core/mapping_engine.py - Engine de mapping (TS):
extension/shared/mapping-engine.ts