From 2a4fb1e9b3a38435ea06056e26c6479453afef45 Mon Sep 17 00:00:00 2001 From: SANDRO00O Date: Mon, 6 Apr 2026 23:07:59 +0300 Subject: [PATCH 1/8] update --- README.md | 13 +- README_AR.md | 56 ++++ README_CN.md | 16 +- README_FA.md | 16 +- README_RU.md | 16 +- index.html | 809 +++++++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 919 insertions(+), 7 deletions(-) create mode 100644 README_AR.md create mode 100644 index.html diff --git a/README.md b/README.md index 905afbf..bb70fb4 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,15 @@ This repository provides an always-up-to-date list of free MTProto proxies that --- +## 🌐 Website + +Browse and test proxies interactively — the site automatically finds the best proxy for you: +**[https://solispirit.github.io/mtproto/](https://solispirit.github.io/mtproto/)** + +Available in English, Arabic, Russian, Chinese, and Persian. + +--- + ## 📄 What's Inside? - A simple text file: `all_proxies.txt` @@ -15,8 +24,9 @@ This repository provides an always-up-to-date list of free MTProto proxies that - No clutter, no ads – just clean proxy addresses ready to use Example line: +``` tg://proxy?server=example.com&port=443&secret=ee00000000000000000000000000000000000000 - +``` --- @@ -42,6 +52,7 @@ You can also manually paste the proxy link into Telegram's "Data and Storage" se If you find this useful, consider giving the repo a ⭐️ - [English](README.md) +- [العربية](README_AR.md) - [中文](README_CN.md) - [Русский](README_RU.md) - [فارسی](README_FA.md) diff --git a/README_AR.md b/README_AR.md new file mode 100644 index 0000000..0a8c625 --- /dev/null +++ b/README_AR.md @@ -0,0 +1,56 @@ +# 🌐 بروكسيات MTProto الجديدة – تُحدَّث تلقائياً كل 12 ساعة + +هل تبحث عن بروكسيات MTProto جديدة وفعّالة لتيليغرام؟ +يوفر هذا المستودع قائمة دائمة التحديث من بروكسيات MTProto المجانية، تُمكّنك من تجاوز الرقابة والاتصال بتيليغرام بأمان وسرعة. + +> **✅ الملف:** [`all_proxies.txt`](https://raw.githubusercontent.com/SoliSpirit/mtproto/master/all_proxies.txt) +> **🕒 التحديث:** تلقائي كل 12 ساعة + +--- + +## 🌐 الموقع الإلكتروني + +تصفّح البروكسيات وافحصها تلقائياً معرفة الأفضل لك عبر موقعنا: +**[https://solispirit.github.io/mtproto/](https://solispirit.github.io/mtproto/)** + +يدعم الموقع العربية، الإنجليزية، الروسية، الصينية، والفارسية. + +--- + +## 📄 المحتويات + +- ملف نصي بسيط: `all_proxies.txt` +- كل سطر يحتوي على بروكسي MTProto فعّال بالصيغة القياسية +- بدون إعلانات أو فوضى — فقط عناوين بروكسي نظيفة وجاهزة للاستخدام + +مثال على السطر: +`tg://proxy?server=example.com&port=443&secret=ee00000000000000000000000000000000000000` + +--- + +## 🔄 نظام التحديث التلقائي + +تُولَّد هذه القائمة وتُنشر بواسطة بوت كل **12 ساعة** باستخدام سكريبت مخصص. +يقوم السكريبت بمسح البروكسيات المتاحة للعموم والتحقق منها قبل النشر. + +--- + +## 💡 كيفية استخدام بروكسيات MTProto؟ + +1. انسخ سطراً من `all_proxies.txt` +2. افتحه في متصفح هاتفك أو جهاز الكمبيوتر +3. سيعرض تيليغرام تلقائياً خيار الاتصال عبر البروكسي + +يمكنك أيضاً لصق رابط البروكسي يدوياً في إعدادات تيليغرام ضمن **"البيانات والتخزين" ← "البروكسي"**. + +--- + +## ☕ الدعم + +إذا كان هذا مفيداً، فكّر في إعطاء ⭐️ للمستودع + +- [English](README.md) +- [العربية](README_AR.md) +- [中文](README_CN.md) +- [Русский](README_RU.md) +- [فارسی](README_FA.md) diff --git a/README_CN.md b/README_CN.md index 526ad89..a618c96 100644 --- a/README_CN.md +++ b/README_CN.md @@ -8,6 +8,15 @@ --- +## 🌐 网站 + +通过我们的网站浏览并测试代理,自动为你找到最佳代理: +**[https://solispirit.github.io/mtproto/](https://solispirit.github.io/mtproto/)** + +支持英语、阿拉伯语、俄语、中文和波斯语。 + +--- + ## 📄 内容简介 - 一个简单的文本文件:`all_proxies.txt` @@ -15,7 +24,9 @@ - 无广告,无杂乱,只有干净的代理地址 示例行: +``` tg://proxy?server=example.com&port=443&secret=ee00000000000000000000000000000000000000 +``` --- @@ -32,7 +43,7 @@ tg://proxy?server=example.com&port=443&secret=ee00000000000000000000000000000000 2. 在手机或桌面浏览器打开 3. Telegram会自动提示连接代理 -你也可以手动将代理链接粘贴到Telegram“数据和存储”设置下的“代理”中。 +你也可以手动将代理链接粘贴到Telegram **"数据和存储"** 设置下的 **"代理"** 中。 --- @@ -40,7 +51,8 @@ tg://proxy?server=example.com&port=443&secret=ee00000000000000000000000000000000 如果你觉得有用,请给本仓库点个⭐️ -- [English](README.md) +- [English](README.md) +- [العربية](README_AR.md) - [中文](README_CN.md) - [Русский](README_RU.md) - [فارسی](README_FA.md) diff --git a/README_FA.md b/README_FA.md index 08dd0c3..3747792 100644 --- a/README_FA.md +++ b/README_FA.md @@ -8,6 +8,15 @@ --- +## 🌐 وب‌سایت + +پروکسی‌ها را به‌صورت تعاملی مرور و آزمایش کنید — سایت به‌طور خودکار بهترین پروکسی را برای شما پیدا می‌کند: +**[https://solispirit.github.io/mtproto/](https://solispirit.github.io/mtproto/)** + +در دسترس به زبان‌های انگلیسی، عربی، روسی، چینی و فارسی. + +--- + ## 📄 محتویات - یک فایل متنی ساده به نام `all_proxies.txt` @@ -15,7 +24,9 @@ - بدون تبلیغات و شلوغی، فقط آدرس‌های تمیز و آماده استفاده نمونه خط: +``` tg://proxy?server=example.com&port=443&secret=ee00000000000000000000000000000000000000 +``` --- @@ -32,7 +43,7 @@ tg://proxy?server=example.com&port=443&secret=ee00000000000000000000000000000000 2. آن را در گوشی یا مرورگر دسکتاپ خود باز کنید 3. تلگرام به‌صورت خودکار پیشنهاد اتصال با پروکسی را می‌دهد -همچنین می‌توانید لینک پروکسی را به صورت دستی در تنظیمات "داده‌ها و ذخیره‌سازی" تلگرام زیر بخش "پروکسی" وارد کنید. +همچنین می‌توانید لینک پروکسی را به‌صورت دستی در تنظیمات **«داده‌ها و ذخیره‌سازی»** تلگرام زیر بخش **«پروکسی»** وارد کنید. --- @@ -40,7 +51,8 @@ tg://proxy?server=example.com&port=443&secret=ee00000000000000000000000000000000 اگر این مخزن برایتان مفید بود، لطفاً ⭐️ بدهید -- [English](README.md) +- [English](README.md) +- [العربية](README_AR.md) - [中文](README_CN.md) - [Русский](README_RU.md) - [فارسی](README_FA.md) diff --git a/README_RU.md b/README_RU.md index 93368bd..e42e3e5 100644 --- a/README_RU.md +++ b/README_RU.md @@ -8,6 +8,15 @@ --- +## 🌐 Сайт + +Просматривайте и проверяйте прокси в интерактивном режиме — сайт автоматически найдёт лучший прокси для вас: +**[https://solispirit.github.io/mtproto/](https://solispirit.github.io/mtproto/)** + +Доступен на английском, арабском, русском, китайском и персидском языках. + +--- + ## 📄 Что внутри? - Простой текстовый файл: `all_proxies.txt` @@ -15,7 +24,9 @@ - Без рекламы, без мусора – только чистые адреса прокси Пример строки: +``` tg://proxy?server=example.com&port=443&secret=ee00000000000000000000000000000000000000 +``` --- @@ -32,7 +43,7 @@ tg://proxy?server=example.com&port=443&secret=ee00000000000000000000000000000000 2. Откройте её на телефоне или браузере 3. Telegram автоматически предложит подключиться через прокси -Вы также можете вручную вставить ссылку прокси в настройках Telegram в разделе "Данные и хранилище" → "Прокси". +Вы также можете вручную вставить ссылку прокси в настройках Telegram в разделе **«Данные и хранилище» → «Прокси»**. --- @@ -40,7 +51,8 @@ tg://proxy?server=example.com&port=443&secret=ee00000000000000000000000000000000 Если вам это полезно, поставьте ⭐️ этому репозиторию -- [English](README.md) +- [English](README.md) +- [العربية](README_AR.md) - [中文](README_CN.md) - [Русский](README_RU.md) - [فارسی](README_FA.md) diff --git a/index.html b/index.html new file mode 100644 index 0000000..6ed7db1 --- /dev/null +++ b/index.html @@ -0,0 +1,809 @@ + + + + + +MTProto — Telegram Proxies + + + + + + + +
+ + + + + +
+ +
+
+
MTProto
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+ +
+ + + +
+
+ +
+
+ +
+
+
+
+ +
+
+
+
+   +   +   +
+
+ + +
+
+ +
+
+ + + + + + +
+
+
+ + + + From 340da88b41c4d811cd88b8c38cc6ad466e34df09 Mon Sep 17 00:00:00 2001 From: SANDRO00O Date: Tue, 7 Apr 2026 00:50:04 +0300 Subject: [PATCH 2/8] update --- README_AR.md | 9 - index.html | 809 --------------------------------------------------- 2 files changed, 818 deletions(-) delete mode 100644 index.html diff --git a/README_AR.md b/README_AR.md index 0a8c625..c7c677a 100644 --- a/README_AR.md +++ b/README_AR.md @@ -8,15 +8,6 @@ --- -## 🌐 الموقع الإلكتروني - -تصفّح البروكسيات وافحصها تلقائياً معرفة الأفضل لك عبر موقعنا: -**[https://solispirit.github.io/mtproto/](https://solispirit.github.io/mtproto/)** - -يدعم الموقع العربية، الإنجليزية، الروسية، الصينية، والفارسية. - ---- - ## 📄 المحتويات - ملف نصي بسيط: `all_proxies.txt` diff --git a/index.html b/index.html deleted file mode 100644 index 6ed7db1..0000000 --- a/index.html +++ /dev/null @@ -1,809 +0,0 @@ - - - - - -MTProto — Telegram Proxies - - - - - - - -
- - - - - -
- -
-
-
MTProto
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
- -
- - - -
-
- -
-
- -
-
-
-
- -
-
-
-
-   -   -   -
-
- - -
-
- -
-
- - - - - - -
-
-
- - - - From 8e1ffc2decd737aa9ee371f8dabffac9346fee96 Mon Sep 17 00:00:00 2001 From: SANDRO00O Date: Tue, 7 Apr 2026 00:51:21 +0300 Subject: [PATCH 3/8] update --- README.md | 9 --------- README_CN.md | 9 --------- README_FA.md | 9 --------- README_RU.md | 9 --------- 4 files changed, 36 deletions(-) diff --git a/README.md b/README.md index bb70fb4..7dddb2c 100644 --- a/README.md +++ b/README.md @@ -8,15 +8,6 @@ This repository provides an always-up-to-date list of free MTProto proxies that --- -## 🌐 Website - -Browse and test proxies interactively — the site automatically finds the best proxy for you: -**[https://solispirit.github.io/mtproto/](https://solispirit.github.io/mtproto/)** - -Available in English, Arabic, Russian, Chinese, and Persian. - ---- - ## 📄 What's Inside? - A simple text file: `all_proxies.txt` diff --git a/README_CN.md b/README_CN.md index a618c96..f6fa093 100644 --- a/README_CN.md +++ b/README_CN.md @@ -8,15 +8,6 @@ --- -## 🌐 网站 - -通过我们的网站浏览并测试代理,自动为你找到最佳代理: -**[https://solispirit.github.io/mtproto/](https://solispirit.github.io/mtproto/)** - -支持英语、阿拉伯语、俄语、中文和波斯语。 - ---- - ## 📄 内容简介 - 一个简单的文本文件:`all_proxies.txt` diff --git a/README_FA.md b/README_FA.md index 3747792..e82d68e 100644 --- a/README_FA.md +++ b/README_FA.md @@ -8,15 +8,6 @@ --- -## 🌐 وب‌سایت - -پروکسی‌ها را به‌صورت تعاملی مرور و آزمایش کنید — سایت به‌طور خودکار بهترین پروکسی را برای شما پیدا می‌کند: -**[https://solispirit.github.io/mtproto/](https://solispirit.github.io/mtproto/)** - -در دسترس به زبان‌های انگلیسی، عربی، روسی، چینی و فارسی. - ---- - ## 📄 محتویات - یک فایل متنی ساده به نام `all_proxies.txt` diff --git a/README_RU.md b/README_RU.md index e42e3e5..a5e341c 100644 --- a/README_RU.md +++ b/README_RU.md @@ -8,15 +8,6 @@ --- -## 🌐 Сайт - -Просматривайте и проверяйте прокси в интерактивном режиме — сайт автоматически найдёт лучший прокси для вас: -**[https://solispirit.github.io/mtproto/](https://solispirit.github.io/mtproto/)** - -Доступен на английском, арабском, русском, китайском и персидском языках. - ---- - ## 📄 Что внутри? - Простой текстовый файл: `all_proxies.txt` From 6172d68ff93e36e896827e572a12d4db1a4fe640 Mon Sep 17 00:00:00 2001 From: SANDRO00O Date: Wed, 8 Apr 2026 01:07:02 +0300 Subject: [PATCH 4/8] update --- functions/check.js | 57 +++ index.html | 1150 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 1207 insertions(+) create mode 100644 functions/check.js create mode 100644 index.html diff --git a/functions/check.js b/functions/check.js new file mode 100644 index 0000000..5f71bf5 --- /dev/null +++ b/functions/check.js @@ -0,0 +1,57 @@ +import { connect } from 'cloudflare:sockets'; + +export async function onRequest(context) { + if (context.request.method === 'OPTIONS') { + return new Response(null, { + status: 204, + headers: { + 'Access-Control-Allow-Origin': '*', + 'Access-Control-Allow-Methods': 'GET, OPTIONS', + 'Access-Control-Max-Age': '86400' + } + }); + } + + const url = new URL(context.request.url); + const hdrs = { + 'Content-Type': 'application/json', + 'Access-Control-Allow-Origin': '*', + 'Cache-Control': 'no-store' + }; + + if (url.searchParams.get('ping') === '1') { + return new Response(JSON.stringify({ pong: true }), { headers: hdrs }); + } + + // 3. Proxy TCP Probe + const server = (url.searchParams.get('server') || '').replace(/\.+$/, '').trim(); + const port = parseInt(url.searchParams.get('port') || '0', 10); + + if (!server || port < 1 || port > 65535) { + return new Response(JSON.stringify({ up: false, lat: 0 }), { headers: hdrs }); + } + + const TIMEOUT = 4500; + const t0 = Date.now(); + let sock = null; + + try { + sock = connect({ hostname: server, port }, { secureTransport: 'off' }); + const writer = sock.writable.getWriter(); + + await Promise.race([ + writer.ready, + new Promise((_, rej) => setTimeout(() => rej(new Error('timeout')), TIMEOUT)) + ]); + + const lat = Date.now() - t0; // L_Worker + writer.releaseLock(); + + return new Response(JSON.stringify({ up: true, lat }), { headers: hdrs }); + } catch (e) { + const lat = Date.now() - t0; + return new Response(JSON.stringify({ up: false, lat }), { headers: hdrs }); + } finally { + if (sock) sock.close().catch(() => {}); + } +} \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..303cb62 --- /dev/null +++ b/index.html @@ -0,0 +1,1150 @@ + + + + + + + MTProto — Telegram Proxies + + + + + + + + +
+ + + + + +
+ +
+ +
+ +
+
+
MTProto
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+ +
+ + + +
+
+ Edge TCP + +
+
+ +
+
+
+
+
+
+ +
+
+
+
+   +   +   +
+
+ + +
+
+ +
+
+ + + + + + +
+
+
+ + + + + \ No newline at end of file From 4cea1262111860162f4a9f69a4a61bcda37c00c8 Mon Sep 17 00:00:00 2001 From: SANDRO00O Date: Wed, 8 Apr 2026 01:40:27 +0300 Subject: [PATCH 5/8] update index.html --- index.html | 99 ++++++++++++++++++++++++++++++------------------------ 1 file changed, 55 insertions(+), 44 deletions(-) diff --git a/index.html b/index.html index 303cb62..07d481b 100644 --- a/index.html +++ b/index.html @@ -391,7 +391,7 @@ } @keyframes blink { - + 0%, 100% { opacity: 1 @@ -514,7 +514,7 @@ } @media(max-width:700px) { - + .list-head, .p-item { grid-template-columns: 20px 1fr 60px 80px 118px @@ -532,11 +532,10 @@ .list-head, .p-item { - grid-template-columns: 20px 1fr 55px 108px + grid-template-columns: 20px 1fr 45px 55px 108px } - .col-t, - .col-l { + .col-t { display: none } @@ -552,6 +551,14 @@ .edge-tag { display: none !important } + + .prt { + font-size: 10px; + } + + .lat { + font-size: 10px; + } } @@ -939,41 +946,41 @@ if (lc) lc.innerHTML = latHtml(p); } - async function checkOne(p){ - var url = '/check?server=' + encodeURIComponent(p.server) + '&port=' + p.port; - try { - var t0 = performance.now(); - - var [pingRes, resp] = await Promise.all([ - fetch('/check?ping=1', {cache: 'no-store'}) - .then(function(){ return performance.now() - t0; }) - .catch(function(){ return null; }), - fetch(url, {cache: 'no-store'}) - ]); - - if (!resp.ok) throw new Error('http'); - var d = await resp.json(); - var lTotal = performance.now() - t0; // L_Total - - if (d.up === true) { - var lWorker = typeof d.lat === 'number' ? Math.max(0, d.lat) : 4500; // L_Worker - - var lBase = pingRes !== null ? pingRes : Math.max(10, lTotal - lWorker - 25); - - var lReal = Math.round(lBase + lWorker); - - p.lat = Math.min(lReal, 4500); - p.up = true; - } else { - p.lat = 4500; - p.up = false; - } - } catch(e) { - p.lat = 4500; - p.up = false; - } - p.chk = false; -} + async function checkOne(p) { + var url = '/check?server=' + encodeURIComponent(p.server) + '&port=' + p.port; + try { + var t0 = performance.now(); + + var [pingRes, resp] = await Promise.all([ + fetch('/check?ping=1', { cache: 'no-store' }) + .then(function() { return performance.now() - t0; }) + .catch(function() { return null; }), + fetch(url, { cache: 'no-store' }) + ]); + + if (!resp.ok) throw new Error('http'); + var d = await resp.json(); + var lTotal = performance.now() - t0; // L_Total + + if (d.up === true) { + var lWorker = typeof d.lat === 'number' ? Math.max(0, d.lat) : 4500; // L_Worker + + var lBase = pingRes !== null ? pingRes : Math.max(10, lTotal - lWorker - 25); + + var lReal = Math.round(lBase + lWorker); + + p.lat = Math.min(lReal, 4500); + p.up = true; + } else { + p.lat = 4500; + p.up = false; + } + } catch (e) { + p.lat = 4500; + p.up = false; + } + p.chk = false; + } async function runCheck() { if (busy || !cfReady) return; @@ -982,9 +989,11 @@ var btn = document.getElementById('run-btn'); btn.disabled = true; btn.textContent = l.checking; - data.forEach(function(p) { p.lat = null; + data.forEach(function(p) { + p.lat = null; p.up = null; - p.chk = false; }); + p.chk = false; + }); bestProxy = null; document.getElementById('best-wrap').classList.remove('show'); document.getElementById('n-online').textContent = '\u2014'; @@ -1001,8 +1010,10 @@ var BATCH = 8; for (var i = 0; i < total; i += BATCH) { var slice = data.slice(i, Math.min(i + BATCH, total)); - slice.forEach(function(p) { p.chk = true; - updateRow(p); }); + slice.forEach(function(p) { + p.chk = true; + updateRow(p); + }); await Promise.all(slice.map(function(p) { return checkOne(p).then(function() { done++; From 3004e5571a96da4bd275a063b61b35c33c082dd7 Mon Sep 17 00:00:00 2001 From: SANDRO00O Date: Wed, 8 Apr 2026 01:48:53 +0300 Subject: [PATCH 6/8] update --- functions/check.js | 28 ++++++++++++++++------------ index.html | 7 +++---- 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/functions/check.js b/functions/check.js index 5f71bf5..8d4ace7 100644 --- a/functions/check.js +++ b/functions/check.js @@ -23,7 +23,6 @@ export async function onRequest(context) { return new Response(JSON.stringify({ pong: true }), { headers: hdrs }); } - // 3. Proxy TCP Probe const server = (url.searchParams.get('server') || '').replace(/\.+$/, '').trim(); const port = parseInt(url.searchParams.get('port') || '0', 10); @@ -31,26 +30,31 @@ export async function onRequest(context) { return new Response(JSON.stringify({ up: false, lat: 0 }), { headers: hdrs }); } - const TIMEOUT = 4500; + const TIMEOUT = 4000; const t0 = Date.now(); let sock = null; try { sock = connect({ hostname: server, port }, { secureTransport: 'off' }); const writer = sock.writable.getWriter(); - - await Promise.race([ - writer.ready, - new Promise((_, rej) => setTimeout(() => rej(new Error('timeout')), TIMEOUT)) - ]); - - const lat = Date.now() - t0; // L_Worker + + // الانتظار حتى يتم فتح اتصال TCP بنجاح + await writer.ready; + const tcpLat = Date.now() - t0; // زمن الوصول الأولي + + // إرسال حمولة وهمية (Fake Payload) لإجبار البروكسي على كشف حالته + // البروكسي الوهمي أو الميت لن يستطيع التعامل مع هذه البيانات + const payload = new TextEncoder().encode("GET / HTTP/1.1\r\nHost: " + server + "\r\n\r\n"); + await writer.write(payload); + + // ننتظر قليلاً للتأكد من أن السيرفر لم يقطع الاتصال فوراً (RST) + await new Promise(res => setTimeout(res, 50)); writer.releaseLock(); - return new Response(JSON.stringify({ up: true, lat }), { headers: hdrs }); + return new Response(JSON.stringify({ up: true, lat: tcpLat }), { headers: hdrs }); } catch (e) { - const lat = Date.now() - t0; - return new Response(JSON.stringify({ up: false, lat }), { headers: hdrs }); + // إذا فشل الاتصال أو رفض السيرفر الحمولة، فهو بروكسي لا يعمل + return new Response(JSON.stringify({ up: false, lat: 4500 }), { headers: hdrs }); } finally { if (sock) sock.close().catch(() => {}); } diff --git a/index.html b/index.html index 07d481b..972af7f 100644 --- a/index.html +++ b/index.html @@ -960,14 +960,13 @@ if (!resp.ok) throw new Error('http'); var d = await resp.json(); - var lTotal = performance.now() - t0; // L_Total + var lTotal = performance.now() - t0; if (d.up === true) { - var lWorker = typeof d.lat === 'number' ? Math.max(0, d.lat) : 4500; // L_Worker - + var lWorker = typeof d.lat === 'number' ? Math.max(0, d.lat) : 4500; var lBase = pingRes !== null ? pingRes : Math.max(10, lTotal - lWorker - 25); - var lReal = Math.round(lBase + lWorker); + var lReal = Math.round(lBase + (lWorker * 2.5) + 80); p.lat = Math.min(lReal, 4500); p.up = true; From b2b743b835e3a9c6262f97ab6af0df27d9ac95e2 Mon Sep 17 00:00:00 2001 From: SANDRO00O Date: Wed, 8 Apr 2026 01:49:22 +0300 Subject: [PATCH 7/8] update check.js --- functions/check.js | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/functions/check.js b/functions/check.js index 8d4ace7..c523f92 100644 --- a/functions/check.js +++ b/functions/check.js @@ -38,22 +38,17 @@ export async function onRequest(context) { sock = connect({ hostname: server, port }, { secureTransport: 'off' }); const writer = sock.writable.getWriter(); - // الانتظار حتى يتم فتح اتصال TCP بنجاح await writer.ready; - const tcpLat = Date.now() - t0; // زمن الوصول الأولي + const tcpLat = Date.now() - t0; - // إرسال حمولة وهمية (Fake Payload) لإجبار البروكسي على كشف حالته - // البروكسي الوهمي أو الميت لن يستطيع التعامل مع هذه البيانات const payload = new TextEncoder().encode("GET / HTTP/1.1\r\nHost: " + server + "\r\n\r\n"); await writer.write(payload); - // ننتظر قليلاً للتأكد من أن السيرفر لم يقطع الاتصال فوراً (RST) await new Promise(res => setTimeout(res, 50)); writer.releaseLock(); return new Response(JSON.stringify({ up: true, lat: tcpLat }), { headers: hdrs }); } catch (e) { - // إذا فشل الاتصال أو رفض السيرفر الحمولة، فهو بروكسي لا يعمل return new Response(JSON.stringify({ up: false, lat: 4500 }), { headers: hdrs }); } finally { if (sock) sock.close().catch(() => {}); From 303ac7f53bdf26f26315b964f0a80bace000e2da Mon Sep 17 00:00:00 2001 From: SANDRO00O Date: Wed, 8 Apr 2026 01:57:11 +0300 Subject: [PATCH 8/8] update --- functions/check.js | 47 ++++++++++++++++------- index.html | 95 +++++++++++++++++++++++++++++----------------- 2 files changed, 94 insertions(+), 48 deletions(-) diff --git a/functions/check.js b/functions/check.js index c523f92..5427c42 100644 --- a/functions/check.js +++ b/functions/check.js @@ -11,43 +11,62 @@ export async function onRequest(context) { } }); } - + const url = new URL(context.request.url); const hdrs = { 'Content-Type': 'application/json', 'Access-Control-Allow-Origin': '*', 'Cache-Control': 'no-store' }; - + if (url.searchParams.get('ping') === '1') { return new Response(JSON.stringify({ pong: true }), { headers: hdrs }); } - + const server = (url.searchParams.get('server') || '').replace(/\.+$/, '').trim(); const port = parseInt(url.searchParams.get('port') || '0', 10); - + if (!server || port < 1 || port > 65535) { return new Response(JSON.stringify({ up: false, lat: 0 }), { headers: hdrs }); } - - const TIMEOUT = 4000; + const t0 = Date.now(); let sock = null; - + try { sock = connect({ hostname: server, port }, { secureTransport: 'off' }); const writer = sock.writable.getWriter(); + const reader = sock.readable.getReader(); - await writer.ready; + // 1. انتظار فتح الاتصال (بحد أقصى 2.5 ثانية) + await Promise.race([ + writer.ready, + new Promise((_, r) => setTimeout(() => r(new Error('timeout')), 2500)) + ]); const tcpLat = Date.now() - t0; - - const payload = new TextEncoder().encode("GET / HTTP/1.1\r\nHost: " + server + "\r\n\r\n"); - await writer.write(payload); - - await new Promise(res => setTimeout(res, 50)); + + // 2. إرسال بيانات عشوائية لاستفزاز البروكسي (MTProto proxy سيرفضها فوراً) + const dummy = new Uint8Array([0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef]); + await writer.write(dummy); + + // 3. قراءة استجابة السيرفر (الخطوة الأهم) + // السيرفر الميت/المحجوب سيظل صامتاً. البروكسي الحقيقي سيغلق الاتصال فوراً لأنه بروتوكول خاطئ. + const readResult = await Promise.race([ + reader.read(), + new Promise(res => setTimeout(() => res({ isHoneypot: true }), 1500)) + ]); + writer.releaseLock(); - + reader.releaseLock(); + + // إذا لم يستجب السيرفر وابتلع البيانات، فهو سيرفر وهمي أو جدار حماية + if (readResult.isHoneypot) { + throw new Error('Dead Server'); + } + + // إذا استجاب أو أغلق الاتصال بنجاح، فهو بروكسي حيّ return new Response(JSON.stringify({ up: true, lat: tcpLat }), { headers: hdrs }); + } catch (e) { return new Response(JSON.stringify({ up: false, lat: 4500 }), { headers: hdrs }); } finally { diff --git a/index.html b/index.html index 972af7f..84eaf9e 100644 --- a/index.html +++ b/index.html @@ -946,40 +946,67 @@ if (lc) lc.innerHTML = latHtml(p); } - async function checkOne(p) { - var url = '/check?server=' + encodeURIComponent(p.server) + '&port=' + p.port; - try { - var t0 = performance.now(); - - var [pingRes, resp] = await Promise.all([ - fetch('/check?ping=1', { cache: 'no-store' }) - .then(function() { return performance.now() - t0; }) - .catch(function() { return null; }), - fetch(url, { cache: 'no-store' }) - ]); - - if (!resp.ok) throw new Error('http'); - var d = await resp.json(); - var lTotal = performance.now() - t0; - - if (d.up === true) { - var lWorker = typeof d.lat === 'number' ? Math.max(0, d.lat) : 4500; - var lBase = pingRes !== null ? pingRes : Math.max(10, lTotal - lWorker - 25); - - var lReal = Math.round(lBase + (lWorker * 2.5) + 80); - - p.lat = Math.min(lReal, 4500); - p.up = true; - } else { - p.lat = 4500; - p.up = false; - } - } catch (e) { - p.lat = 4500; - p.up = false; - } - p.chk = false; - } + // دالة جديدة لاكتشاف الحظر من مزود الإنترنت المحلي (ISP) +function localProbe(server, port) { + return new Promise(function(resolve) { + var t0 = performance.now(); + var controller = new AbortController(); + + // إذا استغرق أكثر من 1.5 ثانية دون استجابة، فهذا يعني أن شركة الإنترنت تقوم بحجبه + var timeout = setTimeout(function(){ + controller.abort(); + resolve(2000); // 2000 يعني محظور + }, 1500); + + fetch('http://' + server + ':' + port, { mode: 'no-cors', cache: 'no-store', signal: controller.signal }) + .then(function() { + clearTimeout(timeout); + resolve(performance.now() - t0); + }) + .catch(function(e) { + clearTimeout(timeout); + if (e.name === 'AbortError') resolve(2000); + // الفشل السريع يعني أن البروكسي يمكن الوصول إليه محلياً ولكنه رفض طلب الويب (وهذا ممتاز لأنه بروكسي وليس موقع) + else resolve(performance.now() - t0); + }); + }); +} + +// الدالة المعدلة بالكامل +async function checkOne(p){ + var url = '/check?server=' + encodeURIComponent(p.server) + '&port=' + p.port; + try { + var t0 = performance.now(); + + // تشغيل 3 اختبارات في نفس الوقت: الفحص العالمي، قياس البينج، وفحص الحظر المحلي + var [workerRes, pingRes, localTime] = await Promise.all([ + fetch(url, {cache: 'no-store'}).then(r => r.ok ? r.json() : {up:false}).catch(()=>({up:false})), + fetch('/check?ping=1', {cache: 'no-store'}).then(() => performance.now() - t0).catch(() => null), + localProbe(p.server, p.port) + ]); + + // إذا أرجع الفحص المحلي وقتاً كبيراً، فهذا يعني أن شركة الإنترنت في بلدك تحظر هذا البروكسي + var isBlockedLocally = localTime >= 1500; + + if (workerRes.up === true && !isBlockedLocally) { + var lWorker = workerRes.lat; + var lBase = pingRes !== null ? pingRes : 50; + + // معادلة محاكاة تيليجرام الواقعية ليكون البينج مطابقاً لما يظهر في التطبيق + var lReal = Math.round(lBase + (lWorker * 2.2) + 60); + + p.lat = Math.min(lReal, 4500); + p.up = true; + } else { + p.lat = 4500; + p.up = false; // يتم اعتباره غير متاح إذا كان محظوراً محلياً أو ميت عالمياً + } + } catch(e) { + p.lat = 4500; + p.up = false; + } + p.chk = false; +} async function runCheck() { if (busy || !cfReady) return;