diff --git a/docs/CfProxy.md b/docs/CfProxy.md new file mode 100644 index 0000000..59830a1 --- /dev/null +++ b/docs/CfProxy.md @@ -0,0 +1,32 @@ +# Cloudflare-прокси + +Для недоступных дата-центров можно использовать альтернативный бесплатный способ подключения — проксирование через Cloudflare. **Для работы нужен только домен**. В приложении есть домен по умолчанию, но его можно (и желательно) заменить на свой. + +Прокси возвращает доступ к тому, что раньше не загружалось (реакции, некоторые стикеры). Если на аккаунте без Premium не загружаются фото/видео, оставьте в блоке `DC → IP` только `4:149.154.167.220`. Если CF-прокси работает, медиа снова начнет загружаться. + +## Зачем мне настраивать свой домен? + +Cloudflare имеет лимиты на одновременное количество WS-подключений. Домен по умолчанию может перестать работать в любой момент. + +## Настройка своего домена + +1. Добавьте свой домен в Cloudflare (либо купив его напрямую у Cloudflare, либо изменив NS-серверы: https://developers.cloudflare.com/dns/zone-setups/full-setup/setup/). Домены стоят примерно 150 рублей в год, подойдёт любой. + +2. В `SSL/TLS` → `Overview` выставьте режим **Flexible**. + +3. В `DNS` → `Records` добавьте следующие `A`-записи через `+ Add Record`: +- Name=`kws1` IPv4=`149.154.175.50` +- Name=`kws2` IPv4=`149.154.167.51` +- Name=`kws3` IPv4=`149.154.175.100` +- Name=`kws4` IPv4=`149.154.167.91` +- Name=`kws5` IPv4=`149.154.171.5` +- Name=`kws203` IPv4=`91.105.192.100` + +4. **Добавьте домен в [zapret](https://github.com/Flowseal/zapret-discord-youtube/) или в любое другое ПО, так как подсеть Cloudflare может быть заблокирована (например, в России).** + +5. В настройках `TgWsProxy` замените домен на свой. + +## Благодарности + +- Идея: https://github.com/Nekogram/WSProxy +- Спасибо [@UjuiUjuMandan](https://github.com/UjuiUjuMandan) за информацию. \ No newline at end of file diff --git a/docs/CfWorker.md b/docs/CfWorker.md new file mode 100644 index 0000000..9ad1d59 --- /dev/null +++ b/docs/CfWorker.md @@ -0,0 +1,125 @@ +# Cloudflare Worker + +Альтернативный (полностью бесплатный, не нужно покупать домен в отличии от [CfProxy](./CfProxy.md)) способ проксирования. + +Прокси возвращает доступ к тому, что раньше не загружалось (реакции, некоторые стикеры). Если на аккаунте без Premium с данным способом все еще не загружаются фото/видео, оставьте в блоке `DC → IP` только `4:149.154.167.220` + +## + +1. **Добавьте в [zapret](https://github.com/Flowseal/zapret-discord-youtube/) или в любое другое ПО следующие домены:** +``` +cloudflare.com +cloudflare.dev +workers.dev +``` +2. Создайте аккаунт в [Cloudflare](https://dash.cloudflare.com/) (или войдите в существующий) + * **После создания аккаунта подтвердите почту с помощью письма, который вам пришел на email** +3. Слева в панели выберите `Compute` → `Workers & Pages` + image + +4. Нажмите сверху справа кнопку **`Create application`** → `Start with Hello World!` → `Deploy` + image + image + image + +5. Сверху справа нажмите кнопку **`Edit code`**, замените код слева на тот, [что находится внизу этой страницы](./CfWorker.md#код-workerа) + * Если у вас не загружается код, то вы не выполнили первый пункт + image + image + + +6. Нажмите сверху справа кнопку **`Deploy`** + image + +7. Скопируйте домен из поля справа и укажите его в настройках **Cloudflare Worker** (или через аргумент `--cfproxy-worker-domain`) + * Пример домена: `random-symbols-1234.username.workers.dev` + * **Можно указывать несколько доменов через запятую (или повторением аргумента `--cfproxy-worker-domain`)** + image + + +### Код Worker'а +```javascript +import { connect } from "cloudflare:sockets"; + +function toBytes(data) { + if (data instanceof ArrayBuffer) { + return new Uint8Array(data); + } + if (typeof data === "string") { + return new TextEncoder().encode(data); + } + if (data && typeof data.arrayBuffer === "function") { + return data.arrayBuffer().then((ab) => new Uint8Array(ab)); + } + return new Uint8Array(); +} + +export default { + async fetch(request) { + if ((request.headers.get("Upgrade") || "").toLowerCase() !== "websocket") { + return new Response("Expected websocket", { status: 426 }); + } + + const url = new URL(request.url); + if (url.pathname !== "/apiws") { + return new Response("Not found", { status: 404 }); + } + + const dst = url.searchParams.get("dst"); + const pair = new WebSocketPair(); + const client = pair[0]; + const server = pair[1]; + server.accept(); + + const socket = connect({ hostname: dst, port: 443 }); + const tcpReader = socket.readable.getReader(); + const tcpWriter = socket.writable.getWriter(); + + server.addEventListener("message", async (event) => { + try { + await tcpWriter.write(await toBytes(event.data)); + } catch { + try { + server.close(1011, "tcp write failed"); + } catch {} + } + }); + + server.addEventListener("close", async () => { + try { + await tcpWriter.close(); + } catch {} + try { + socket.close(); + } catch {} + }); + + (async () => { + try { + while (true) { + const { value, done } = await tcpReader.read(); + if (done) { + break; + } + if (value) { + server.send(value); + } + } + } catch { + } finally { + try { + server.close(); + } catch {} + try { + tcpReader.releaseLock(); + } catch {} + try { + socket.close(); + } catch {} + } + })(); + + return new Response(null, { status: 101, webSocket: client }); + }, +}; +``` diff --git a/docs/Funding.md b/docs/Funding.md new file mode 100644 index 0000000..9d99ff0 --- /dev/null +++ b/docs/Funding.md @@ -0,0 +1,12 @@ +> [!TIP] +> +> ### 🎉 Поддержать меня +> +> **USDT (TRC20)**: `TXPnKs2Ww1RD8JN6nChFUVmi5r2hqrWjuu` +> **BTC**: `bc1qr8vd6jelkyyry3m4mq6z5txdx4pl856fu6ss0w` +> **ETH**: `0x1417878fdc5047E670a77748B34819b9A49C72F1` +> **Другие монеты**: https://nowpayments.io/donation/flowseal + +Проект полностью бесплатен для всех. +Однако его развитие и стабильная работа при росте числа пользователей требуют вложений. +Буду благодарен за любую форму поддержки! Спасибо ❤️ \ No newline at end of file