feat(X13 Tier-1): calibrate נט המשפט fetch — Camoufox python, proven on 46111-12-22

אומת end-to-end: פס"ד 34 עמ' של עת"מ 46111-12-22 הורד אוטונומית מלא, נטו
קוד-פתוח, ללא כרטיס-חכם וללא פתרון-CAPTCHA.

ממצאי-כיול עיקריים:
- החיפוש+הניווט-לתיק ללא reCAPTCHA כלל. reCAPTCHA קיים רק בצופה ורק על
  שמירה/הדפסה מפורשת — לא על הצגת המסמך.
- הצופה מגיש עמודים כ-PNG דרך PageMethod GetImages (4/batch); משיכה ב-fetch
  עם הכותרת X-Requested-With: XMLHttpRequest (חובה — F5 WAF חוסם בלעדיה) →
  הרכבת PDF (Pillow).

שינויים:
- camofox_client.py: שכתוב מלא — Camoufox דרך חבילת-הפייתון (in-process,
  לא שרת-Node REST). מסלול מכויל: home→btnExternalSearchCases→Bama fields→
  CaseDetails→פסקי דין→DecisionList→NGCSViewerPage→GetImages→PDF.
- pm2 config: app Xvfb :99 + DISPLAY=:99 (Camoufox קורס headless בלי צג וירטואלי).
- pyproject: extra [court-fetch] = camoufox + faster-whisper (host-only; הקונטיינר
  לא מריץ דפדפן). Pillow כבר בבסיס.
- X13 spec + SCRIPTS.md: עודכנו לממצאים (image-API, Xvfb, אימות).

reCAPTCHA audio (Whisper) נשמר כ-fallback למסלול-השמירה-המפורש בלבד; המסלול
הראשי אינו זקוק לו. Invariants: מקיים INV-CF1/CF4/CF6 (ללא שינוי).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-07 19:32:13 +00:00
parent f3740fef68
commit 781f24c643
5 changed files with 256 additions and 115 deletions

View File

@@ -34,7 +34,9 @@ const env = {
HOME: "/home/chaim",
PATH: "/home/chaim/.local/bin:/usr/local/bin:/usr/bin:/bin",
PYTHONUNBUFFERED: "1",
// CAMOFOX_URL: "http://127.0.0.1:9377", // set when camofox-browser is up
// Camoufox (headless Firefox) crashes on this server without a virtual
// display, so the service points at the Xvfb companion app below (:99).
DISPLAY: ":99",
};
try {
const text = fs.readFileSync(ENV_FILE, "utf8");
@@ -50,6 +52,16 @@ try {
module.exports = {
apps: [
{
// Persistent virtual display for Camoufox (headless Firefox needs it on
// this screenless server). Bound to :99 to match DISPLAY above.
name: "legal-court-fetch-xvfb",
script: "/usr/bin/Xvfb",
args: ":99 -screen 0 1920x1080x24 -nolisten tcp",
autorestart: true,
max_restarts: 10,
restart_delay: 3000,
},
{
name: "legal-court-fetch-service",
cwd: "/home/chaim/legal-ai/mcp-server",
@@ -59,7 +71,9 @@ module.exports = {
restart_delay: 5000,
max_restarts: 10,
autorestart: true,
max_memory_restart: "1G",
// A Firefox content process loading the heavy ASP.NET pages can spike;
// give headroom but cap so a leak can't threaten Postgres.
max_memory_restart: "1500M",
},
],
};