Spaces:
Sleeping
Sleeping
| from flask import Flask, request, redirect, url_for, render_template_string | |
| import sqlite3 | |
| import threading | |
| import webbrowser | |
| app = Flask(__name__) | |
| DB_NAME = "risk_system.db" | |
| # ---------- DATABASE SETUP ---------- | |
| def init_db(): | |
| conn = sqlite3.connect(DB_NAME) | |
| cursor = conn.cursor() | |
| cursor.execute(""" | |
| CREATE TABLE IF NOT EXISTS risk_list ( | |
| number TEXT PRIMARY KEY, | |
| risk_level TEXT, | |
| reviews TEXT | |
| ) | |
| """) | |
| cursor.execute(""" | |
| CREATE TABLE IF NOT EXISTS aadhar_mapping ( | |
| number TEXT PRIMARY KEY, | |
| aadhar TEXT | |
| ) | |
| """) | |
| cursor.execute(""" | |
| CREATE TABLE IF NOT EXISTS aadhar_numbers ( | |
| aadhar TEXT, | |
| number TEXT | |
| ) | |
| """) | |
| conn.commit() | |
| conn.close() | |
| init_db() | |
| # ---------- HELPER FUNCTIONS ---------- | |
| def get_db(): | |
| return sqlite3.connect(DB_NAME) | |
| def check_and_flag(number): | |
| conn = get_db() | |
| cursor = conn.cursor() | |
| result = {"number": number, "risk": None, "reviews": None, "aadhar": None, "linked_numbers": []} | |
| # Step 1: Risk List lookup | |
| cursor.execute("SELECT risk_level, reviews FROM risk_list WHERE number=?", (number,)) | |
| row = cursor.fetchone() | |
| if row: | |
| result["risk"] = row[0] | |
| result["reviews"] = row[1] | |
| # Step 2: Aadhaar mapping | |
| cursor.execute("SELECT aadhar FROM aadhar_mapping WHERE number=?", (number,)) | |
| aadhar_row = cursor.fetchone() | |
| if aadhar_row: | |
| aadhar = aadhar_row[0] | |
| result["aadhar"] = aadhar | |
| cursor.execute("SELECT number FROM aadhar_numbers WHERE aadhar=?", (aadhar,)) | |
| linked_numbers = [n[0] for n in cursor.fetchall()] | |
| result["linked_numbers"] = linked_numbers | |
| # Step 3: If risky, flag all linked numbers | |
| if row: | |
| for n in linked_numbers: | |
| cursor.execute("INSERT OR IGNORE INTO risk_list VALUES (?, ?, ?)", | |
| (n, row[0], "Auto-flagged via Aadhaar link")) | |
| conn.commit() | |
| conn.close() | |
| return result | |
| def add_review(number, review, risk_level="Medium"): | |
| conn = get_db() | |
| cursor = conn.cursor() | |
| cursor.execute("SELECT reviews FROM risk_list WHERE number=?", (number,)) | |
| row = cursor.fetchone() | |
| if row: | |
| updated_reviews = row[0] + " | " + review | |
| cursor.execute("UPDATE risk_list SET reviews=?, risk_level=? WHERE number=?", | |
| (updated_reviews, risk_level, number)) | |
| else: | |
| cursor.execute("INSERT INTO risk_list VALUES (?, ?, ?)", (number, risk_level, review)) | |
| conn.commit() | |
| conn.close() | |
| def get_all_risks(): | |
| conn = get_db() | |
| cursor = conn.cursor() | |
| cursor.execute("SELECT * FROM risk_list") | |
| rows = cursor.fetchall() | |
| conn.close() | |
| return rows | |
| # ---------- HTML TEMPLATES ---------- | |
| INDEX_HTML = """ | |
| <!DOCTYPE html> | |
| <html lang="en"> | |
| <head> | |
| <meta charset="UTF-8"> | |
| <title>Risk Checker</title> | |
| <style> | |
| body { font-family: Arial, sans-serif; margin: 30px; } | |
| h1 { color: #333; } | |
| form { margin-bottom: 20px; } | |
| input, select, button { padding: 8px; margin: 5px; } | |
| .result { border: 1px solid #ddd; padding: 15px; border-radius: 8px; background: #f9f9f9; } | |
| .risk { color: red; font-weight: bold; } | |
| </style> | |
| </head> | |
| <body> | |
| <h1>📞fraud Risk Checker</h1> | |
| <!-- Check Number --> | |
| <form method="POST"> | |
| <input type="text" name="number" placeholder="Enter mobile number" required> | |
| <button type="submit">Check</button> | |
| </form> | |
| {% if result %} | |
| <div class="result"> | |
| <h3>Result for {{ result.number }}</h3> | |
| <p><b>Risk:</b> <span class="risk">{{ result.risk if result.risk else "Not in Risk List" }}</span></p> | |
| <p><b>Reviews:</b> {{ result.reviews if result.reviews else "None" }}</p> | |
| <p><b>Aadhaar:</b> {{ result.aadhar if result.aadhar else "Not linked" }}</p> | |
| <p><b>Linked Numbers:</b> {{ result.linked_numbers if result.linked_numbers else "None" }}</p> | |
| </div> | |
| {% endif %} | |
| <!-- Add Review --> | |
| <h3>Add Review</h3> | |
| <form action="{{ url_for('review_number') }}" method="POST"> | |
| <input type="text" name="number" placeholder="Number" required> | |
| <input type="text" name="review" placeholder="Write your review" required> | |
| <select name="risk_level"> | |
| <option value="Low">Low</option> | |
| <option value="Medium" selected>Medium</option> | |
| <option value="High">High</option> | |
| </select> | |
| <button type="submit">Submit Review</button> | |
| </form> | |
| <p><a href="{{ url_for('seed_data') }}">Seed demo data</a> | <a href="{{ url_for('all_risks') }}">View all risks</a></p> | |
| </body> | |
| </html> | |
| """ | |
| ALL_RISKS_HTML = """ | |
| <!DOCTYPE html> | |
| <html lang="en"> | |
| <head> | |
| <meta charset="UTF-8"> | |
| <title>All Risky Numbers</title> | |
| <style> | |
| body { font-family: Arial, sans-serif; margin: 30px; } | |
| table { border-collapse: collapse; width: 100%; } | |
| th, td { border: 1px solid #ddd; padding: 8px; text-align: left; } | |
| th { background-color: #f2f2f2; } | |
| </style> | |
| </head> | |
| <body> | |
| <h1>⚠ All Risky Numbers</h1> | |
| <table> | |
| <tr> | |
| <th>Number</th> | |
| <th>Risk Level</th> | |
| <th>Reviews</th> | |
| </tr> | |
| {% for row in risks %} | |
| <tr> | |
| <td>{{ row[0] }}</td> | |
| <td>{{ row[1] }}</td> | |
| <td>{{ row[2] }}</td> | |
| </tr> | |
| {% endfor %} | |
| </table> | |
| <p><a href="{{ url_for('home') }}">Back</a></p> | |
| </body> | |
| </html> | |
| """ | |
| # ---------- FLASK ROUTES ---------- | |
| def home(): | |
| result = None | |
| if request.method == "POST": | |
| number = request.form.get("number") | |
| result = check_and_flag(number) | |
| return render_template_string(INDEX_HTML, result=result) | |
| def review_number(): | |
| number = request.form.get("number") | |
| review = request.form.get("review") | |
| risk_level = request.form.get("risk_level", "Medium") | |
| if number and review: | |
| add_review(number, review, risk_level) | |
| return redirect(url_for("home")) | |
| def all_risks(): | |
| risks = get_all_risks() | |
| return render_template_string(ALL_RISKS_HTML, risks=risks) | |
| def seed_data(): | |
| conn = get_db() | |
| cursor = conn.cursor() | |
| cursor.execute("INSERT OR IGNORE INTO risk_list VALUES (?, ?, ?)", | |
| ("9999999999", "High", "Fraudulent calls reported")) | |
| cursor.execute("INSERT OR IGNORE INTO aadhar_mapping VALUES (?, ?)", | |
| ("9999999999", "AADHAR123")) | |
| cursor.execute("INSERT OR IGNORE INTO aadhar_mapping VALUES (?, ?)", | |
| ("8888888888", "AADHAR123")) | |
| cursor.execute("INSERT OR IGNORE INTO aadhar_numbers VALUES (?, ?)", ("AADHAR123", "9999999999")) | |
| cursor.execute("INSERT OR IGNORE INTO aadhar_numbers VALUES (?, ?)", ("AADHAR123", "8888888888")) | |
| cursor.execute("INSERT OR IGNORE INTO aadhar_numbers VALUES (?, ?)", ("AADHAR123", "7777777777")) | |
| conn.commit() | |
| conn.close() | |
| return redirect(url_for("home")) | |
| def open_browser(): | |
| webbrowser.open_new("http://127.0.0.1:7860/") | |
| # ---------- RUN ---------- | |
| if __name__ == "__main__": | |
| threading.Timer(1, open_browser).start() | |
| app.run(debug=False, port=7860, use_reloader=False) |