A função
Monta a base (8 dígitos de raiz + a matriz 0001), calcula os dois verificadores pelo módulo 11 e devolve um CNPJ válido. Com alpha=True, a raiz vira alfanumérica.
Python
import random
_W1 = [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]
_W2 = [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]
_ALFABETO = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
def _dv_cnpj(base: str, pesos) -> int:
soma = sum((ord(c) - 48) * p for c, p in zip(base, pesos))
resto = soma % 11
return 0 if resto < 2 else 11 - resto
def generate_cnpj(alpha: bool = False, mask: bool = False) -> str:
if alpha:
raiz = ''.join(random.choice(_ALFABETO) for _ in range(8))
else:
raiz = ''.join(str(random.randint(0, 9)) for _ in range(8))
base = raiz + '0001' # matriz
d1 = _dv_cnpj(base, _W1)
d2 = _dv_cnpj(base + str(d1), _W2)
s = base + str(d1) + str(d2)
if mask:
return f'{s[0:2]}.{s[2:5]}.{s[5:8]}/{s[8:12]}-{s[12:14]}'
return s
generate_cnpj() # '11222333000181'
generate_cnpj(alpha=True, mask=True) # '12.ABC.345/0001-DE' → DV numéricoOs dois verificadores são sempre numéricos; só a raiz pode ter letras. A conversão ord(c) - 48 faz o mesmo módulo 11 valer para os dois formatos.
Forçar pelo menos uma letra
Como a raiz é sorteada, um generate_cnpj(alpha=True) pode sair só com dígitos (ainda válido). Se você quer garantir o formato novo na demonstração, troque uma posição por uma letra antes de calcular os DV:
Python
raiz = list(''.join(random.choice(_ALFABETO) for _ in range(8)))
i = random.randrange(8)
raiz[i] = random.choice('ABCDEFGHIJKLMNOPQRSTUVWXYZ')
raiz = ''.join(raiz)publicidade
Cuidados
- Válido ≠ real. O CNPJ gerado passa no módulo 11, mas não existe na Receita. É para teste e QA.
- Matriz é
0001. A função fixa a ordem da matriz; filiais seriam0002em diante — veja matriz e filial. - Alfanumérico: só maiúsculas e DV sempre numérico. Detalhes em CNPJ alfanumérico.
- No banco, use texto (
CHAR(14)/VARCHAR): coluna numérica quebra com letras.
Continue
Gerador verificado por execução: milhares de CNPJs (numéricos e alfanuméricos) gerados e validados pela função oficial, todos válidos. Algoritmo módulo 11 com ASCII−48. Revisado em 06/2026.