更新
This commit is contained in:
+59
-37
@@ -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')) {
|
||||
|
||||
Reference in New Issue
Block a user