Python · SDK + algoritmo
Gerador de Título de Eleitor em Python
Para gerar título de eleitor válido em Python, instale pip install fakeforge-br e chame FakeForge().titulo_eleitor(n), ou calcule localmente os 12 dígitos do padrão TSE: 8 sequenciais, 2 de código de UF e 2 verificadores em mod-11. O guia traz o SDK, o algoritmo e testes prontos.
TL;DR
pip install fakeforge-br
from fakeforge import FakeForge
titulos = FakeForge().titulo_eleitor(100) # 100 títulos válidos, UF sorteadaFree 50 chamadas/dia sem cadastro. Versão no navegador: Gerador de Título de Eleitor.
Como gerar título de eleitor em Python com o SDK?
.titulo_eleitor(n) devolve uma lista de strings.
from fakeforge import FakeForge
ff = FakeForge()
# 1 título formatado (grupos de 4 pra leitura)
titulo = ff.titulo_eleitor(1)[0]
print(titulo) # "3847 5921 0213"
# 1000 títulos só com os 12 dígitos
titulos = ff.titulo_eleitor(1000, formatted=False)
# Pessoa de teste: CPF + título
cpfs = ff.cpf(10)
titulos = ff.titulo_eleitor(10)
eleitores = list(zip(cpfs, titulos))Requer internet, porque o SDK chama o endpoint HTTP. A UF de cada título é sorteada e o SDK não tem parâmetro pra fixá-la. Quando o teste exige um estado específico, use o algoritmo da próxima seção.
Qual é o algoritmo do título de eleitor em Python?
O título tem 12 dígitos: NNNNNNNN UU D1 D2. O primeiro dígito verificador usa os 8 sequenciais com pesos 2 a 9. O segundo usa os 2 dígitos da UF e o primeiro verificador com pesos 7, 8 e 9. Versão offline, sem dependência:
# titulo_eleitor.py - implementação pura, offline
import random
# Código de UF do título (TSE): 01 a 28
UFS = {
"SP": "01", "MG": "02", "RJ": "03", "RS": "04", "BA": "05",
"PR": "06", "CE": "07", "PE": "08", "SC": "09", "GO": "10",
"MA": "11", "PB": "12", "PA": "13", "ES": "14", "PI": "15",
"RN": "16", "AL": "17", "MT": "18", "MS": "19", "DF": "20",
"SE": "21", "AM": "22", "RO": "23", "AC": "24", "AP": "25",
"RR": "26", "TO": "27", "ZZ": "28", # ZZ = exterior
}
def calcula_dv(digitos: list[int], pesos, cod_uf: str) -> int:
dv = sum(d * p for d, p in zip(digitos, pesos)) % 11
if dv == 10:
dv = 0
if dv == 0 and cod_uf in ("01", "02"): # regra SP e MG
dv = 1
return dv
def gera_titulo_eleitor(uf: str = "SP") -> str:
cod = UFS[uf]
base = [random.randint(0, 9) for _ in range(8)]
dv1 = calcula_dv(base, range(2, 10), cod)
dv2 = calcula_dv([int(cod[0]), int(cod[1]), dv1], (7, 8, 9), cod)
return "".join(map(str, base)) + cod + str(dv1) + str(dv2)
def valida_titulo_eleitor(titulo: str) -> bool:
d = "".join(c for c in titulo if c.isdigit())
if len(d) != 12 or len(set(d)) == 1:
return False
cod = d[8:10]
if cod not in UFS.values():
return False
n = [int(c) for c in d]
ok1 = calcula_dv(n[:8], range(2, 10), cod) == n[10]
ok2 = calcula_dv([n[8], n[9], n[10]], (7, 8, 9), cod) == n[11]
return ok1 and ok2Vantagens: zero deps, offline e UF à sua escolha. Limitação: só o título, sem zona ou seção eleitoral e sem correlação com o resto da pessoa.
Como testar título de eleitor em pytest?
# tests/test_titulo_eleitor.py
import pytest
from titulo_eleitor import UFS, gera_titulo_eleitor, valida_titulo_eleitor
@pytest.mark.parametrize("uf", list(UFS))
def test_titulo_gerado_passa_no_validador(uf):
for _ in range(100):
assert valida_titulo_eleitor(gera_titulo_eleitor(uf))
@pytest.mark.parametrize("uf", ["SP", "MG"])
def test_ufs_com_regra_especial(uf):
# 2000 títulos garantem casos de resto 0 nos dois estados
for _ in range(2000):
assert valida_titulo_eleitor(gera_titulo_eleitor(uf))
def test_codigo_uf_fica_nas_posicoes_9_e_10():
assert gera_titulo_eleitor("MG")[8:10] == "02"
def test_validador_rejeita_dv_adulterado():
titulo = gera_titulo_eleitor("RJ")
dv_errado = str((int(titulo[-1]) + 1) % 10)
assert not valida_titulo_eleitor(titulo[:-1] + dv_errado)
def test_validador_rejeita_uf_inexistente():
assert not valida_titulo_eleitor("123456789912") # UF 99Como popular um banco Django com título de eleitor?
# cadastro/management/commands/seed_eleitores.py
from django.core.management.base import BaseCommand
from fakeforge import FakeForge
from cadastro.models import Eleitor
class Command(BaseCommand):
help = "Cria eleitores de teste com CPF e título válidos"
def add_arguments(self, parser):
parser.add_argument("--qtd", type=int, default=500)
def handle(self, *args, **options):
qtd = options["qtd"]
ff = FakeForge()
cpfs = ff.cpf(qtd, formatted=False)
titulos = ff.titulo_eleitor(qtd, formatted=False)
nomes = ff.full_name(qtd)
Eleitor.objects.bulk_create(
[Eleitor(nome=n, cpf=c, titulo=t) for n, c, t in zip(nomes, cpfs, titulos)],
ignore_conflicts=True,
)
self.stdout.write(f"{qtd} eleitores criados")SDK ou algoritmo local: qual escolher?
| Cenário | SDK fakeforge-br | Algoritmo local |
|---|---|---|
| Só título simples | Sim | Sim |
| Escolher a UF do título | Não (UF sorteada) | Sim |
| Pessoa correlacionada (nome + CPF) | Sim | Não |
| 100% offline | Não | Sim |
| Zero deps runtime | Sim | Sim |
| Bulk 10k+ | 1 chamada | Loop |
| Custo | Free 50/dia | R$0 |
Mais volume ou mais itens por chamada? Veja os planos.
Perguntas frequentes
Como gerar título de eleitor válido em Python?+
Instale pip install fakeforge-br e chame FakeForge().titulo_eleitor(n). Sem SDK, sorteie 8 dígitos, acrescente o código da UF (01 a 28), calcule o primeiro dígito verificador com pesos 2 a 9 e o segundo com pesos 7, 8 e 9 sobre o código da UF mais o primeiro dígito.
Qual é a estrutura do título de eleitor?+
12 dígitos: 8 sequenciais, 2 do código da UF de inscrição (01 SP, 02 MG, 03 RJ e assim por diante até 28 para o exterior) e 2 dígitos verificadores. O formato é definido pelo TSE (Tribunal Superior Eleitoral).
Qual a regra especial dos dígitos verificadores para SP e MG?+
Nos dois cálculos, se o resto da divisão por 11 for 10, o dígito vira 0. Quando a UF é 01 (SP) ou 02 (MG) e o resto é 0, o dígito vira 1. Esquecer essa regra gera títulos inválidos justamente nos dois estados mais populosos.
Dá pra escolher a UF do título gerado?+
Com o algoritmo local, sim: gera_titulo_eleitor('MG') fixa o código 02. O SDK sorteia a UF entre as 28 possíveis a cada título, sem parâmetro para fixá-la. Se o seu teste precisa de um estado específico, use o algoritmo local.
O título de eleitor gerado pertence a alguém?+
Não. O número é sorteado e só passa na conta dos dígitos verificadores. Não está vinculado a nenhum eleitor, zona ou seção do TSE. Use apenas em testes de formulário, validação e cadastro, nunca para se passar por eleitor.