This commit is contained in:
Alex Yang
2026-03-30 01:04:46 +08:00
parent 050aa421b1
commit f627244b8f
5978 changed files with 1502187 additions and 2947 deletions
+59 -37
View File
@@ -22,6 +22,10 @@ window.dashboardHistoryData = window.dashboardHistoryData || {
let lastProcessedTime = 0;
const PROCESS_THROTTLE_INTERVAL = 1000; // 1秒节流间隔
// 跟踪器信息缓存
const trackerInfoCache = {};
const TRACKER_CACHE_EXPIRY = 24 * 60 * 60 * 1000; // 24小时缓存过期时间
// 引入颜色配置文件
const COLOR_CONFIG = window.COLOR_CONFIG || {};
@@ -944,7 +948,7 @@ async function updateTopBlockedTable(domains) {
<div class="tracker-tooltip absolute z-50 bg-white shadow-lg rounded-md border p-3 min-w-64 text-sm">
<div class="font-semibold mb-2">已知跟踪器</div>
<div class="mb-1"><strong>名称:</strong> ${trackerInfo.name || '未知'}</div>
<div class="mb-1"><strong>类别:</strong> ${trackerInfo.categoryId && trackersDatabase && trackersDatabase.categories ? trackersDatabase.categories[trackerInfo.categoryId] : '未知'}</div>
<div class="mb-1"><strong>类别:</strong> ${trackerInfo.category || '未知'}</div>
${trackerInfo.url ? `<div class="mb-1"><strong>URL:</strong> <a href="${trackerInfo.url}" target="_blank" class="text-blue-500 hover:underline">${trackerInfo.url}</a></div>` : ''}
${trackerInfo.source ? `<div class="mb-1"><strong>源:</strong> ${trackerInfo.source}</div>` : ''}
</div>
@@ -1082,7 +1086,7 @@ async function loadTrackersDatabase() {
trackersLoading = true;
try {
const response = await fetch('domain-info/tracker/trackers.json');
const response = await fetch('/api/domain-info?trackers');
if (!response.ok) {
console.error('加载跟踪器数据库失败:', response.statusText);
trackersDatabase = { trackers: {} };
@@ -1103,37 +1107,61 @@ async function loadTrackersDatabase() {
// 检查域名是否在跟踪器数据库中
async function isDomainInTrackerDatabase(domain) {
if (!trackersDatabase || !trackersLoaded) {
await loadTrackersDatabase();
// 检查缓存
const now = Date.now();
if (trackerInfoCache[domain] && (now - trackerInfoCache[domain].timestamp) < TRACKER_CACHE_EXPIRY) {
return trackerInfoCache[domain].data;
}
if (!trackersDatabase || !trackersDatabase.trackers) {
return null;
}
// 检查域名是否直接作为跟踪器键存在
if (trackersDatabase.trackers.hasOwnProperty(domain)) {
return trackersDatabase.trackers[domain];
}
// 检查域名是否在跟踪器URL中
for (const trackerKey in trackersDatabase.trackers) {
if (trackersDatabase.trackers.hasOwnProperty(trackerKey)) {
const tracker = trackersDatabase.trackers[trackerKey];
if (tracker && tracker.url) {
try {
const trackerUrl = new URL(tracker.url);
if (trackerUrl.hostname === domain) {
return tracker;
}
} catch (e) {
// 忽略无效URL
}
try {
// 使用新的API端点获取跟踪器信息
const response = await fetch(`/api/domain-info?trackers=${encodeURIComponent(domain)}`);
if (!response.ok) {
console.error('获取跟踪器信息失败:', response.statusText);
// 将失败结果也存入缓存,避免频繁请求失败的域名
trackerInfoCache[domain] = {
data: null,
timestamp: now
};
return null;
}
const data = await response.json();
let result = null;
if (Array.isArray(data) && data.length > 0) {
// 如果有多个跟踪器,返回一个包含所有跟踪器的对象
if (data.length === 1) {
result = data[0];
} else {
// 构建一个包含所有跟踪器信息的对象
result = {
name: data.map(t => t.name).join(' | '),
category: data.map(t => t.category).filter((v, i, a) => a.indexOf(v) === i).join(' | '),
url: data.map(t => t.url).join(' | '),
company: data.map(t => t.company).filter((v, i, a) => a.indexOf(v) === i).join(' | '),
multiple: true
};
}
}
// 将结果存入缓存
trackerInfoCache[domain] = {
data: result,
timestamp: now
};
return result;
} catch (error) {
console.error('获取跟踪器信息失败:', error);
// 将失败结果也存入缓存,避免频繁请求失败的域名
trackerInfoCache[domain] = {
data: null,
timestamp: now
};
return null;
}
return null;
}
// 获取IP地理位置信息
@@ -1360,7 +1388,7 @@ async function updateTopDomainsTable(domains) {
<div class="tracker-tooltip absolute z-50 bg-white shadow-lg rounded-md border p-3 min-w-64 text-sm">
<div class="font-semibold mb-2">已知跟踪器</div>
<div class="mb-1"><strong>名称:</strong> ${trackerInfo.name || '未知'}</div>
<div class="mb-1"><strong>类别:</strong> ${trackerInfo.categoryId && trackersDatabase && trackersDatabase.categories ? trackersDatabase.categories[trackerInfo.categoryId] : '未知'}</div>
<div class="mb-1"><strong>类别:</strong> ${trackerInfo.category || '未知'}</div>
${trackerInfo.url ? `<div class="mb-1"><strong>URL:</strong> <a href="${trackerInfo.url}" target="_blank" class="text-blue-500 hover:underline">${trackerInfo.url}</a></div>` : ''}
${trackerInfo.source ? `<div class="mb-1"><strong>源:</strong> ${trackerInfo.source}</div>` : ''}
</div>
@@ -3180,10 +3208,7 @@ async function loadDashboardData() {
// 更新图表
updateCharts(stats, queryTypeStats);
// 初始化或更新查询类型统计饼图
if (queryTypeStats) {
drawQueryTypeChart(queryTypeStats);
}
// 更新查询类型统计信息
if (document.getElementById('top-query-type')) {
@@ -3307,10 +3332,7 @@ function processDashboardData(cachedData) {
// 更新图表
updateCharts(stats, queryTypeStats);
// 初始化或更新查询类型统计饼图
if (queryTypeStats) {
drawQueryTypeChart(queryTypeStats);
}
// 更新查询类型统计信息
if (document.getElementById('top-query-type')) {