autor: George Marmelstein projeto: Sistema Marmelstein licenca: Todos os direitos reservados ano: 2026 name: criar-pje-download description: Cria skill de download do PJE para qualquer tribunal via engenharia reversa de HAR context: main agent: general-purpose allowed-tools: Read, Write, Bash
Criar Skill PJE Download
**HAR de Listagem (obrigatorio):**
```
1. Abra o PJE do seu tribunal no navegador
2. Faca login com certificado digital
3. Abra DevTools (F12) -> aba Network
4. Marque "Preserve log" para nao perder requisicoes
5. Navegue ate o Painel do Usuario
6. Aguarde carregar a lista de processos
7. Clique direito na lista -> "Save all as HAR"
8. Salve como: pje_listagem.har
```
**HAR de Download (recomendado):**
```
1. Com DevTools ainda aberto
2. Clique em um processo da lista
3. Solicite download dos autos digitais
4. Aguarde o PDF comecar a baixar
5. Salve novo HAR: pje_download.har
```
**Alternativa: Chrome MCP**
Se o usuario tiver Chrome MCP configurado:
```
1. Usar mcp__claude-in-chrome__read_network_requests
2. Navegar pelo PJE logado
3. Capturar requisicoes em tempo real
```
**Padroes comuns de URL:**
| Tribunal | Padrao 1G | Padrao 2G |
|----------|-----------|-----------|
| TRF1 | pje1g.trf1.jus.br | pje2g.trf1.jus.br |
| TRF2 | pje.trf2.jus.br | pje2g.trf2.jus.br |
| TRF3 | pje1g.trf3.jus.br | pje2g.trf3.jus.br |
| TRF4 | pje.trf4.jus.br | - |
| TRF5 | pje1g.trf5.jus.br | pje2g.trf5.jus.br |
| TRTs | pje.trtN.jus.br | - |
| TJs | pje.tjXX.jus.br | - |
**O que procurar no HAR:**
```python
# Buscar em entries[].request.url
# Filtrar por: /pje/seam/resource/rest/
# Exemplo: https://pje1g.trf5.jus.br/pje/seam/resource/rest/...
BASE_URL = extrair_dominio(url) # https://pje1g.trf5.jus.br
```
**Cookies universais do PJE:**
| Cookie | Funcao | Obrigatorio |
|--------|--------|-------------|
| JSESSIONID | Sessao do servidor | SIM |
| KEYCLOAK_IDENTITY | Token SSO | SIM (se usar Keycloak) |
| KEYCLOAK_SESSION | Sessao SSO | SIM (se usar Keycloak) |
| dtCookie | Monitoramento | Nao |
**Cookies especificos do tribunal:**
Procurar cookies com nome do tribunal (ex: `trf5017e3f72`).
Estes sao identificadores de sessao sticky/load balancer.
**O que procurar no HAR:**
```python
# Em entries[].request.cookies
# Listar todos os cookies unicos
# Marcar quais aparecem em TODAS as requisicoes bem-sucedidas
```
**Headers comuns do PJE:**
| Header | Valor Exemplo | Funcao |
|--------|---------------|--------|
| X-pje-legacy-app | pje-trf5-1g | Identificador da aplicacao |
| X-pje-usuario-localizacao | 12345 | ID da lotacao do usuario |
| X-pje-cookies | [cookie string] | Cookies em header (redundante) |
| Origin | https://pje1g.trf5.jus.br | CORS |
| Referer | https://frontend-prd.trf5.jus.br/ | Pagina de origem |
**ATENCAO: Authorization**
```
NUNCA enviar header Authorization com Bearer token para endpoints de download!
A API REST do PJE usa APENAS cookies para autenticacao de sessao.
Enviar Authorization causa erro 401.
```
**O que procurar no HAR:**
```python
# Em entries[].request.headers
# Filtrar headers que comecam com "X-pje"
# Anotar valores estaticos vs dinamicos
```
**Endpoints REST (JSON):**
```
# Listagem de processos
GET /pje/seam/resource/rest/pje-legacy/painelUsuario/recuperarProcessosTarefaPendenteComCriterios/{tarefa}/false
# Gerar chave de acesso
GET /pje/seam/resource/rest/pje-legacy/painelUsuario/gerarChaveAcessoProcesso/{idProcesso}
# Buscar por numero CNJ
GET /pje/seam/resource/rest/pje-legacy/api/processoPublico/consultarProcessoPorNumero/{numeroCNJ}
```
**Endpoints JSF (HTML/PDF):**
```
# Lista de autos digitais (HTML com ViewState)
GET /pje/Processo/ConsultaProcesso/Detalhe/listAutosDigitais.seam?ca={chaveAcesso}
# Download de documento
GET /pje/Processo/ConsultaDocumento/listView.seam?idProcessoDocumento={id}
```
**O que procurar no HAR:**
```python
# Filtrar entries por:
# - URL contem "/pje/seam/resource/rest/" (API REST)
# - URL contem ".seam" (paginas JSF)
# - mimeType == "application/pdf" (downloads)
```
**Criar: config_tribunal.json**
```json
{
"tribunal": "TRF1",
"instancia": "1g",
"base_url": "https://pje1g.trf1.jus.br",
"frontend_url": "https://frontend-prd.trf1.jus.br",
"headers": {
"X-pje-legacy-app": "pje-trf1-1g",
"Origin": "https://pje1g.trf1.jus.br"
},
"cookies_obrigatorios": [
"JSESSIONID",
"KEYCLOAK_IDENTITY",
"trf1xxxxxxxx"
],
"endpoints": {
"listar_processos": "/pje/seam/resource/rest/pje-legacy/painelUsuario/recuperarProcessosTarefaPendenteComCriterios/{tarefa}/false",
"gerar_chave": "/pje/seam/resource/rest/pje-legacy/painelUsuario/gerarChaveAcessoProcesso/{id}",
"autos_digitais": "/pje/Processo/ConsultaProcesso/Detalhe/listAutosDigitais.seam"
},
"tarefas": {
"sentenca": "Elaboração de Sentença - Minutar",
"decisao": "Elaboração de decisão - Minutar"
}
}
```
**Arquivo: criar script de listagem**
```python
# Substituir no template:
# - BASE_URL = config["base_url"]
# - X-pje-legacy-app = config["headers"]["X-pje-legacy-app"]
# - Referer/Origin = config["frontend_url"]
```
**Consultar referencias:**
- `references/template-listar.py` - Template do script de listagem
- `references/template-baixar.py` - Template do script de download
**Estrutura de saida:**
```
.claude/skills/pje-download-{tribunal}/
├── SKILL.md
├── config.json
└── scripts/
├── listar_processos.py
├── baixar_pdfs.py
└── extrair_cookies_har.py
```
**Checklist de validacao:**
- [ ] Extrai cookies do HAR corretamente
- [ ] Lista processos da fila escolhida
- [ ] Obtem chave de acesso do processo
- [ ] Baixa PDF dos autos digitais
- [ ] Trata erro de sessao expirada
**Teste minimo:**
```bash
# 1. Extrair cookies
python scripts/extrair_cookies_har.py --har ~/Downloads/pje.har --output session.json
# 2. Listar 1 processo
python scripts/listar_processos.py --cookies session.json --limite 1
# 3. Baixar 1 processo
python scripts/baixar_pdfs.py --cookies session.json --processos processos.json --limite 1
```
Ambas compartilham cookies, mas a sessao JSF expira mais rapido (~30min).
**Descobertas:**
- BASE_URL: https://pje1g.trf1.jus.br
- Cookie especifico: trf1a7b8c9d0
- Header: X-pje-legacy-app: pje-trf1-1g
**Saida:** Skill pje-download-trf1 funcional
**Descobertas:**
- Autenticacao via JSESSIONID apenas
- Cookie de sessao: TJSPJSESSIONID
- Sem headers X-pje (versao mais antiga)
**Adaptacao:** Script simplificado sem validacao Keycloak
Sistema Marmelstein | George Marmelstein | Todos os direitos reservados | 2026