Refactor and enhance MCP client and server functionality
- Removed prueba_cliente_mcp.py as it was no longer needed. - Updated prueba_loop_agente.py to integrate MCPServerRunner for managing server instances. - Modified prueba_mcp.py to implement a new structure for starting and stopping MCP servers. - Enhanced AgenteAI class to support multiple MCP blocks execution. - Improved MCPClient with timeout handling for tool calls. - Added new sandbox files for children's stories. - Created a simple ERP system with a main entry point. - Added unit tests for the ERP system. - Implemented MCPServerRunner to manage server processes. - Developed server_files.py to handle file operations securely within a sandbox environment. - Introduced ElementoWeb and Navegador classes for web scraping functionalities. - Enhanced Scrapper and Tab classes for better interaction with web pages.
This commit is contained in:
@@ -0,0 +1,69 @@
|
||||
import aiohttp
|
||||
import websockets
|
||||
import json
|
||||
import asyncio
|
||||
from src.ScrappingWeb.Tab import Tab
|
||||
|
||||
class Scrapper:
|
||||
def __init__(self, debugging_url: str = "http://127.0.0.1:9222"):
|
||||
self.debugging_url = debugging_url
|
||||
self.tabs: list[Tab] = []
|
||||
|
||||
async def _crear_tab_websocket_url(self, target_url: str = "about:blank") -> str:
|
||||
"""
|
||||
Crea una nueva pestaña usando el método oficial Target.createTarget
|
||||
y devuelve su WebSocketDebuggerUrl.
|
||||
"""
|
||||
# 1. Obtener el WebSocket general del browser (root)
|
||||
async with aiohttp.ClientSession() as session:
|
||||
async with session.get(f"{self.debugging_url}/json/version") as resp:
|
||||
if resp.status != 200:
|
||||
raise RuntimeError("No se pudo obtener información del navegador")
|
||||
data = await resp.json()
|
||||
browser_ws_url = data["webSocketDebuggerUrl"]
|
||||
|
||||
# 2. Conectarse al WebSocket del browser
|
||||
async with websockets.connect(browser_ws_url) as websocket:
|
||||
# 3. Enviar comando para crear target
|
||||
msg_id = 1
|
||||
await websocket.send(json.dumps({
|
||||
"id": msg_id,
|
||||
"method": "Target.createTarget",
|
||||
"params": {
|
||||
"url": target_url,
|
||||
"newWindow": False
|
||||
}
|
||||
}))
|
||||
|
||||
# 4. Esperar respuesta con el targetId
|
||||
while True:
|
||||
respuesta = await websocket.recv()
|
||||
data = json.loads(respuesta)
|
||||
if data.get("id") == msg_id:
|
||||
target_id = data["result"]["targetId"]
|
||||
break
|
||||
|
||||
# 5. Esperar a que el target aparezca en /json
|
||||
for _ in range(30): # máximo ~3 segundos
|
||||
await asyncio.sleep(0.1)
|
||||
async with aiohttp.ClientSession() as session:
|
||||
async with session.get(f"{self.debugging_url}/json") as resp:
|
||||
if resp.status == 200:
|
||||
tabs = await resp.json()
|
||||
for tab in tabs:
|
||||
if tab.get("id") == target_id:
|
||||
return tab["webSocketDebuggerUrl"]
|
||||
|
||||
raise RuntimeError("No se pudo obtener el WebSocket de la nueva pestaña")
|
||||
|
||||
async def nueva_tab(self, url: str, wait_time: float = 5.0) -> Tab:
|
||||
websocket_url = await self._crear_tab_websocket_url()
|
||||
tab = await Tab.crear_desde_websocket(websocket_url)
|
||||
self.tabs.append(tab)
|
||||
await tab.navegar(url, wait_time)
|
||||
return tab
|
||||
|
||||
async def cerrar_todos(self):
|
||||
for tab in list(self.tabs):
|
||||
await tab.cerrar()
|
||||
self.tabs.clear()
|
||||
Reference in New Issue
Block a user