Spaces:
Sleeping
Sleeping
File size: 5,185 Bytes
114aa0a |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 |
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()
|