oldgetaddrinfo = socket.getaddrinfo def ipv4only_getaddrinfo(*args, **kwargs): res = oldgetaddrinfo(*args, **kwargs) v4 = [r for r in res if r[0] == socket.AF_INET] return v4 if v4 else res socket.getaddrinfo = ipv4only_getaddrinfo
class C: G = ‘\033[92m’; Y = ‘\033[93m’; R = ‘\033[91m’ B = ‘\033[94m’; GR = ‘\033[90m’; BOLD = ‘\033[1m’; RES = ‘\033[0m’
def print_box(title, lines): w = 70 print(f"{C.BOLD}{C.B}{‘═’*w}{C.RES}“) print(f”{C.BOLD} {title}{C.RES}“) print(f”{C.BOLD}{C.B}{‘═’*w}{C.RES}“) for l in lines: print(f” {l}“) print(f”{C.B}{‘═’*w}{C.RES}\n")
# === БЛОКИРОВКИ РН ===
if 'TCP_RESET' in raw_output or 'Connection reset' in raw_output:
status_line = "🔴 Заблокировано РН: сброс соединения (RST)"
status_color = C.R
elif 'TLS_BLOCK' in raw_output or 'handshake failed' in raw_output or 'SNI filtered' in raw_lower:
status_line = "🟡 Заблокировано РН: фильтрация по SNI (TLS)"
status_color = C.Y
elif 'DNS poisoning' in raw_output or 'DNS_BLOCK' in raw_output:
status_line = "🔴 Заблокировано РН: отравление DNS"
status_color = C.R
elif 'TIMEOUT' in raw_output and any(x in raw_lower for x in ['telegram','discord','twitter','youtube','instagram','whatsapp']):
status_line = "🔴 Заблокировано РН: пакеты отбрасываются (DROP)"
status_color = C.R
# === САЙТ НЕ РАБОТАЕТ / ТЕХНИЧЕСКИЕ ОШИБКИ ===
elif 'NXDOMAIN' in raw_output or 'non-existent domain' in raw_lower:
status_line = "⚫ Домен не существует"
status_color = C.GR
elif 'Connection refused' in raw_output:
status_line = "⚫ Сайт не отвечает на порту 443"
status_color = C.GR
elif 'No route to host' in raw_output or 'Network unreachable' in raw_lower:
status_line = " Нет маршрута до хоста (проблема сети)"
status_color = C.GR
elif 'HTTP 5' in raw_output or '502' in raw_output or '503' in raw_output:
status_line = "⚫ Ошибка на стороне сервера (5xx)"
status_color = C.GR
elif 'DOWN' in raw_output and 'TCP failed' in raw_output:
status_line = "⚫ Сайт недоступен"
status_color = C.GR
# === ДОСТУПЕН ===
elif '[✓]' in raw_output or 'HTTP: 200' in raw_output or 'HTTP: 301' in raw_output:
status_line = "🟢 Сайт доступен"
status_color = C.G
# === НЕ ОПРЕДЕЛЕНО ===
else:
status_line = "⚪ Статус не определён"
status_color = C.GR
# === Сбор технических деталей ===
details = []
ip_match = re.search(r'IP:\s*([\d\.]+)', raw_output)
if ip_match: details.append(f"Ваш IP: {ip_match.group(1)}")
isp_match = re.search(r'ISP:\s*(.+?)(?=\n)', raw_output)
if isp_match: details.append(f"Провайдер: {isp_match.group(1).strip()}")
dns_match = re.search(r'DNS:\s*(.+?)(?:\n|$)', raw_output)
if dns_match: details.append(f"DNS: {dns_match.group(1).strip()}")
tcp_match = re.search(r'TCP:\s*(.+?)(?:\n|$)', raw_output)
if tcp_match: details.append(f"TCP: {tcp_match.group(1).strip()}")
http_match = re.search(r'HTTP:\s*(.+?)(?:\n|$)', raw_output)
if http_match: details.append(f"HTTP: {http_match.group(1).strip()}")
# === Формируем вывод ===
lines = [f"{status_color}{status_line}{C.RES}", ""]
if details:
lines.append(f"{C.GR}Детали:{C.RES}")
for d in details:
lines.append(f" • {d}")
lines.append("")
if '🔴' in status_line or '🟡' in status_line:
lines.append(f"{C.GR}Ресурс:{C.RES} {target}")
print_box(f"RKN Block Checker — {target}", lines)
return 0 if '🟢' in status_line else 1
Разраб ты красава, держи обертку, позже вэб версию, возможно сделаем.
#!/usr/bin/env python3
-- coding: utf-8 --
“”" RKN Block Checker PRO — Unified IPv4-only checker with interactive UI & smart analysis. Drop-in replacement for original rkn-check. “”" import re import sys import socket import io
==========================================================
1. ПАТЧ: Принудительный IPv4 (до импорта библиотеки)
==========================================================
oldgetaddrinfo = socket.getaddrinfo def ipv4only_getaddrinfo(*args, **kwargs): res = oldgetaddrinfo(*args, **kwargs) v4 = [r for r in res if r[0] == socket.AF_INET] return v4 if v4 else res socket.getaddrinfo = ipv4only_getaddrinfo
==========================================================
2. ИМПОРТ ОРИГИНАЛЬНОГО CLI
==========================================================
from rkn_checker.cli import main as origmain
==========================================================
3. УТИЛИТЫ: Цвета и Форматирование
==========================================================
class C: G = ‘\033[92m’; Y = ‘\033[93m’; R = ‘\033[91m’ B = ‘\033[94m’; GR = ‘\033[90m’; BOLD = ‘\033[1m’; RES = ‘\033[0m’
def print_box(title, lines): w = 70 print(f"{C.BOLD}{C.B}{‘═’*w}{C.RES}“) print(f”{C.BOLD} {title}{C.RES}“) print(f”{C.BOLD}{C.B}{‘═’*w}{C.RES}“) for l in lines: print(f” {l}“) print(f”{C.B}{‘═’*w}{C.RES}\n")
==========================================================
4. АНАЛИЗАТОР ВЫВОДА
==========================================================
def analyze(raw_output, target): status_line = “” status_color = C.GR raw_lower = raw_output.lower()
==========================================================
5. MAIN: Логика запуска
==========================================================
def main(): args = sys.argv[1:]
if name == ‘main’: main()