waqasbm commited on
Commit
847eab0
·
verified ·
1 Parent(s): 1b35cc7

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +134 -0
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.")