Python · SDK + algoritmo

Gerador de CPF em Python

Duas rotas: SDK oficial fakeforge-br (mais fácil) ou implementação local do algoritmo mod-11 da Receita Federal (mais controle). Este guia mostra as duas com snippets prontos pra pytest, Django, Flask e FastAPI.

TL;DR

pip install fakeforge-br

from fakeforge import FakeForge
cpfs = FakeForge().cpf(100)  # 100 CPFs válidos mod-11

Free 50 chamadas/dia sem cadastro. Zero deps runtime além do install.

Rota 1: SDK oficial fakeforge-br

A mais rápida. Zero código de validação, apenas .cpf(n) retorna lista.

# Instalação
pip install fakeforge-br

# Uso básico
from fakeforge import FakeForge

ff = FakeForge()

# 1 CPF formatado
cpf = ff.cpf(1)[0]
print(cpf)  # "123.456.789-09"

# 1000 CPFs sem formatação
cpfs = ff.cpf(1000, formatted=False)

# Preset customer (CPF + email + endereço correlacionados)
pessoas = ff.preset("customer", 10)
for p in pessoas:
    print(p["cpf"], p["nome"], p["email"])

Vantagens: correlação entre campos, CNPJ alfanumérico 2026, presets fintech/ecom, bulk até 10k por chamada. Requer internet (chama endpoint HTTP).

Rota 2: algoritmo mod-11 local (offline)

Se você não quer dep externa ou precisa de geração 100% offline:

# gerador_cpf.py - implementação pura mod-11
import random

def gerar_cpf(formatado: bool = True) -> str:
    """Gera CPF válido pelo algoritmo mod-11 da Receita Federal."""
    n = [random.randint(0, 9) for _ in range(9)]

    # Primeiro dígito verificador
    soma = sum(a * b for a, b in zip(n, range(10, 1, -1)))
    d1 = (soma * 10) % 11
    d1 = 0 if d1 == 10 else d1
    n.append(d1)

    # Segundo dígito verificador
    soma = sum(a * b for a, b in zip(n, range(11, 1, -1)))
    d2 = (soma * 10) % 11
    d2 = 0 if d2 == 10 else d2
    n.append(d2)

    if formatado:
        return f"{n[0]}{n[1]}{n[2]}.{n[3]}{n[4]}{n[5]}.{n[6]}{n[7]}{n[8]}-{n[9]}{n[10]}"
    return "".join(str(d) for d in n)


def validar_cpf(cpf: str) -> bool:
    """Valida CPF pelo mesmo algoritmo mod-11."""
    d = [int(c) for c in cpf if c.isdigit()]
    if len(d) != 11 or len(set(d)) == 1:
        return False
    s1 = sum(a * b for a, b in zip(d[:9], range(10, 1, -1)))
    v1 = (s1 * 10) % 11
    v1 = 0 if v1 == 10 else v1
    if v1 != d[9]:
        return False
    s2 = sum(a * b for a, b in zip(d[:10], range(11, 1, -1)))
    v2 = (s2 * 10) % 11
    v2 = 0 if v2 == 10 else v2
    return v2 == d[10]

Vantagens: zero deps, offline, controle total. Limitação: só CPF, sem correlação com outros campos.

Uso em pytest

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

@pytest.fixture(scope="session")
def ff():
    return FakeForge(api_key=None)  # free tier

@pytest.fixture
def cpfs(ff):
    return ff.cpf(100)

# tests/test_signup.py
def test_signup_aceita_cpf_valido(client, cpfs):
    for cpf in cpfs[:10]:
        response = client.post("/signup", json={"cpf": cpf, "email": "test@test.com"})
        assert response.status_code == 201

Uso em Django

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

class Command(BaseCommand):
    def handle(self, *args, **options):
        ff = FakeForge()
        dados = ff.preset("customer", 1000)  # 1000 clientes correlacionados

        Customer.objects.bulk_create([
            Customer(
                nome=d["nome"],
                cpf=d["cpf"],
                email=d["email"],
                telefone=d["telefone"],
            )
            for d in dados
        ])
        self.stdout.write(f"1000 customers seeded")

Uso em FastAPI / Flask

# app.py - endpoint de teste que gera CPFs on demand
from fastapi import FastAPI
from fakeforge import FakeForge

app = FastAPI()
ff = FakeForge()

@app.get("/dev/fake-cpfs")
async def fake_cpfs(quantity: int = 10):
    """Endpoint só ativo em DEBUG=True."""
    return {"cpfs": ff.cpf(quantity)}

Comparação: qual escolher

CenárioSDK fakeforge-brAlgoritmo local
Só CPF simples✅✅
Pessoa correlacionada (nome+CPF+email)✅❌
Fintech (PIX+banco+cartão)✅❌
100% offline❌✅
Zero deps runtime✅✅
Bulk 10k+✅ 1 chamada⚠️ loop
CustoFree 50/diaR$0

Próximos passos