--- title: MYPRO emoji: ⚡ colorFrom: blue colorTo: indigo sdk: gradio sdk_version: 4.44.0 app_file: app.py pinned: false --- # מעקף פרוקסי 2.0 (Etrog Bypass Proxy) Reverse proxy מבוזר: **Cloudflare Worker** + **Service Worker** בדפדפן, לעקיפת סינון יתר (SNI/DPI/DNS) לצריכת תוכן חוקי (מנוי פעיל). ## כתובת פרוסה https://etrog-bypass-proxy.miriklain616.workers.dev | נתיב | תפקיד | |------|--------| | `/` | דף בית + ניווט | | `/ytp?v=VIDEO_ID` | נגן YouTube יציב (מומלץ) | | `/websearch?q=…&t=web\|images\|videos\|news&p=N` | חיפוש נייטיב: רשת / תמונות / וידאו / חדשות | | `/api/websearch?q=…&t=…&p=N` | אותן תוצאות כ-JSON | | `/x/p?d=` | פרוקסי תמונות כללי (אטום ב-XOR כשה-SW פעיל) | | `/cdn/` | פרוקסי מוצפן (XOR) לכתובת יעד | | `/api/m?v=…&i=18` | זרם וידאו YouTube (same-isolate) | | `/sw.js` | Service Worker | | `/import-cookies` | ייבוא עוגיות (YouTube / אתרים אחרים) | | `/api/health` | בדיקת חיים | ### חיפוש — למה אין "אני לא רובוט" הכלל היחיד: **המשתמש לעולם לא מגיע לדף של מנוע חיפוש זר.** כל תוצאה נאספת ב-Worker ומוצגת בדף שלנו, ולכן אין CAPTCHA, אין באנר הסכמה ואין SPA שנשבר דרך הפרוקסי. Google / Brave / Mojeek / Startpage / SearX מציגים אתגר ל-IP של דאטה-סנטר — ולכן **אינם בשימוש כלל**, וגם הוסרו מהקיצורים בדף הבית. | לשונית | מקור ראשי | גיבויים | |--------|-----------|---------| | רשת | Bing (עמוד 1) | Yahoo (עמודים 2+ — רק לו יש דפדוף אמין), DuckDuckGo | | תמונות | Bing (לטינית) / DuckDuckGo (עברית ושאר כתבים) | Wikimedia Commons | | וידאו | YouTube InnerTube → נגן `/ytp` הפנימי | Bing Videos | | חדשות | Bing News RSS | — | שתי מלכודות שהקוד מטפל בהן: 1. **דפדוף של Bing מדומה.** `&first=` מתעלם ומחזיר שוב את עמוד 1, ולכן עמודים 2+ מגיעים מ-Yahoo (`&b=`), שבו הדפדוף אמיתי. 2. **Bing "חוטף" שאילתות שאינן לטיניות.** הוא מחזיר דף עם כותרת נכונה (`ירושלים - חיפוש תמונות`) אבל תוצאות שאינן קשורות בכלל — בלי שום קוד שגיאה. `resultsLookRelevant()` פוסל סט כזה וממשיך למנוע הבא; אם כולם נכשלים מוצג "לא נמצאו תוצאות" ולא זבל. הבדיקה חלה רק על מנועים שנגרדים מ-HTML — לא על API מובנה (Commons/RSS/InnerTube), שם הכיתובים לגיטימית בשפה אחרת. **תמונות** עוברות דרך `/x/p`: ה-Worker מאמת magic-bytes, וה-Service Worker מוסיף `X-Etrog-SW` כדי לקבל אותן אטומות (XOR) — כך הפילטר לא מזהה JPEG ולא מטשטש. בלי SW הן מוגשות רגילות, כך שגם טעינה ראשונה עובדת. ## איך עוקפים את הסינון (ומה נכשל קודם) הפילטר (Rimon/Etrog) **מסווג לפי גוף התשובה, לא לפי הכתובת**. הוא עושה MITM על החיבור לוורקר, קורא את ה-HTML, ומחליף אותו בדף חסימה — מזוהה לפי `rimon: RWC_BLOCK` + `server: lighttpd`. לכן ynet ו-mako נחסמו, למרות שהוורקר החזיר אותם תקין. התשובה: **כל מה שניתן לסיווג נשלח אטום (XOR)**. הפילטר רואה בייטים חסרי-משמעות, ה-Service Worker מפענח לפני שהדפדפן רואה. | סוג | אטום? | למה | |-----|-------|-----| | מסמך HTML (ניווט + iframe) | ✅ | זה מה שהפילטר מסווג | | XHR/JSON | ✅ | אתרי חדשות מגישים את הכתבה כ-JSON | | תמונות | ✅ | אחרת הפילטר מטשטש אותן | | JS | ❌ | אטימה שברה מודולים של YouTube (SyntaxError) | | CSS | ❌ | לא מסווג, וסיכון מיותר | | פונטים | ❌ | בקשה שתחמוק מה-SW תקבל בייטים אטומים ו-OTS יפסול | | מדיה / Range | ❌ | שובר ניגון פרוגרסיבי | **המלכודת שהייתה:** ה-Service Worker ויתר לגמרי על ניווטים (`if (e.request.mode === 'navigate') return;`), ולכן המסמך הראשי — בדיוק מה שנחסם — עבר בטקסט גלוי. בנוסף, ענף ה-HTML בוורקר החזיר תשובה לפני שהגיע לקוד האטימה, כך ש- `X-Proxy-Obfuscate` פשוט לא נלקח בחשבון עבור HTML. שני החצאים תוקנו. > אחרי ריווייט, **כל** משאבי המשנה של דף הם כתובות `/cdn/` באותו origin — ולכן הענף > ה-same-origin ב-SW (ולא זה של cross-origin) הוא שקובע מה נשלח אטום. הוא אטם רק תמונות. ## ניווט בין דפים (הבאג של "הדף הראשי נטען אבל אי אפשר להתקדם") רוב הקישורים עוברים ריווייט ל-`/cdn/` ולכן הם חד-משמעיים. אבל **כתובת "עירומה"** — ניתוב SPA, קישור שנבנה ב-JS, או רענון של אחד מהם — מגיעה בלי יעד משלה, והוורקר חייב להסיק לאיזה אתר היא שייכת. שני מקורות המידע לכך היו שבורים: 1. **`__proxy_target` נדרס על ידי כל תשובת HTML** — כולל `