Spaces:
Sleeping
Sleeping
| import requests | |
| import logging | |
| import os | |
| import json | |
| import asyncio | |
| logger = logging.getLogger("spider_supervisor") | |
| logging.basicConfig(level=logging.INFO) | |
| # The URL of the detached Spider deployment on Hugging Face | |
| SPIDER_API_URL = os.getenv("SPIDER_API_URL", "https://wrzzzrzr-hypermega-c2-spider.hf.space") | |
| class SpiderSupervisor: | |
| def __init__(self): | |
| self.workers = {} | |
| def deploy_spiders(self, targets): | |
| """Sends the target payload to the external Spider Space instead of spawning local processes.""" | |
| sources_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', 'config', 'sources.json')) | |
| try: | |
| with open(sources_path, 'r') as f: | |
| existing = json.load(f) | |
| except Exception: | |
| existing = [] | |
| existing_urls = [s.get("url") for s in existing] | |
| new_targets = [] | |
| for t in targets: | |
| if t not in existing_urls: | |
| existing.append({"name": "HF_Dynamic_Target", "url": t, "domain": t.split("//")[-1].split("/")[0]}) | |
| new_targets.append(t) | |
| else: | |
| new_targets.append(t) | |
| # Forward the targets to the Spider Space asynchronously | |
| if new_targets: | |
| asyncio.create_task(self._forward_to_spider(new_targets)) | |
| # Save updated sources map | |
| try: | |
| with open(sources_path, 'w') as f: | |
| json.dump(existing, f, indent=4) | |
| except Exception as e: | |
| logger.error(f"[Supervisor] Could not write to sources.json: {e}") | |
| async def _forward_to_spider(self, targets): | |
| try: | |
| import httpx | |
| async with httpx.AsyncClient() as client: | |
| url = f"{SPIDER_API_URL.rstrip('/')}/crawl" | |
| logger.info(f"[Supervisor] Deploying {len(targets)} targets to Spider Space: {url}") | |
| r = await client.post(url, json={"urls": targets}, timeout=10.0) | |
| r.raise_for_status() | |
| logger.info(f"[Supervisor] Spider acknowledged targets: {r.json()}") | |
| except Exception as e: | |
| logger.error(f"[Supervisor] Failed to deploy targets to Spider Space: {e}") | |
| def active_count(self): | |
| # We can poll the Spider Space / for status if needed, but for now we assume 1 active swarm | |
| return 1 | |
| supervisor = SpiderSupervisor() | |