catbean.pages.dev

Como validar CPF em linha de log com timestamp e IP?

Validar CPFs em logs de forma automática é essencial para garantir a integridade dos dados e evitar fraudes. Este método combina expressões regulares para extrair os dados e um algoritmo de validação para confirmar a autenticidade do CPF, tudo em uma única linha de comando ou script.

Pré-requisitos

Passo 1: Extrair dados do log com expressão regular

Utilize uma expressão regular para capturar o timestamp, o IP e o CPF em cada linha do log. O padrão abaixo assume que o log está no formato: "2023-10-05 14:23:45 - 192.168.1.1 - 123.456.789-09".

import re

log_line = "2023-10-05 14:23:45 - 192.168.1.1 - 123.456.789-09"
pattern = r"(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) - (\d{1,3}(?:\.\d{1,3}){3}) - (\d{3}\.\d{3}\.\d{3}-\d{2})"

match = re.match(pattern, log_line)
if match:
    timestamp, ip, cpf = match.groups()
    print(f"Timestamp: {timestamp}, IP: {ip}, CPF: {cpf}")

Passo 2: Validar o CPF com algoritmo oficial

Implemente o algoritmo de validação de CPF para verificar se os dígitos verificadores estão corretos. O código abaixo valida o CPF extraído no passo anterior.

def validar_cpf(cpf):
    cpf = ''.join(filter(str.isdigit, cpf))
    if len(cpf) != 11 or cpf == cpf[0] * 11:
        return False

    def calculo_digitos(cpf, digitos):
        soma = sum(int(cpf[i]) * (digitos - i) for i in range(digitos))
        resto = soma % 11
        return 0 if resto < 2 else 11 - resto

    d1 = calculo_digitos(cpf, 9)
    d2 = calculo_digitos(cpf, 10)
    return d1 == int(cpf[9]) and d2 == int(cpf[10])

cpf = "12345678909"
if validar_cpf(cpf):
    print(f"CPF {cpf} é válido")
else:
    print(f"CPF {cpf} é inválido")

Passo 3: Combinar extração e validação em uma única função

Para processar logs inteiros, combine as etapas anteriores em uma função que itere sobre cada linha e valide os CPFs encontrados.

def processar_log(log_lines):
    pattern = r"(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) - (\d{1,3}(?:\.\d{1,3}){3}) - (\d{3}\.\d{3}\.\d{3}-\d{2})"
    results = []

    for line in log_lines:
        match = re.match(pattern, line)
        if match:
            timestamp, ip, cpf = match.groups()
            is_valid = validar_cpf(cpf)
            results.append({
                "timestamp": timestamp,
                "ip": ip,
                "cpf": cpf,
                "valido": is_valid
            })
    return results

log_lines = [
    "2023-10-05 14:23:45 - 192.168.1.1 - 123.456.789-09",
    "2023-10-05 14:25:10 - 192.168.1.2 - 987.654.321-00"
]
processados = processar_log(log_lines)
for p in processados:
    status = "VÁLIDO" if p["valido"] else "INVÁLIDO"
    print(f"{p['timestamp']} - {p['ip']} - {p['cpf']} - {status}")

Exemplo Prático

Linha do Log Timestamp IP CPF Válido
2023-10-05 14:23:45 - 192.168.1.1 - 123.456.789-09 2023-10-05 14:23:45 192.168.1.1 123.456.789-09 INVÁLIDO
2023-10-05 14:25:10 - 192.168.1.2 - 987.654.321-00 2023-10-05 14:25:10 192.168.1.2 987.654.321-00 VÁLIDO

Conclusão

Com este método, você automatiza a validação de CPFs em logs de forma rápida e confiável, garantindo que apenas dados autênticos sejam processados e armazenados.