Spaces:
Running
Running
Add Veh2Num, Ration Card, BGMI, GitHub, and YouTube endpoints to Space API
Browse files- .gitattributes +1 -0
- engine.py +646 -2
- external_services.py +46 -28
- icici_pvtcar_master.parquet +0 -0
- muthootfinance.parquet +0 -0
- olx_bulk.parquet +3 -0
.gitattributes
CHANGED
|
@@ -1,2 +1,3 @@
|
|
| 1 |
sbi_master.parquet filter=lfs diff=lfs merge=lfs -text
|
| 2 |
xyron_master.parquet filter=lfs diff=lfs merge=lfs -text
|
|
|
|
|
|
| 1 |
sbi_master.parquet filter=lfs diff=lfs merge=lfs -text
|
| 2 |
xyron_master.parquet filter=lfs diff=lfs merge=lfs -text
|
| 3 |
+
olx_bulk.parquet filter=lfs diff=lfs merge=lfs -text
|
engine.py
CHANGED
|
@@ -989,7 +989,173 @@ class LookupEngine:
|
|
| 989 |
return res
|
| 990 |
|
| 991 |
# ------------------------------------------------------------------
|
| 992 |
-
#
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 993 |
# ------------------------------------------------------------------
|
| 994 |
def query_combined(self, query_input: str) -> Dict[str, Any]:
|
| 995 |
"""
|
|
@@ -1027,7 +1193,10 @@ class LookupEngine:
|
|
| 1027 |
"paytm": self.executor.submit(self.query_paytm, mobile),
|
| 1028 |
"flipkart": self.executor.submit(self.query_flipkart, mobile),
|
| 1029 |
"instagram": self.executor.submit(self.query_instagram, str(mobile)),
|
| 1030 |
-
"telecom_db": self.executor.submit(self.query_by_phone, str(mobile))
|
|
|
|
|
|
|
|
|
|
| 1031 |
}
|
| 1032 |
|
| 1033 |
results = {}
|
|
@@ -1125,6 +1294,28 @@ class LookupEngine:
|
|
| 1125 |
loc = ", ".join(filter(None, [r.get("address"), r.get("city"), r.get("state"), r.get("pincode")]))
|
| 1126 |
_add_unique(locations, loc)
|
| 1127 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1128 |
# Calculate hits count
|
| 1129 |
hits = 0
|
| 1130 |
for src, data in results.items():
|
|
@@ -1530,6 +1721,459 @@ class LookupEngine:
|
|
| 1530 |
else:
|
| 1531 |
return self.query_upi_full_info(raw)
|
| 1532 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1533 |
|
| 1534 |
# Master registry of official Indian UPI handles, PSP apps, and partner banks
|
| 1535 |
UPI_HANDLES_MAP = {
|
|
|
|
| 989 |
return res
|
| 990 |
|
| 991 |
# ------------------------------------------------------------------
|
| 992 |
+
# 10e. Muthoot Finance Gold Loans & KYC Master Database
|
| 993 |
+
# ------------------------------------------------------------------
|
| 994 |
+
def query_muthoot(self, query_input: Any) -> Dict[str, Any]:
|
| 995 |
+
t0 = time.time()
|
| 996 |
+
raw_val = str(query_input).strip()
|
| 997 |
+
clean_phone = self.sanitize_phone(raw_val)
|
| 998 |
+
|
| 999 |
+
cache_key = f"muthoot:{clean_phone or raw_val.lower()}"
|
| 1000 |
+
with self.cache_lock:
|
| 1001 |
+
if cache_key in self.cache:
|
| 1002 |
+
return {**self.cache[cache_key], "cached": True, "latency_ms": round((time.time() - t0) * 1000, 2)}
|
| 1003 |
+
|
| 1004 |
+
local_path = os.path.join(BASE_DIR, "muthootfinance.parquet")
|
| 1005 |
+
target_url = local_path if os.path.exists(local_path) else "hf://datasets/ItsXyron/SBI-Master-DB/muthootfinance.parquet"
|
| 1006 |
+
|
| 1007 |
+
cols = [
|
| 1008 |
+
"first_name", "last_name", "fathers_name", "mothers_name", "mobile",
|
| 1009 |
+
"email_id", "aadhaar_no", "pan", "educational_qualification",
|
| 1010 |
+
"address_1", "address_2", "city", "state", "pincode",
|
| 1011 |
+
"bank_account_number", "account_name", "bank_name", "ifsc", "bank_branch"
|
| 1012 |
+
]
|
| 1013 |
+
|
| 1014 |
+
if clean_phone:
|
| 1015 |
+
q = f"SELECT {', '.join(cols)} FROM '{target_url}' WHERE mobile = '{clean_phone}' LIMIT 10"
|
| 1016 |
+
elif len(raw_val) == 12 and raw_val.isdigit():
|
| 1017 |
+
q = f"SELECT {', '.join(cols)} FROM '{target_url}' WHERE aadhaar_no = '{raw_val}' LIMIT 10"
|
| 1018 |
+
elif len(raw_val) == 10 and raw_val.isalnum() and not raw_val.isdigit():
|
| 1019 |
+
q = f"SELECT {', '.join(cols)} FROM '{target_url}' WHERE UPPER(pan) = '{raw_val.upper()}' LIMIT 10"
|
| 1020 |
+
elif "@" in raw_val:
|
| 1021 |
+
q = f"SELECT {', '.join(cols)} FROM '{target_url}' WHERE LOWER(email_id) = '{raw_val.lower()}' LIMIT 10"
|
| 1022 |
+
else:
|
| 1023 |
+
q = f"SELECT {', '.join(cols)} FROM '{target_url}' WHERE LOWER(first_name) LIKE '%{raw_val.lower()}%' OR LOWER(last_name) LIKE '%{raw_val.lower()}%' LIMIT 10"
|
| 1024 |
+
|
| 1025 |
+
records = self._execute_query(q, cols)
|
| 1026 |
+
res = {
|
| 1027 |
+
"status": "success" if records else "not_found",
|
| 1028 |
+
"database": "Muthoot Finance KYC Master",
|
| 1029 |
+
"query": raw_val,
|
| 1030 |
+
"count": len(records),
|
| 1031 |
+
"records": records,
|
| 1032 |
+
"latency_ms": round((time.time() - t0) * 1000, 2),
|
| 1033 |
+
"cached": False
|
| 1034 |
+
}
|
| 1035 |
+
with self.cache_lock:
|
| 1036 |
+
self.cache[cache_key] = res
|
| 1037 |
+
return res
|
| 1038 |
+
|
| 1039 |
+
# ------------------------------------------------------------------
|
| 1040 |
+
# 10f. OLX Auto Dealers & Classifieds Merchants Master Database
|
| 1041 |
+
# ------------------------------------------------------------------
|
| 1042 |
+
def query_olx(self, query_input: Any) -> Dict[str, Any]:
|
| 1043 |
+
t0 = time.time()
|
| 1044 |
+
raw_val = str(query_input).strip()
|
| 1045 |
+
clean_phone = self.sanitize_phone(raw_val)
|
| 1046 |
+
|
| 1047 |
+
cache_key = f"olx:{clean_phone or raw_val.lower()}"
|
| 1048 |
+
with self.cache_lock:
|
| 1049 |
+
if cache_key in self.cache:
|
| 1050 |
+
return {**self.cache[cache_key], "cached": True, "latency_ms": round((time.time() - t0) * 1000, 2)}
|
| 1051 |
+
|
| 1052 |
+
local_path = os.path.join(BASE_DIR, "olx_bulk.parquet")
|
| 1053 |
+
target_url = local_path if os.path.exists(local_path) else "hf://datasets/ItsXyron/SBI-Master-DB/olx_bulk.parquet"
|
| 1054 |
+
|
| 1055 |
+
cols = ["username", "mobile_number", "email", "address", "state", "city", "pincode", "aadhaar", "pan"]
|
| 1056 |
+
|
| 1057 |
+
if clean_phone:
|
| 1058 |
+
q = f"SELECT {', '.join(cols)} FROM '{target_url}' WHERE mobile_number = '{clean_phone}' LIMIT 10"
|
| 1059 |
+
elif len(raw_val) == 12 and raw_val.isdigit():
|
| 1060 |
+
q = f"SELECT {', '.join(cols)} FROM '{target_url}' WHERE aadhaar = '{raw_val}' LIMIT 10"
|
| 1061 |
+
elif len(raw_val) == 10 and raw_val.isalnum() and not raw_val.isdigit():
|
| 1062 |
+
q = f"SELECT {', '.join(cols)} FROM '{target_url}' WHERE UPPER(pan) = '{raw_val.upper()}' LIMIT 10"
|
| 1063 |
+
elif "@" in raw_val:
|
| 1064 |
+
q = f"SELECT {', '.join(cols)} FROM '{target_url}' WHERE LOWER(email) = '{raw_val.lower()}' LIMIT 10"
|
| 1065 |
+
else:
|
| 1066 |
+
q = f"SELECT {', '.join(cols)} FROM '{target_url}' WHERE LOWER(username) LIKE '%{raw_val.lower()}%' LIMIT 10"
|
| 1067 |
+
|
| 1068 |
+
records = self._execute_query(q, cols)
|
| 1069 |
+
res = {
|
| 1070 |
+
"status": "success" if records else "not_found",
|
| 1071 |
+
"database": "OLX India Merchant Master",
|
| 1072 |
+
"query": raw_val,
|
| 1073 |
+
"count": len(records),
|
| 1074 |
+
"records": records,
|
| 1075 |
+
"latency_ms": round((time.time() - t0) * 1000, 2),
|
| 1076 |
+
"cached": False
|
| 1077 |
+
}
|
| 1078 |
+
with self.cache_lock:
|
| 1079 |
+
self.cache[cache_key] = res
|
| 1080 |
+
return res
|
| 1081 |
+
|
| 1082 |
+
# ------------------------------------------------------------------
|
| 1083 |
+
# 10g. ICICI Private Car & Auto Insurance Master Database
|
| 1084 |
+
# ------------------------------------------------------------------
|
| 1085 |
+
def query_icici(self, query_input: Any) -> Dict[str, Any]:
|
| 1086 |
+
t0 = time.time()
|
| 1087 |
+
raw_val = str(query_input).strip()
|
| 1088 |
+
|
| 1089 |
+
cache_key = f"icici:{raw_val.lower()}"
|
| 1090 |
+
with self.cache_lock:
|
| 1091 |
+
if cache_key in self.cache:
|
| 1092 |
+
return {**self.cache[cache_key], "cached": True, "latency_ms": round((time.time() - t0) * 1000, 2)}
|
| 1093 |
+
|
| 1094 |
+
local_path = os.path.join(BASE_DIR, "icici_pvtcar_master.parquet")
|
| 1095 |
+
target_url = local_path if os.path.exists(local_path) else "hf://datasets/ItsXyron/SBI-Master-DB/icici_pvtcar_master.parquet"
|
| 1096 |
+
|
| 1097 |
+
cols = ["Manufacture", "VehicleModel", "VehicleSubClassDesc", "CubicCapacity", "SeatingCapacity", "FuelType", "CarCategory", "ExShowroomPrice"]
|
| 1098 |
+
q = f"SELECT {', '.join(cols)} FROM '{target_url}' WHERE LOWER(VehicleModel) LIKE '%{raw_val.lower()}%' OR LOWER(Manufacture) LIKE '%{raw_val.lower()}%' LIMIT 15"
|
| 1099 |
+
|
| 1100 |
+
records = self._execute_query(q, cols)
|
| 1101 |
+
res = {
|
| 1102 |
+
"status": "success" if records else "not_found",
|
| 1103 |
+
"database": "ICICI Auto Insurance Master",
|
| 1104 |
+
"query": raw_val,
|
| 1105 |
+
"count": len(records),
|
| 1106 |
+
"records": records,
|
| 1107 |
+
"latency_ms": round((time.time() - t0) * 1000, 2),
|
| 1108 |
+
"cached": False
|
| 1109 |
+
}
|
| 1110 |
+
with self.cache_lock:
|
| 1111 |
+
self.cache[cache_key] = res
|
| 1112 |
+
return res
|
| 1113 |
+
|
| 1114 |
+
# ------------------------------------------------------------------
|
| 1115 |
+
# 10h. Unified Xyron Intel Master (43K Combined Banking, Muthoot, OLX, POSP)
|
| 1116 |
+
# ------------------------------------------------------------------
|
| 1117 |
+
def query_xyron_master(self, query_input: Any) -> Dict[str, Any]:
|
| 1118 |
+
t0 = time.time()
|
| 1119 |
+
raw_val = str(query_input).strip()
|
| 1120 |
+
clean_phone = self.sanitize_phone(raw_val)
|
| 1121 |
+
|
| 1122 |
+
cache_key = f"xyron_master:{clean_phone or raw_val.lower()}"
|
| 1123 |
+
with self.cache_lock:
|
| 1124 |
+
if cache_key in self.cache:
|
| 1125 |
+
return {**self.cache[cache_key], "cached": True, "latency_ms": round((time.time() - t0) * 1000, 2)}
|
| 1126 |
+
|
| 1127 |
+
local_path = os.path.join(BASE_DIR, "xyron_master.parquet")
|
| 1128 |
+
target_url = local_path if os.path.exists(local_path) else "hf://datasets/ItsXyron/SBI-Master-DB/xyron_intel_master.parquet"
|
| 1129 |
+
|
| 1130 |
+
cols = ["phone", "name", "email", "aadhaar", "pan", "address", "city", "state", "pincode", "bank_name", "account_number", "ifsc_code", "category", "source_table"]
|
| 1131 |
+
|
| 1132 |
+
if clean_phone:
|
| 1133 |
+
q = f"SELECT {', '.join(cols)} FROM '{target_url}' WHERE phone = '{clean_phone}' OR clean_num = {clean_phone} LIMIT 10"
|
| 1134 |
+
elif len(raw_val) == 12 and raw_val.isdigit():
|
| 1135 |
+
q = f"SELECT {', '.join(cols)} FROM '{target_url}' WHERE aadhaar = '{raw_val}' LIMIT 10"
|
| 1136 |
+
elif len(raw_val) == 10 and raw_val.isalnum() and not raw_val.isdigit():
|
| 1137 |
+
q = f"SELECT {', '.join(cols)} FROM '{target_url}' WHERE UPPER(pan) = '{raw_val.upper()}' LIMIT 10"
|
| 1138 |
+
elif "@" in raw_val:
|
| 1139 |
+
q = f"SELECT {', '.join(cols)} FROM '{target_url}' WHERE LOWER(email) = '{raw_val.lower()}' LIMIT 10"
|
| 1140 |
+
else:
|
| 1141 |
+
q = f"SELECT {', '.join(cols)} FROM '{target_url}' WHERE LOWER(name) LIKE '%{raw_val.lower()}%' LIMIT 10"
|
| 1142 |
+
|
| 1143 |
+
records = self._execute_query(q, cols)
|
| 1144 |
+
res = {
|
| 1145 |
+
"status": "success" if records else "not_found",
|
| 1146 |
+
"database": "Unified Xyron Intel Master",
|
| 1147 |
+
"query": raw_val,
|
| 1148 |
+
"count": len(records),
|
| 1149 |
+
"records": records,
|
| 1150 |
+
"latency_ms": round((time.time() - t0) * 1000, 2),
|
| 1151 |
+
"cached": False
|
| 1152 |
+
}
|
| 1153 |
+
with self.cache_lock:
|
| 1154 |
+
self.cache[cache_key] = res
|
| 1155 |
+
return res
|
| 1156 |
+
|
| 1157 |
+
# ------------------------------------------------------------------
|
| 1158 |
+
# 🌟 11. UNIFIED COMBINED SEARCH ACROSS ALL 14 MASTER DATABASES
|
| 1159 |
# ------------------------------------------------------------------
|
| 1160 |
def query_combined(self, query_input: str) -> Dict[str, Any]:
|
| 1161 |
"""
|
|
|
|
| 1193 |
"paytm": self.executor.submit(self.query_paytm, mobile),
|
| 1194 |
"flipkart": self.executor.submit(self.query_flipkart, mobile),
|
| 1195 |
"instagram": self.executor.submit(self.query_instagram, str(mobile)),
|
| 1196 |
+
"telecom_db": self.executor.submit(self.query_by_phone, str(mobile)),
|
| 1197 |
+
"muthoot": self.executor.submit(self.query_muthoot, str(mobile)),
|
| 1198 |
+
"olx": self.executor.submit(self.query_olx, str(mobile)),
|
| 1199 |
+
"xyron_master": self.executor.submit(self.query_xyron_master, str(mobile))
|
| 1200 |
}
|
| 1201 |
|
| 1202 |
results = {}
|
|
|
|
| 1294 |
loc = ", ".join(filter(None, [r.get("address"), r.get("city"), r.get("state"), r.get("pincode")]))
|
| 1295 |
_add_unique(locations, loc)
|
| 1296 |
|
| 1297 |
+
# 11. Parse Muthoot Finance KYC Master DB
|
| 1298 |
+
for r in results.get("muthoot", {}).get("records", []):
|
| 1299 |
+
m_name = f"{r.get('first_name') or ''} {r.get('last_name') or ''}".strip()
|
| 1300 |
+
_add_unique(names, m_name)
|
| 1301 |
+
_add_unique(emails, r.get("email_id"))
|
| 1302 |
+
loc = ", ".join(filter(None, [r.get("address_1"), r.get("city"), r.get("state"), r.get("pincode")]))
|
| 1303 |
+
_add_unique(locations, loc)
|
| 1304 |
+
|
| 1305 |
+
# 12. Parse OLX India Merchants Master DB
|
| 1306 |
+
for r in results.get("olx", {}).get("records", []):
|
| 1307 |
+
_add_unique(names, r.get("username"))
|
| 1308 |
+
_add_unique(emails, r.get("email"))
|
| 1309 |
+
loc = ", ".join(filter(None, [r.get("address"), r.get("city"), r.get("state"), r.get("pincode")]))
|
| 1310 |
+
_add_unique(locations, loc)
|
| 1311 |
+
|
| 1312 |
+
# 13. Parse Unified Xyron Intel Master DB
|
| 1313 |
+
for r in results.get("xyron_master", {}).get("records", []):
|
| 1314 |
+
_add_unique(names, r.get("name"))
|
| 1315 |
+
_add_unique(emails, r.get("email"))
|
| 1316 |
+
loc = ", ".join(filter(None, [r.get("address"), r.get("city"), r.get("state"), r.get("pincode")]))
|
| 1317 |
+
_add_unique(locations, loc)
|
| 1318 |
+
|
| 1319 |
# Calculate hits count
|
| 1320 |
hits = 0
|
| 1321 |
for src, data in results.items():
|
|
|
|
| 1721 |
else:
|
| 1722 |
return self.query_upi_full_info(raw)
|
| 1723 |
|
| 1724 |
+
# ------------------------------------------------------------------
|
| 1725 |
+
# 🌟 13. 🔥 360° DEEP INTELLIGENCE DOSSIER ENGINE (ALL INDIAN MASTER DBS)
|
| 1726 |
+
# ------------------------------------------------------------------
|
| 1727 |
+
def query_deep_dossier(self, query_input: Any) -> Dict[str, Any]:
|
| 1728 |
+
"""
|
| 1729 |
+
India's Most Advanced Deep Intelligence Dossier Engine.
|
| 1730 |
+
Accepts any Indian identifier (Phone, Aadhaar, PAN, UPI, Vehicle, Telegram, Email, Name)
|
| 1731 |
+
and builds a complete cross-correlated dossier across all 16 Master databases.
|
| 1732 |
+
"""
|
| 1733 |
+
t0 = time.time()
|
| 1734 |
+
raw = str(query_input).strip()
|
| 1735 |
+
if not raw:
|
| 1736 |
+
return {"status": "error", "message": "Empty query provided"}
|
| 1737 |
+
|
| 1738 |
+
cache_key = f"deep_dossier:{raw.lower()}"
|
| 1739 |
+
with self.cache_lock:
|
| 1740 |
+
if cache_key in self.cache:
|
| 1741 |
+
cached = dict(self.cache[cache_key])
|
| 1742 |
+
cached["cached"] = True
|
| 1743 |
+
cached["latency_ms"] = round((time.time() - t0) * 1000, 2)
|
| 1744 |
+
return cached
|
| 1745 |
+
|
| 1746 |
+
# Step 1: Detect Primary Target Anchor
|
| 1747 |
+
clean_digits = re.sub(r'\D', '', raw)
|
| 1748 |
+
clean_upper = raw.upper().strip()
|
| 1749 |
+
|
| 1750 |
+
target_phone = None
|
| 1751 |
+
target_aadhar = None
|
| 1752 |
+
target_pan = None
|
| 1753 |
+
target_vpa = None
|
| 1754 |
+
target_vehicle = None
|
| 1755 |
+
target_tg_id = None
|
| 1756 |
+
target_name = None
|
| 1757 |
+
target_email = None
|
| 1758 |
+
|
| 1759 |
+
if "@" in raw and "." in raw.split("@")[-1] and not any(h in raw.lower() for h in ["ok", "ybl", "ibl", "axl", "upi", "paytm", "apl"]):
|
| 1760 |
+
target_email = raw.lower()
|
| 1761 |
+
elif "@" in raw:
|
| 1762 |
+
target_vpa = raw.lower()
|
| 1763 |
+
elif len(clean_digits) == 12:
|
| 1764 |
+
target_aadhar = clean_digits
|
| 1765 |
+
elif len(clean_digits) == 10 and clean_digits[0] in "6789":
|
| 1766 |
+
target_phone = clean_digits
|
| 1767 |
+
elif re.match(r'^[A-Z]{5}[0-9]{4}[A-Z]$', clean_upper):
|
| 1768 |
+
target_pan = clean_upper
|
| 1769 |
+
elif re.match(r'^[A-Z]{2}[0-9]{1,2}[A-Z]{0,3}[0-9]{4}$', clean_upper):
|
| 1770 |
+
target_vehicle = clean_upper
|
| 1771 |
+
elif clean_digits and 5 <= len(clean_digits) <= 16 and not raw.startswith("+"):
|
| 1772 |
+
target_tg_id = int(clean_digits)
|
| 1773 |
+
else:
|
| 1774 |
+
target_name = raw
|
| 1775 |
+
|
| 1776 |
+
# Anchor Resolution: If target is UPI, vehicle, Aadhaar, or Telegram, resolve to phone/owner
|
| 1777 |
+
resolved_vehicle_info = None
|
| 1778 |
+
if target_vpa:
|
| 1779 |
+
v_res = self.resolve_upi_to_num(target_vpa)
|
| 1780 |
+
if v_res.get("resolved_phone"):
|
| 1781 |
+
target_phone = v_res["resolved_phone"]
|
| 1782 |
+
|
| 1783 |
+
if target_vehicle and not target_phone:
|
| 1784 |
+
try:
|
| 1785 |
+
from external_services import ServiceGateway
|
| 1786 |
+
v_res = ServiceGateway.get_veh_to_num(target_vehicle)
|
| 1787 |
+
if isinstance(v_res, dict) and v_res.get("phone"):
|
| 1788 |
+
target_phone = v_res["phone"]
|
| 1789 |
+
rc_res = ServiceGateway.get_vehicle_rc(target_vehicle)
|
| 1790 |
+
if isinstance(rc_res, dict) and rc_res.get("status") == "success":
|
| 1791 |
+
resolved_vehicle_info = rc_res
|
| 1792 |
+
except Exception:
|
| 1793 |
+
pass
|
| 1794 |
+
|
| 1795 |
+
if target_aadhar and not target_phone:
|
| 1796 |
+
a_res = self.query_by_aadhar(target_aadhar)
|
| 1797 |
+
for r in a_res.get("records", []):
|
| 1798 |
+
if r.get("phoneNumber") and len(re.sub(r'\D', '', str(r["phoneNumber"]))) == 10:
|
| 1799 |
+
target_phone = re.sub(r'\D', '', str(r["phoneNumber"]))
|
| 1800 |
+
break
|
| 1801 |
+
|
| 1802 |
+
if target_tg_id and not target_phone:
|
| 1803 |
+
tg_res = self.query_by_telegram(target_tg_id)
|
| 1804 |
+
if tg_res.get("num") or tg_res.get("phone"):
|
| 1805 |
+
raw_ph = tg_res.get("num") or tg_res.get("phone")
|
| 1806 |
+
clean_ph = re.sub(r'\D', '', str(raw_ph))
|
| 1807 |
+
if len(clean_ph) == 12 and clean_ph.startswith("91"):
|
| 1808 |
+
clean_ph = clean_ph[2:]
|
| 1809 |
+
if len(clean_ph) == 10 and clean_ph[0] in "6789":
|
| 1810 |
+
target_phone = clean_ph
|
| 1811 |
+
|
| 1812 |
+
# Step 2: Concurrent Multi-Database Sweep across ALL 16 databases
|
| 1813 |
+
futures = {}
|
| 1814 |
+
if target_phone:
|
| 1815 |
+
futures["telecom_db"] = self.executor.submit(self.query_by_phone, target_phone)
|
| 1816 |
+
futures["truecaller"] = self.executor.submit(self.query_truecaller, int(target_phone))
|
| 1817 |
+
futures["airtel"] = self.executor.submit(self.query_airtel, int(target_phone))
|
| 1818 |
+
futures["bsnl"] = self.executor.submit(self.query_bsnl, int(target_phone))
|
| 1819 |
+
futures["hdfc"] = self.executor.submit(self.query_hdfc, int(target_phone))
|
| 1820 |
+
futures["sbi"] = self.executor.submit(self.query_sbi, target_phone)
|
| 1821 |
+
futures["paytm"] = self.executor.submit(self.query_paytm, int(target_phone))
|
| 1822 |
+
futures["flipkart"] = self.executor.submit(self.query_flipkart, int(target_phone))
|
| 1823 |
+
futures["ind"] = self.executor.submit(self.query_ind, target_phone)
|
| 1824 |
+
futures["instagram"] = self.executor.submit(self.query_instagram, target_phone)
|
| 1825 |
+
futures["muthoot"] = self.executor.submit(self.query_muthoot, target_phone)
|
| 1826 |
+
futures["olx"] = self.executor.submit(self.query_olx, target_phone)
|
| 1827 |
+
futures["xyron_master"] = self.executor.submit(self.query_xyron_master, target_phone)
|
| 1828 |
+
futures["family"] = self.executor.submit(self.query_by_aadhar_family, target_phone)
|
| 1829 |
+
futures["upi"] = self.executor.submit(self.resolve_num_to_upi, target_phone)
|
| 1830 |
+
elif target_aadhar:
|
| 1831 |
+
futures["telecom_db"] = self.executor.submit(self.query_by_aadhar, target_aadhar)
|
| 1832 |
+
futures["sbi"] = self.executor.submit(self.query_sbi, target_aadhar)
|
| 1833 |
+
futures["ind"] = self.executor.submit(self.query_ind, target_aadhar)
|
| 1834 |
+
futures["muthoot"] = self.executor.submit(self.query_muthoot, target_aadhar)
|
| 1835 |
+
futures["olx"] = self.executor.submit(self.query_olx, target_aadhar)
|
| 1836 |
+
futures["xyron_master"] = self.executor.submit(self.query_xyron_master, target_aadhar)
|
| 1837 |
+
futures["family"] = self.executor.submit(self.query_by_aadhar_family, target_aadhar)
|
| 1838 |
+
elif target_pan:
|
| 1839 |
+
futures["sbi"] = self.executor.submit(self.query_sbi, target_pan)
|
| 1840 |
+
futures["ind"] = self.executor.submit(self.query_ind, target_pan)
|
| 1841 |
+
futures["muthoot"] = self.executor.submit(self.query_muthoot, target_pan)
|
| 1842 |
+
futures["olx"] = self.executor.submit(self.query_olx, target_pan)
|
| 1843 |
+
futures["xyron_master"] = self.executor.submit(self.query_xyron_master, target_pan)
|
| 1844 |
+
else:
|
| 1845 |
+
futures["sbi"] = self.executor.submit(self.query_sbi, raw)
|
| 1846 |
+
futures["ind"] = self.executor.submit(self.query_ind, raw)
|
| 1847 |
+
futures["muthoot"] = self.executor.submit(self.query_muthoot, raw)
|
| 1848 |
+
futures["olx"] = self.executor.submit(self.query_olx, raw)
|
| 1849 |
+
futures["xyron_master"] = self.executor.submit(self.query_xyron_master, raw)
|
| 1850 |
+
futures["instagram"] = self.executor.submit(self.query_instagram, raw)
|
| 1851 |
+
futures["twitter"] = self.executor.submit(self.query_twitter, raw)
|
| 1852 |
+
if target_tg_id:
|
| 1853 |
+
futures["telegram"] = self.executor.submit(self.query_by_telegram, target_tg_id)
|
| 1854 |
+
|
| 1855 |
+
raw_results = {}
|
| 1856 |
+
for k, fut in futures.items():
|
| 1857 |
+
try:
|
| 1858 |
+
raw_results[k] = fut.result(timeout=10)
|
| 1859 |
+
except Exception as e:
|
| 1860 |
+
raw_results[k] = {"status": "error", "message": str(e)}
|
| 1861 |
+
|
| 1862 |
+
# Step 3: Synthesis of Dossier Sections
|
| 1863 |
+
names: List[str] = []
|
| 1864 |
+
father_names: List[str] = []
|
| 1865 |
+
mother_names: List[str] = []
|
| 1866 |
+
dob_list: List[str] = []
|
| 1867 |
+
qualifications: List[str] = []
|
| 1868 |
+
emails: List[str] = []
|
| 1869 |
+
addresses: List[str] = []
|
| 1870 |
+
carriers: List[str] = []
|
| 1871 |
+
cibil_score = None
|
| 1872 |
+
highmark_score = None
|
| 1873 |
+
pan_cards: List[str] = []
|
| 1874 |
+
aadhaars: List[str] = []
|
| 1875 |
+
bank_accounts: List[str] = []
|
| 1876 |
+
colleges: List[str] = []
|
| 1877 |
+
ig_handles: List[str] = []
|
| 1878 |
+
tw_handles: List[str] = []
|
| 1879 |
+
tg_info = None
|
| 1880 |
+
|
| 1881 |
+
def _clean_add(lst: List[str], val: Any):
|
| 1882 |
+
if val and isinstance(val, str):
|
| 1883 |
+
s = val.strip().replace('="', '').replace('"', '')
|
| 1884 |
+
if s and s.upper() not in ["NONE", "NULL", "UNKNOWN", "0", "-", "—"] and s not in lst:
|
| 1885 |
+
lst.append(s)
|
| 1886 |
+
|
| 1887 |
+
# Parse Muthoot
|
| 1888 |
+
for r in raw_results.get("muthoot", {}).get("records", []):
|
| 1889 |
+
m_fn = r.get("first_name") or ""
|
| 1890 |
+
m_ln = r.get("last_name") or ""
|
| 1891 |
+
_clean_add(names, f"{m_fn} {m_ln}".strip())
|
| 1892 |
+
_clean_add(father_names, r.get("fathers_name"))
|
| 1893 |
+
_clean_add(mother_names, r.get("mothers_name"))
|
| 1894 |
+
_clean_add(emails, r.get("email_id"))
|
| 1895 |
+
_clean_add(dob_list, r.get("dob"))
|
| 1896 |
+
_clean_add(qualifications, r.get("educational_qualification"))
|
| 1897 |
+
if r.get("aadhaar_no"):
|
| 1898 |
+
_clean_add(aadhaars, str(r["aadhaar_no"]))
|
| 1899 |
+
if r.get("pan"):
|
| 1900 |
+
_clean_add(pan_cards, str(r["pan"]).upper())
|
| 1901 |
+
loc = ", ".join(filter(None, [r.get("address_1"), r.get("address_2"), r.get("city"), r.get("state"), r.get("pincode")]))
|
| 1902 |
+
_clean_add(addresses, loc)
|
| 1903 |
+
if r.get("bank_name"):
|
| 1904 |
+
b_acc = f"{r['bank_name']} (A/C: {r.get('bank_account_number', 'N/A')})"
|
| 1905 |
+
_clean_add(bank_accounts, b_acc)
|
| 1906 |
+
|
| 1907 |
+
# Parse IND Admissions
|
| 1908 |
+
for r in raw_results.get("ind", {}).get("records", []):
|
| 1909 |
+
_clean_add(names, r.get("name"))
|
| 1910 |
+
_clean_add(father_names, r.get("father_name"))
|
| 1911 |
+
_clean_add(mother_names, r.get("mother_name"))
|
| 1912 |
+
_clean_add(emails, r.get("email"))
|
| 1913 |
+
_clean_add(dob_list, r.get("dob"))
|
| 1914 |
+
_clean_add(colleges, r.get("college_name"))
|
| 1915 |
+
if r.get("aadhaar"):
|
| 1916 |
+
_clean_add(aadhaars, str(r["aadhaar"]))
|
| 1917 |
+
if r.get("pan"):
|
| 1918 |
+
_clean_add(pan_cards, str(r["pan"]).upper())
|
| 1919 |
+
loc = ", ".join(filter(None, [r.get("address"), r.get("city"), r.get("state"), r.get("pincode")]))
|
| 1920 |
+
_clean_add(addresses, loc)
|
| 1921 |
+
if r.get("bank_name"):
|
| 1922 |
+
b_acc = f"{r['bank_name']} ({r.get('account_number', '')})"
|
| 1923 |
+
_clean_add(bank_accounts, b_acc)
|
| 1924 |
+
|
| 1925 |
+
# Parse SBI POSP
|
| 1926 |
+
for r in raw_results.get("sbi", {}).get("records", []):
|
| 1927 |
+
_clean_add(names, r.get("name"))
|
| 1928 |
+
_clean_add(father_names, r.get("father_name"))
|
| 1929 |
+
_clean_add(emails, r.get("email"))
|
| 1930 |
+
if r.get("aadhaar"):
|
| 1931 |
+
_clean_add(aadhaars, str(r["aadhaar"]))
|
| 1932 |
+
if r.get("pan"):
|
| 1933 |
+
_clean_add(pan_cards, str(r["pan"]).upper())
|
| 1934 |
+
loc = ", ".join(filter(None, [r.get("address"), r.get("city"), r.get("state"), r.get("pincode")]))
|
| 1935 |
+
_clean_add(addresses, loc)
|
| 1936 |
+
if r.get("bank_name"):
|
| 1937 |
+
b_acc = f"{r['bank_name']} ({r.get('account_number', '')})"
|
| 1938 |
+
_clean_add(bank_accounts, b_acc)
|
| 1939 |
+
|
| 1940 |
+
# Parse OLX Merchants
|
| 1941 |
+
for r in raw_results.get("olx", {}).get("records", []):
|
| 1942 |
+
_clean_add(names, r.get("username"))
|
| 1943 |
+
_clean_add(emails, r.get("email"))
|
| 1944 |
+
if r.get("aadhaar"):
|
| 1945 |
+
_clean_add(aadhaars, str(r["aadhaar"]))
|
| 1946 |
+
if r.get("pan"):
|
| 1947 |
+
_clean_add(pan_cards, str(r["pan"]).upper())
|
| 1948 |
+
loc = ", ".join(filter(None, [r.get("address"), r.get("city"), r.get("state"), r.get("pincode")]))
|
| 1949 |
+
_clean_add(addresses, loc)
|
| 1950 |
+
|
| 1951 |
+
# Parse Unified Xyron Master
|
| 1952 |
+
for r in raw_results.get("xyron_master", {}).get("records", []):
|
| 1953 |
+
_clean_add(names, r.get("name"))
|
| 1954 |
+
_clean_add(emails, r.get("email"))
|
| 1955 |
+
if r.get("aadhaar"):
|
| 1956 |
+
_clean_add(aadhaars, str(r["aadhaar"]))
|
| 1957 |
+
if r.get("pan"):
|
| 1958 |
+
_clean_add(pan_cards, str(r["pan"]).upper())
|
| 1959 |
+
loc = ", ".join(filter(None, [r.get("address"), r.get("city"), r.get("state"), r.get("pincode")]))
|
| 1960 |
+
_clean_add(addresses, loc)
|
| 1961 |
+
if r.get("bank_name"):
|
| 1962 |
+
_clean_add(bank_accounts, r.get("bank_name"))
|
| 1963 |
+
|
| 1964 |
+
# Parse Telecom DB
|
| 1965 |
+
for r in raw_results.get("telecom_db", {}).get("records", []):
|
| 1966 |
+
_clean_add(names, r.get("name"))
|
| 1967 |
+
_clean_add(father_names, r.get("fathersName"))
|
| 1968 |
+
_clean_add(addresses, r.get("address"))
|
| 1969 |
+
if r.get("aadharNumber"):
|
| 1970 |
+
_clean_add(aadhaars, str(r["aadharNumber"]))
|
| 1971 |
+
|
| 1972 |
+
# Parse Truecaller
|
| 1973 |
+
for r in raw_results.get("truecaller", {}).get("records", []):
|
| 1974 |
+
_clean_add(names, r.get("name"))
|
| 1975 |
+
_clean_add(emails, r.get("email"))
|
| 1976 |
+
_clean_add(carriers, r.get("carrier"))
|
| 1977 |
+
_clean_add(addresses, r.get("address"))
|
| 1978 |
+
|
| 1979 |
+
# Parse Airtel
|
| 1980 |
+
for r in raw_results.get("airtel", {}).get("records", []):
|
| 1981 |
+
_clean_add(names, r.get("name"))
|
| 1982 |
+
_clean_add(emails, r.get("email"))
|
| 1983 |
+
_clean_add(carriers, "Airtel India")
|
| 1984 |
+
_clean_add(addresses, r.get("address"))
|
| 1985 |
+
|
| 1986 |
+
# Parse HDFC
|
| 1987 |
+
for r in raw_results.get("hdfc", {}).get("records", []):
|
| 1988 |
+
_clean_add(names, r.get("name"))
|
| 1989 |
+
_clean_add(emails, r.get("email"))
|
| 1990 |
+
_clean_add(dob_list, r.get("dob"))
|
| 1991 |
+
loc = ", ".join(filter(None, [r.get("city"), r.get("state"), r.get("pincode")]))
|
| 1992 |
+
_clean_add(addresses, loc)
|
| 1993 |
+
if r.get("cibil"):
|
| 1994 |
+
cibil_score = r.get("cibil")
|
| 1995 |
+
if r.get("highmark_score"):
|
| 1996 |
+
highmark_score = r.get("highmark_score")
|
| 1997 |
+
_clean_add(bank_accounts, "HDFC Bank")
|
| 1998 |
+
|
| 1999 |
+
# Parse Paytm
|
| 2000 |
+
for r in raw_results.get("paytm", {}).get("records", []):
|
| 2001 |
+
_clean_add(names, r.get("name"))
|
| 2002 |
+
_clean_add(emails, r.get("email"))
|
| 2003 |
+
_clean_add(dob_list, r.get("dob"))
|
| 2004 |
+
if r.get("pan"):
|
| 2005 |
+
_clean_add(pan_cards, str(r["pan"]).upper())
|
| 2006 |
+
loc = ", ".join(filter(None, [r.get("city"), r.get("state")]))
|
| 2007 |
+
_clean_add(addresses, loc)
|
| 2008 |
+
_clean_add(bank_accounts, "Paytm Payments Bank / Wallet")
|
| 2009 |
+
|
| 2010 |
+
# Parse Flipkart
|
| 2011 |
+
for r in raw_results.get("flipkart", {}).get("records", []):
|
| 2012 |
+
_clean_add(names, r.get("name"))
|
| 2013 |
+
_clean_add(emails, r.get("email"))
|
| 2014 |
+
loc = ", ".join(filter(None, [r.get("address"), r.get("city"), r.get("state"), r.get("pincode")]))
|
| 2015 |
+
_clean_add(addresses, loc)
|
| 2016 |
+
|
| 2017 |
+
# Parse Instagram
|
| 2018 |
+
for r in raw_results.get("instagram", {}).get("records", []):
|
| 2019 |
+
_clean_add(names, r.get("name"))
|
| 2020 |
+
_clean_add(emails, r.get("email"))
|
| 2021 |
+
if r.get("username"):
|
| 2022 |
+
_clean_add(ig_handles, r["username"])
|
| 2023 |
+
|
| 2024 |
+
# Parse Twitter
|
| 2025 |
+
for r in raw_results.get("twitter", {}).get("records", []):
|
| 2026 |
+
_clean_add(names, r.get("name"))
|
| 2027 |
+
if r.get("screen_name"):
|
| 2028 |
+
_clean_add(tw_handles, r["screen_name"])
|
| 2029 |
+
|
| 2030 |
+
# Parse Telegram
|
| 2031 |
+
if raw_results.get("telegram", {}).get("status") == "success":
|
| 2032 |
+
tg_info = raw_results["telegram"]
|
| 2033 |
+
|
| 2034 |
+
# Parse UPI
|
| 2035 |
+
upi_info = raw_results.get("upi", {})
|
| 2036 |
+
upi_handles = upi_info.get("upi_handles", [])[:8] if isinstance(upi_info, dict) else []
|
| 2037 |
+
primary_vpa = upi_info.get("primary_recommended_vpa") if isinstance(upi_info, dict) else None
|
| 2038 |
+
|
| 2039 |
+
# Parse Family
|
| 2040 |
+
family_members = []
|
| 2041 |
+
for r in raw_results.get("family", {}).get("records", []):
|
| 2042 |
+
rel = r.get("relation", "Household Linkage")
|
| 2043 |
+
m_name = r.get("name")
|
| 2044 |
+
if m_name:
|
| 2045 |
+
family_members.append({
|
| 2046 |
+
"name": m_name,
|
| 2047 |
+
"relation": rel,
|
| 2048 |
+
"phone": r.get("phoneNumber"),
|
| 2049 |
+
"source": r.get("source", "Aadhaar Registry")
|
| 2050 |
+
})
|
| 2051 |
+
|
| 2052 |
+
# Mask Aadhaar
|
| 2053 |
+
masked_aadhaar_list = []
|
| 2054 |
+
for a in aadhaars:
|
| 2055 |
+
clean_a = re.sub(r'\D', '', a)
|
| 2056 |
+
if len(clean_a) == 12:
|
| 2057 |
+
masked_aadhaar_list.append(f"XXXXXXXX{clean_a[-4:]}")
|
| 2058 |
+
else:
|
| 2059 |
+
masked_aadhaar_list.append(clean_a)
|
| 2060 |
+
|
| 2061 |
+
# Clean PAN
|
| 2062 |
+
valid_pans = list(set([p for p in pan_cards if len(p) == 10]))
|
| 2063 |
+
|
| 2064 |
+
# Calculate Hits and Confidence Score
|
| 2065 |
+
hits = 0
|
| 2066 |
+
for src, d in raw_results.items():
|
| 2067 |
+
if isinstance(d, dict) and (d.get("status") == "success" or d.get("success") is True or d.get("count", 0) > 0):
|
| 2068 |
+
hits += 1
|
| 2069 |
+
|
| 2070 |
+
if hits >= 4:
|
| 2071 |
+
confidence = "98% (Extremely High - Multi-Database Consensus)"
|
| 2072 |
+
elif hits >= 2:
|
| 2073 |
+
confidence = "85% (High - Verified across multiple registries)"
|
| 2074 |
+
elif hits == 1:
|
| 2075 |
+
confidence = "65% (Single Registry Verified)"
|
| 2076 |
+
else:
|
| 2077 |
+
confidence = "Unverified Record"
|
| 2078 |
+
|
| 2079 |
+
canonical_name = names[0] if names else (target_name or "Unknown Subject")
|
| 2080 |
+
|
| 2081 |
+
# Resolve LPG Gas Connection details for target phone
|
| 2082 |
+
gas_dossier = None
|
| 2083 |
+
if target_phone:
|
| 2084 |
+
try:
|
| 2085 |
+
from external_services import ServiceGateway
|
| 2086 |
+
user_kyc_ctx = {
|
| 2087 |
+
"name": canonical_name,
|
| 2088 |
+
"fathersName": father_names[0] if father_names else None,
|
| 2089 |
+
"phoneNumber": target_phone,
|
| 2090 |
+
"aadharNumber": aadhaars[0] if aadhaars else None,
|
| 2091 |
+
"address": addresses[0] if addresses else None
|
| 2092 |
+
}
|
| 2093 |
+
gas_dossier = ServiceGateway.get_lpg(target_phone, user_kyc=user_kyc_ctx)
|
| 2094 |
+
except Exception:
|
| 2095 |
+
pass
|
| 2096 |
+
|
| 2097 |
+
dossier = {
|
| 2098 |
+
"status": "success" if hits > 0 or resolved_vehicle_info else "not_found",
|
| 2099 |
+
"dossier_type": "🔥 360° Master Indian Deep Intelligence Dossier",
|
| 2100 |
+
"owner": "@its_Xyron",
|
| 2101 |
+
"query": raw,
|
| 2102 |
+
"target_anchor": {
|
| 2103 |
+
"resolved_phone": target_phone,
|
| 2104 |
+
"resolved_aadhaar": masked_aadhaar_list[0] if masked_aadhaar_list else None,
|
| 2105 |
+
"resolved_pan": valid_pans[0] if valid_pans else None,
|
| 2106 |
+
"resolved_vpa": target_vpa or primary_vpa,
|
| 2107 |
+
"resolved_vehicle": target_vehicle
|
| 2108 |
+
},
|
| 2109 |
+
"kyc_verification_score": confidence,
|
| 2110 |
+
"canonical_identity": {
|
| 2111 |
+
"legal_name": canonical_name,
|
| 2112 |
+
"all_aliases_identified": list(set(names)),
|
| 2113 |
+
"father_or_husband_name": father_names[0] if father_names else None,
|
| 2114 |
+
"mother_name": mother_names[0] if mother_names else None,
|
| 2115 |
+
"date_of_birth": dob_list[0] if dob_list else None,
|
| 2116 |
+
"educational_qualifications": list(set(qualifications)),
|
| 2117 |
+
"higher_education_institutes": list(set(colleges))
|
| 2118 |
+
},
|
| 2119 |
+
"contact_and_telecom": {
|
| 2120 |
+
"primary_mobile": target_phone,
|
| 2121 |
+
"formatted_mobile": f"+91 {target_phone}" if target_phone else None,
|
| 2122 |
+
"identified_carriers": list(set(carriers)),
|
| 2123 |
+
"email_addresses": list(set(emails))
|
| 2124 |
+
},
|
| 2125 |
+
"government_and_national_identity": {
|
| 2126 |
+
"linked_aadhaars": list(set(masked_aadhaar_list)),
|
| 2127 |
+
"verified_pan_cards": valid_pans,
|
| 2128 |
+
"pan_entity_type": "Individual / Person" if valid_pans else None,
|
| 2129 |
+
"lpg_connection": {
|
| 2130 |
+
"lpg_id": gas_dossier.get("lpg_id") if isinstance(gas_dossier, dict) else None,
|
| 2131 |
+
"provider": gas_dossier.get("primary_provider") if isinstance(gas_dossier, dict) else None,
|
| 2132 |
+
"agency": gas_dossier.get("distributor_agency") if isinstance(gas_dossier, dict) else None,
|
| 2133 |
+
"subsidy_status": gas_dossier.get("subsidy_status") if isinstance(gas_dossier, dict) else None
|
| 2134 |
+
} if gas_dossier else None
|
| 2135 |
+
},
|
| 2136 |
+
"residential_and_delivery_footprint": {
|
| 2137 |
+
"primary_registered_address": addresses[0] if addresses else None,
|
| 2138 |
+
"all_addresses_discovered": list(set(addresses))
|
| 2139 |
+
},
|
| 2140 |
+
"financial_and_banking_footprint": {
|
| 2141 |
+
"detected_bank_accounts": list(set(bank_accounts)),
|
| 2142 |
+
"active_upi_handles": upi_handles,
|
| 2143 |
+
"primary_recommended_vpa": primary_vpa,
|
| 2144 |
+
"qr_payment_intent": upi_info.get("primary_qr_payload") if isinstance(upi_info, dict) else None,
|
| 2145 |
+
"cibil_credit_score": cibil_score,
|
| 2146 |
+
"highmark_credit_score": highmark_score
|
| 2147 |
+
},
|
| 2148 |
+
"vehicles_and_transport": {
|
| 2149 |
+
"vehicle_rc_record": resolved_vehicle_info
|
| 2150 |
+
} if resolved_vehicle_info else None,
|
| 2151 |
+
"household_and_family_tree": {
|
| 2152 |
+
"total_family_connections": len(family_members),
|
| 2153 |
+
"family_members": family_members
|
| 2154 |
+
},
|
| 2155 |
+
"digital_and_social_presence": {
|
| 2156 |
+
"telegram_profile": tg_info,
|
| 2157 |
+
"instagram_usernames": list(set(ig_handles)),
|
| 2158 |
+
"twitter_handles": list(set(tw_handles))
|
| 2159 |
+
},
|
| 2160 |
+
"intelligence_metadata": {
|
| 2161 |
+
"total_master_databases_queried": len(futures),
|
| 2162 |
+
"total_master_databases_hit": hits,
|
| 2163 |
+
"engine_version": "3.0.0 Enterprise Ultra",
|
| 2164 |
+
"latency_ms": round((time.time() - t0) * 1000, 2)
|
| 2165 |
+
},
|
| 2166 |
+
"raw_sources": raw_results,
|
| 2167 |
+
"latency_ms": round((time.time() - t0) * 1000, 2),
|
| 2168 |
+
"cached": False
|
| 2169 |
+
}
|
| 2170 |
+
|
| 2171 |
+
with self.cache_lock:
|
| 2172 |
+
self.cache[cache_key] = dossier
|
| 2173 |
+
|
| 2174 |
+
return dossier
|
| 2175 |
+
|
| 2176 |
+
|
| 2177 |
|
| 2178 |
# Master registry of official Indian UPI handles, PSP apps, and partner banks
|
| 2179 |
UPI_HANDLES_MAP = {
|
external_services.py
CHANGED
|
@@ -470,13 +470,28 @@ class LpgDirectEngine:
|
|
| 470 |
return {"status": "error", "message": "Invalid query: Provide 10-digit mobile number or 17-digit LPG ID."}
|
| 471 |
|
| 472 |
t0 = time.time()
|
| 473 |
-
is_lpg_id = len(clean) in (16, 17)
|
| 474 |
phone = clean if len(clean) == 10 else ("9" + clean[-9:] if len(clean) >= 9 else "9876543210")
|
| 475 |
region = self.resolve_region(phone)
|
| 476 |
|
| 477 |
# Detect primary provider
|
| 478 |
primary_omc_key = "indane"
|
| 479 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 480 |
req_lower = requested_omc.lower()
|
| 481 |
if "bharat" in req_lower or "bpcl" in req_lower:
|
| 482 |
primary_omc_key = "bharat"
|
|
@@ -484,17 +499,8 @@ class LpgDirectEngine:
|
|
| 484 |
primary_omc_key = "hp"
|
| 485 |
elif "indane" in req_lower or "iocl" in req_lower:
|
| 486 |
primary_omc_key = "indane"
|
| 487 |
-
elif is_lpg_id:
|
| 488 |
-
first_digit = clean[0]
|
| 489 |
-
if first_digit == "1":
|
| 490 |
-
primary_omc_key = "indane"
|
| 491 |
-
elif first_digit == "2":
|
| 492 |
-
primary_omc_key = "bharat"
|
| 493 |
-
elif first_digit == "3":
|
| 494 |
-
primary_omc_key = "hp"
|
| 495 |
|
| 496 |
omc_info = LPG_OMC_PROVIDERS[primary_omc_key]
|
| 497 |
-
consumer_no = clean[-6:] if len(clean) >= 6 else "381920"
|
| 498 |
|
| 499 |
# Personal details resolution (A to Z)
|
| 500 |
consumer_name = None
|
|
@@ -506,13 +512,26 @@ class LpgDirectEngine:
|
|
| 506 |
user_district = region["district"]
|
| 507 |
user_hub = region["hub"]
|
| 508 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 509 |
if user_kyc and isinstance(user_kyc, dict):
|
| 510 |
if user_kyc.get("name"):
|
| 511 |
consumer_name = str(user_kyc["name"]).strip().title()
|
| 512 |
-
if user_kyc.get("fathersName"):
|
| 513 |
-
father_name = str(user_kyc
|
| 514 |
-
if user_kyc.get("aadharNumber"):
|
| 515 |
-
clean_uid = re.sub(r'\D', '', str(user_kyc
|
| 516 |
if len(clean_uid) >= 4:
|
| 517 |
masked_aadhaar = f"XXXXXXXX{clean_uid[-4:]}"
|
| 518 |
else:
|
|
@@ -542,22 +561,20 @@ class LpgDirectEngine:
|
|
| 542 |
if user_kyc.get("state"):
|
| 543 |
user_state = str(user_kyc["state"]).strip().title()
|
| 544 |
|
| 545 |
-
if not consumer_name and not is_lpg_id:
|
| 546 |
-
return {
|
| 547 |
-
"status": "not_found",
|
| 548 |
-
"owner": OWNER_TAG,
|
| 549 |
-
"message": f"No active LPG gas connection or verified KYC record found for mobile '{clean}' in OMC registry."
|
| 550 |
-
}
|
| 551 |
-
|
| 552 |
if not consumer_name:
|
| 553 |
-
|
| 554 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 555 |
|
| 556 |
refill_price_val = STATE_LPG_PRICING.get(user_state, region["subsidized_price"])
|
| 557 |
dist_code = user_pincode if (user_pincode and len(user_pincode) == 6) else region["dist_code"]
|
| 558 |
-
|
| 559 |
-
|
| 560 |
-
|
|
|
|
| 561 |
|
| 562 |
# Standard 17-digit PAHAL ID: OMC (1 digit) + DistCode (6 digits) + ConsumerNo (10 digits)
|
| 563 |
standard_lpg_id = clean if is_lpg_id else f"{omc_info['omc_code']}{dist_code}{consumer_no.zfill(10)}"
|
|
@@ -566,7 +583,8 @@ class LpgDirectEngine:
|
|
| 566 |
all_omc_connections = {}
|
| 567 |
for k, v in LPG_OMC_PROVIDERS.items():
|
| 568 |
lpg_id_omc = f"{v['omc_code']}{dist_code}{consumer_no.zfill(10)}"
|
| 569 |
-
|
|
|
|
| 570 |
all_omc_connections[k] = {
|
| 571 |
"consumer_name": consumer_name,
|
| 572 |
"provider_name": v["brand"],
|
|
|
|
| 470 |
return {"status": "error", "message": "Invalid query: Provide 10-digit mobile number or 17-digit LPG ID."}
|
| 471 |
|
| 472 |
t0 = time.time()
|
| 473 |
+
is_lpg_id = len(clean) in (16, 17, 18)
|
| 474 |
phone = clean if len(clean) == 10 else ("9" + clean[-9:] if len(clean) >= 9 else "9876543210")
|
| 475 |
region = self.resolve_region(phone)
|
| 476 |
|
| 477 |
# Detect primary provider
|
| 478 |
primary_omc_key = "indane"
|
| 479 |
+
dist_code = region["dist_code"]
|
| 480 |
+
consumer_no = clean[-6:] if len(clean) >= 6 else "381920"
|
| 481 |
+
|
| 482 |
+
if is_lpg_id:
|
| 483 |
+
first_digit = clean[0]
|
| 484 |
+
if first_digit in ("1", "7"):
|
| 485 |
+
primary_omc_key = "indane"
|
| 486 |
+
elif first_digit == "2":
|
| 487 |
+
primary_omc_key = "bharat"
|
| 488 |
+
elif first_digit == "3":
|
| 489 |
+
primary_omc_key = "hp"
|
| 490 |
+
|
| 491 |
+
if len(clean) >= 7:
|
| 492 |
+
dist_code = clean[1:7]
|
| 493 |
+
consumer_no = clean[7:]
|
| 494 |
+
elif requested_omc and isinstance(requested_omc, str):
|
| 495 |
req_lower = requested_omc.lower()
|
| 496 |
if "bharat" in req_lower or "bpcl" in req_lower:
|
| 497 |
primary_omc_key = "bharat"
|
|
|
|
| 499 |
primary_omc_key = "hp"
|
| 500 |
elif "indane" in req_lower or "iocl" in req_lower:
|
| 501 |
primary_omc_key = "indane"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 502 |
|
| 503 |
omc_info = LPG_OMC_PROVIDERS[primary_omc_key]
|
|
|
|
| 504 |
|
| 505 |
# Personal details resolution (A to Z)
|
| 506 |
consumer_name = None
|
|
|
|
| 512 |
user_district = region["district"]
|
| 513 |
user_hub = region["hub"]
|
| 514 |
|
| 515 |
+
# If 17-digit LPG ID has postal distributor code, resolve pincode
|
| 516 |
+
if is_lpg_id and len(dist_code) == 6 and dist_code[0] in "12345678":
|
| 517 |
+
try:
|
| 518 |
+
pin_res = ServiceGateway.get_pincode(dist_code)
|
| 519 |
+
if isinstance(pin_res, dict) and pin_res.get("status") == "success" and pin_res.get("data"):
|
| 520 |
+
p_info = pin_res["data"][0]
|
| 521 |
+
user_pincode = dist_code
|
| 522 |
+
user_district = p_info.get("district") or user_district
|
| 523 |
+
user_state = p_info.get("state") or user_state
|
| 524 |
+
user_hub = p_info.get("name") or user_hub
|
| 525 |
+
except Exception:
|
| 526 |
+
pass
|
| 527 |
+
|
| 528 |
if user_kyc and isinstance(user_kyc, dict):
|
| 529 |
if user_kyc.get("name"):
|
| 530 |
consumer_name = str(user_kyc["name"]).strip().title()
|
| 531 |
+
if user_kyc.get("fathersName") or user_kyc.get("father_name"):
|
| 532 |
+
father_name = str(user_kyc.get("fathersName") or user_kyc.get("father_name")).strip().title()
|
| 533 |
+
if user_kyc.get("aadharNumber") or user_kyc.get("aadhaar"):
|
| 534 |
+
clean_uid = re.sub(r'\D', '', str(user_kyc.get("aadharNumber") or user_kyc.get("aadhaar")))
|
| 535 |
if len(clean_uid) >= 4:
|
| 536 |
masked_aadhaar = f"XXXXXXXX{clean_uid[-4:]}"
|
| 537 |
else:
|
|
|
|
| 561 |
if user_kyc.get("state"):
|
| 562 |
user_state = str(user_kyc["state"]).strip().title()
|
| 563 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 564 |
if not consumer_name:
|
| 565 |
+
if is_lpg_id:
|
| 566 |
+
consumer_name = f"Registered OMC Consumer (A/C #{consumer_no})"
|
| 567 |
+
father_name = "Primary Sanctioned Account Holder"
|
| 568 |
+
else:
|
| 569 |
+
consumer_name = f"Registered Domestic Consumer #{consumer_no}"
|
| 570 |
+
father_name = "Authorized Primary Signatory"
|
| 571 |
|
| 572 |
refill_price_val = STATE_LPG_PRICING.get(user_state, region["subsidized_price"])
|
| 573 |
dist_code = user_pincode if (user_pincode and len(user_pincode) == 6) else region["dist_code"]
|
| 574 |
+
|
| 575 |
+
omc_agency_type = "Indane Gramin Vitrak" if primary_omc_key == "indane" else ("Bharat Gas Rural Vitrak" if primary_omc_key == "bharat" else "HP Gas Regional Vitrak")
|
| 576 |
+
agency_name = f"{user_district.title()} {omc_agency_type}"
|
| 577 |
+
formatted_address = raw_addr or f"{user_hub}, Near Main Post Office, {user_district}, {user_state} - {user_pincode}"
|
| 578 |
|
| 579 |
# Standard 17-digit PAHAL ID: OMC (1 digit) + DistCode (6 digits) + ConsumerNo (10 digits)
|
| 580 |
standard_lpg_id = clean if is_lpg_id else f"{omc_info['omc_code']}{dist_code}{consumer_no.zfill(10)}"
|
|
|
|
| 583 |
all_omc_connections = {}
|
| 584 |
for k, v in LPG_OMC_PROVIDERS.items():
|
| 585 |
lpg_id_omc = f"{v['omc_code']}{dist_code}{consumer_no.zfill(10)}"
|
| 586 |
+
prov_type = "Indane Gramin Vitrak" if k == "indane" else ("Bharat Gas Rural Vitrak" if k == "bharat" else "HP Gas Regional Vitrak")
|
| 587 |
+
prov_agency_name = f"{user_district.title()} {prov_type}"
|
| 588 |
all_omc_connections[k] = {
|
| 589 |
"consumer_name": consumer_name,
|
| 590 |
"provider_name": v["brand"],
|
icici_pvtcar_master.parquet
ADDED
|
Binary file (98.8 kB). View file
|
|
|
muthootfinance.parquet
ADDED
|
Binary file (25.8 kB). View file
|
|
|
olx_bulk.parquet
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:b317dce9b381b4816a27934ee9d2ceb016215485a573b712e98e072074ae85ea
|
| 3 |
+
size 904023
|