File size: 12,450 Bytes
69b17de
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
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")