| import http.server |
| import socketserver |
| import json |
| import sqlite3 |
| import os |
| import urllib.parse |
| import urllib.request |
| import http.cookiejar |
| import ssl |
|
|
| PORT = int(os.environ.get("PORT", 8080)) |
| DB_FILE = "aadhaar_history.db" |
|
|
| |
| ssl_context = ssl._create_unverified_context() |
|
|
| |
| cj = http.cookiejar.CookieJar() |
| opener = urllib.request.build_opener( |
| urllib.request.HTTPCookieProcessor(cj), |
| urllib.request.HTTPSHandler(context=ssl_context) |
| ) |
|
|
| def init_db(): |
| conn = sqlite3.connect(DB_FILE) |
| cursor = conn.cursor() |
| cursor.execute(''' |
| CREATE TABLE IF NOT EXISTS history ( |
| id TEXT PRIMARY KEY, |
| timestamp TEXT, |
| data TEXT |
| ) |
| ''') |
| conn.commit() |
| conn.close() |
|
|
| class AadhaarRequestHandler(http.server.SimpleHTTPRequestHandler): |
| def do_GET(self): |
| if self.path == '/api/history': |
| self.send_response(200) |
| self.send_header('Content-type', 'application/json') |
| self.end_headers() |
| |
| conn = sqlite3.connect(DB_FILE) |
| cursor = conn.cursor() |
| cursor.execute("SELECT data FROM history ORDER BY timestamp DESC LIMIT 50") |
| rows = cursor.fetchall() |
| conn.close() |
| |
| history = [json.loads(row[0]) for row in rows] |
| self.wfile.write(json.dumps(history).encode()) |
| else: |
| return super().do_GET() |
|
|
| def do_POST(self): |
| if self.path == '/api/history': |
| content_length = int(self.headers['Content-Length']) |
| post_data = self.rfile.read(content_length) |
| item = json.loads(post_data.decode('utf-8')) |
| |
| conn = sqlite3.connect(DB_FILE) |
| cursor = conn.cursor() |
| cursor.execute("INSERT OR REPLACE INTO history (id, timestamp, data) VALUES (?, ?, ?)", |
| (item['id'], item['timestamp'], json.dumps(item))) |
| |
| |
| cursor.execute("DELETE FROM history WHERE id NOT IN (SELECT id FROM history ORDER BY timestamp DESC LIMIT 50)") |
| |
| conn.commit() |
| conn.close() |
| |
| self.send_response(201) |
| self.send_header('Content-type', 'application/json') |
| self.end_headers() |
| self.wfile.write(json.dumps({"status": "success"}).encode()) |
|
|
| elif self.path.startswith('/api/proxy/'): |
| self.handle_proxy() |
|
|
| def send_cors_headers(self): |
| self.send_header('Access-Control-Allow-Origin', '*') |
| self.send_header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS') |
| self.send_header('Access-Control-Allow-Headers', 'Content-Type, x-request-id, appid') |
|
|
| def do_OPTIONS(self): |
| self.send_response(200) |
| self.send_cors_headers() |
| self.end_headers() |
|
|
| def handle_proxy(self): |
| target_path = self.path[len('/api/proxy/'):] |
| |
| |
| proxy_map = { |
| 'captcha': 'https://tathya.uidai.gov.in/audioCaptchaService/api/captcha/v3/generation', |
| 'otp': 'https://tathya.uidai.gov.in/unifiedAppAuthService/api/v2/generate/aadhaar/otp', |
| 'download': 'https://tathya.uidai.gov.in/downloadAadhaarService/api/aadhaar/download' |
| } |
| |
| if target_path not in proxy_map: |
| self.send_error(404, "Proxy mapping not found") |
| return |
|
|
| url = proxy_map[target_path] |
| content_length = int(self.headers.get('Content-Length', 0)) |
| post_data = self.rfile.read(content_length) if content_length > 0 else None |
| |
| |
| headers = { |
| 'Content-Type': self.headers.get('Content-Type', 'application/json'), |
| 'appid': self.headers.get('appid', 'MYAADHAAR'), |
| 'x-request-id': self.headers.get('x-request-id', ''), |
| 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36' |
| } |
|
|
| req = urllib.request.Request(url, data=post_data, headers=headers, method='POST') |
| |
| try: |
| with opener.open(req) as response: |
| resp_data = response.read() |
| self.send_response(response.status) |
| self.send_cors_headers() |
| |
| for header in ['Content-Type', 'Content-Encoding', 'Content-Length', 'Set-Cookie']: |
| if header in response.headers: |
| self.send_header(header, response.headers[header]) |
| self.end_headers() |
| self.wfile.write(resp_data) |
| except urllib.error.HTTPError as e: |
| resp_data = e.read() |
| self.send_response(e.code) |
| self.send_cors_headers() |
| for header in ['Content-Type', 'Content-Encoding', 'Content-Length']: |
| if header in e.headers: |
| self.send_header(header, e.headers[header]) |
| self.end_headers() |
| self.wfile.write(resp_data) |
| except Exception as e: |
| self.send_response(500) |
| self.send_cors_headers() |
| self.end_headers() |
| self.wfile.write(json.dumps({"error": str(e)}).encode()) |
|
|
| def do_DELETE(self): |
| if self.path.startswith('/api/history'): |
| parsed_path = urllib.parse.urlparse(self.path) |
| query_params = urllib.parse.parse_qs(parsed_path.query) |
| item_id = query_params.get('id', [None])[0] |
| |
| if item_id: |
| conn = sqlite3.connect(DB_FILE) |
| cursor = conn.cursor() |
| cursor.execute("DELETE FROM history WHERE id = ?", (item_id,)) |
| conn.commit() |
| conn.close() |
| |
| self.send_response(200) |
| self.send_header('Content-type', 'application/json') |
| self.end_headers() |
| self.wfile.write(json.dumps({"status": "deleted"}).encode()) |
| else: |
| self.send_response(400) |
| self.end_headers() |
|
|
| class ThreadingTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer): |
| allow_reuse_address = True |
| daemon_threads = True |
|
|
| if __name__ == "__main__": |
| init_db() |
| |
| |
| with ThreadingTCPServer(("", PORT), AadhaarRequestHandler) as httpd: |
| print(f"Aadhaar API Server running at http://localhost:{PORT}") |
| print(f"Database: {os.path.abspath(DB_FILE)}") |
| httpd.serve_forever() |
|
|