Renecto's picture
Update app.py
c2db713 verified
from fastapi import FastAPI
from playwright.async_api import async_playwright
from pydantic import BaseModel
from typing import List, Dict, Any
import logging
# ロギング設定
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
app = FastAPI()
class Step(BaseModel):
tool: str
parameters: Dict[str, Any]
class Payload(BaseModel):
steps: List[Step]
@app.api_route("/", methods=["GET", "POST"])
async def automate(payload: Payload):
logger.info(f"Received payload:")
async with async_playwright() as p:
try:
browser = await p.chromium.launch(headless=True, timeout=180000)
page = await browser.new_page()
# デフォルトのナビゲーション/操作タイムアウトを180秒に設定
page.set_default_navigation_timeout(180000)
page.set_default_timeout(180000)
for step in payload.steps:
tool = step.tool
params = step.parameters
logger.info(f"Executing step: {tool}")
if tool == "browser_navigate":
await page.goto(params["url"])
elif tool == "browser_type":
await page.fill(params["element"], params["text"])
if params.get("submit", False):
await page.press(params["element"], "Enter")
elif tool == "browser_click":
await page.click(params["element"])
elif tool == "browser_snapshot":
content = await page.content()
return {"snapshot": content}
else:
return {"error": f"Unknown tool: {tool}"}
return {"status": "completed"}
except Exception as e:
logger.error(f"Error during execution: {str(e)}", exc_info=True)
return {"error": str(e)}
finally:
if 'browser' in locals():
await browser.close()