mirror of
https://github.com/Flowseal/tg-ws-proxy.git
synced 2026-10-31 21:01:50 +03:00
Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 50d539c718 | |||
| 694077ef7d | |||
| 87a9320e61 | |||
| 86191badf4 | |||
| 19cdbd9d6f | |||
| dc2c4c03f6 |
@@ -0,0 +1,23 @@
|
|||||||
|
### Проверьте две вещи:
|
||||||
|
- вы на последней версии: [Releases](https://github.com/Flowseal/tg-ws-proxy/releases)
|
||||||
|
- запускали по инструкции для своей ОС: [Быстрый старт](https://github.com/Flowseal/tg-ws-proxy#навигация)
|
||||||
|
|
||||||
|
## Решение частых проблем:
|
||||||
|
|
||||||
|
**Q**: Не запускается, падает с ошибкой, не работает как раньше после обновления?
|
||||||
|
**A**:
|
||||||
|
1. Удалите всё в папке Temp (или хотя бы всё, что начинается с _MEI)
|
||||||
|
2. Запускайте от имени админа
|
||||||
|
3. Попробуйте Win7 версию (если вы пользователь Windows)
|
||||||
|
4. Попробуйте отключить антивирус (если помогло, то добавьте exe в исключения). Не забудьте включить антивирус обратно.
|
||||||
|
|
||||||
|
###
|
||||||
|
|
||||||
|
**Q**: Не грузит медиа? (фото/видео/стикеры)
|
||||||
|
**A**: Удалите в настройках прокси в поле **DC → IP** всё, кроме `4:149.154.167.220`. Если это не помогло, полностью очистите это поле.
|
||||||
|
|
||||||
|
|
||||||
|
#### Если проблема решена, то закройте Issue
|
||||||
|
|
||||||
|
### Если проблема осталась, пожалуйста, приложите по возможности логи.
|
||||||
|
Сделать это можно через иконку в трее -> Пкм -> Открыть логи. Сохраните логи в файл и приложите его сюда.
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
## У вас не включен CF-прокси, включите его в настройках.
|
||||||
|
|
||||||
|
Если в логах будет **TimeoutError**, то:
|
||||||
|
|
||||||
|
Timeout error при CF-прокси - проблема с вашей стороны. РКН/сторонние впны/прокси и т.п.
|
||||||
|
|
||||||
|
1. Попробуйте поставить галочку "Выключить TLS для CF-прокси и CF-worker" в настройках. Если не поможет, уберите.
|
||||||
|
2. Если используете запрет, попробуйте его выключить и проверьте работу. Если работает, то добавьте в файл `list-exclude-user`: **`co.uk`**
|
||||||
|
3. Если не помогло, то уберите запись из прошлого пункта и добавьте в файл `list-general-user`: **`co.uk`**
|
||||||
|
4. Попробуйте настроить https://github.com/Flowseal/tg-ws-proxy/blob/main/docs/RU/CfWorker.md
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
Проверьте включенли WARP/VPN, если выключены то:
|
||||||
|
|
||||||
|
1. Если используете запрет, добавьте в файл `list-general-user`: **`co.uk`**
|
||||||
|
2. Попробуйте настроить https://github.com/Flowseal/tg-ws-proxy/blob/main/docs/RU/CfWorker.md
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
Timeout error при CF-прокси - проблема с вашей стороны. РКН/сторонние впны/прокси и т.п.
|
||||||
|
|
||||||
|
1. Попробуйте поставить галочку "Выключить TLS для CF-прокси и CF-worker" в настройках. Если не поможет, уберите.
|
||||||
|
2. Если используете запрет, попробуйте его выключить и проверьте работу. Если работает, то добавьте в файл `list-exclude-user`: **`co.uk`**
|
||||||
|
3. Если не помогло, то уберите запись из прошлого пункта и добавьте в файл `list-general-user`: **`co.uk`**
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
Timeout error при CF-прокси - проблема с вашей стороны. РКН/сторонние впны/прокси и т.п.
|
||||||
|
|
||||||
|
1. Попробуйте поставить галочку "Выключить TLS для CF-прокси и CF-worker" в настройках. Если не поможет, уберите.
|
||||||
|
2. Если используете запрет, попробуйте его выключить и проверьте работу. Если работает, то добавьте в файл `list-exclude-user`: **`co.uk`**
|
||||||
|
3. Если не помогло, то уберите запись из прошлого пункта и добавьте в файл `list-general-user`: **`co.uk`**
|
||||||
|
4. Попробуйте настроить https://github.com/Flowseal/tg-ws-proxy/blob/main/docs/RU/CfWorker.md
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
Указан **неверный секрет** в настройках прокси в телеграме
|
||||||
|
|
||||||
|
`Лкм` по иконке в трее -> **Открыть в Telegram**
|
||||||
@@ -0,0 +1,65 @@
|
|||||||
|
import os
|
||||||
|
from time import sleep
|
||||||
|
import urllib.request as request
|
||||||
|
|
||||||
|
url = os.environ["LOG_URL"]
|
||||||
|
path_answer = ".github/scripts/answers"
|
||||||
|
|
||||||
|
for _ in range(0,3):
|
||||||
|
try:
|
||||||
|
with request.urlopen(url,timeout=30.0) as r:
|
||||||
|
log_bytes = r.read()
|
||||||
|
break
|
||||||
|
except Exception:
|
||||||
|
sleep(5.0)
|
||||||
|
else:
|
||||||
|
print(str(path_answer + "/default.md"))
|
||||||
|
exit()
|
||||||
|
|
||||||
|
log_old = log_bytes.decode("utf-8",errors="replace").splitlines()
|
||||||
|
|
||||||
|
worker_end = False
|
||||||
|
cfproxy_end = False
|
||||||
|
|
||||||
|
log = []
|
||||||
|
for line in reversed(log_old):
|
||||||
|
line = line[20:]
|
||||||
|
log.append(line)
|
||||||
|
if "CF proxy: enabled" in line:
|
||||||
|
cfproxy_end = True
|
||||||
|
elif "CF worker: enabled" in line:
|
||||||
|
worker_end = True
|
||||||
|
elif "INFO tg-ws-tray Starting proxy" in line:
|
||||||
|
break
|
||||||
|
|
||||||
|
secret_false = 0
|
||||||
|
timeouterror = 0
|
||||||
|
reset_error = 0
|
||||||
|
|
||||||
|
for line in log :
|
||||||
|
if "(wrong secret or proto)" in line:
|
||||||
|
secret_false += 1
|
||||||
|
if secret_false >= 10:
|
||||||
|
print(str(path_answer + "/wrong_secret.md"))
|
||||||
|
break
|
||||||
|
elif "TimeoutError" in line:
|
||||||
|
timeouterror += 1
|
||||||
|
if timeouterror >= 20:
|
||||||
|
if cfproxy_end is False:
|
||||||
|
print(str(path_answer + "/no_cfproxy.md"))
|
||||||
|
break
|
||||||
|
if worker_end is False:
|
||||||
|
print(str(path_answer + "/timeout_no_worker.md"))
|
||||||
|
else:
|
||||||
|
print(str(path_answer + "/timeout.md"))
|
||||||
|
break
|
||||||
|
elif "ConnectionResetError" in line:
|
||||||
|
reset_error += 1
|
||||||
|
if reset_error >= 20:
|
||||||
|
print(str(path_answer + "/reset_error.md"))
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
if cfproxy_end is True:
|
||||||
|
print(str(path_answer + "/default.md"))
|
||||||
|
else:
|
||||||
|
print(str(path_answer + "/no_cfproxy.md"))
|
||||||
@@ -664,7 +664,7 @@ jobs:
|
|||||||
|
|
||||||
> [!TIP]
|
> [!TIP]
|
||||||
> Не можете скачать?
|
> Не можете скачать?
|
||||||
> Добавьте `185.199.109.133 release-assets.githubusercontent.com` в hosts или воспользуйтесь зеркалом: https://sourceforge.net/projects/tg-ws-proxy.mirror/files/
|
> Воспользуйтесь зеркалом: https://sourceforge.net/projects/tg-ws-proxy.mirror/files/
|
||||||
files: |
|
files: |
|
||||||
dist/TgWsProxy_windows.exe
|
dist/TgWsProxy_windows.exe
|
||||||
dist/TgWsProxy_windows_arm64.exe
|
dist/TgWsProxy_windows_arm64.exe
|
||||||
|
|||||||
@@ -6,37 +6,54 @@ on:
|
|||||||
|
|
||||||
permissions:
|
permissions:
|
||||||
issues: write
|
issues: write
|
||||||
|
contents: read
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
comment:
|
comment:
|
||||||
if: contains(github.event.issue.labels.*.name, 'bug')
|
if: contains(github.event.issue.labels.*.name, 'bug')
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
|
- name: Check for availability log file
|
||||||
|
id: log
|
||||||
|
env:
|
||||||
|
ISSUE_BODY: ${{ github.event.issue.body }}
|
||||||
|
run: |
|
||||||
|
if [[ "$ISSUE_BODY" =~ (https://github\.com/user-attachments/files/[^[:space:]]+\.log) ]]; then
|
||||||
|
echo "found=true" >> "$GITHUB_OUTPUT"
|
||||||
|
echo "url=${BASH_REMATCH[1]}" >> "$GITHUB_OUTPUT"
|
||||||
|
echo "Log file found"
|
||||||
|
else
|
||||||
|
echo "found=false" >> "$GITHUB_OUTPUT"
|
||||||
|
echo "Log file not found"
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Install python
|
||||||
|
if: steps.log.outputs.found == 'true'
|
||||||
|
uses: actions/setup-python@v6
|
||||||
|
with:
|
||||||
|
python-version: "3.14"
|
||||||
|
|
||||||
|
- name: Clone folder
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
sparse-checkout: |
|
||||||
|
.github/scripts/*
|
||||||
|
sparse-checkout-cone-mode: false
|
||||||
|
|
||||||
|
- name: Start check log
|
||||||
|
if: steps.log.outputs.found == 'true'
|
||||||
|
id: comment
|
||||||
|
env:
|
||||||
|
LOG_URL: ${{ steps.log.outputs.url }}
|
||||||
|
run: |
|
||||||
|
{
|
||||||
|
echo "com<<EOF"
|
||||||
|
python .github/scripts/check_log.py
|
||||||
|
echo "EOF"
|
||||||
|
} >> "$GITHUB_OUTPUT"
|
||||||
|
|
||||||
- name: Comment on new issue
|
- name: Comment on new issue
|
||||||
uses: peter-evans/create-or-update-comment@v5
|
uses: peter-evans/create-or-update-comment@v5
|
||||||
with:
|
with:
|
||||||
issue-number: ${{ github.event.issue.number }}
|
issue-number: ${{ github.event.issue.number }}
|
||||||
body: |
|
body-path: ${{ steps.log.outputs.found == 'true' && steps.comment.outputs.com || '.github/scripts/answers/default.md' }}
|
||||||
### Проверьте две вещи:
|
|
||||||
- вы на последней версии: [Releases](https://github.com/Flowseal/tg-ws-proxy/releases)
|
|
||||||
- запускали по инструкции для своей ОС: [Быстрый старт](https://github.com/Flowseal/tg-ws-proxy#навигация)
|
|
||||||
|
|
||||||
## Решение частых проблем:
|
|
||||||
|
|
||||||
**Q**: Не запускается, падает с ошибкой, не работает как раньше после обновления?
|
|
||||||
**A**:
|
|
||||||
1. Удалите всё в папке Temp (или хотя бы всё, что начинается с _MEI)
|
|
||||||
2. Запускайте от имени админа
|
|
||||||
3. Попробуйте Win7 версию (если вы пользователь Windows)
|
|
||||||
4. Попробуйте отключить антивирус (если помогло, то добавьте exe в исключения). Не забудьте включить антивирус обратно.
|
|
||||||
|
|
||||||
###
|
|
||||||
|
|
||||||
**Q**: Не грузит медиа? (фото/видео/стикеры)
|
|
||||||
**A**: Удалите в настройках прокси в поле **DC → IP** всё, кроме `4:149.154.167.220`. Если это не помогло, полностью очистите это поле.
|
|
||||||
|
|
||||||
|
|
||||||
#### Если проблема решена, то закройте Issue
|
|
||||||
|
|
||||||
### Если проблема осталась, пожалуйста, приложите по возможности логи.
|
|
||||||
Сделать это можно через иконку в трее -> Пкм -> Открыть логи. Сохраните логи в файл и приложите его сюда.
|
|
||||||
|
|||||||
+13
-1
@@ -45,5 +45,17 @@ USER app
|
|||||||
|
|
||||||
EXPOSE 1443/tcp
|
EXPOSE 1443/tcp
|
||||||
|
|
||||||
ENTRYPOINT ["/usr/bin/tini", "--", "/bin/sh", "-lc", "set -eu; args=\"--host ${TG_WS_PROXY_HOST} --port ${TG_WS_PROXY_PORT}\"; for dc in ${TG_WS_PROXY_DC_IPS}; do args=\"$args --dc-ip $dc\"; done; if [ -n \"${TG_WS_PROXY_SECRET}\" ]; then args=\"$args --secret ${TG_WS_PROXY_SECRET}\"; fi; if [ -n \"${TG_WS_PROXY_CF_WORKER}\" ]; then args=\"$args --cfproxy-worker-domain ${TG_WS_PROXY_CF_WORKER}\"; fi; if [ \"${TG_WS_PROXY_NO_SECURE}\" = \"True\" ]; then args=\"$args --no-secure \"; fi; exec /opt/venv/bin/python -u proxy/tg_ws_proxy.py $args \"$@\"", "--"]
|
ENTRYPOINT ["/usr/bin/tini", "--", "/bin/sh", "-lc", "set -eu; args=\"\
|
||||||
|
--host ${TG_WS_PROXY_HOST} \
|
||||||
|
--port ${TG_WS_PROXY_PORT}\"; \
|
||||||
|
for dc in ${TG_WS_PROXY_DC_IPS}; \
|
||||||
|
do args=\"$args --dc-ip $dc\"; \
|
||||||
|
done; \
|
||||||
|
if [ -n \"${TG_WS_PROXY_SECRET}\" ]; \
|
||||||
|
then args=\"$args --secret ${TG_WS_PROXY_SECRET}\"; fi; \
|
||||||
|
if [ -n \"${TG_WS_PROXY_CF_WORKER}\" ]; \
|
||||||
|
then args=\"$args --cfproxy-worker-domain ${TG_WS_PROXY_CF_WORKER}\"; fi; \
|
||||||
|
if [ \"${TG_WS_PROXY_NO_SECURE}\" = \"True\" ]; \
|
||||||
|
then args=\"$args --no-secure \"; fi; \
|
||||||
|
exec /opt/venv/bin/python -u proxy/tg_ws_proxy.py $args \"$@\"", "--"]
|
||||||
CMD []
|
CMD []
|
||||||
+2
-1
@@ -12,6 +12,7 @@ import logging
|
|||||||
|
|
||||||
from typing import Dict, FrozenSet, NamedTuple, Optional, Tuple
|
from typing import Dict, FrozenSet, NamedTuple, Optional, Tuple
|
||||||
from .stats import stats
|
from .stats import stats
|
||||||
|
from .utils import set_x25519
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from cryptography.hazmat.primitives.asymmetric.x25519 import X25519PrivateKey
|
from cryptography.hazmat.primitives.asymmetric.x25519 import X25519PrivateKey
|
||||||
@@ -272,7 +273,7 @@ async def probe_appdata_len(domain: str, port: int = 443,
|
|||||||
writer = None
|
writer = None
|
||||||
try:
|
try:
|
||||||
ctx = ssl.create_default_context()
|
ctx = ssl.create_default_context()
|
||||||
ctx.set_ecdh_curve('X25519')
|
set_x25519(ctx)
|
||||||
ctx.check_hostname = False
|
ctx.check_hostname = False
|
||||||
ctx.verify_mode = ssl.CERT_NONE
|
ctx.verify_mode = ssl.CERT_NONE
|
||||||
ctx.minimum_version = ssl.TLSVersion.TLSv1_3
|
ctx.minimum_version = ssl.TLSVersion.TLSv1_3
|
||||||
|
|||||||
@@ -695,7 +695,6 @@ def main():
|
|||||||
log_max_mb=args.log_max_mb,
|
log_max_mb=args.log_max_mb,
|
||||||
backups=args.log_backups,
|
backups=args.log_backups,
|
||||||
)
|
)
|
||||||
fh.setFormatter(log_fmt)
|
|
||||||
fh.addFilter(DomainCensorFilter())
|
fh.addFilter(DomainCensorFilter())
|
||||||
root.addHandler(fh)
|
root.addHandler(fh)
|
||||||
|
|
||||||
|
|||||||
+8
-1
@@ -143,13 +143,20 @@ class _PinnedHTTPSHandler(urllib.request.HTTPSHandler):
|
|||||||
return super().https_open(req)
|
return super().https_open(req)
|
||||||
|
|
||||||
|
|
||||||
|
def set_x25519(context: ssl.SSLContext) -> None:
|
||||||
|
try:
|
||||||
|
context.set_ecdh_curve('X25519')
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
def create_ssl_context(*, check_hostname: bool = True) -> ssl.SSLContext:
|
def create_ssl_context(*, check_hostname: bool = True) -> ssl.SSLContext:
|
||||||
bundle_dir = getattr(sys, '_MEIPASS', None)
|
bundle_dir = getattr(sys, '_MEIPASS', None)
|
||||||
cafile = (os.path.join(bundle_dir, 'certifi', 'cacert.pem')
|
cafile = (os.path.join(bundle_dir, 'certifi', 'cacert.pem')
|
||||||
if bundle_dir else certifi.where())
|
if bundle_dir else certifi.where())
|
||||||
context = ssl.create_default_context(cafile=cafile)
|
context = ssl.create_default_context(cafile=cafile)
|
||||||
context.load_default_certs()
|
context.load_default_certs()
|
||||||
context.set_ecdh_curve('X25519')
|
set_x25519(context)
|
||||||
context.check_hostname = check_hostname
|
context.check_hostname = check_hostname
|
||||||
return context
|
return context
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
"""Shared construction of the rotating log file handler.
|
"""Shared construction and formatting of the rotating log file handler.
|
||||||
|
|
||||||
Centralizes the rotation invariant so both the tray and the CLI log paths
|
Centralizes the rotation invariant so both the tray and the CLI log paths
|
||||||
behave identically and the file can never grow without bound (issue #885).
|
behave identically and the file can never grow without bound (issue #885).
|
||||||
@@ -31,9 +31,14 @@ def build_log_handler(
|
|||||||
"""
|
"""
|
||||||
max_bytes = max(_MIN_BYTES, int(log_max_mb * 1024 * 1024))
|
max_bytes = max(_MIN_BYTES, int(log_max_mb * 1024 * 1024))
|
||||||
backup_count = max(_MIN_BACKUPS, int(backups))
|
backup_count = max(_MIN_BACKUPS, int(backups))
|
||||||
return logging.handlers.RotatingFileHandler(
|
handler = logging.handlers.RotatingFileHandler(
|
||||||
path,
|
path,
|
||||||
maxBytes=max_bytes,
|
maxBytes=max_bytes,
|
||||||
backupCount=backup_count,
|
backupCount=backup_count,
|
||||||
encoding="utf-8",
|
encoding="utf-8",
|
||||||
)
|
)
|
||||||
|
handler.setFormatter(logging.Formatter(
|
||||||
|
"%(asctime)s %(levelname)-5s %(name)s %(message)s",
|
||||||
|
datefmt="%Y-%m-%d %H:%M:%S",
|
||||||
|
))
|
||||||
|
return handler
|
||||||
|
|||||||
@@ -225,7 +225,6 @@ def save_config(cfg: dict) -> None:
|
|||||||
|
|
||||||
# logging
|
# logging
|
||||||
|
|
||||||
_LOG_FMT_FILE = "%(asctime)s %(levelname)-5s %(name)s %(message)s"
|
|
||||||
_LOG_FMT_CONSOLE = "%(asctime)s %(levelname)-5s %(message)s"
|
_LOG_FMT_CONSOLE = "%(asctime)s %(levelname)-5s %(message)s"
|
||||||
|
|
||||||
|
|
||||||
@@ -238,7 +237,6 @@ def setup_logging(verbose: bool = False, log_max_mb: float = 5) -> None:
|
|||||||
|
|
||||||
fh = build_log_handler(str(LOG_FILE), log_max_mb=log_max_mb, backups=1)
|
fh = build_log_handler(str(LOG_FILE), log_max_mb=log_max_mb, backups=1)
|
||||||
fh.setLevel(logging.DEBUG)
|
fh.setLevel(logging.DEBUG)
|
||||||
fh.setFormatter(logging.Formatter(_LOG_FMT_FILE, datefmt="%Y-%m-%d %H:%M:%S"))
|
|
||||||
fh.addFilter(DomainCensorFilter())
|
fh.addFilter(DomainCensorFilter())
|
||||||
root.addHandler(fh)
|
root.addHandler(fh)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user