flash2 / main.py
rkihacker's picture
Update main.py
e50ca24 verified
raw
history blame
4.64 kB
import httpx
from fastapi import FastAPI, Request, HTTPException
from fastapi.responses import StreamingResponse
import json
import random
import logging
import ipaddress
# Configure logging
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s - %(levelname)s - %(message)s",
datefmt="%Y-%m-%d %H:%M:%S",
)
app = FastAPI()
# List of API URLs to be randomized
API_URLS = [
"https://api.deepinfra.com/v1/openai/chat/completions",
"https://stage.api.deepinfra.com/v1/openai/chat/completions",
]
# A pool of User-Agents (you can expand this list)
USER_AGENTS = [
# Chrome (Windows)
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36",
# Firefox (Windows)
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:132.0) Gecko/20100101 Firefox/132.0",
# Safari (macOS)
"Mozilla/5.0 (Macintosh; Intel Mac OS X 14_5) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Safari/605.1.15",
# Edge (Windows)
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36 Edg/140.0.0.0",
# Chrome (Android)
"Mozilla/5.0 (Linux; Android 14; Pixel 7 Pro) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Mobile Safari/537.36",
# Safari (iOS)
"Mozilla/5.0 (iPhone; CPU iPhone OS 17_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Mobile/15E148 Safari/604.1",
]
def generate_random_ip() -> str:
"""Generate a random IPv4 address, avoiding reserved ranges."""
while True:
ip = ipaddress.IPv4Address(random.getrandbits(32))
if not (ip.is_private or ip.is_multicast or ip.is_reserved or ip.is_loopback):
return str(ip)
@app.post("/v1/openai/chat/completions")
async def proxy_deepinfra(request: Request):
"""
Proxies chat completion requests to the DeepInfra API.
Randomizes API URLs, spoofed random IP, fake headers, and User-Agent rotation.
"""
try:
body = await request.json()
except json.JSONDecodeError:
raise HTTPException(status_code=400, detail="Invalid JSON in request body")
# Random spoofed IP + random User-Agent
random_ip = generate_random_ip()
user_agent = random.choice(USER_AGENTS)
headers = {
# Browser/device headers
"User-Agent": user_agent,
"accept": "text/event-stream",
"sec-ch-ua": '"Chromium";v="140", "Not=A?Brand";v="24", "Google Chrome";v="140"',
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": '"Windows"',
"Referer": "https://deepinfra.com/",
"Origin": "https://deepinfra.com",
# Spoofed IP headers
"X-Forwarded-For": random_ip,
"X-Real-IP": random_ip,
"Forwarded": f"for={random_ip};proto=https",
# Extra fake headers
"DNT": "1",
"Pragma": "no-cache",
"Cache-Control": "no-cache",
"Accept-Encoding": "gzip, deflate, br, zstd",
"Accept-Language": "en-US,en;q=0.9,fr;q=0.8,de;q=0.7",
"Upgrade-Insecure-Requests": "1",
"Sec-Fetch-Dest": "document",
"Sec-Fetch-Mode": "navigate",
"Sec-Fetch-Site": "none",
"Sec-Fetch-User": "?1",
# Deepinfra-specific
"X-Deepinfra-Source": request.headers.get("X-Deepinfra-Source", "web-embed"),
"Content-Type": "application/json",
}
shuffled_urls = random.sample(API_URLS, len(API_URLS))
async def stream_generator():
last_error = None
for url in shuffled_urls:
logging.info(
f"Attempting to connect to: {url} with spoofed IP {random_ip} and UA {user_agent}"
)
try:
async with httpx.AsyncClient() as client:
async with client.stream(
"POST", url, headers=headers, json=body, timeout=None
) as response:
response.raise_for_status()
logging.info(f"Successfully connected. Streaming from: {url}")
async for chunk in response.aiter_bytes():
yield chunk
return
except (httpx.RequestError, httpx.HTTPStatusError) as e:
last_error = e
logging.warning(
f"Failed to connect to {url}: {e}. Trying next URL."
)
continue
if last_error:
logging.error(f"All API endpoints failed. Last error: {last_error}")
return StreamingResponse(stream_generator(), media_type="text-event-stream")