File size: 2,420 Bytes
3f63f6e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
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)