| | import requests |
| | import base64 |
| | from urllib.parse import urlencode, quote |
| | from fastapi import FastAPI, Response |
| | import uvicorn |
| |
|
| | app = FastAPI() |
| |
|
| | def get_ip_location(ip_address): |
| | try: |
| | api_url = f"http://ip-api.com/json/{ip_address}?lang=zh-CN" |
| | response = requests.get(api_url, timeout=5) |
| | if response.status_code == 200: |
| | data = response.json() |
| | if data.get('status') == 'success': |
| | country = data.get('country', '') |
| | city = data.get('city', '') |
| | return f"{country} {city}".strip() |
| | except: |
| | pass |
| | return "未知位置" |
| |
|
| | def fetch_config(path_type, index): |
| | urls = [ |
| | f"https://www.gitlabip.xyz/Alvin9999/PAC/refs/heads/master/backup/img/1/2/ipp/{path_type}/{index}/config.json", |
| | f"https://gitlab.com/free9999/ipupdate/-/raw/master/backup/img/1/2/ipp/{path_type}/{index}/config.json" |
| | ] |
| | for url in urls: |
| | try: |
| | res = requests.get(url, timeout=5) |
| | if res.status_code == 200: |
| | return res.json() |
| | except: |
| | continue |
| | return None |
| |
|
| | def generate_links(): |
| | links = [] |
| | |
| | for i in range(1, 5): |
| | cfg = fetch_config("hysteria", i) |
| | if cfg: |
| | server = cfg.get("server", "") |
| | if ":" in server: |
| | host, port = (server.split("]:")[0] + "]", server.split("]:")[1]) if "[" in server else server.split(":") |
| | loc = get_ip_location(host.strip("[]")) |
| | params = { |
| | "upmbps": cfg.get("up_mbps", 11), |
| | "downmbps": cfg.get("down_mbps", 55), |
| | "auth": cfg.get("auth_str", ""), |
| | "peer": cfg.get("server_name", ""), |
| | "insecure": 1 if cfg.get("insecure") else 0, |
| | "alpn": "h3" |
| | } |
| | params = {k: v for k, v in params.items() if v} |
| | link = f"hysteria://{host}:{port}?{urlencode(params)}#{quote(f'{loc} Hy1_发财进行时 {i}')}" |
| | links.append(link) |
| |
|
| | |
| | for i in range(1, 5): |
| | cfg = fetch_config("hysteria2", i) |
| | if cfg: |
| | server = cfg.get("server", "").split(",")[0] |
| | if ":" in server: |
| | host, port = (server.split("]:")[0] + "]", server.split("]:")[1]) if "[" in server else server.split(":") |
| | loc = get_ip_location(host.strip("[]")) |
| | tls = cfg.get("tls", {}) |
| | bw = cfg.get("bandwidth", {}) |
| | params = { |
| | "sni": tls.get("sni", ""), |
| | "insecure": 1 if tls.get("insecure") else 0, |
| | "up": bw.get("up", "").replace(" mbps", ""), |
| | "down": bw.get("down", "").replace(" mbps", "") |
| | } |
| | params = {k: v for k, v in params.items() if v} |
| | auth = cfg.get("auth", "") |
| | link = f"hysteria2://{auth}@{host}:{port}?{urlencode(params)}#{quote(f'{loc} Hy2_好运充值成功 {i}')}" |
| | links.append(link) |
| | |
| | combined = "\n".join(links) |
| | return base64.b64encode(combined.encode()).decode() |
| |
|
| | @app.get("/") |
| | def home(): |
| | return {"我是小可爱~"} |
| |
|
| | @app.get("/sub") |
| | def get_sub(): |
| | |
| | content = generate_links() |
| | return Response(content=content, media_type="text/plain") |
| |
|
| | if __name__ == "__main__": |
| | uvicorn.run(app, host="0.0.0.0", port=7860) |