mirror of
https://github.com/ThePhaseless/Byparr.git
synced 2025-03-15 01:40:21 +08:00
57 lines
1.4 KiB
Python
57 lines
1.4 KiB
Python
from __future__ import annotations
|
|
|
|
import asyncio
|
|
import time
|
|
|
|
import uvicorn
|
|
import uvicorn.config
|
|
from fastapi import FastAPI
|
|
from fastapi.responses import RedirectResponse
|
|
|
|
from src.models.requests import LinkRequest, LinkResponse
|
|
from src.utils import logger
|
|
from src.utils.browser import bypass_cloudflare, new_browser
|
|
from src.utils.consts import LOG_LEVEL
|
|
|
|
app = FastAPI(debug=True)
|
|
|
|
|
|
@app.get("/")
|
|
def read_root():
|
|
"""Redirect to /docs."""
|
|
logger.info("Redirecting to /docs")
|
|
return RedirectResponse(url="/docs", status_code=301)
|
|
|
|
|
|
@app.post("/v1")
|
|
async def read_item(request: LinkRequest):
|
|
"""Handle POST requests."""
|
|
# request.url = "https://nowsecure.nl"
|
|
logger.info(f"Request: {request}")
|
|
start_time = int(time.time() * 1000)
|
|
browser = await new_browser()
|
|
try:
|
|
page = await browser.get(request.url)
|
|
await page.bring_to_front()
|
|
|
|
challenged = await asyncio.wait_for(
|
|
bypass_cloudflare(page), timeout=request.maxTimeout
|
|
)
|
|
|
|
logger.info(f"Got webpage: {request.url}")
|
|
|
|
response = await LinkResponse.create(
|
|
page=page,
|
|
start_timestamp=start_time,
|
|
challenged=challenged,
|
|
)
|
|
except asyncio.TimeoutError:
|
|
logger.fatal("Couldn't complete the request")
|
|
finally:
|
|
browser.stop()
|
|
return response
|
|
|
|
|
|
if __name__ == "__main__":
|
|
uvicorn.run(app, host="0.0.0.0", port=8191, log_level=LOG_LEVEL) # noqa: S104
|