from flask import Flask, jsonify, request import joblib import pandas as pd import numpy as np import requests import os app = Flask(__name__) model = joblib.load("safety_model.pkl") le = joblib.load("label_encoder.pkl") grid = pd.read_csv("grid_lookup.csv") FEATURE_COLS = open("feature_cols.txt").read().strip().split("\n") FAST2SMS_KEY = "YOUR_FAST2SMS_API_KEY" GUARDIAN_PHONE = "91XXXXXXXXXX" def send_sms(lat, lon, risk_score): message = ( f"SAFETY ALERT! Unsafe location detected. " f"Location: https://maps.google.com/?q={lat},{lon} " f"Risk Score: {risk_score:.2f}. Please check immediately!" ) url = "https://www.fast2sms.com/dev/bulkV2" payload = { "route" : "v3", "sender_id": "TXTIND", "message" : message, "language" : "english", "flash" : 0, "numbers" : GUARDIAN_PHONE } headers = {"authorization": FAST2SMS_KEY, "Content-Type": "application/json"} try: resp = requests.post(url, json=payload, headers=headers, timeout=10) return resp.json() except Exception as e: return {"error": str(e)} @app.route("/predict", methods=["GET"]) def predict(): try: lat = float(request.args.get("lat")) lon = float(request.args.get("lon")) except (TypeError, ValueError): return jsonify({"error": "Missing or invalid lat/lon"}), 400 distances = np.sqrt((grid["latitude"] - lat)**2 + (grid["longitude"] - lon)**2) nearest_row = grid.iloc[distances.idxmin()] features = pd.DataFrame([nearest_row[FEATURE_COLS].values], columns=FEATURE_COLS) prediction = int(model.predict(features)[0]) risk_score = round(float(model.predict_proba(features)[0][1]), 4) sms_sent = False if prediction == 1: send_sms(lat, lon, risk_score) sms_sent = True return jsonify({ "latitude" : lat, "longitude" : lon, "label" : "UNSAFE" if prediction == 1 else "SAFE", "risk_score": risk_score, "sms_sent" : sms_sent, "area_id" : nearest_row["area_id"] }) @app.route("/", methods=["GET"]) def home(): return jsonify({"status": "Women Safety API is running", "usage": "/predict?lat=13.05&lon=80.25"}) if __name__ == "__main__": port = int(os.environ.get("PORT", 5000)) app.run(host="0.0.0.0", port=port, debug=False)