Como automatizar o login no gov.br(e por que todo scraper falha antes de você)
O gov.br usa hCaptcha, fingerprinting de navegador e bloqueio por IP. Playwright, Selenium e Puppeteer falham silenciosamente. Este tutorial mostra como resolver tudo isso com Abrasio e sair com uma sessão autenticada — pronta para consultas veiculares, extração de documentos e preenchimento de guias.
O problema que ninguém fala abertamente
Toda semana, algum desenvolvedor ou analista de dados tenta automatizar algo no gov.br e bate na mesma parede invisível. Não aparece um aviso claro. Não tem mensagem de erro explicativa. O Selenium simplesmente fica parado na tela de login. O Playwright abre a página, digita o CPF e... nada acontece. O processo trava antes mesmo do hCaptcha aparecer.
O problema não é o seu código. É o detector de bots.
O gov.br é o SSO (Single Sign-On) que protege mais de 1.800 serviços públicos federais e estaduais. Para entrar no DETRAN-MG, na Receita Federal, no INSS, no Meu INSS, no portal da CNH, no SINARM ou em qualquer sistema que use "Entrar com gov.br" — você precisa passar por esse login primeiro.
E as razões para querer automatizar esse acesso são completamente legítimas:
- Despachantes e escritórios de transporte que consultam situação de dezenas de veículos por dia
- Empresas de logística que precisam verificar habilitação e pontuação de motoristas
- Contabilidades que emitem GRU e DARF para múltiplos clientes
- Escritórios de advocacia que acompanham processos no PROJUDI e tribunais estaduais
- Empresas de RH que validam informações no eSocial
- Prestadores de serviço que precisam emitir notas no sistema de NFS-e de múltiplos municípios
- Desenvolvedores que constroem ferramentas internas para acelerar processos burocráticos
Em todos esses casos, o gargalo é o mesmo: o login. Uma vez autenticado, você pode navegar por qualquer serviço vinculado ao gov.br. Mas chegar lá com automação convencional é quase impossível — e é exatamente o que vamos resolver aqui.
O que realmente protege o gov.br
Antes de mostrar a solução, vale entender o que está do outro lado. O gov.br não usa apenas um mecanismo de proteção — usa pelo menos quatro camadas simultâneas:
hCaptcha
O hCaptcha é um sistema de verificação que funciona de forma semelhante ao reCAPTCHA, mas com uma abordagem mais avançada de detecção de robôs. Ele analisa o comportamento do usuário e pode exigir interações visuais para confirmar que é um humano.
Fingerprinting de navegador
O Chrome lançado pelo Playwright, Selenium ou Puppeteer tem uma assinatura digital diferente de um Chrome real. O navigator.webdriver está marcado como true, as strings de WebGL revelam que não há GPU real, o canvas retorna valores idênticos entre execuções (sem ruído), e os plugins padrão do usuário estão ausentes.
Análise de IP e geolocalização
IPs de datacenters (AWS, GCP, Azure, DigitalOcean) são bloqueados automaticamente. O gov.br espera IPs residenciais brasileiros. Se você tenta de um servidor ou de fora do Brasil, o sistema já sabe antes de você digitar qualquer coisa.
Análise comportamental
Velocidade de digitação constante (delay=0 ou delay fixo), mouse que vai diretamente ao campo sem movimento prévio, ausência de scroll, sessão nova sem cookies anteriores — qualquer um desses padrões levanta um sinal.

Por que Playwright, Selenium e Puppeteer falham
Veja o que acontece quando você usa automação convencional:
# O que acontece com Playwright puro no gov.br:
from playwright.async_api import async_playwright
async with async_playwright() as p:
browser = await p.chromium.launch(headless=True)
page = await browser.new_page()
await page.goto("https://sso.acesso.gov.br/login")
# Resultado: bloqueio imediato
# O gov.br detecta:
# navigator.webdriver = true → identifica automação
# Headless Chrome fingerprint → sem plugins, sem GPU real
# IP de datacenter → não é IP residencial brasileiro
# Ausência de histórico → novo perfil sem cookies anteriores
# Velocidade de digitação → 0ms entre teclas (robótico)O navegador abre, a página carrega, mas o hCaptcha já analisou o fingerprint e tomou a decisão. Sem resposta visual, sem mensagem de erro — o formulário simplesmente não avança.

O bloqueio não é permanente
A solução: Abrasio
O Abrasio é um browser service construído especificamente para esse tipo de cenário. Ele combina três tecnologias para passar por essas defesas:
Fingerprint-patched Chromium
Um Chromium modificado onde navigator.webdriver é removido, as strings de WebGL e Canvas recebem ruído realista, os headers HTTP são normalizados e os plugins padrão estão presentes. A assinatura digital é de um Chrome real.
IPs residenciais brasileiros
Cada sessão usa um IP residencial na região BR por padrão. O gov.br enxerga uma conexão normal de um cidadão brasileiro, não um servidor.
Simulação de comportamento humano
As funções human_type(), human_wait(), human_scroll() e simulate_reading() replicam os padrões de um usuário real: variação no delay de teclas, movimento de mouse com curvas de Bézier, pausas aleatórias entre ações.



Tutorial
Você vai precisar de uma API key do Abrasio. Crie a sua gratuitamente no final do artigo.
Instalação
Instale o SDK do Abrasio via pip:
pip install abrasioConfigure sua API key como variável de ambiente. Você pode encontrá-la no seu dashboard do Abrasio:
export ABRASIO_API_KEY=sk_live_sua_chave_aquiNunca coloque sua API key no código
Login no gov.br
O fluxo de login do gov.br tem três etapas: CPF → senha → código MFA (autenticador ou SMS). O código abaixo encapsula esse fluxo em uma função que retorna os cookies da sessão autenticada:
"""
Tutorial: Login automatizado no gov.br com Abrasio
Instalação:
pip install abrasio
Configuração:
export ABRASIO_API_KEY=sk_live_sua_chave_aqui
"""
import asyncio
import os
from abrasio import Abrasio
from abrasio.utils import human_type, human_wait
async def login_govbr(cpf: str, senha: str, otp_callback=None) -> list:
"""
Faz login no gov.br e retorna os cookies da sessão autenticada.
Args:
cpf: CPF do cidadão (apenas números)
senha: Senha do acesso gov.br
otp_callback: Função chamada para obter o código OTP.
Se None, solicita via input().
Returns:
Lista de cookies da sessão autenticada.
"""
api_key = os.getenv("ABRASIO_API_KEY")
if not api_key:
raise ValueError("Configure a variável de ambiente ABRASIO_API_KEY")
async with Abrasio(
api_key=api_key,
region="br", # IP brasileiro — obrigatório para o gov.br
device="desktop",
headless=False, # Use True em produção
humanize=True, # Simula comportamento humano (mouse, teclado)
) as browser:
page = await browser.new_page()
# 1. Navegar para o SSO do gov.br
await page.goto(
"https://sso.acesso.gov.br/login",
wait_until="domcontentloaded"
)
await page.wait_for_selector("#accountId")
# 2. Digitar CPF com timing humano (evita detecção por velocidade de digitação)
await human_type(page, cpf, "#accountId")
await page.locator("#enter-account-id").click()
# 3. Aguardar o campo de senha aparecer e digitar
await human_wait(2, 4)
await page.locator("#password").wait_for(state="visible")
await page.keyboard.type(senha, delay=100)
await page.locator("#submit-button").click()
# 4. Fechar o popup de aviso e inserir código OTP/MFA
await page.wait_for_selector(".gdd-close-btn")
await page.locator(".gdd-close-btn").click()
await page.locator("#otpInput").wait_for(state="visible")
# Obter código OTP (via callback ou input interativo)
if otp_callback:
codigo = await otp_callback()
else:
codigo = input("Digite o código MFA do gov.br: ")
await page.keyboard.type(codigo, delay=100)
await page.locator("#enter-offline-2fa-code").click()
# 5. Sessão autenticada — capturar e retornar cookies
cookies = await page.context.cookies()
print(f"✓ Login realizado com sucesso. {len(cookies)} cookies capturados.")
await page.screenshot(path="govbr_sessao.png", full_page=True)
return cookies
if __name__ == "__main__":
import asyncio
async def main():
cookies = await login_govbr(
cpf=input("CPF (apenas números): "),
senha=input("Senha: "),
)
print(f"\nCookies da sessão: {len(cookies)}")
for c in cookies:
print(f" {c['name']}: {c['value'][:30]}...")
asyncio.run(main())O que você tem agora
Exemplo real: consulta de situação de veículo
Com a sessão autenticada, veja como fazer uma consulta de situação de veículo no portal cidadão do estado de Minas Gerais. O mesmo padrão se aplica a qualquer outro serviço que use "Entrar com gov.br":
"""
Exemplo: Consulta de situação de veículo no Detran-MG
usando a sessão gov.br já autenticada.
"""
import asyncio
import os
from abrasio import Abrasio
from abrasio.utils import human_wait, human_scroll, human_click, simulate_reading
async def consultar_veiculo(placa: str, chassi: str) -> dict:
"""
Consulta a situação de um veículo no portal cidadão do MG.
Requer autenticação via gov.br (SSO).
Returns:
Dicionário com os dados do veículo retornados pela API do Detran.
"""
api_key = os.getenv("ABRASIO_API_KEY")
async with Abrasio(
api_key=api_key,
region="br",
device="desktop",
headless=False,
humanize=True,
) as browser:
page = await browser.new_page()
# Navegar para o portal cidadão — o gov.br SSO já está em sessão
await page.goto(
"https://cidadao.mg.gov.br/#/login",
wait_until="domcontentloaded"
)
await human_wait(5, 7)
# Aceitar cookies do portal
await page.locator(
"p-button:nth-child(2) > button"
).click()
# Clicar em "Entrar com gov.br"
await page.locator(".govBrBtn").wait_for(state="visible")
await page.locator(".govBrBtn").click()
# Navegar até "Veículos e Condutores (Trânsito)"
await page.wait_for_selector(
"//*[contains(text(), 'Veículos e Condutores (Trânsito)')]"
)
await page.locator(
"//*[contains(text(), 'Veículos e Condutores (Trânsito)')]"
).click()
await human_wait(2, 3)
await simulate_reading(page, 5, 10)
await human_scroll(page, 0, 2000)
# Clicar em "Situação do Veículo"
await human_click(page, "//*[contains(text(), 'Situação do Veículo')]")
await simulate_reading(page, 2, 4)
# Preencher placa e chassi com comportamento humano
await human_click(page, "#placa")
await human_wait(1, 2)
from abrasio.utils import human_type
await human_type(page, placa, "#placa")
await human_type(page, chassi, "#chassi")
# Interceptar a resposta da API antes de clicar em consultar
async with page.expect_response(
lambda r: "veiculos/situacao" in r.url,
timeout=90000
) as response_info:
await simulate_reading(page, 7, 15)
await page.locator("button[type='submit']").click()
response = await response_info.value
dados = await response.json()
if dados.get("mensagem") == "Acesso Negado":
raise PermissionError("Sessão expirada ou acesso negado pelo portal.")
return dados
if __name__ == "__main__":
async def main():
resultado = await consultar_veiculo(
placa="ABC1234",
chassi="9BWXX00X0XX000000",
)
import json
print(json.dumps(resultado, indent=2, ensure_ascii=False))
asyncio.run(main())Sobre o MFA
O que você pode construir com isso
A sessão autenticada no gov.br é a chave para uma série de automações que antes eram impossíveis ou exigiam intervenção manual constante:
Consulta em lote de veículos
Passe uma lista de placas e chassi e obtenha a situação de cada um automaticamente. Ideal para despachantes e transportadoras.
Verificação de CNH
Consulte pontuação, validade e categoria de motoristas via DETRAN online. Útil para empresas de logística e frotas.
Emissão de GRU/DARF
Automatize a geração de guias de recolhimento federal para múltiplos clientes, integrando com sistemas de contabilidade.
Extração de certidões
Baixe Certidão Negativa de Débitos, comprovantes do INSS e outros documentos automaticamente, sem intervenção humana.
Acompanhamento de processos
Monitore andamentos processuais em tribunais e sistemas jurídicos estaduais que usam o gov.br como autenticação.
Integração com ERPs
Alimente sistemas internos com dados governamentais em tempo real, eliminando retrabalho manual de consulta e digitação.
Comece agora com o Abrasio
Crie sua API key gratuitamente e rode o código deste tutorial em menos de 5 minutos.