import ipaddress import json import os import sys from urllib.error import HTTPError, URLError from urllib.parse import urlencode from urllib.request import Request, HTTPRedirectHandler, build_opener class NoRedirect(HTTPRedirectHandler): def redirect_request(self, request, fp, code, message, headers, new_url): return None def check_ip(ip, api_key): ipaddress.ip_address(ip) if not api_key: raise ValueError("Set PROXYRADAR_API_KEY on your server.") query = urlencode({"ip": ip, "format": "json"}) request = Request( "https://proxyradar.io/v1/check?" + query, headers={"Authorization": "Bearer " + api_key, "Accept": "application/json"}, ) try: with build_opener(NoRedirect()).open(request, timeout=15) as response: raw = response.read(65537) if len(raw) > 65536: raise ValueError("Response too large") data = json.loads(raw) if not isinstance(data, dict) or data.get("status") != "success": raise ValueError("Unexpected response") if type(data.get("proxy")) is not int or data["proxy"] not in (0, 1): raise ValueError("Unexpected verdict") return {"ip": data["ip"], "proxy": data["proxy"], "flags": data.get("flags")} except HTTPError as error: raise RuntimeError(f"Lookup unavailable (HTTP {error.code}); result is unknown.") from None except (URLError, TimeoutError, ValueError, KeyError): raise RuntimeError("Lookup unavailable; result is unknown.") from None if __name__ == "__main__": if len(sys.argv) != 2: sys.exit("Usage: python proxy-check.py PUBLIC_IP") try: result = check_ip(sys.argv[1], os.environ.get("PROXYRADAR_API_KEY", "")) print(json.dumps(result, indent=2)) except (ValueError, RuntimeError) as error: sys.exit(str(error))