GenCCPlus1 / app.py
GenCCPlus's picture
Upload app.py
114aa0a verified
import gradio as gr
import requests
import random
import re
def luhn_check(card_number):
digits = [int(d) for d in str(card_number) if d.isdigit()]
checksum = 0
parity = len(digits) % 2
for i, digit in enumerate(digits):
if i % 2 == parity:
digit *= 2
if digit > 9:
digit -= 9
checksum += digit
return checksum % 10 == 0
def verificar_luhn_lista(lista):
tarjetas_raw = [t.strip() for t in lista.replace('\n', ',').split(',') if t.strip()]
if len(tarjetas_raw) > 50:
return "❌ Máximo permitido: 50 tarjetas."
resultados = []
for entrada in tarjetas_raw:
match = re.search(r"\d{12,19}", entrada)
if match:
numero = match.group()
resultado = "✅ VÁLIDA" if luhn_check(numero) else "❌ INVÁLIDA"
resultados.append(f"{entrada}{resultado}")
else:
resultados.append(f"{entrada} → ⚠️ No se encontró un número válido")
return "\n".join(resultados)
def buscar_bin(bin_input):
bin_input = re.sub(r"\D", "", bin_input)[:6]
if len(bin_input) < 6:
return "❌ Ingrese al menos los primeros 6 dígitos."
try:
response = requests.get(f"https://lookup.binlist.net/{bin_input}")
if response.status_code == 200:
data = response.json()
tipo = data.get("type", "Desconocido")
marca = data.get("scheme", "Desconocida")
nivel = data.get("brand", "Desconocido")
banco = data.get("bank", {}).get("name", "Desconocido")
pais = data.get("country", {}).get("name", "Desconocido")
return (
f"🔍 Información del BIN {bin_input}:\n"
f"- Banco: {banco}\n"
f"- Marca: {marca.capitalize()}\n"
f"- Tipo: {tipo.capitalize()} 💳\n"
f"- Nivel: {nivel}\n"
f"- País: {pais}"
)
else:
return "❌ No se encontró información para este BIN."
except:
return "❌ Error al conectar con el servicio BIN."
def generar_tarjetas(bin_input, cantidad, mes, anio):
bin_input = re.sub(r"\D", "", bin_input)
if len(bin_input) < 6 or len(bin_input) > 15:
return "❌ El BIN debe tener entre 6 y 15 dígitos."
fecha_final = f"{str(mes).zfill(2)}/{str(anio)[-2:]}"
generadas = []
while len(generadas) < cantidad:
base = bin_input
while len(base) < 15:
base += str(random.randint(0, 9))
for last_digit in range(10):
card_candidate = base + str(last_digit)
if luhn_check(card_candidate):
ccv = str(random.randint(100, 999))
generadas.append(f"{card_candidate}|{fecha_final}|{ccv}")
break
return "\n".join(generadas)
custom_css = '''
body {
background-color: #eafaf1;
font-family: Arial, sans-serif;
}
h1, h2, .gr-textbox label, .gr-dropdown label, .gr-slider label {
text-align: center !important;
font-weight: bold !important;
color: #14532d;
}
.gr-block, .gr-group {
margin: auto;
max-width: 600px;
padding: 10px;
}
.gr-button {
display: block;
margin: 10px auto 0 auto;
font-weight: bold;
background-color: #34d399;
color: #064e3b;
}
'''
with gr.Blocks(css=custom_css, title="Herramientas Educativas de Tarjetas") as demo:
gr.Markdown("# 🧠 Herramientas Educativas para Tarjetas")
with gr.Tab("💳 Generador de CC"):
gr.Markdown("Genera tarjetas válidas con BIN, fecha seleccionada y CCV aleatorio.")
bin_para_generar = gr.Textbox(label="BIN o primeros dígitos")
cantidad = gr.Slider(minimum=1, maximum=50, step=1, value=10, label="Cantidad de tarjetas")
mes_dropdown = gr.Dropdown(choices=[str(m).zfill(2) for m in range(1, 13)], label="Mes (MM)", value="12")
anio_dropdown = gr.Dropdown(choices=[str(y) for y in range(2025, 2033)], label="Año (YYYY)", value="2026")
boton_generar = gr.Button("Generar tarjetas")
salida_generadas = gr.Textbox(label="Tarjetas generadas", lines=10)
boton_generar.click(
generar_tarjetas,
inputs=[bin_para_generar, cantidad, mes_dropdown, anio_dropdown],
outputs=salida_generadas
)
with gr.Tab("📘 Bin List"):
gr.Markdown("Consulta información educativa de un BIN específico.")
bin_input = gr.Textbox(label="Número de tarjeta o BIN")
boton_bin = gr.Button("Buscar BIN")
bin_info = gr.Textbox(label="Resultado del análisis", lines=7, interactive=False)
boton_bin.click(buscar_bin, inputs=bin_input, outputs=bin_info)
with gr.Tab("✅ Verificador Luhn"):
gr.Markdown("Verifica si un número de tarjeta cumple con el algoritmo Luhn.")
entrada_luhn = gr.Textbox(label="Pega tarjetas (con o sin fecha/ccv)", lines=8)
boton_verificar = gr.Button("Verificar")
salida_luhn = gr.Textbox(label="Resultado", lines=10, interactive=False)
boton_verificar.click(verificar_luhn_lista, inputs=entrada_luhn, outputs=salida_luhn)
demo.launch()