This commit is contained in:
Your Name
2026-04-22 14:13:21 +08:00
parent e0406b5d0e
commit 7cbde2aa78
145 changed files with 23086 additions and 2243 deletions

View File

@@ -9,14 +9,41 @@
'''
import re # 正则表达式模块用于从HTML中提取网站标题
import os
import requests # HTTP请求库用于发送网络请求
from loguru import logger # 日志记录模块,用于记录程序运行日志
from requests.adapters import HTTPAdapter
from typing import List, Optional # 类型提示
def check_aizhan(domain: str, sensitive_words: Optional[List[str]] = None, proxies: dict = None):
_SESSION = requests.Session()
_SESSION.mount("http://", HTTPAdapter(pool_connections=256, pool_maxsize=512, max_retries=0))
_SESSION.mount("https://", HTTPAdapter(pool_connections=256, pool_maxsize=512, max_retries=0))
AIZHAN_TIMEOUT_PROXY = max(
0.8,
float(os.getenv("DOMAINCHECK_AIZHAN_TIMEOUT_PROXY", "1.6") or 1.6),
)
AIZHAN_TIMEOUT_DIRECT = max(
1.0,
float(os.getenv("DOMAINCHECK_AIZHAN_TIMEOUT_DIRECT", "2.2") or 2.2),
)
def _resolve_aizhan_timeout(proxies: dict = None, budget_seconds: Optional[float] = None) -> float:
timeout = float(AIZHAN_TIMEOUT_PROXY if proxies else AIZHAN_TIMEOUT_DIRECT)
if budget_seconds not in (None, "", 0, "0"):
timeout = min(timeout, max(0.6, float(budget_seconds or 0.0)))
return max(0.6, timeout)
def check_aizhan(
domain: str,
sensitive_words: Optional[List[str]] = None,
proxies: dict = None,
budget_seconds: Optional[float] = None,
):
'''
查询域名的网站标题信息是否存在敏感词
@@ -43,86 +70,43 @@ def check_aizhan(domain: str, sensitive_words: Optional[List[str]] = None, proxi
'host': 'www.aizhan.com', # 目标主机地址
}
# 添加重试机制
max_retries = 3
for retry in range(max_retries):
try:
# 发送GET请求获取页面内容
# url: 请求URL
# headers: HTTP请求头
# timeout=10: 设置超时时间10秒
# proxies: 代理配置(如需使用代理)
response = requests.get(url, headers=headers, timeout=10, proxies=proxies)
try:
# 发送GET请求获取页面内容
# url: 请求URL
# headers: HTTP请求头
# timeout=10: 设置超时时间10秒
# proxies: 代理配置(如需使用代理)
response = _SESSION.get(
url,
headers=headers,
timeout=_resolve_aizhan_timeout(proxies, budget_seconds=budget_seconds),
proxies=proxies,
)
# 判断请求是否成功HTTP 200表示成功
if response.status_code == 200:
# 使用正则表达式提取网站标题
# 正则解释:匹配 id="webpage_title"> 开头,</div> 结尾,中间的内容
# 匹配模式id="webpage_title">标题内容</div>
# ([^<]+) 表示匹配一个或多个非<字符,作为捕获组
match = re.search(r'id="webpage_title">([^<]+)</div>', response.text)
# 判断请求是否成功HTTP 200表示成功
if response.status_code == 200:
# 使用正则表达式提取网站标题
# 正则解释:匹配 id="webpage_title"> 开头,</div> 结尾,中间的内容
# 匹配模式id="webpage_title">标题内容</div>
# ([^<]+) 表示匹配一个或多个非<字符,作为捕获组
match = re.search(r'id="webpage_title">([^<]+)</div>', response.text)
# 如果找到匹配则返回标题文本,否则返回空字符串
title = match.group(1) if match else ''
if title:
for sensitive_word in sensitive_words:
# 使用正则表达式检查是否包含敏感词
if re.search(sensitive_word, title, re.IGNORECASE):
logger.warning(f'检测到敏感词: {sensitive_word} 在结果: {title}')
return False, f'检测到敏感词: {sensitive_word} 在结果: {title}'
return True, title
# 如果找到匹配则返回标题文本,否则返回空字符串
title = match.group(1) if match else ''
if title:
for sensitive_word in sensitive_words:
# 使用正则表达式检查是否包含敏感词
if re.search(sensitive_word, title, re.IGNORECASE):
logger.warning(f'检测到敏感词: {sensitive_word} 在结果: {title}')
return False, f'检测到敏感词: {sensitive_word} 在结果: {title}'
return True, title
# 请求失败,继续重试
logger.warning(f"爱站网检测第{retry+1}次失败: {domain}, 状态码: {response.status_code}")
if retry < max_retries - 1:
import time
time.sleep(2) # 等待2秒后重试
else:
# 达到最大重试次数,尝试不使用代理
if proxies:
logger.info('爱站网检测失败,尝试不使用代理')
try:
response = requests.get(url, headers=headers, timeout=10, proxies=None)
if response.status_code == 200:
match = re.search(r'id="webpage_title">([^<]+)</div>', response.text)
title = match.group(1) if match else ''
if title:
for sensitive_word in sensitive_words:
if re.search(sensitive_word, title, re.IGNORECASE):
logger.warning(f'检测到敏感词: {sensitive_word} 在结果: {title}')
return False, f'检测到敏感词: {sensitive_word} 在结果: {title}'
return True, title
return True, ''
except Exception as e2:
logger.error(f"不使用代理的爱站网检测也失败: {domain}, 错误: {e2}")
return False, str(e2)
return True, ''
logger.debug(f"爱站网检测失败: {domain}, 状态码: {response.status_code}")
return True, ''
except Exception as e: # 捕获所有异常(网络错误、超时等)
logger.warning(f"爱站网检测{retry+1}失败: {domain}, 错误: {e}")
if retry < max_retries - 1:
import time
time.sleep(2) # 等待2秒后重试
else:
# 达到最大重试次数,尝试不使用代理
if proxies:
logger.info('爱站网检测失败,尝试不使用代理')
try:
response = requests.get(url, headers=headers, timeout=10, proxies=None)
if response.status_code == 200:
match = re.search(r'id="webpage_title">([^<]+)</div>', response.text)
title = match.group(1) if match else ''
if title:
for sensitive_word in sensitive_words:
if re.search(sensitive_word, title, re.IGNORECASE):
logger.warning(f'检测到敏感词: {sensitive_word} 在结果: {title}')
return False, f'检测到敏感词: {sensitive_word} 在结果: {title}'
return True, title
return True, ''
except Exception as e2:
logger.error(f"不使用代理的爱站网检测也失败: {domain}, 错误: {e2}")
return False, str(e2)
return False, str(e)
except Exception as e: # 捕获所有异常(网络错误、超时等)
logger.debug(f"爱站网检测失败: {domain}, 错误: {e}")
return False, str(e)
# # ========================= 【测试代码】 =========================
# if __name__ == '__main__':
@@ -152,4 +136,4 @@ def check_aizhan(domain: str, sensitive_words: Optional[List[str]] = None, proxi
# logger.info(f"查询域名: {test_domain_4}")
#
# result_4 = check_aizhan(test_domain_4)
# logger.info(f"网站标题: {result_4 if result_4 else '(无结果)'}")
# logger.info(f"网站标题: {result_4 if result_4 else '(无结果)'}")