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-11Free 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 == 201Uso 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ário | SDK fakeforge-br | Algoritmo local |
|---|---|---|
| Só CPF simples | ✅ | ✅ |
| Pessoa correlacionada (nome+CPF+email) | ✅ | ❌ |
| Fintech (PIX+banco+cartão) | ✅ | ❌ |
| 100% offline | ❌ | ✅ |
| Zero deps runtime | ✅ | ✅ |
| Bulk 10k+ | ✅ 1 chamada | ⚠️ loop |
| Custo | Free 50/dia | R$0 |