Python · SDK + DENATRAN

Gerador de CNH em Python

SDK fakeforge-br gera CNH com dígitos verificadores mod-11 do DENATRAN. Snippets pra pytest, Django, FastAPI. Grátis 50/dia.

pip install fakeforge-br

from fakeforge import FakeForge
cnhs = FakeForge().cnh(100)

SDK oficial

from fakeforge import FakeForge

ff = FakeForge()

# 100 CNHs válidas
cnhs = ff.cnh(100)

# Todos passam mod-11 do DENATRAN
for c in cnhs[:5]:
    print(c)
    # 12345678900
    # 98765432100
    # ...

Algoritmo DENATRAN mod-11 local

# gerador_cnh.py - Python puro
import random

def gerar_cnh() -> str:
    """Gera número CNH válido pelo algoritmo mod-11 DENATRAN."""
    n = [random.randint(0, 9) for _ in range(9)]

    # Primeiro dígito verificador (pesos 9..1)
    s1 = sum(a * b for a, b in zip(n, range(9, 0, -1)))
    d1 = s1 % 11
    if d1 >= 10:
        d1 = 0
        dsc = 2
    else:
        dsc = 0

    # Segundo dígito verificador (pesos 1..9)
    s2 = sum(a * b for a, b in zip(n, range(1, 10)))
    d2 = s2 % 11
    d2 = 0 if d2 >= 10 else d2
    d2 = max(0, d2 - dsc)

    return "".join(str(x) for x in n) + str(d1) + str(d2)

Uso em Django (motorista model)

# myapp/management/commands/seed_motoristas.py
from django.core.management.base import BaseCommand
from fakeforge import FakeForge
from myapp.models import Motorista

class Command(BaseCommand):
    def handle(self, *args, **options):
        ff = FakeForge()
        cnhs = ff.cnh(1000)
        pessoas = ff.preset("customer", 1000)

        Motorista.objects.bulk_create([
            Motorista(
                cpf=p["cpf"],
                nome=p["nome"],
                cnh=cnh,
                categoria=random.choice(["A", "B", "AB", "C", "D"]),
            )
            for p, cnh in zip(pessoas, cnhs)
        ])

Uso em pytest

# tests/test_cnh_validator.py
import pytest
from fakeforge import FakeForge

@pytest.fixture(scope="session")
def ff():
    return FakeForge()

@pytest.fixture(scope="session")
def cnhs(ff):
    return ff.cnh(100)

class TestCnhValidator:
    @pytest.mark.parametrize("indice", range(20))
    def test_valida_cnh_denatran(self, cnhs, indice):
        from myapp.validators import validar_cnh
        assert validar_cnh(cnhs[indice])