File size: 2,532 Bytes
2d93720
 
 
 
4de386a
2d93720
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
326f1b4
2d93720
 
 
 
 
 
326f1b4
2d93720
14f06cc
2d93720
 
 
14f06cc
326f1b4
 
14f06cc
2d93720
 
 
4de386a
2d93720
326f1b4
14f06cc
326f1b4
14f06cc
 
 
 
 
 
 
 
 
 
 
 
 
 
2d93720
14f06cc
4de386a
 
 
326f1b4
 
 
4de386a
326f1b4
 
14f06cc
2d93720
326f1b4
 
2d93720
 
 
 
 
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
import requests
import random
import time
import threading
from flask import Flask, request, Response, jsonify

PROXY_LIST_URL = "https://proxies.typegpt.net/ips.txt"
proxies_cache = []
last_refresh = 0

app = Flask(__name__)

def fetch_proxies():
    try:
        resp = requests.get(PROXY_LIST_URL, timeout=10)
        resp.raise_for_status()
        proxies = [line.strip() for line in resp.text.splitlines() if line.strip()]
        return proxies
    except Exception as e:
        print(f"[ERROR] Failed to fetch proxies: {e}")
        return []

def get_random_proxy(proxies):
    if not proxies:
        return None
    return random.choice(proxies)

def refresh_proxies_loop():
    global proxies_cache, last_refresh
    while True:
        if time.time() - last_refresh > 300 or not proxies_cache:
            proxies_cache = fetch_proxies()
            last_refresh = time.time()
            print(f"[INFO] Refreshed {len(proxies_cache)} proxies.")
        time.sleep(60)

@app.route("/health", methods=["GET"])
def health():
    return "Healthy", 200

@app.route("/<path:target_url>", methods=["GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS", "HEAD"])
def proxy_request(target_url):
    if not target_url.startswith("http"):
        target_url = "http://" + target_url

    proxy = get_random_proxy(proxies_cache)
    if not proxy:
        return jsonify({"error": "No proxies available"}), 500

    proxies = {"http": proxy, "https": proxy}

    try:
        print(f"[INFO] Forwarding {request.method} to {target_url} via {proxy}")

        # Forward original request (method, headers, body, params)
        resp = requests.request(
            method=request.method,
            url=target_url,
            headers={k: v for k, v in request.headers if k.lower() != "host"},
            data=request.get_data(),
            cookies=request.cookies,
            params=request.args,
            proxies=proxies,
            timeout=30,
            allow_redirects=False
        )

        # Copy headers + add X-Proxy-Used
        headers = dict(resp.headers)
        headers["X-Proxy-Used"] = proxy

        return Response(
            resp.content,
            status=resp.status_code,
            headers=headers,
        )
    except Exception as e:
        return jsonify({"error": "Proxy failed", "proxy": proxy, "details": str(e)}), 502

def main():
    t = threading.Thread(target=refresh_proxies_loop, daemon=True)
    t.start()
    app.run(host="0.0.0.0", port=5000)

if __name__ == "__main__":
    main()