Проверка доступности доменов с адаптивной валидацией: DNS (A/SOA) → HTTP → TCP → Ping.
┌─────────────────────────────────────────────────────────────┐
│ Входные данные │
│ list.txt (дубликаты удаляются) │
└─────────────────────────────┬───────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────┐
│ asyncio.Semaphore(30) │
│ Ограничение параллельных задач │
└─────────────────────────────┬───────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────┐
│ Проверка доступности (Logic) │
│ │
│ ┌────────────┐ ┌──────────┐ ┌─────────┐ ┌────────┐ │
│ │ DNS │───▶│ HTTP │─▶│ TCP │─▶│ Ping │ │
│ │ A-record │ YES│ HTTPS │ │ :443 │ │ ICMP │ │
│ │ │ │ │ :80 │ │ :80 │ │ │ │
│ │ ▼ │ └─────┬────┘ └────┬────┘ └───┬────┘ │
│ │ SOA-record?│ │ │ │ │
│ │ (Service) │ │ │ │ │
│ └─────┬──────┘ │ │ │ │
│ ▼ ▼ ▼ ▼ │
│ NO DNS SUCCESS? SUCCESS? SUCCESS? │
│ │ │ │ │ │
│ ▼ ▼ ▼ ▼ │
│ ALIVE? ALIVE ALIVE ALIVE │
└─────────────────────────────────────────────────────────────┘
▼
ИТОГ: ALIVE = DNS OR HTTP OR TCP OR PING
▼
┌─────────────────────────────────────────────────────────────┐
│ asyncio.as_completed() │
│ Результаты по мере готовности (без барьеров) │
└─────────────────────────────────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────┐
│ Интерактивное удаление мертвых доменов │
│ (Y/N по каждому домену) │
└─────────────────────────────────────────────────────────────┘
Домен считается ЖИВЫМ, если прошла успешно хотя бы одна проверка.
| Шаг | Проверка | Детали | Результат |
|---|---|---|---|
| 1 | DNS | Запрос A-записи (IPv4). Если нет — запрос SOA (для сервисных доменов без IP, например oaiusercontent.com). |
Если есть A или SOA ➔ Жив |
| 2 | HTTP | Запрос HEAD/GET с поддержкой SNI и User-Agent. (Таймаут 10с) | Если код ответа получен ➔ Жив |
| 3 | TCP | Попытка соединения с портами 443 и 80. (Таймаут 5с) | Если порт открыт ➔ Жив |
| 4 | Ping | ICMP эхо-запрос. Работает даже если DNS не вернул IP (системный резолв). (Таймаут 5с) | Если есть ответ ➔ Жив |
Особенности:
- SOA Fallback — защита от удаления корневых сервисных доменов (CDN, Service Roots).
- DNS Retry — 2 попытки с паузой (защита от сбоев резолвера).
- SNI поддержка — корректная работа с CDN (Cloudflare, Instagram).
- Smart Timeout — увеличенные таймауты (10с DNS/HTTP) для медленных сетей.
- Дедупликация — автоматическое удаление дубликатов при загрузке.
| Файл | Роль | Детали |
|---|---|---|
test.py |
Проверка доступности | Работает только с list.txt. Проверяет живой домен или нет (DNS, Ping, HTTP). Удаляет мертвые. |
filter_domains.py |
Фильтрация уровней | Читает list.txt и создает list_2nd_level.txt. Преобразует поддомены в домены 2-го уровня (например, api.google.com -> google.com). Убирает дубликаты. Не проверяет доступность. |
list.txt |
Исходный список | Полный список всех доменов и поддоменов. |
list_2nd_level.txt |
Результат фильтрации | Содержит только домены 2-го уровня. Идеально для DNS-маршрутизации Keenetic (прошивка 5.0+). |
- Python: 3.10+ (рекомендуется 3.11+)
- ОС: Windows / Linux / macOS
# Виртуальное окружение
python -m venv .venv
# Активация
# Windows:
.venv\Scripts\activate
# Linux/macOS:
source .venv/bin/activate
# Зависимости
pip install -r requirements.txtСкрипт берет домены из list.txt, проверяет их доступность и предлагает удалить нерабочие.
python test.pyСкрипт берет list.txt, преобразует все поддомены в домены 2-го уровня (обрезает лишнее) и сохраняет результат в list_2nd_level.txt, удаляя дубликаты.
python filter_domains.pyВажно: Этот скрипт не проверяет, работают ли сайты. Он просто чистит структуру доменов для использования в правилах маршрутизации (например, Keenetic).
| Пакет | Назначение |
|---|---|
aiodns |
Асинхронные DNS-запросы через публичные серверы (1.1.1.1, 8.8.8.8, 9.9.9.9) |
aiohttp |
Асинхронные HTTP-запросы с поддержкой SNI |
tldextract |
Разбор доменных имен (используется в filter_domains.py) |