import streamlit as st import random from faker import Faker from datetime import datetime, timedelta fake = Faker() # ---------------- UI CONFIG ---------------- st.set_page_config( page_title="Credit Card Generator", layout="centered", initial_sidebar_state="collapsed" ) # ---- Dark Mode Styling ---- st.markdown(""" """, unsafe_allow_html=True) st.title("💳 Credit Card Generator") st.caption("Generate **test credit card details** for development and QA use only.") # ---------------- INPUT ---------------- card_type = st.selectbox("Select Card Type", ["VISA", "MASTERCARD"]) generate = st.button("Generate Card") # ---------------- CORE LOGIC ---------------- def luhn_generate(prefix, length): number = prefix while len(number) < length - 1: number += str(random.randint(0, 9)) digits = [int(d) for d in number] for i in range(len(digits) - 1, -1, -2): digits[i] *= 2 if digits[i] > 9: digits[i] -= 9 checksum = (10 - (sum(digits) % 10)) % 10 return number + str(checksum) def format_card(number): return " ".join([number[i:i+4] for i in range(0, len(number), 4)]) def generate_expiry(): future_date = datetime.now() + timedelta(days=random.randint(365, 1825)) return future_date.strftime("%m/%y") def generate_cvv(): return str(random.randint(100, 999)) def detect_country(bin_prefix): bin_map = { "4": "USA / International (VISA)", "51": "USA (MasterCard)", "52": "Canada", "53": "UK", "54": "Germany", "55": "France" } return bin_map.get(bin_prefix[:2], "Unknown") def generate_card(card_type): if card_type == "VISA": prefix = "4" length = 16 else: prefix = str(random.choice(range(51, 56))) length = 16 number = luhn_generate(prefix, length) return { "number": number, "formatted": format_card(number), "name": fake.name(), "zip": fake.zipcode(), "expiry": generate_expiry(), "cvv": generate_cvv(), "country": detect_country(prefix) } # ---------------- OUTPUT ---------------- if generate: card = generate_card(card_type) st.success("Card Generated") st.markdown(f"""
{card['formatted']}
{card['name']}
EXP: {card['expiry']} | CVV: {card['cvv']}