Spaces:
Sleeping
Sleeping
Create app.py
Browse files
app.py
ADDED
|
@@ -0,0 +1,134 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import streamlit as st
|
| 2 |
+
import random
|
| 3 |
+
from faker import Faker
|
| 4 |
+
from datetime import datetime, timedelta
|
| 5 |
+
|
| 6 |
+
fake = Faker()
|
| 7 |
+
|
| 8 |
+
# ---------------- UI CONFIG ----------------
|
| 9 |
+
st.set_page_config(
|
| 10 |
+
page_title="Credit Card Generator",
|
| 11 |
+
layout="centered",
|
| 12 |
+
initial_sidebar_state="collapsed"
|
| 13 |
+
)
|
| 14 |
+
|
| 15 |
+
# ---- Dark Mode Styling ----
|
| 16 |
+
st.markdown("""
|
| 17 |
+
<style>
|
| 18 |
+
body {
|
| 19 |
+
background-color: #0e1117;
|
| 20 |
+
color: #ffffff;
|
| 21 |
+
}
|
| 22 |
+
.stButton>button {
|
| 23 |
+
background-color: #4CAF50;
|
| 24 |
+
color: white;
|
| 25 |
+
border-radius: 8px;
|
| 26 |
+
height: 3em;
|
| 27 |
+
width: 100%;
|
| 28 |
+
}
|
| 29 |
+
.card-box {
|
| 30 |
+
background: linear-gradient(135deg, #1f2937, #111827);
|
| 31 |
+
padding: 20px;
|
| 32 |
+
border-radius: 12px;
|
| 33 |
+
color: white;
|
| 34 |
+
font-family: monospace;
|
| 35 |
+
}
|
| 36 |
+
.copy-btn {
|
| 37 |
+
margin-top: 10px;
|
| 38 |
+
}
|
| 39 |
+
</style>
|
| 40 |
+
""", unsafe_allow_html=True)
|
| 41 |
+
|
| 42 |
+
st.title("💳 Credit Card Generator")
|
| 43 |
+
|
| 44 |
+
st.caption("Generate **test credit card details** for development and QA use only.")
|
| 45 |
+
|
| 46 |
+
# ---------------- INPUT ----------------
|
| 47 |
+
card_type = st.selectbox("Select Card Type", ["VISA", "MASTERCARD"])
|
| 48 |
+
generate = st.button("Generate Card")
|
| 49 |
+
|
| 50 |
+
# ---------------- CORE LOGIC ----------------
|
| 51 |
+
|
| 52 |
+
def luhn_generate(prefix, length):
|
| 53 |
+
number = prefix
|
| 54 |
+
while len(number) < length - 1:
|
| 55 |
+
number += str(random.randint(0, 9))
|
| 56 |
+
|
| 57 |
+
digits = [int(d) for d in number]
|
| 58 |
+
|
| 59 |
+
for i in range(len(digits) - 1, -1, -2):
|
| 60 |
+
digits[i] *= 2
|
| 61 |
+
if digits[i] > 9:
|
| 62 |
+
digits[i] -= 9
|
| 63 |
+
|
| 64 |
+
checksum = (10 - (sum(digits) % 10)) % 10
|
| 65 |
+
return number + str(checksum)
|
| 66 |
+
|
| 67 |
+
def format_card(number):
|
| 68 |
+
return " ".join([number[i:i+4] for i in range(0, len(number), 4)])
|
| 69 |
+
|
| 70 |
+
def generate_expiry():
|
| 71 |
+
future_date = datetime.now() + timedelta(days=random.randint(365, 1825))
|
| 72 |
+
return future_date.strftime("%m/%y")
|
| 73 |
+
|
| 74 |
+
def generate_cvv():
|
| 75 |
+
return str(random.randint(100, 999))
|
| 76 |
+
|
| 77 |
+
def detect_country(bin_prefix):
|
| 78 |
+
bin_map = {
|
| 79 |
+
"4": "USA / International (VISA)",
|
| 80 |
+
"51": "USA (MasterCard)",
|
| 81 |
+
"52": "Canada",
|
| 82 |
+
"53": "UK",
|
| 83 |
+
"54": "Germany",
|
| 84 |
+
"55": "France"
|
| 85 |
+
}
|
| 86 |
+
return bin_map.get(bin_prefix[:2], "Unknown")
|
| 87 |
+
|
| 88 |
+
def generate_card(card_type):
|
| 89 |
+
if card_type == "VISA":
|
| 90 |
+
prefix = "4"
|
| 91 |
+
length = 16
|
| 92 |
+
else:
|
| 93 |
+
prefix = str(random.choice(range(51, 56)))
|
| 94 |
+
length = 16
|
| 95 |
+
|
| 96 |
+
number = luhn_generate(prefix, length)
|
| 97 |
+
|
| 98 |
+
return {
|
| 99 |
+
"number": number,
|
| 100 |
+
"formatted": format_card(number),
|
| 101 |
+
"name": fake.name(),
|
| 102 |
+
"zip": fake.zipcode(),
|
| 103 |
+
"expiry": generate_expiry(),
|
| 104 |
+
"cvv": generate_cvv(),
|
| 105 |
+
"country": detect_country(prefix)
|
| 106 |
+
}
|
| 107 |
+
|
| 108 |
+
# ---------------- OUTPUT ----------------
|
| 109 |
+
|
| 110 |
+
if generate:
|
| 111 |
+
card = generate_card(card_type)
|
| 112 |
+
|
| 113 |
+
st.success("Card Generated")
|
| 114 |
+
|
| 115 |
+
st.markdown(f"""
|
| 116 |
+
<div class="card-box">
|
| 117 |
+
<h3>{card_type}</h3>
|
| 118 |
+
<p style="font-size:20px;">{card['formatted']}</p>
|
| 119 |
+
<p>{card['name']}</p>
|
| 120 |
+
<p>EXP: {card['expiry']} | CVV: {card['cvv']}</p>
|
| 121 |
+
</div>
|
| 122 |
+
""", unsafe_allow_html=True)
|
| 123 |
+
|
| 124 |
+
st.write(f"**ZIP Code:** {card['zip']}")
|
| 125 |
+
st.write(f"**Country (BIN):** {card['country']}")
|
| 126 |
+
|
| 127 |
+
# -------- Copy Buttons --------
|
| 128 |
+
st.subheader("Copy Details")
|
| 129 |
+
|
| 130 |
+
st.code(card["number"], language="text")
|
| 131 |
+
st.code(card["formatted"], language="text")
|
| 132 |
+
st.code(card["cvv"], language="text")
|
| 133 |
+
|
| 134 |
+
st.info("⚠️ These are fake/generated details for testing only. Not usable for real transactions.")
|