chore: можно открыть страницу и подождать

This commit is contained in:
protokey committed 2026-09-08 17:39:57 +04:00
1 parent 0602d89012
commit 0f60aa9046
2 files changed
+84 -2

No files matched your search

+69 -2
View File
@@ -1,4 +1,9 @@
from datetime import datetime
from camoufox.async_api import AsyncCamoufox
from fastapi import FastAPI from fastapi import FastAPI
from fastapi import Request
from playwright.async_api import Page
from pydantic import BaseModel from pydantic import BaseModel
@@ -27,6 +32,68 @@ async def root():
return {"message": "Hello World"} return {"message": "Hello World"}
async def _fill(page: "Page", act: ActionRequest) -> str | None:
...
async def _mouse_move(page: "Page", act: ActionRequest) -> str | None:
...
async def _click(page: "Page", act: ActionRequest) -> str | None:
...
async def _wait_for(page: Page, act: ActionRequest) -> str | None:
try:
assert act.selector
await page.wait_for_selector(act.selector, timeout=act.timeout * 1000)
except Exception as e:
return str(e)
else:
return None
@app.post("/v1/solve") @app.post("/v1/solve")
async def solve(payload: SolveRequest): async def solve(request: Request, payload: SolveRequest):
return {"message": payload.model_dump(exclude_none=True)} api_key = request.headers.get('X-API-Key')
async with AsyncCamoufox() as camoufo:
page = await camoufo.new_page()
page.set_default_timeout(30_000)
await page.goto(url=payload.url)
actions_result = []
status = True
error = None
for act in payload.actions:
result = await {
"fill": _fill,
"mouse_move": _mouse_move,
"click": _click,
"wait_for": _wait_for,
}[act.type](page, act)
if( ok := result ) is None:
act_log = {"type": act.type, "ok": ok}
else:
act_log = {"type": act.type, "ok": ok, "error": result}
actions_result.append(act_log)
if "error" in act_log:
status = False
error = act_log["error"]
break
cookies = await camoufo.cookies()
html = await page.inner_html('html')
await page.screenshot(
path=(
f"/home/sokol/PycharmProjects/WebRoboApi/extra/screenshots/"
f"{datetime.timestamp(datetime.now())}.png"
)
)
return {
"status": ["err", "ok"][status],
"html": html,
"cookies": cookies,
"actions": actions_result,
"error": error,
}
+15
View File
@@ -33,3 +33,18 @@ X-API-Key: <key>
} }
### ###
POST http://127.0.0.1:8000/v1/solve
Accept: application/json
Content-Type: application/json
X-API-Key: <key>
{
"url": "https://camoufox.com/python/usage/",
"proxy": "-",
"actions": [
{"type": "wait_for", "selector": "span.dark\\:text-white", "timeout": 30}
]
}
###