PlaybookAbrasio
Abrasiogov.brAutomaçãoAnti-botIntermediário

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.

8 de abril de 202612 min de leituraPor Scrape Technology

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.

Fingerprint

Por que Playwright, Selenium e Puppeteer falham

Veja o que acontece quando você usa automação convencional:

playwright_falha.py
# 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.

Bloqueio

O bloqueio não é permanente

O gov.br não bane IPs indefinidamente para automação convencional. Ele simplesmente não avança o fluxo de login. O loop é silencioso: você tenta, nada acontece, você tenta de novo, nada acontece.

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.

Fingerprint

Fingerprint

Login bem-sucedido

Tutorial

Você vai precisar de uma API key do Abrasio. Crie a sua gratuitamente no final do artigo.

1

Instalação

Instale o SDK do Abrasio via pip:

terminal
pip install abrasio

Configure sua API key como variável de ambiente. Você pode encontrá-la no seu dashboard do Abrasio:

terminal
export ABRASIO_API_KEY=sk_live_sua_chave_aqui

Nunca coloque sua API key no código

Use sempre variáveis de ambiente ou um gerenciador de secrets. A chave dá acesso à sua conta e ao seu saldo de requisições.
2

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:

govbr_login.py
"""
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

Uma lista de cookies de sessão autenticada no gov.br. Com esses cookies, você pode navegar para qualquer serviço que use o SSO do gov.br — DETRAN, Receita Federal, INSS, portais estaduais — sem precisar fazer o login novamente.
3

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":

consulta_veiculo.py
"""
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 gov.br exige código de autenticação de dois fatores em toda sessão nova. Em automações de produção, você tem duas opções: integrar com um autenticador TOTP (usando a secret key da conta) para gerar o código programaticamente, ou configurar o Abrasio com um profile persistente — assim a sessão é reaproveitada e o MFA só é solicitado novamente depois que a sessão expira.

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.