🐛 純網域建構修正

This commit is contained in:
踢低吸
2026-01-30 21:09:11 +08:00
parent cbd48f01f5
commit 84c5e616e7

View File

@@ -6,6 +6,9 @@ import asyncio
import time
from urllib.parse import urlparse
# Domain 驗證相關
DOMAIN_PATTERN = re.compile(r"^(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z]{2,}$", re.IGNORECASE)
filterlist = {
"abp": [
"experimental.txt",
@@ -42,6 +45,25 @@ class HEAD:
)
def is_valid_domain(hostname: str) -> bool:
"""檢查是否為合法的完整 domain"""
if not hostname or len(hostname) > 253:
return False
if hostname.startswith(".") or hostname.endswith("."):
return False
if ".." in hostname:
return False
if not DOMAIN_PATTERN.match(hostname):
return False
parts = hostname.split(".")
if len(parts) < 2:
return False
tld = parts[-1]
if len(tld) < 2 or not tld.isalpha():
return False
return True
def strip_bang_comments(text: str) -> str:
lines = text.splitlines(keepends=True)
return "".join(line for line in lines if not line.lstrip().startswith("!"))
@@ -150,11 +172,15 @@ def parse_url(url: str) -> dict:
# 檢查是否為 IP
is_ip = bool(re.match(r'^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$', domain))
# 檢查是否為合法 domain
is_valid = is_valid_domain(domain) if not is_ip else True
return {
'domain': domain,
'path': path,
'has_path': bool(path),
'is_ip': is_ip,
'is_valid': is_valid,
'full': domain + path
}
@@ -171,8 +197,11 @@ async def to_pure_domain(filename: str, data: str):
# 只保留沒有 path 的 domain與 hosts 格式一致
domains = []
for line in data:
line = line.strip()
if not line:
continue
parsed = parse_url(line)
if not parsed['has_path'] and not parsed['is_ip']:
if not parsed['has_path'] and not parsed['is_ip'] and parsed['is_valid']:
domains.append(parsed['domain'])
newoutput = "\n".join(sorted(set(domains)))
else: