File size: 3,188 Bytes
7e5a1e8 02bdb59 7e5a1e8 16c2696 7e5a1e8 02bdb59 f857dca 7e5a1e8 1053dea 7e5a1e8 9726c82 7e5a1e8 544ad74 9726c82 544ad74 9726c82 544ad74 7e5a1e8 544ad74 7e5a1e8 544ad74 7e5a1e8 544ad74 7e5a1e8 544ad74 7e5a1e8 9726c82 7e5a1e8 319feef |
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 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 |
from flask import Flask, request, jsonify
from flask_cors import CORS
import os
import requests
import ipaddress
import hashlib
import urllib.request
app = Flask(__name__)
CORS(app) # Enable CORS for all routes
# VPN IP list URL
VPN_LIST_URL = "https://raw.githubusercontent.com/Dan-Duran/vpn-checker/main/known-vpn/vpn-list.txt"
VPN_LIST_PATH = "known-vpn/vpn-list.txt"
MANUAL_LIST_PATH = "known-vpn/vpn-manual.txt"
# Ensure known-vpn directory exists
os.makedirs("known-vpn", exist_ok=True)
@app.route('/')
def home():
return ""
def download_file(url, local_path):
"""Download the VPN IP list if updated."""
try:
response = urllib.request.urlopen(url)
new_content = response.read()
if os.path.exists(local_path):
with open(local_path, "rb") as local_file:
existing_content = local_file.read()
if hashlib.md5(existing_content).hexdigest() == hashlib.md5(new_content).hexdigest():
print(f"No changes in {local_path}. Using the existing file.")
return
with open(local_path, "wb") as local_file:
local_file.write(new_content)
print(f"Updated {local_path} with the latest version.")
except urllib.error.URLError as e:
print(f"Failed to download {url}: {e}")
def load_ip_list(file_path):
"""Load IP lists from a given file path."""
if os.path.exists(file_path):
with open(file_path, "r") as file:
return [line.strip() for line in file if line.strip()]
return []
def is_ip_in_list(ip, ip_list):
"""Check if an IP is in a VPN CIDR block."""
try:
ip_obj = ipaddress.IPv4Address(ip)
for cidr in ip_list:
if ip_obj in ipaddress.IPv4Network(cidr, strict=False):
return True
except ipaddress.AddressValueError:
return False
return False
def get_public_ip():
"""Fetch the user's public IP from api64.ipify.org"""
try:
response = requests.get("https://api64.ipify.org?format=json")
return response.json().get("ip")
except requests.RequestException:
return None
@app.route("/check-vpn", methods=["GET"])
def check_vpn():
"""Check if an IP is in the VPN list."""
try:
user_ip = request.args.get("ip")
# If no IP is provided, fetch the public IP automatically
if not user_ip:
user_ip = get_public_ip()
if not user_ip:
return jsonify({"error": "Could not fetch public IP"}), 500
# Ensure latest VPN list is downloaded
download_file(VPN_LIST_URL, VPN_LIST_PATH)
vpn_list = load_ip_list(VPN_LIST_PATH)
manual_list = load_ip_list(MANUAL_LIST_PATH)
is_vpn = is_ip_in_list(user_ip, vpn_list) or is_ip_in_list(user_ip, manual_list)
return jsonify({"ip": user_ip, "vpn_detected": is_vpn})
except Exception as e:
import traceback
print("❌ Error:", traceback.format_exc()) # Logs full error
return jsonify({"error": "Internal Server Error", "details": str(e)}), 500
if __name__ == "__main__":
app.run(host='0.0.0.0', port=7860) |