Skip to content

Instantly share code, notes, and snippets.

@rodorgas
Created April 15, 2016 00:22
Show Gist options
  • Save rodorgas/af53ce362a2129d2f2806110f65fb8a9 to your computer and use it in GitHub Desktop.
Save rodorgas/af53ce362a2129d2f2806110f65fb8a9 to your computer and use it in GitHub Desktop.
import requests
import random
from bs4 import BeautifulSoup
from time import sleep
def gera_digitos_verificadores(cpf_parcial):
"""Gera os dois últimos dígitos (verificadores) do CPF
Args:
cpf_parcial: contendo apenas os 9 primeiros dígitos
Returns:
CPF com dígitos de verficação válidos
"""
vCpf = [0 for x in range(11)]
for k in range(9): vCpf[k] = int(cpf_parcial[k])
for k in range(9): vCpf[9] = (vCpf[9] + vCpf[k]*(k+1)) % 11
vCpf[9] = vCpf[9] % 10
for k in range(10): vCpf[10] = (vCpf[10] + vCpf[k]*k) % 11
vCpf[10] = vCpf[10] % 10
return ''.join(str(x) for x in vCpf)
def gera_possibilidades(cpf_parcial):
"""
Args:
cpf_parcial: primeiros 9 dígitos do CPF substituindo os dígitos
indeterminados por x (ex: 000000xxx)
"""
cpf = [0 for x in range(11)]
# list com as posições dos dígitos indeterminados
pos_digito_indet = []
for i in range(9):
if cpf_parcial[i] == 'x':
pos_digito_indet.append(i)
else:
cpf[i]= int(cpf_parcial[i])
indet = [0 for x in pos_digito_indet] # [0, 0]
cpfs = []
while indet[0] < 10:
qtd_digitos_indet = len(pos_digito_indet)
for i in range(qtd_digitos_indet):
if indet[qtd_digitos_indet-i-1] == 10 and i < qtd_digitos_indet-1:
indet[qtd_digitos_indet-i-1] = 0
indet[qtd_digitos_indet-i-2] += 1
if indet[0] != 10:
for i in range(qtd_digitos_indet):
cpf[pos_digito_indet[i]] = indet[i]
cpfs.append(gera_digitos_verificadores(cpf))
indet[qtd_digitos_indet-1] += 1
return cpfs
def consulta(cpf):
"""Consulta o CPF no tudosobretodos.se
Returns:
Nome exibido na consulta
"""
url = 'http://tudosobretodos.se/' + cpf
headers = {
'Accept-Encoding': 'gzip, deflate, sdch',
'Accept-Language': 'pt-BR,pt;q=0.8,en-US;q=0.6,en;q=0.4,es;q=0.2',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_4)'
' AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.89'
' Safari/537.36',
'HTTPS': '1',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,'
'image/webp,*/*;q=0.8',
'Referer': 'http://tudosobretodos.se/',
'Cookie': '_ga=GA1.2.83130429.1437960858; _gat=1',
'Connection': 'keep-alive',
}
r = requests.get(url, headers=headers, proxies=proxies)
soup = BeautifulSoup(r.text)
nome = soup.find('h1', {'class': 'textoTituloDetalhesPessoa'})
if nome:
return nome.text
else:
return 'CPF não consta na base'
if __name__ == "__main__":
cpf_parcial = input('CPF: ')
nome = input('Nome: ').upper()
cpfs = gera_possibilidades(cpf_parcial)
for cpf in cpfs[500:]:
nome_consulta = consulta(cpf)
print('CPF: {} Nome: {}'.format(cpf, nome_consulta))
if nome_consulta.startswith(nome):
print('CPF bate com o nome :D')
input('\nPressione enter pra continuar...')
# Adiciona um pouco de entropia no tempo entre as consultas
# (para burlar possíveis mecanismos de identificação de robôs)
# seed = random.random() * 2 # de 0 a 5s
# sleep(1 + seed)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment