tgwsapiproxy
Локальный прокси для Telegram-ботов в РФ. Тот же приём, что в tg-ws-proxy, но вместо MTProto Telegram Desktop — обычный HTTPS Bot API.
Telegram Bot ──► tgwsapiproxy ──► Cloudflare Worker ──► api.telegram.org
127.0.0.1 workers.dev
socks5 + http CONNECT
DPI на участке между тобой и Cloudflare видит только SNI=xxx.workers.dev.
SNI=api.telegram.org не покидает туннель — его открывает сам бот, уже внутри.
Ноль зависимостей. Только стандартная библиотека. Нужно потому, что PyPI
бывает недоступен из РФ, а aiohttp-socks/httpx-socks/PySocks туда не поставить.
Установка
С PyPI:
pip install tgwsapiproxy
Прямо из репозитория (без публикации на PyPI):
pip install "git+https://github.com/winchanii/TgWsApiProxy"
Опционально, вместе с библиотеками ботов:
pip install "tgwsapiproxy[aiogram]" # aiogram + aiohttp-socks
pip install "tgwsapiproxy[ptb]" # python-telegram-bot + httpx[socks]
Пока пакет не опубликован на PyPI, работает только вариант с
git+....
Настройка Cloudflare Worker
Нужен бесплатный аккаунт на dash.cloudflare.com. Домен покупать не нужно.
Compute→Workers & Pages→Create application→Start with Hello World!→DeployEdit code— вставьworker.js(лежит в sdist этого пакета) →Deploy- Скопируй домен вида
my-worker-abc123.имя.workers.dev
Важно: белый список
worker.js жёстко ограничен списком ALLOWED_HOSTS. Не убирай его.
Без ограничения получится open-proxy на инфраструктуре Cloudflare: через него
можно сканировать порты и бить по чужому аккаунту, и Cloudflare его забанит.
Запуск
tgwsapiproxy --worker-host my-worker-abc123.workers.dev
Поднимает два входа:
| Порт | Протокол | Для кого |
|---|---|---|
1080 |
SOCKS5 | клиенты с поддержкой SOCKS5 |
8080 |
HTTP CONNECT | всё, что умеет HTTP-прокси |
По умолчанию разрешён только api.telegram.org, слушает только 127.0.0.1.
Использование в боте
aiogram 3
from aiogram import Bot
from aiogram.client.session.aiohttp import AiohttpSession
session = AiohttpSession(proxy="http://127.0.0.1:8080")
bot = Bot(token="123456:ABC", session=session)
В aiogram 3.31 класс называется
AiohttpSession.AioHTTPSession— имя из ранних 3.x, сейчас не существует.
aiogram требует aiohttp-socks при любом типе прокси — хоть socks5://,
хоть http://. Это зашито в его код: _prepare_connector() импортирует
ProxyConnector из aiohttp_socks безусловно.
python-telegram-bot 20+
from telegram import Bot
from telegram.request import HTTPXRequest
bot = Bot(token="123456:ABC", request=HTTPXRequest(proxy="http://127.0.0.1:8080"))
PTB работает на httpx, у которого HTTP-прокси поддержан нативно — дополнительные пакеты не нужны.
Встроенный прокси прямо в боте
Пакет умеет поднимать прокси сам, отдельным процессом не нужен:
import asyncio
from aiogram import Bot
from aiogram.client.session.aiohttp import AiohttpSession
import tgwsapiproxy
async def main():
async with tgwsapiproxy.run_proxy("my-worker.workers.dev"):
session = AiohttpSession(proxy=tgwsapiproxy.proxy_url()) # http://127.0.0.1:8080
bot = Bot(token="123456:ABC", session=session)
await dp.start_polling(bot)
Неблокирующий вариант — start_proxy() / stop_proxy().
Проверка
curl -sS --proxy http://127.0.0.1:8080 https://api.telegram.org/bot<ТОКЕН>/getMe
JSON с "ok": true — туннель живой.
Как это работает
Ключевая идея: SOCKS5 оперирует байтами TCP и ничего не шифрует.
TLS-сессию до api.telegram.org открывает сам бот, уже внутри туннеля.
Поэтому SNI=api.telegram.org физически не может утечь на участок между
тобой и Cloudflare: там видно только SNI=xxx.workers.dev.
Cloudflare соединяется с Telegram от своего имени, уже не из России, где блокировки и DPI не действуют.
Публикация на PyPI
Публикация привязана к GitHub Releases — токен API не нужен, авторизацию делает GitHub через OIDC.
- На https://pypi.org/manage/account/publishing/ добавь издателя:
- Owner:
winchanii - Repository name:
TgWsApiProxy - Workflow name:
publish.yml - Environment name:
pypi
- Owner:
- В GitHub:
Settings→Environments→ создай окружениеpypi - Создай релиз:
Releases→Draft a new release→ тегv0.1.0→Publish release
Workflow соберёт пакет, проверит метаданные через twine check и загрузит
артефакты на PyPI.
Имя
tgwsapiproxyна PyPI необратимо. Перед первой публикацией убедись, что оно свободно: https://pypi.org/project/tgwsapiproxy/ должен вернуть 404.
Ограничения и риски
Надёжность ~85–95% на бесплатном тарифе Workers. connect() от Worker'а
к Telegram периодически провисает на десятки секунд. Клиент делает до четырёх
попыток с растущим бэкоффом, это поднимает успех с ~70% до ~90%, но остаток
уходит на платный тариф — там TCP-исходящие стабильнее. Ботам всё равно
нужен собственный ретрай поверх этого: нормальная практика для сетевого
вызова в любом случае.
Рукопожатие с Worker провисает на холодных стартах изолятов. Здоровый хендшейк занимает ~0.3 с, таймаут на попытку намеренно небольшой (10 с), иначе повторы не успевают отработать за бюджет клиента.
Cloudflare может забанить аккаунт. Использование CF как транспорта для обхода блокировок местами противоречит их ToS. Держи аккаунт на отдельной почте.
Это не VPN. Только SOCKS5/HTTP на localhost с белым списком. Интернет, YouTube, Discord не починятся — для этого нужен Xray/sing-box.
Лимиты Workers. Бесплатного тарифа хватает для работы ботов (текст, фото, документы). На массовую выкачку видео — уже нет.
Длинные соединения. Keepalive-пинг каждые 25 с не даёт Cloudflare закрыть
простаивый WebSocket. Для long polling с timeout=30 хватает с запасом.
Лицензия
MIT
Metadata
Release files for tgwsapiproxy 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| tgwsapiproxy-0.1.0.tar.gz | 15.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| tgwsapiproxy-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 29.9 kB
Release files / tgwsapiproxy-0.1.0.tar.gz
| Download URL | tgwsapiproxy-0.1.0.tar.gz |
|---|---|
| Size | 15.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
1e4bc3485d7c8826daade6efe23a6eb4c9ac6f25e60c48e1c8e35db75c02616e
|
|
BLAKE2b-256 checksum How to use checksums |
3964f2e1bed3936734d0981cd5a993a0ca2c4f53052efe2c326981fbc90fcf1d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 11, 2026.
Transparency logRelease files / tgwsapiproxy-0.1.0-py3-none-any.whl
| Download URL | tgwsapiproxy-0.1.0-py3-none-any.whl |
|---|---|
| Size | 14.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
171993c888aa2b86a1392ea37f6dac107c3c3af9bcefe988d0b9d26f76405660
|
|
BLAKE2b-256 checksum How to use checksums |
ea31c9426f7ad6833c9020eede7204f2bbc52bddda785eff7a4ed46466f9ecd2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 11, 2026.
Transparency log