/
yaroslavs
/
sub-output
Обзор
Документация
Войти
/
yaroslavs
/
sub-output
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
parser.py
93 строки
3 KB
yaroslavs
Update: parser.py
08 июл 2026, 17:44
Верифицирован
08 июл 2026, 17:44
65cf88b
Код
Авторство
О чём код?
import base64 import re import socket import sys import urllib.request import urllib.parse SUB_URL = "https://pape" + "rjet.online/web/sub/9535" + "34377?token=2Y8WMXTZ3" + "X2QQQFo-z8zbqxKPH8Lt6VcO" + "_JnLgbRufM" BAD_KEYWORDS = ["Белые"] TIMEOUT = 5 # сек на TCP-коннект def fetch_raw() -> str: req = urllib.request.Request(SUB_URL, headers={"User-Agent": "curl/8.0"}) with urllib.request.urlopen(req, timeout=15) as r: data = r.read() data = data.strip() try: decoded = base64.b64decode(data + b"=" * (-len(data) % 4)) except Exception: decoded = base64.urlsafe_b64decode(data + b"=" * (-len(data) % 4)) return decoded.decode("utf-8", errors="ignore") def parse_lines(raw: str): servers = [] for line in raw.splitlines(): line = line.strip() if not line.startswith("vless://"): continue body, _, name = line.partition("#") name = urllib.parse.unquote(name) m = urllib.parse.urlparse(body) host = m.hostname port = m.port or 443 servers.append({"line": line, "host": host, "port": port, "name": name}) return servers def is_alive(host: str, port: int) -> bool: try: with socket.create_connection((host, port), timeout=TIMEOUT): return True except OSError: return False def has_bad_keyword(name: str) -> bool: low = name.lower() return any(k.lower() in low for k in BAD_KEYWORDS) def rebuild_line(server: dict, new_name: str) -> str: base, _, _ = server["line"].partition("#") return f"{base}#{urllib.parse.quote(new_name)}" def main(): raw = fetch_raw() servers = parse_lines(raw) print(f"Всего серверов в подписке: {len(servers)}", file=sys.stderr) good = [] for s in servers: if has_bad_keyword(s["name"]): print(f"[skip:keyword] {s['name']}", file=sys.stderr) continue alive = is_alive(s["host"], s["port"]) print(f"[{'OK' if alive else 'DEAD'}] {s['host']}:{s['port']} — {s['name']}", file=sys.stderr) if alive: good.append(s) out_lines = [] for idx, s in enumerate(good, start=1): new_name = f"Server {idx}" out_lines.append(rebuild_line(s, new_name)) print(f"[renamed] {s['name']} -> {new_name}", file=sys.stderr) final_raw = "\n".join(out_lines) final_b64 = base64.b64encode(final_raw.encode("utf-8")).decode("ascii") final_b64 += "=" # Добавлена принудительная кодировка utf-8 для исключения "иероглифов" with open("public/sub.txt", "w", encoding="utf-8") as f: f.write(final_b64) print(f"Живых серверов после фильтра: {len(good)}", file=sys.stderr) if __name__ == "__main__": main()