scamdetect-backend / backend /dataset /scripts /generate_dataset.py
ScamDetect Bot
Auto-sync backend from GitHub
69b17de
Raw
History Blame Contribute Delete
12.5 kB
import csv
import random
import os
# Define output paths
DATA_DIR = os.path.join(os.path.dirname(os.path.dirname(__file__)), "data")
if not os.path.exists(DATA_DIR):
os.makedirs(DATA_DIR)
TEXT_DATASET_PATH = os.path.join(DATA_DIR, "text_dataset.csv")
URL_DATASET_PATH = os.path.join(DATA_DIR, "url_dataset.csv")
# ==========================================
# 1. TEXT DATASET GENERATOR (~30,000 samples)
# ==========================================
def generate_text_dataset(num_samples=30000):
print(f"Generating {num_samples} text samples...")
# Target distribution based on user requirements:
# Total: ~27k-30k. Let's do 30k total.
# Phishing: 9000
# UPI scams: 6000
# Investment scams: 4000
# Normal messages: 11000
targets = {
"phishing": int(num_samples * 0.30),
"upi_fraud": int(num_samples * 0.20),
"investment_scam": int(num_samples * 0.13),
"benign": int(num_samples * 0.37)
}
# Phishing Templates
phishing_templates = [
"URGENT: Your {bank} account KYC has expired. Update immediately at {url} to avoid suspension.",
"Dear customer, your PAN card is not linked to your {bank} account. Link now: {url}",
"Your {bank} internet banking access will be locked in 24 hrs. Verify your identity at {url}",
"Income Tax Notice: You have a pending refund of Rs.{amount}. Claim it here: {url}",
"{brand} Winner! You have been selected for a free gift worth Rs.{amount}. Claim: {url}",
"Your {service} account has been logged in from an unknown device. If this wasn't you, secure your account: {url}",
"Dear Policyholder, your LIC premium is due. Pay Rs.{amount} online using {url} and get 10% cashback.",
"Your Netflix subscription has expired. Renew immediately at {url} to continue watching.",
"Action Required: Complete your {bank} Aadhaar linking process today via {url}",
"Dear {bank} customer, 15,000 reward points are expiring today. Redeem for cash at {url}"
]
# UPI Fraud Templates
upi_templates = [
"ALERT: Rs.{amount} debited from your A/c. If not done by you, forward this SMS to {number} to block transaction.",
"You have received a payment of Rs.{amount} on PhonePe. Enter your UPI pin to claim the amount.",
"Congratulations! You won Rs.{amount} cashback on Google Pay. Click here and enter PIN to receive: {url}",
"Dear Sir/Madam, your UPI transaction of Rs.{amount} failed. Scan the QR code sent on your WhatsApp to process refund.",
"Your electricity bill of Rs.{amount} is pending. Power will be disconnected at 9 PM. Pay via UPI: {upi_id}",
"Customer Service: Please share the 6-digit OTP to process your refund of Rs.{amount} via UPI.",
"Your Paytm KYC details are incomplete. Your wallet will be blocked. Call {number} to update.",
"Aapke UPI par Rs.{amount} bhej diye gaye hain. Confirm karne ke liye apna PIN dalein.",
"Dear Customer, your FASTag wallet is almost empty. Recharge now via UPI {upi_id} to avoid double toll.",
"Reliance Jio: Your number has been selected for 1-year free recharge. Pay Rs.10 activation fee via UPI: {upi_id}"
]
# Investment Templates
invest_templates = [
"Earn Guaranteed 30% monthly returns! Invest Rs.{amount} in crypto now. Join Telegram: {url}",
"Work from home opportunity! Earn Rs.5000 daily by liking YouTube videos. Deposit Rs.{small_amount} security fee.",
"IPO Alert: Apply for Pre-IPO shares of {brand}. 500% returns expected in 3 months. Register: {url}",
"Multibagger Stock Tip: Buy 'XYZ Infra' target 500 (Current 40). Insider info! Subscribe to our premium channel Rs.{amount}.",
"Make Rs.50,000 per month with simple data entry. Zero investment plan requires Rs.{small_amount} registration. {url}",
"RBI Approved SIP: Invest Rs.1000/month and get 1 Crore in 5 years. Start your journey today: {url}",
"You have been chosen for an exclusive Forex trading group. Deposit Rs.{amount} and our AI will trade for you. {url}",
"Double your money in 100 days! Authentic scheme registered with Government. Start investing: {url}",
"Part-time job offer from Amazon. Earn up to Rs.3000/day. Message HR on WhatsApp: {number}",
"Binance VIP Trading Signals. 99% accuracy. Pay monthly fee of Rs.{amount} for access."
]
# Benign Templates
benign_templates = [
"Hey, are we still meeting for dinner at {time}?",
"Your Swiggy order #45829 is on the way. Delivery executive will be there in 15 mins.",
"Salary of Rs.{amount} credited to your account XX4521 on 01-Mar-2026. Avail Bal: Rs.1,45,200.",
"Reminder: Doctor appointment scheduled for tomorrow at {time}. Please arrive 10 minutes early.",
"Your Amazon package is out for delivery. OTP to share with agent is {otp}.",
"OTP for login to your HDFC account is {otp}. Do not share this with anyone.",
"Happy Birthday! Have a wonderful year ahead. Let's catch up soon.",
"Meeting pushed to {time}. Please check the updated invite.",
"Did you watch the match yesterday? What a crazy finish!",
"Your Uber trip has ended. Total fare: Rs.{small_amount}.",
"Thanks for shopping with Myntra! Your order will be delivered by Thursday.",
"Can you send me the presentation file before EOD?",
"WiFi bill generated for March. Amount due Rs.{small_amount}. Pay by 15th.",
"Boarding pass for Air India flight AI452 is attached. Safe travels!",
"Flight delayed by 45 minutes due to bad weather at destination."
]
# Dictionaries for substitution
banks = ["SBI", "HDFC", "ICICI", "Axis Bank", "Punjab National Bank", "Kotak", "Bank of Baroda", "Canara Bank", "Union Bank", "Yes Bank"]
url_domains = ["update-kyc.in", "verify-account-info.com", "secure-login.xyz", "claim-reward-now.net", "official-portal.co", "refund-processing.online"]
brands = ["Amazon", "Flipkart", "Reliance", "Tata", "Jio", "Airtel", "Paytm"]
times = ["10:00 AM", "2:30 PM", "5:00 PM", "7:45 PM", "9:00 AM", "4:15 PM"]
data = []
# Helper to generate rows
def append_rows(template_list, label, category, count):
for _ in range(count):
template = random.choice(template_list)
text = template.format(
bank=random.choice(banks),
url=f"http://{random.choice(['www.', '', 'secure.'])}{random.choice(brands).lower()}-{random.choice(url_domains)}",
amount=random.choice([5000, 10000, 25000, 50000, 100000, 49999, 9999]),
small_amount=random.choice([100, 250, 500, 999, 1500, 2000]),
number=f"+91-{random.randint(6000000000, 9999999999)}",
service=random.choice(["Instagram", "Facebook", "Gmail", "Apple ID", "WhatsApp"]),
brand=random.choice(brands),
upi_id=f"{random.randint(6000000000, 9999999999)}@{random.choice(['ybl', 'okicici', 'oksbi', 'paytm'])}",
time=random.choice(times),
otp=random.randint(100000, 999999)
)
# Add some minor noise or variations occasionally
if random.random() < 0.1:
text = text.replace("Rs.", "INR ")
if random.random() < 0.05:
text = text.upper()
data.append([category, label, text, "en" if "Aapke" not in text else "hi"])
# Generate records
append_rows(phishing_templates, "scam", "phishing", targets["phishing"])
append_rows(upi_templates, "scam", "upi_fraud", targets["upi_fraud"])
append_rows(invest_templates, "scam", "investment_scam", targets["investment_scam"])
append_rows(benign_templates, "safe", "benign", targets["benign"])
# Shuffle dataset
random.shuffle(data)
# Write to CSV
with open(TEXT_DATASET_PATH, 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerow(['category', 'label', 'text', 'language'])
writer.writerows(data)
print(f"Generated {len(data)} text samples in {TEXT_DATASET_PATH}")
# ==========================================
# 2. URL DATASET GENERATOR (~20,000 samples)
# ==========================================
def generate_url_dataset(num_samples=20000):
print(f"Generating {num_samples} URL samples...")
targets = {
"phishing": int(num_samples * 0.60), # 12,000
"benign": int(num_samples * 0.40) # 8,000
}
# Benign building blocks
legit_domains = [
"google.com", "youtube.com", "facebook.com", "amazon.in", "flipkart.com",
"sbi.co.in", "onlinesbi.sbi", "hdfcbank.com", "icicibank.com", "axisbank.com",
"incometax.gov.in", "uidai.gov.in", "irctc.co.in", "makemytrip.com", "myntra.com",
"wikipedia.org", "twitter.com", "instagram.com", "linkedin.com", "github.com",
"stackoverflow.com", "reddit.com", "netflix.com", "primevideo.com", "hotstar.com",
"zomato.com", "swiggy.com", "bookmyshow.com", "paytm.com", "phonepe.com"
]
legit_paths = ["", "/login", "/home", "/about", "/contact", "/products", "/checkout", "/profile", "/settings"]
# Phishing building blocks
phishing_brands = ["sbi", "hdfc", "paytm", "amazon", "flipkart", "irctc", "uidai", "kyc", "jio", "airtel", "income-tax"]
phishing_keywords = ["update", "verify", "secure", "login", "auth", "confirm", "reward", "cashback", "refund"]
phishing_tlds = [".xyz", ".tk", ".ml", ".ga", ".cf", ".gq", ".co.vu", ".buzz", ".top", ".cc", ".icu", ".online", ".site"]
free_hosts = [".herokuapp.com", ".netlify.app", ".vercel.app", ".blogspot.com", ".weebly.com", ".wixsite.com"]
data = []
# Generate benign URLs
for _ in range(targets["benign"]):
protocol = random.choice(["https://", "http://", "https://www."])
domain = random.choice(legit_domains)
path = random.choice(legit_paths)
if random.random() < 0.2:
path += f"?id={random.randint(1000,9999)}"
url = f"{protocol}{domain}{path}"
data.append(["benign", "safe", url])
# Generate Phishing URLs
for _ in range(targets["phishing"]):
protocol = random.choice(["http://", "https://"])
brand = random.choice(phishing_brands)
kw = random.choice(phishing_keywords)
# Determine phishing tactic
tactic = random.choice(["typosquat", "suspicious_tld", "free_host", "ip_address", "subdomain"])
if tactic == "typosquat":
# e.g., amazon -> arnazon
b2 = brand.replace('m', 'rn').replace('l', '1').replace('o', '0').replace('i', 'l')
if b2 == brand: b2 = brand + "-security"
url = f"{protocol}{b2}.com/{kw}"
elif tactic == "suspicious_tld":
url = f"{protocol}{brand}-{kw}{random.choice(phishing_tlds)}/login.php"
elif tactic == "free_host":
url = f"{protocol}{brand}-{kw}{random.choice(free_hosts)}/"
elif tactic == "ip_address":
ip = f"{random.randint(11,250)}.{random.randint(1,250)}.{random.randint(1,250)}.{random.randint(1,250)}"
url = f"{protocol}{ip}/{brand}/{kw}.html"
elif tactic == "subdomain":
# e.g. sbi.co.in.scamdomain.xyz
tld2 = random.choice(phishing_tlds)
url = f"{protocol}{brand}.co.in.security-check-portal{tld2}/verify"
else:
url = f"{protocol}www.{brand}-kyc-update.in/{kw}"
data.append(["url_phishing", "scam", url])
# Shuffle dataset
random.shuffle(data)
# Write to CSV
with open(URL_DATASET_PATH, 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerow(['category', 'label', 'url'])
writer.writerows(data)
print(f"Generated {len(data)} URL samples in {URL_DATASET_PATH}")
if __name__ == "__main__":
print("Starting Indian Scam Multi-Modal Dataset Generator laying foundation for ~50,000 samples...")
generate_text_dataset(30000)
generate_url_dataset(20000)
print("Done! CSV files are located in backend/dataset/data/")
print(f"Total samples generated: 50,000")