ztxi2 / app.py
Geek7's picture
Update app.py
16c2696 verified
raw
history blame contribute delete
3.19 kB
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)