commit d6640719bd082209441fd6f19d10262768eab68c Author: LL Date: Tue Nov 18 14:25:00 2025 +0800 初始化版本 diff --git a/404.html b/404.html new file mode 100644 index 0000000..99409b5 --- /dev/null +++ b/404.html @@ -0,0 +1,334 @@ + + + + + + 404 - 页面未找到 + + + + + + + +
+ + + + + +
+ + +
+
404
+

页面未找到

+

您访问的页面可能已经移动、删除或从未存在。请返回首页继续浏览我们的基金监控系统。

+ + 返回首页 + +
+ + + + + \ No newline at end of file diff --git a/admin.css b/admin.css new file mode 100644 index 0000000..7fd3482 --- /dev/null +++ b/admin.css @@ -0,0 +1,632 @@ +:root { + --primary: #6366f1; + --primary-dark: #4f46e5; + --success: #10b981; + --danger: #ef4444; + --warning: #f59e0b; + --info: #3b82f6; + --dark: #1f2937; + --light: #f8fafc; + --gray: #6b7280; + --border: #e5e7eb; +} + +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: 'Segoe UI', system-ui, -apple-system, sans-serif; + background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + min-height: 100vh; + color: #334155; + line-height: 1.5; +} + +.container { + max-width: 1400px; + margin: 0 auto; + padding: 15px; +} + +/* 头部样式 */ +.header { + text-align: center; + margin-bottom: 25px; + color: white; +} + +.header-content { + background: rgba(255, 255, 255, 0.1); + backdrop-filter: blur(10px); + padding: 20px; + border-radius: 16px; + border: 1px solid rgba(255, 255, 255, 0.2); +} + +.header h1 { + font-size: 2.2rem; + font-weight: 700; + margin-bottom: 8px; + background: linear-gradient(45deg, #fff, #e0f2fe); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; +} + +.header p { + font-size: 1rem; + opacity: 0.9; + margin-bottom: 15px; +} + +/* 控制按钮 */ +.controls { + display: flex; + justify-content: center; + gap: 12px; + margin-bottom: 20px; + flex-wrap: wrap; +} + +.btn { + padding: 10px 18px; + border: none; + border-radius: 10px; + font-size: 0.9rem; + font-weight: 600; + cursor: pointer; + transition: all 0.3s ease; + display: flex; + align-items: center; + gap: 6px; +} + +.btn-primary { + background: linear-gradient(135deg, var(--primary), var(--primary-dark)); + color: white; +} + +.btn-primary:hover { + transform: translateY(-2px); +} + +.btn-success { + background: linear-gradient(135deg, var(--success), #059669); + color: white; +} + +.btn-danger { + background: linear-gradient(135deg, var(--danger), #dc2626); + color: white; +} + +.btn-outline { + background: rgba(134, 63, 235); + color: white; + border: 2px solid rgba(134, 63, 235, 0.3); +} + +.btn-outline:hover { + background: rgba(255, 255, 255, 0.2); + transform: translateY(-2px); +} + +/* 内容区域 */ +.content { + background: white; + border-radius: 16px; + padding: 25px; + box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1); + margin-bottom: 25px; +} + +/* 表单样式 */ +.form-group { + margin-bottom: 20px; +} + +/* 搜索框样式 */ +.search-box { + position: relative; + max-width: 300px; + width: 100%; + margin-bottom: 20px; +} + +.search-box input { + width: 100%; + padding: 10px 40px 10px 16px; + border: 2px solid var(--border); + border-radius: 10px; + font-size: 0.9rem; + transition: all 0.3s ease; +} + +.search-box input:focus { + outline: none; + border-color: var(--primary); + box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.1); +} + +.search-box::after { + content: '🔍'; + position: absolute; + right: 12px; + top: 50%; + transform: translateY(-50%); + color: var(--gray); + pointer-events: none; +} + +.form-label { + display: block; + margin-bottom: 8px; + font-weight: 600; + color: var(--dark); +} + +.form-control { + width: 100%; + padding: 12px 16px; + border: 2px solid var(--border); + border-radius: 10px; + font-size: 1rem; + transition: all 0.3s ease; + background: white; +} + +.form-control:focus { + outline: none; + border-color: var(--primary); + box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.1); +} + +.form-select { + appearance: none; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3e%3c/svg%3e"); + background-position: right 12px center; + background-repeat: no-repeat; + background-size: 16px; + padding-right: 40px; +} + +/* 表格样式 */ +.table-container { + overflow-x: auto; + border-radius: 12px; + border: 1px solid var(--border); + background: white; + box-shadow: 0 2px 8px rgba(0,0,0,0.05); +} + +.funds-table, +.data-table { + width: 100%; + border-collapse: collapse; + background: white; +} + +.funds-table th, +.funds-table td, +.data-table th, +.data-table td { + padding: 12px 16px; + text-align: left; + border-bottom: 1px solid var(--border); + transition: all 0.3s ease; +} + +.funds-table th, +.data-table th { + background: linear-gradient(90deg, #f8fafc, #f1f5f9); + font-weight: 600; + color: var(--dark); + font-size: 0.9rem; + text-transform: uppercase; + letter-spacing: 0.5px; + position: sticky; + top: 0; + z-index: 10; +} + +.funds-table tr:hover, +.data-table tr:hover { + background: #f8fafc; + transform: translateY(-1px); + box-shadow: 0 4px 6px rgba(0,0,0,0.05); +} + +.funds-table tr:last-child td, +.data-table tr:last-child td { + border-bottom: none; +} + +/* 推荐基金表格特殊样式 */ +.fund-row { + transition: all 0.3s ease; +} + +.fund-code-cell { + font-weight: 700; + color: var(--primary); +} + +.fund-ip-cell { + font-family: 'Courier New', monospace; +} + +.fund-time-cell { + font-size: 0.85rem; + color: var(--gray); +} + +.fund-amount-cell { + font-weight: 600; +} + +.fund-status-cell { + font-weight: 600; +} + +.fund-actions-cell { + text-align: right; +} + +/* 状态标签样式优化 */ +.status-badge { + padding: 6px 12px; + border-radius: 20px; + font-size: 0.8rem; + font-weight: 700; + color: white; + display: inline-block; + transition: all 0.3s ease; +} + +.status-pending { + background: linear-gradient(135deg, var(--warning), #d97706); +} + +.status-approved { + background: linear-gradient(135deg, var(--success), #059669); +} + +.status-rejected { + background: linear-gradient(135deg, var(--danger), #dc2626); +} + +/* 渠道标签 */ +.channel-badge { + padding: 6px 12px; + border-radius: 20px; + font-size: 0.8rem; + font-weight: 700; + color: white; +} + +.channel-cmb { + background: linear-gradient(135deg, #e74c3c, #c0392b); +} + +.channel-tt { + background: linear-gradient(135deg, #3498db, #2980b9); +} + +.channel-zfb { + background: linear-gradient(135deg, #27ae60, #229954); +} + +/* 操作按钮 */ +.action-buttons { + display: flex; + gap: 8px; + justify-content: flex-end; +} + +.btn-sm { + padding: 6px 12px; + font-size: 0.8rem; + border-radius: 6px; + transition: all 0.3s ease; +} + +.btn-sm:hover { + transform: translateY(-1px); + box-shadow: 0 4px 6px rgba(0,0,0,0.1); +} + +.btn-sm:active { + transform: translateY(0); +} + +/* 消息提示 */ +.alert { + padding: 12px 16px; + border-radius: 8px; + margin-bottom: 20px; + display: none; +} + +.alert-success { + background: #dcfce7; + border: 1px solid #bbf7d0; + color: #166534; +} + +.alert-error { + background: #fee2e2; + border: 1px solid #fecaca; + color: #dc2626; +} + +/* 模态框 */ +.modal { + display: none; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: rgba(0, 0, 0, 0.5); + backdrop-filter: blur(5px); + z-index: 1000; + align-items: center; + justify-content: center; +} + +.modal-content { + background: white; + border-radius: 16px; + padding: 30px; + width: 90%; + max-width: 500px; + box-shadow: 0 20px 60px rgba(0, 0, 0, 0.2); +} + +.modal-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 20px; +} + +.modal-title { + font-size: 1.3rem; + font-weight: 700; + color: var(--dark); +} + +.close-modal { + background: none; + border: none; + font-size: 1.5rem; + cursor: pointer; + color: var(--gray); + padding: 5px; +} + +.close-modal:hover { + color: var(--dark); +} + +/* 页脚 */ +.footer { + text-align: center; + color: white; + margin-top: 30px; + padding-top: 20px; + border-top: 1px solid rgba(255, 255, 255, 0.3); +} + +/* 标签页样式 */ +.tabs { + display: flex; + margin-bottom: 20px; + border-bottom: 1px solid var(--border); + background: #f8fafc; + border-radius: 10px 10px 0 0; + overflow: hidden; +} + +.tab { + padding: 12px 24px; + background: none; + border: none; + border-bottom: 3px solid transparent; + font-size: 1rem; + font-weight: 600; + color: var(--gray); + cursor: pointer; + transition: all 0.3s ease; + position: relative; + z-index: 1; +} + +.tab.active { + color: var(--primary); + border-bottom-color: var(--primary); + background: white; + box-shadow: 0 -2px 5px rgba(0,0,0,0.05); +} + +.tab:hover { + color: var(--primary-dark); + background: rgba(255,255,255,0.5); +} + +.tab-content { + display: none; + padding: 20px; + background: white; + border-radius: 0 0 10px 10px; + animation: fadeIn 0.5s ease; +} + +.tab-content.active { + display: block; +} + +@keyframes fadeIn { + from { + opacity: 0; + transform: translateY(10px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +/* 操作日志样式 */ +.operation-log { + max-height: 500px; + overflow-y: auto; + border: 1px solid var(--border); + border-radius: 8px; + padding: 15px; +} + +.operation-item { + padding: 12px; + border-bottom: 1px solid var(--border); + display: flex; + justify-content: space-between; + align-items: center; +} + +.operation-item:last-child { + border-bottom: none; +} + +.operation-details { + flex: 1; +} + +.operation-type { + padding: 4px 8px; + border-radius: 4px; + font-size: 0.8rem; + font-weight: 600; + margin-right: 10px; +} + +.type-add { + background: #dcfce7; + color: #166534; +} + +.type-update { + background: #fef3c7; + color: #92400e; +} + +.type-delete { + background: #fee2e2; + color: #dc2626; +} + +.operation-time { + color: var(--gray); + font-size: 0.85rem; +} + +/* 图表容器样式 */ +.chart-container { + background: white; + border-radius: 12px; + padding: 20px; + margin-bottom: 20px; + box-shadow: 0 2px 8px rgba(0,0,0,0.1); +} + +.chart-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 15px; +} + +.chart-title { + font-size: 1.2rem; + font-weight: 700; + color: var(--dark); +} + +.fund-selector { + padding: 8px 12px; + border: 1px solid var(--border); + border-radius: 6px; + font-size: 0.9rem; +} + +.chart-wrapper { + position: relative; + height: 300px; +} + +/* 响应式设计 */ +@media (max-width: 768px) { + .container { + padding: 10px; + } + + .header h1 { + font-size: 1.8rem; + } + + .content { + padding: 15px; + } + + .funds-table { + font-size: 0.85rem; + } + + .funds-table th, + .funds-table td { + padding: 8px 12px; + } + + .action-buttons { + flex-direction: column; + } + + .btn { + width: 100%; + justify-content: center; + } + + .tabs { + flex-direction: column; + } + + .tab { + border-bottom: none; + border-left: 3px solid transparent; + } + + .tab.active { + border-left-color: var(--primary); + } + + .operation-item { + flex-direction: column; + align-items: flex-start; + gap: 8px; + } +} + +@media (max-width: 480px) { + .modal-content { + padding: 20px; + margin: 10px; + } +} + +/* 加载动画 */ +@keyframes spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} \ No newline at end of file diff --git a/admin.js b/admin.js new file mode 100644 index 0000000..fa0b223 --- /dev/null +++ b/admin.js @@ -0,0 +1,849 @@ +// 全局变量 +let fundsData = []; +let fundChart = null; + +// 页面加载完成后初始化 +document.addEventListener('DOMContentLoaded', function() { + loadFundsData(); + loadOperationLog(); + populateFundSelector(); + + // 表单提交事件 + document.getElementById('fundForm').addEventListener('submit', function(e) { + e.preventDefault(); + saveFund(); + }); +}); + +// 加载推荐基金数据 +async function loadRecommendedFunds() { + try { + showLoading(); + + const response = await fetch('admin_api.php?action=get_recommended_funds'); + const result = await response.json(); + + if (result.success) { + renderRecommendedFundsTable(result.data); + } else { + throw new Error(result.message || '加载数据失败'); + } + } catch (error) { + console.error('加载推荐基金数据失败:', error); + showMessage('数据加载失败: ' + error.message, 'error'); + } finally { + hideLoading(); + } +} + +// 渲染推荐基金表格 +function renderRecommendedFundsTable(data) { + const tbody = document.getElementById('recommendedFundsList'); + + if (!data || data.length === 0) { + tbody.innerHTML = ` + + + + 暂无推荐基金数据 + + + `; + return; + } + + let html = ''; + data.forEach((fund, index) => { + // 处理状态显示,支持多种可能的状态值 + const getStatusText = (status) => { + const normalizedStatus = (status || '').toLowerCase().trim(); + if (normalizedStatus.includes('approve') || normalizedStatus === '已批准') { + return '已批准'; + } else if (normalizedStatus.includes('pend') || normalizedStatus === '待审核') { + return '待审核'; + } else if (normalizedStatus.includes('reject') || normalizedStatus === '已拒绝') { + return '已拒绝'; + } + return '未知'; + }; + + const getStatusClass = (status) => { + const normalizedStatus = (status || '').toLowerCase().trim(); + if (normalizedStatus.includes('approve') || normalizedStatus === '已批准') { + return 'status-approved'; + } else if (normalizedStatus.includes('pend') || normalizedStatus === '待审核') { + return 'status-pending'; + } else if (normalizedStatus.includes('reject') || normalizedStatus === '已拒绝') { + return 'status-rejected'; + } + return 'status-unknown'; + }; + + const statusText = getStatusText(fund.status); + const statusClass = getStatusClass(fund.status); + + // 根据状态决定操作按钮 + let actionButtons = ''; + if (fund.status === 'pending') { + actionButtons = ` + + + `; + } else { + // 已批准或已拒绝状态只显示删除按钮 + actionButtons = ` + + `; + } + + html += ` + + ${fund.fund_code} + ${fund.ip} + ${fund.timestamp} + ${fund.channel} + ${parseFloat(fund.amount).toFixed(2)} + + + ${statusText} + + + +
+ ${actionButtons} +
+ + + `; + }); + + tbody.innerHTML = html; +} + +// 搜索推荐基金 +function searchRecommendedFunds(keyword) { + const rows = document.querySelectorAll('#recommendedFundsList tr'); + keyword = keyword.toLowerCase(); + + rows.forEach(row => { + const fundCode = row.querySelector('td:first-child').textContent.toLowerCase(); + if (fundCode.includes(keyword)) { + row.style.display = ''; + } else { + row.style.display = 'none'; + } + }); +} + +// 批准推荐基金 +async function approveRecommendedFund(fundCode) { + if (!confirm(`确定要批准基金 ${fundCode} 吗?`)) { + return; + } + + try { + showLoading(); + + const response = await fetch('admin_api.php?action=approve_recommended_fund&fund_code=' + fundCode); + const result = await response.json(); + + if (result.success) { + showMessage('基金批准成功', 'success'); + loadRecommendedFunds(); + } else { + throw new Error(result.message || '操作失败'); + } + } catch (error) { + console.error('批准推荐基金失败:', error); + showMessage('操作失败: ' + error.message, 'error'); + } finally { + hideLoading(); + } +} + +// 删除推荐基金 +async function deleteRecommendedFund(fundCode) { + if (!confirm(`确定要删除推荐基金 ${fundCode} 吗?此操作不可恢复。`)) { + return; + } + + try { + showLoading(); + + const response = await fetch('admin_api.php?action=delete_recommended_fund&fund_code=' + fundCode); + const result = await response.json(); + + if (result.success) { + showMessage('基金删除成功', 'success'); + loadRecommendedFunds(); + } else { + throw new Error(result.message || '操作失败'); + } + } catch (error) { + console.error('删除推荐基金失败:', error); + showMessage('操作失败: ' + error.message, 'error'); + } finally { + hideLoading(); + } +} + +// 切换标签页 +function switchTab(tabName) { + // 隐藏所有标签内容 + document.querySelectorAll('.tab-content').forEach(tab => { + tab.classList.remove('active'); + }); + + // 移除所有标签的激活状态 + document.querySelectorAll('.tab').forEach(tab => { + tab.classList.remove('active'); + }); + + // 显示选中的标签内容 + document.getElementById(tabName).classList.add('active'); + + // 激活选中的标签 + event.target.classList.add('active'); + + // 如果是图表标签,加载默认图表 + if (tabName === 'fundCharts') { + const fundSelector = document.getElementById('fundSelector'); + if (fundSelector.value) { + loadFundChart(fundSelector.value); + } + } else if (tabName === 'recommendedFunds') { + // 加载推荐基金数据 + loadRecommendedFunds(); + + // 添加搜索事件监听 + const searchInput = document.getElementById('searchRecommendedFund'); + searchInput.oninput = function() { + searchRecommendedFunds(this.value); + }; + } +} + +// 加载基金数据 +async function loadFundsData() { + try { + showLoading(); + + const response = await fetch('admin_api.php?action=get_funds'); + const result = await response.json(); + + if (result.success) { + fundsData = result.data; + renderFundsTable(); + populateFundSelector(); + } else { + throw new Error(result.message || '加载数据失败'); + } + } catch (error) { + console.error('加载基金数据失败:', error); + showMessage('数据加载失败: ' + error.message, 'error'); + } +} + +// 渲染基金表格 +function renderFundsTable() { + const tbody = document.getElementById('fundsTableBody'); + + if (fundsData.length === 0) { + tbody.innerHTML = ` + + + + 暂无基金数据,点击"添加基金"开始配置 + + + `; + return; + } + + let html = ''; + fundsData.forEach((fund, index) => { + const channelName = getChannelName(fund.channel); + const channelClass = getChannelClass(fund.channel); + + html += ` + + ${fund.fund_code} + ${fund.name || '加载中...'} + + + ${getChannelIcon(fund.channel)} ${channelName} + + + ${parseFloat(fund.investment).toFixed(2)} + +
+ + +
+ + + `; + }); + + tbody.innerHTML = html; + + // 加载基金名称 + loadFundNames(); +} + +// 加载基金名称 +async function loadFundNames() { + const nameCells = document.querySelectorAll('#fundsTableBody td:nth-child(2)'); + + // 先尝试从localStorage获取缓存的基金名称 + const fundNameCache = JSON.parse(localStorage.getItem('fundNameCache') || '{}'); + + // 收集所有需要获取名称的基金代码 + const fundsWithoutNames = fundsData.filter(fund => !fund.name && !fundNameCache[fund.fund_code]); + + // 先应用缓存的名称 + fundsData.forEach((fund, index) => { + if (fundNameCache[fund.fund_code]) { + nameCells[index].textContent = fundNameCache[fund.fund_code]; + fundsData[index].name = fundNameCache[fund.fund_code]; + } + }); + + // 如果有需要获取名称的基金,通过服务器端代理获取 + if (fundsWithoutNames.length > 0) { + try { + const fundCodes = fundsWithoutNames.map(fund => fund.fund_code).join(','); + const response = await fetch(`admin_api.php?action=get_fund_names&fund_codes=${fundCodes}`); + const result = await response.json(); + + if (result.success && result.data) { + // 更新页面显示和缓存 + fundsData.forEach((fund, index) => { + if (result.data[fund.fund_code]) { + const fundName = result.data[fund.fund_code]; + nameCells[index].textContent = fundName; + fundsData[index].name = fundName; + fundNameCache[fund.fund_code] = fundName; + } + }); + + // 保存缓存 + localStorage.setItem('fundNameCache', JSON.stringify(fundNameCache)); + } + } catch (error) { + console.error('获取基金名称失败:', error); + // 即使失败也给每个基金一个默认名称 + fundsData.forEach((fund, index) => { + if (!fund.name && !fundNameCache[fund.fund_code]) { + nameCells[index].textContent = `基金${fund.fund_code}`; + } + }); + } + } +} + +// 填充基金选择器 +function populateFundSelector() { + const selector = document.getElementById('fundSelector'); + selector.innerHTML = ''; + + fundsData.forEach(fund => { + const option = document.createElement('option'); + option.value = fund.fund_code; + option.textContent = `${fund.fund_code} - ${fund.name || '加载中...'}`; + selector.appendChild(option); + }); +} + +// 加载操作日志 +async function loadOperationLog() { + try { + const response = await fetch('admin_api.php?action=get_operation_log&limit=50'); + const result = await response.json(); + + if (result.success) { + renderOperationLog(result.data); + } else { + throw new Error(result.message || '加载操作日志失败'); + } + } catch (error) { + console.error('加载操作日志失败:', error); + document.getElementById('operationLogContent').innerHTML = ` +
+ 加载操作日志失败: ${error.message} +
+ `; + } +} + +// 渲染操作日志 +function renderOperationLog(operations) { + const container = document.getElementById('operationLogContent'); + + if (operations.length === 0) { + container.innerHTML = ` +
+ 暂无操作记录 +
+ `; + return; + } + + let html = ''; + operations.forEach(operation => { + const typeClass = `type-${operation.type}`; + const typeText = { + 'add': '添加', + 'update': '更新', + 'delete': '删除' + }[operation.type] || operation.type; + + const channelName = getChannelName(operation.channel); + + html += ` +
+
+ ${typeText} + ${operation.fund_code} + ${operation.channel ? ` - ${channelName}` : ''} + ${operation.investment ? ` - ${operation.investment}元` : ''} + ${operation.details ? ` - ${operation.details}` : ''} +
+
${formatTime(operation.date)}
+
+ `; + }); + + container.innerHTML = html; +} + +// 加载基金图表 +async function loadFundChart(fundCode) { + if (!fundCode) { + document.getElementById('chartTitle').textContent = '请选择基金查看净值变化'; + if (fundChart) { + fundChart.destroy(); + } + return; + } + + try { + const response = await fetch(`api.php?action=get_fund_chart&fund_code=${fundCode}`); + const result = await response.json(); + + if (result.success) { + renderFundChart(fundCode, result.data); + } else { + throw new Error(result.message || '加载图表数据失败'); + } + } catch (error) { + console.error('加载基金图表失败:', error); + document.getElementById('chartTitle').textContent = `加载图表失败: ${error.message}`; + } +} + +// 渲染基金图表 +function renderFundChart(fundCode, chartData) { + const ctx = document.getElementById('fundChart').getContext('2d'); + const fundName = fundsData.find(f => f.fund_code === fundCode)?.name || fundCode; + + document.getElementById('chartTitle').textContent = `${fundName} - 近5日净值变化`; + + // 销毁现有图表 + if (fundChart) { + fundChart.destroy(); + } + + // 创建新图表 + fundChart = new Chart(ctx, { + type: 'line', + data: { + labels: chartData.labels, + datasets: [ + { + label: '估算净值', + data: chartData.netValues, + borderColor: '#6366f1', + backgroundColor: 'rgba(99, 102, 241, 0.2)', + borderWidth: 3, + fill: true, + tension: 1, // 最大张力,使曲线更平滑 + pointRadius: 5, + pointHoverRadius: 8, + pointBackgroundColor: '#ffffff', + pointBorderColor: '#6366f1', + pointBorderWidth: 2, + pointHoverBackgroundColor: '#6366f1', + pointHoverBorderColor: '#ffffff', + pointHoverBorderWidth: 2 + }, + { + label: '涨跌幅 (%)', + data: chartData.changes, + borderColor: '#10b981', + backgroundColor: 'rgba(16, 185, 129, 0.2)', + borderWidth: 3, + fill: false, + tension: 1, // 最大张力,使曲线更平滑 + pointRadius: 5, + pointHoverRadius: 8, + pointBackgroundColor: '#ffffff', + pointBorderColor: '#10b981', + pointBorderWidth: 2, + pointHoverBackgroundColor: '#10b981', + pointHoverBorderColor: '#ffffff', + pointHoverBorderWidth: 2, + yAxisID: 'y1' + } + ] + }, + options: { + responsive: true, + maintainAspectRatio: false, + interaction: { + mode: 'index', + intersect: false, + axis: 'x' + }, + animation: { + duration: 1500, + easing: 'easeInOutQuart' + }, + scales: { + x: { + grid: { + display: false + }, + ticks: { + font: { + size: 12 + } + } + }, + y: { + type: 'linear', + display: true, + position: 'left', + title: { + display: true, + text: '估算净值', + font: { + size: 14, + weight: 'bold' + } + }, + grid: { + color: 'rgba(0, 0, 0, 0.05)' + }, + ticks: { + font: { + size: 11 + }, + callback: function(value) { + return value.toFixed(4); + } + } + }, + y1: { + type: 'linear', + display: true, + position: 'right', + title: { + display: true, + text: '涨跌幅 (%)', + font: { + size: 14, + weight: 'bold' + } + }, + grid: { + drawOnChartArea: false, + }, + ticks: { + font: { + size: 11 + }, + callback: function(value) { + return value > 0 ? '+' + value.toFixed(2) + '%' : value.toFixed(2) + '%'; + } + } + } + }, + plugins: { + legend: { + position: 'top', + labels: { + usePointStyle: true, + padding: 20, + font: { + size: 13 + } + } + }, + tooltip: { + backgroundColor: 'rgba(0, 0, 0, 0.8)', + padding: 12, + titleFont: { + size: 14, + weight: 'bold' + }, + bodyFont: { + size: 13 + }, + borderColor: '#6366f1', + borderWidth: 1, + displayColors: true, + callbacks: { + title: function(tooltipItems) { + return tooltipItems[0].label; + }, + label: function(context) { + let label = context.dataset.label || ''; + if (label) { + label += ': '; + } + if (context.datasetIndex === 0) { + label += context.parsed.y.toFixed(4); + } else { + const value = context.parsed.y; + label += (value > 0 ? '+' : '') + value.toFixed(2) + '%'; + } + return label; + }, + afterBody: function(context) { + // 添加额外信息或空行以美化显示 + return ''; + } + } + } + } + } + }); +} + +// 显示添加模态框 +function showAddModal() { + document.getElementById('modalTitle').textContent = '添加基金'; + document.getElementById('fundForm').reset(); + document.getElementById('editIndex').value = ''; + document.getElementById('fundModal').style.display = 'flex'; +} + +// 编辑基金 +function editFund(index) { + const fund = fundsData[index]; + + document.getElementById('modalTitle').textContent = '编辑基金'; + document.getElementById('fundCode').value = fund.fund_code; + document.getElementById('channel').value = fund.channel; + document.getElementById('investment').value = fund.investment; + document.getElementById('editIndex').value = index; + + document.getElementById('fundModal').style.display = 'flex'; +} + +// 关闭模态框 +function closeModal() { + document.getElementById('fundModal').style.display = 'none'; +} + +// 保存基金 +async function saveFund() { + const editIndex = document.getElementById('editIndex').value; + const fundCode = document.getElementById('fundCode').value.trim(); + const channel = document.getElementById('channel').value; + const investment = parseFloat(document.getElementById('investment').value); + + // 验证表单数据 + if (!fundCode) { + showMessage('请输入基金代码', 'error'); + return; + } + + if (!/^\d{6}$/.test(fundCode)) { + showMessage('基金代码必须是6位数字', 'error'); + return; + } + + if (!channel) { + showMessage('请选择渠道', 'error'); + return; + } + + if (!investment || investment <= 0) { + showMessage('投资金额必须大于0', 'error'); + return; + } + + // 检查重复(添加时检查,编辑时不检查自身) + if (editIndex === '' || fundsData[editIndex].fund_code !== fundCode) { + const exists = fundsData.some((fund, index) => + fund.fund_code === fundCode && fund.channel === channel && + (editIndex === '' || index !== parseInt(editIndex)) + ); + + if (exists) { + showMessage('该渠道下已存在相同的基金代码', 'error'); + return; + } + } + + try { + const action = editIndex === '' ? 'add_fund' : 'update_fund'; + const payload = { + fund_code: fundCode, + channel: channel, + investment: investment + }; + + if (editIndex !== '') { + payload.index = parseInt(editIndex); + } + + console.log('发送请求:', action, payload); + + const response = await fetch('admin_api.php?action=' + action, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(payload) + }); + + const result = await response.json(); + console.log('响应结果:', result); + + if (result.success) { + showMessage(result.message, 'success'); + closeModal(); + loadFundsData(); + loadOperationLog(); // 刷新操作日志 + } else { + throw new Error(result.message || '保存失败'); + } + } catch (error) { + console.error('保存基金失败:', error); + showMessage('保存失败: ' + error.message, 'error'); + } +} + +// 删除基金 +async function deleteFund(index) { + if (!confirm('确定要删除这只基金吗?')) { + return; + } + + try { + const response = await fetch('admin_api.php?action=delete_fund', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ index: index }) + }); + + const result = await response.json(); + + if (result.success) { + showMessage(result.message, 'success'); + loadFundsData(); + loadOperationLog(); // 刷新操作日志 + } else { + throw new Error(result.message || '删除失败'); + } + } catch (error) { + console.error('删除基金失败:', error); + showMessage('删除失败: ' + error.message, 'error'); + } +} + +// 工具函数 +function getChannelName(channel) { + const channels = { + '0': '招商银行', + '1': '天天基金', + '2': '支付宝' + }; + return channels[channel] || '未知渠道'; +} + +function getChannelClass(channel) { + const classMap = { + '0': 'channel-cmb', + '1': 'channel-tt', + '2': 'channel-zfb' + }; + return classMap[channel] || 'channel-cmb'; +} + +function getChannelIcon(channel) { + const iconMap = { + '0': '🏦', + '1': '📱', + '2': '💙' + }; + return iconMap[channel] || '🏦'; +} + +// 显示消息 +function showMessage(message, type) { + const messageEl = document.getElementById('message'); + messageEl.textContent = message; + messageEl.className = `alert alert-${type === 'success' ? 'success' : 'error'}`; + messageEl.style.display = 'block'; + + // 自动隐藏成功消息,错误消息保持显示直到用户操作 + if (type === 'success') { + setTimeout(() => { + messageEl.style.display = 'none'; + }, 3000); + } +} + +// 显示加载状态 +function showLoading() { + const tbody = document.getElementById('fundsTableBody'); + tbody.innerHTML = ` + + +
+ 加载中... + + + `; +} + +// 格式化时间 +function formatTime(dateString) { + const date = new Date(dateString); + const now = new Date(); + const diff = now - date; + + if (diff < 60000) { + return '刚刚'; + } else if (diff < 3600000) { + return Math.floor(diff / 60000) + '分钟前'; + } else if (diff < 86400000) { + return Math.floor(diff / 3600000) + '小时前'; + } else { + return date.toLocaleDateString() + ' ' + date.toLocaleTimeString([], {hour: '2-digit', minute:'2-digit'}); + } +} + +// 点击模态框外部关闭 +window.onclick = function(event) { + const modal = document.getElementById('fundModal'); + if (event.target === modal) { + closeModal(); + } +} \ No newline at end of file diff --git a/admin.php b/admin.php new file mode 100644 index 0000000..1c4e1d7 --- /dev/null +++ b/admin.php @@ -0,0 +1,243 @@ + $session_timeout) { + // 会话超时,销毁会话并重定向到登录页面 + session_unset(); + session_destroy(); + header('Location: login.php'); + exit; +} + +// 更新最后活动时间 +$_SESSION['last_activity'] = time(); + +// 注销功能 +if (isset($_GET['action']) && $_GET['action'] === 'logout') { + // 记录注销日志 + $log_entry = [ + 'timestamp' => date('Y-m-d H:i:s'), + 'action' => '管理员注销', + 'ip' => $_SERVER['REMOTE_ADDR'] + ]; + + // 保存注销日志 + $log_file = 'data/operation_log.json'; + if (file_exists($log_file)) { + $logs = json_decode(file_get_contents($log_file), true); + if (!is_array($logs)) { + $logs = []; + } + array_unshift($logs, $log_entry); + // 限制日志数量 + if (count($logs) > 500) { + $logs = array_slice($logs, 0, 500); + } + file_put_contents($log_file, json_encode($logs, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT)); + } + + // 销毁会话 + session_unset(); + session_destroy(); + header('Location: login.php'); + exit; +} +?> + + + + + + 🚀 基金监控 - 管理后台 + + + + + +
+
+
+

基金监控管理后台

+

管理基金代码和虚拟投资金额

+
+ + +
+
+
+ + +
+ +
+ +
+ + + + +
+ + +
+
+

推荐基金管理

+ +
+
+ + + + + + + + + + + + + + + +
基金代码推荐IP推荐时间渠道金额状态操作
+
+ +
+ + +
+
+

基金配置管理

+ +
+ + +
+ + + + + + + + + + + + + +
基金代码基金名称所属渠道投资金额(元)操作
+
+
+ + +
+
+

操作日志

+ +
+ +
+ +
+
+ + +
+
+

基金净值变化

+
+ +
+
+ +
+
+
请选择基金查看净值变化
+
+
+ +
+
+
+
+ + +
+ + + + + + + \ No newline at end of file diff --git a/admin_api.php b/admin_api.php new file mode 100644 index 0000000..36876cc --- /dev/null +++ b/admin_api.php @@ -0,0 +1,917 @@ +configFile)) { + $this->initConfig(); + } + + // 初始化操作日志文件(如果不存在) + if (!file_exists($this->operationFile)) { + $this->initOperationLog(); + } + + // 初始化基金名称文件(如果不存在) + if (!file_exists($this->fundNamesFile)) { + $this->initFundNames(); + } + + // 初始化推荐基金文件(如果不存在) + if (!file_exists($this->recommendedFundsFile)) { + $this->initRecommendedFunds(); + } + } + + /** + * 初始化配置文件 + */ + private function initConfig() { + $defaultConfig = [ + [ + "channel" => "0", + "fund_code" => "003766", + "investment" => 1000, + "name" => "汇添富医疗服务混合" + ], + [ + "channel" => "0", + "fund_code" => "004206", + "investment" => 1000, + "name" => "基金004206" + ], + [ + "channel" => "0", + "fund_code" => "019432", + "investment" => 1000, + "name" => "基金019432" + ], + [ + "channel" => "1", + "fund_code" => "003766", + "investment" => 1000, + "name" => "汇添富医疗服务混合" + ], + [ + "channel" => "1", + "fund_code" => "008327", + "investment" => 1000, + "name" => "基金008327" + ], + [ + "channel" => "2", + "fund_code" => "017811", + "investment" => 1000, + "name" => "基金017811" + ] + ]; + + file_put_contents($this->configFile, json_encode($defaultConfig, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE)); + } + + /** + * 初始化操作日志 + */ + private function initOperationLog() { + $initialLog = [ + 'operations' => [] + ]; + + file_put_contents($this->operationFile, json_encode($initialLog, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE)); + } + + /** + * 初始化推荐基金文件 + */ + private function initRecommendedFunds() { + $initialData = []; + file_put_contents($this->recommendedFundsFile, json_encode($initialData, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE)); + } + + /** + * 初始化基金名称文件 + */ + private function initFundNames() { + // 从配置中提取已有的基金名称作为初始数据 + $defaultFundNames = []; + $config = $this->loadConfig(); + + foreach ($config as $fund) { + if (isset($fund['fund_code']) && isset($fund['name']) && $fund['name'] !== "基金{$fund['fund_code']}") { + $defaultFundNames[$fund['fund_code']] = $fund['name']; + } + } + + // 添加一些常用基金名称 + $commonFunds = [ + '003766' => '汇添富医疗服务混合', + '110022' => '易方达消费行业股票', + '001714' => '工银文体产业股票', + '000241' => '中欧时代先锋股票', + '001475' => '易方达国防军工混合', + '161725' => '招商中证白酒指数', + '000689' => '前海开源新经济混合', + '001102' => '前海开源国家比较优势混合', + '001593' => '天弘创业板ETF联接', + '000971' => '高升沪深300指数增强' + ]; + + // 合并默认基金名称 + $fundNames = array_merge($defaultFundNames, $commonFunds); + + file_put_contents($this->fundNamesFile, json_encode($fundNames, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE)); + } + + /** + * 加载基金名称映射 + */ + private function loadFundNames() { + if (!file_exists($this->fundNamesFile)) { + $this->initFundNames(); + } + + $data = file_get_contents($this->fundNamesFile); + if (!$data) { + return []; + } + + $fundNames = json_decode($data, true); + + return is_array($fundNames) ? $fundNames : []; + } + + /** + * 保存基金名称映射 + */ + private function saveFundNames($fundNames) { + $result = file_put_contents($this->fundNamesFile, json_encode($fundNames, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE)); + + if ($result === false) { + error_log('无法写入基金名称文件,请检查目录权限'); + return false; + } + + return true; + } + + /** + * 记录操作日志 + */ + private function logOperation($type, $fundCode, $channel = null, $investment = null, $details = '') { + $log = $this->loadOperationLog(); + + $operation = [ + 'id' => uniqid(), + 'type' => $type, // 'add', 'update', 'delete' + 'fund_code' => $fundCode, + 'channel' => $channel, + 'investment' => $investment, + 'details' => $details, + 'timestamp' => time(), + 'date' => date('Y-m-d H:i:s') + ]; + + $log['operations'][] = $operation; + + // 只保留最近100条操作记录 + if (count($log['operations']) > 100) { + $log['operations'] = array_slice($log['operations'], -100); + } + + file_put_contents($this->operationFile, json_encode($log, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE)); + + return $operation; + } + + /** + * 加载操作日志 + */ + private function loadOperationLog() { + if (!file_exists($this->operationFile)) { + $this->initOperationLog(); + } + + $data = file_get_contents($this->operationFile); + if (!$data) { + return ['operations' => []]; + } + + $log = json_decode($data, true); + + return is_array($log) ? $log : ['operations' => []]; + } + + /** + * 获取基金名称(优先从文件读取,不存在时从API获取并保存) + */ + public function getFundName($fundCode) { + try { + // 优先从文件中查找 + $fundNames = $this->loadFundNames(); + if (isset($fundNames[$fundCode])) { + return [ + 'success' => true, + 'name' => $fundNames[$fundCode] + ]; + } else { + // 文件中没有,尝试从API获取 + $fundName = $this->fetchFundNameFromAPI($fundCode); + if ($fundName) { + // 将新获取的基金名称保存到文件中 + $fundNames[$fundCode] = $fundName; + $this->saveFundNames($fundNames); + + return [ + 'success' => true, + 'name' => $fundName + ]; + } else { + // 如果API也获取失败,尝试从本地数据查找 + $config = $this->loadConfig(); + $fund = array_filter($config, function($item) use ($fundCode) { + return $item['fund_code'] == $fundCode; + }); + + $fund = reset($fund); + if ($fund && isset($fund['name'])) { + // 保存到文件中供以后使用 + $fundNames[$fundCode] = $fund['name']; + $this->saveFundNames($fundNames); + + return [ + 'success' => true, + 'name' => $fund['name'] + ]; + } else { + // 如果都没有,返回默认名称 + return [ + 'success' => true, + 'name' => "基金$fundCode" + ]; + } + } + } + } catch (Exception $e) { + return [ + 'success' => false, + 'message' => '获取基金名称失败: ' . $e->getMessage() + ]; + } + } + + /** + * 获取操作日志 + */ + public function getOperationLog($limit = 20) { + try { + $log = $this->loadOperationLog(); + $operations = $log['operations']; + + // 按时间倒序排列 + usort($operations, function($a, $b) { + return $b['timestamp'] - $a['timestamp']; + }); + + // 限制返回数量 + $operations = array_slice($operations, 0, $limit); + + return [ + 'success' => true, + 'data' => $operations + ]; + } catch (Exception $e) { + return [ + 'success' => false, + 'message' => '获取操作日志失败: ' . $e->getMessage() + ]; + } + } + + /** + * 加载基金配置 + */ + private function loadConfig() { + if (!file_exists($this->configFile)) { + $this->initConfig(); + } + + $data = file_get_contents($this->configFile); + if (!$data) { + return []; + } + + $config = json_decode($data, true); + + return is_array($config) ? $config : []; + } + + /** + * 保存基金配置 + */ + private function saveConfig($config) { + $result = file_put_contents($this->configFile, json_encode($config, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE)); + + if ($result === false) { + throw new Exception('无法写入配置文件,请检查目录权限'); + } + + return true; + } + + /** + * 获取所有基金配置 + */ + public function getFunds() { + try { + $config = $this->loadConfig(); + + return [ + 'success' => true, + 'data' => $config + ]; + } catch (Exception $e) { + return [ + 'success' => false, + 'message' => '获取基金配置失败: ' . $e->getMessage() + ]; + } + } + + /** + * 添加基金 + */ + public function addFund($fundData) { + try { + // 调试:记录接收到的数据 + error_log("addFund received: " . print_r($fundData, true)); + + $config = $this->loadConfig(); + + // 验证数据 + if (!isset($fundData['fund_code']) || trim($fundData['fund_code']) === '') { + return [ + 'success' => false, + 'message' => '基金代码不能为空' + ]; + } + + if (!isset($fundData['channel']) || trim($fundData['channel']) === '') { + return [ + 'success' => false, + 'message' => '渠道不能为空' + ]; + } + + $fundCode = trim($fundData['fund_code']); + $channel = trim($fundData['channel']); + + // 验证基金代码格式 + if (!preg_match('/^\d{6}$/', $fundCode)) { + return [ + 'success' => false, + 'message' => '基金代码必须是6位数字' + ]; + } + + // 检查是否已存在 + foreach ($config as $item) { + if ($item['fund_code'] === $fundCode && $item['channel'] === $channel) { + return [ + 'success' => false, + 'message' => '该渠道下已存在相同的基金代码' + ]; + } + } + + // 添加新基金 + // 获取基金名称 + $fundName = "基金{$fundCode}"; + $fundNames = [ + '003766' => '汇添富医疗服务混合', + '110022' => '易方达消费行业股票' + ]; + if (isset($fundNames[$fundCode])) { + $fundName = $fundNames[$fundCode]; + } + + $newFund = [ + 'channel' => $channel, + 'fund_code' => $fundCode, + 'investment' => isset($fundData['investment']) ? floatval($fundData['investment']) : 1000, + 'name' => $fundName + ]; + + $config[] = $newFund; + + if ($this->saveConfig($config)) { + // 记录操作日志 + $this->logOperation('add', $fundCode, $channel, $newFund['investment'], '添加基金'); + + return [ + 'success' => true, + 'message' => '基金添加成功' + ]; + } else { + return [ + 'success' => false, + 'message' => '保存配置失败' + ]; + } + } catch (Exception $e) { + return [ + 'success' => false, + 'message' => '添加基金失败: ' . $e->getMessage() + ]; + } + } + + /** + * 更新基金 + */ + public function updateFund($fundData) { + try { + // 调试:记录接收到的数据 + error_log("updateFund received: " . print_r($fundData, true)); + + $config = $this->loadConfig(); + $index = isset($fundData['index']) ? intval($fundData['index']) : -1; + + // 验证索引 + if ($index < 0 || !isset($config[$index])) { + return [ + 'success' => false, + 'message' => '基金不存在' + ]; + } + + // 验证数据 + if (!isset($fundData['fund_code']) || trim($fundData['fund_code']) === '') { + return [ + 'success' => false, + 'message' => '基金代码不能为空' + ]; + } + + if (!isset($fundData['channel']) || trim($fundData['channel']) === '') { + return [ + 'success' => false, + 'message' => '渠道不能为空' + ]; + } + + $fundCode = trim($fundData['fund_code']); + $channel = trim($fundData['channel']); + + // 获取旧数据用于日志 + $oldFund = $config[$index]; + + // 检查重复(排除自身) + foreach ($config as $i => $item) { + if ($i !== $index && $item['fund_code'] === $fundCode && $item['channel'] === $channel) { + return [ + 'success' => false, + 'message' => '该渠道下已存在相同的基金代码' + ]; + } + } + + // 更新基金信息 + $config[$index] = [ + 'channel' => $channel, + 'fund_code' => $fundCode, + 'investment' => isset($fundData['investment']) ? floatval($fundData['investment']) : 1000, + 'name' => $oldFund['name'] ?? "基金{$fundCode}" + ]; + + if ($this->saveConfig($config)) { + // 记录操作日志 + $details = sprintf('更新基金: 投资金额 %s -> %s', + $oldFund['investment'], + $config[$index]['investment'] + ); + $this->logOperation('update', $fundCode, $channel, $config[$index]['investment'], $details); + + return [ + 'success' => true, + 'message' => '基金更新成功' + ]; + } else { + return [ + 'success' => false, + 'message' => '保存配置失败' + ]; + } + } catch (Exception $e) { + return [ + 'success' => false, + 'message' => '更新基金失败: ' . $e->getMessage() + ]; + } + } + + /** + * 删除基金 + */ + public function deleteFund($index) { + try { + $config = $this->loadConfig(); + $index = intval($index); + + // 验证索引 + if (!isset($config[$index])) { + return [ + 'success' => false, + 'message' => '基金不存在' + ]; + } + + // 获取要删除的基金信息用于日志 + $deletedFund = $config[$index]; + + // 删除基金 + array_splice($config, $index, 1); + + if ($this->saveConfig($config)) { + // 记录操作日志 + $this->logOperation('delete', $deletedFund['fund_code'], $deletedFund['channel'], $deletedFund['investment'], '删除基金'); + + return [ + 'success' => true, + 'message' => '基金删除成功' + ]; + } else { + return [ + 'success' => false, + 'message' => '保存配置失败' + ]; + } + } catch (Exception $e) { + return [ + 'success' => false, + 'message' => '删除基金失败: ' . $e->getMessage() + ]; + } + } + + /** + * 获取基金名称列表(优先从文件读取,不存在时从API获取并保存) + */ + public function getFundNames() { + $fundCodes = $_GET['fund_codes'] ?? ''; + + if (empty($fundCodes)) { + return [ + 'success' => false, + 'message' => '基金代码不能为空' + ]; + } + + $codes = explode(',', $fundCodes); + $results = []; + $fundNames = $this->loadFundNames(); + + foreach ($codes as $code) { + $code = trim($code); + if (!empty($code)) { + // 先从文件中查找 + if (isset($fundNames[$code])) { + $results[$code] = $fundNames[$code]; + } else { + // 文件中没有,则从API获取 + $fundName = $this->fetchFundNameFromAPI($code); + if ($fundName) { + $results[$code] = $fundName; + // 将新获取的基金名称保存到文件中 + $fundNames[$code] = $fundName; + $this->saveFundNames($fundNames); + } else { + // 如果API也获取失败,使用默认名称 + $results[$code] = "基金$code"; + } + } + } + } + + return [ + 'success' => true, + 'data' => $results, + 'message' => '获取基金名称成功' + ]; + } + + /** + * 获取推荐基金列表 + */ + private function getRecommendedFunds() { + try { + $recommendedFunds = []; + if (file_exists($this->recommendedFundsFile)) { + $data = file_get_contents($this->recommendedFundsFile); + $recommendedFunds = json_decode($data, true); + if (!is_array($recommendedFunds)) { + $recommendedFunds = []; + } + } + + // 按时间倒序排序 + usort($recommendedFunds, function($a, $b) { + return strtotime($b['timestamp']) - strtotime($a['timestamp']); + }); + + echo json_encode(['success' => true, 'data' => $recommendedFunds], JSON_UNESCAPED_UNICODE); + } catch (Exception $e) { + echo json_encode(['success' => false, 'message' => '获取推荐基金失败: ' . $e->getMessage()], JSON_UNESCAPED_UNICODE); + } + } + + /** + * 批准推荐基金 + */ + private function approveRecommendedFund() { + try { + $fundCode = isset($_GET['fund_code']) ? $_GET['fund_code'] : ''; + + if (empty($fundCode)) { + echo json_encode(['success' => false, 'message' => '基金代码不能为空'], JSON_UNESCAPED_UNICODE); + return; + } + + // 加载推荐基金数据 + $recommendedFunds = []; + if (file_exists($this->recommendedFundsFile)) { + $data = file_get_contents($this->recommendedFundsFile); + $recommendedFunds = json_decode($data, true); + if (!is_array($recommendedFunds)) { + $recommendedFunds = []; + } + } + + // 查找并更新基金状态 + $found = false; + foreach ($recommendedFunds as &$fund) { + if ($fund['fund_code'] == $fundCode) { + $fund['status'] = 'approved'; + $found = true; + break; + } + } + + if (!$found) { + echo json_encode(['success' => false, 'message' => '未找到该推荐基金'], JSON_UNESCAPED_UNICODE); + return; + } + + // 保存更新后的数据 + file_put_contents($this->recommendedFundsFile, json_encode($recommendedFunds, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE)); + + // 添加到基金配置中 + $config = $this->loadConfig(); + $fundExists = false; + foreach ($config as $existingFund) { + if ($existingFund['fund_code'] == $fundCode && $existingFund['channel'] == '0') { + $fundExists = true; + break; + } + } + + if (!$fundExists) { + $newFund = [ + 'channel' => '2', // 2表示支付宝渠道 + 'fund_code' => $fundCode, + 'investment' => 1000, + 'name' => '基金' . $fundCode + ]; + $config[] = $newFund; + $this->saveConfig($config); + } + + // 记录操作日志 + $this->logOperation('approve_recommended_fund', ['fund_code' => $fundCode]); + + echo json_encode(['success' => true, 'message' => '基金批准成功'], JSON_UNESCAPED_UNICODE); + } catch (Exception $e) { + echo json_encode(['success' => false, 'message' => '批准基金失败: ' . $e->getMessage()], JSON_UNESCAPED_UNICODE); + } + } + + /** + * 删除推荐基金 + */ + private function deleteRecommendedFund() { + try { + $fundCode = isset($_GET['fund_code']) ? $_GET['fund_code'] : ''; + + if (empty($fundCode)) { + echo json_encode(['success' => false, 'message' => '基金代码不能为空'], JSON_UNESCAPED_UNICODE); + return; + } + + // 加载推荐基金数据 + $recommendedFunds = []; + if (file_exists($this->recommendedFundsFile)) { + $data = file_get_contents($this->recommendedFundsFile); + $recommendedFunds = json_decode($data, true); + if (!is_array($recommendedFunds)) { + $recommendedFunds = []; + } + } + + // 过滤掉要删除的基金 + $filteredFunds = array_filter($recommendedFunds, function($fund) use ($fundCode) { + return $fund['fund_code'] != $fundCode; + }); + + // 保存过滤后的数据 + file_put_contents($this->recommendedFundsFile, json_encode(array_values($filteredFunds), JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE)); + + // 记录操作日志 + $this->logOperation('delete_recommended_fund', ['fund_code' => $fundCode]); + + echo json_encode(['success' => true, 'message' => '基金删除成功'], JSON_UNESCAPED_UNICODE); + } catch (Exception $e) { + echo json_encode(['success' => false, 'message' => '删除基金失败: ' . $e->getMessage()], JSON_UNESCAPED_UNICODE); + } + } + + /** + * 从API获取基金名称(只在文件中不存在时调用) + */ + private function fetchFundNameFromAPI($fundCode) { + // 尝试多个API源 + $apiSources = [ + "https://fundgz.1234567.com.cn/js/{$fundCode}.js?rt=" . time(), + "https://api.doctorxiong.club/v1/fund/detail?code={$fundCode}" + ]; + + foreach ($apiSources as $apiUrl) { + try { + // 设置超时时间 + $context = stream_context_create([ + 'http' => [ + 'timeout' => 5, + 'header' => 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' + ] + ]); + + $response = file_get_contents($apiUrl, false, $context); + + if ($response) { + // 处理不同API的响应格式 + if (strpos($apiUrl, 'fundgz.1234567.com.cn') !== false) { + // 处理JSONP格式 + if (preg_match('/jsonpgz\((.*)\)/', $response, $matches)) { + $data = json_decode($matches[1], true); + if (isset($data['name']) && !empty($data['name'])) { + return $data['name']; + } + } + } else if (strpos($apiUrl, 'doctorxiong.club') !== false) { + // 处理JSON格式 + $data = json_decode($response, true); + if (isset($data['data']['name']) && !empty($data['data']['name'])) { + return $data['data']['name']; + } + } + } + } catch (Exception $e) { + // 记录错误但继续尝试下一个API源 + error_log("获取基金{$fundCode}名称失败: " . $e->getMessage()); + continue; + } + } + + // 所有API都失败,返回false + return false; + } + + /** + * 处理API请求 + */ + public function handleRequest() { + $method = $_SERVER['REQUEST_METHOD']; + + if ($method === 'OPTIONS') { + exit(0); + } + + // 解析请求参数 + $queryString = $_SERVER['QUERY_STRING'] ?? ''; + parse_str($queryString, $params); + $action = $params['action'] ?? ''; + + if ($method === 'GET') { + switch ($action) { + case 'get_funds': + $result = $this->getFunds(); + echo json_encode($result, JSON_UNESCAPED_UNICODE); + break; + + case 'get_operation_log': + $limit = isset($params['limit']) ? intval($params['limit']) : 20; + $result = $this->getOperationLog($limit); + echo json_encode($result, JSON_UNESCAPED_UNICODE); + break; + + case 'get_fund_name': + $fundCode = $params['fund_code'] ?? ''; + if ($fundCode) { + $result = $this->getFundName($fundCode); + echo json_encode($result, JSON_UNESCAPED_UNICODE); + } else { + echo json_encode(['success' => false, 'message' => '基金代码不能为空']); + } + break; + + case 'get_fund_names': + $result = $this->getFundNames(); + echo json_encode($result, JSON_UNESCAPED_UNICODE); + break; + case 'get_recommended_funds': + $this->getRecommendedFunds(); + break; + case 'approve_recommended_fund': + $this->approveRecommendedFund(); + break; + case 'delete_recommended_fund': + $this->deleteRecommendedFund(); + break; + + default: + http_response_code(404); + echo json_encode(['success' => false, 'message' => 'Endpoint not found']); + } + } elseif ($method === 'POST') { + // 获取POST数据 + $input = file_get_contents('php://input'); + + // 调试:记录原始输入 + error_log("Raw input: " . $input); + + $postData = json_decode($input, true); + + if (json_last_error() !== JSON_ERROR_NONE) { + http_response_code(400); + echo json_encode([ + 'success' => false, + 'message' => '无效的JSON数据: ' . json_last_error_msg(), + 'debug_input' => $input + ]); + return; + } + + // 调试:记录解析后的数据 + error_log("Parsed data: " . print_r($postData, true)); + + switch ($action) { + case 'add_fund': + $result = $this->addFund($postData); + echo json_encode($result, JSON_UNESCAPED_UNICODE); + break; + + case 'update_fund': + $result = $this->updateFund($postData); + echo json_encode($result, JSON_UNESCAPED_UNICODE); + break; + + case 'delete_fund': + $result = $this->deleteFund($postData['index']); + echo json_encode($result, JSON_UNESCAPED_UNICODE); + break; + + default: + http_response_code(404); + echo json_encode(['success' => false, 'message' => 'Endpoint not found']); + } + } else { + http_response_code(405); + echo json_encode(['success' => false, 'message' => 'Method not allowed']); + } + } +} + +// 错误处理 +try { + $api = new FundAdminAPI(); + $api->handleRequest(); +} catch (Exception $e) { + http_response_code(500); + echo json_encode([ + 'success' => false, + 'message' => '服务器内部错误: ' . $e->getMessage() + ]); +} +?> \ No newline at end of file diff --git a/api.php b/api.php new file mode 100644 index 0000000..593bdd4 --- /dev/null +++ b/api.php @@ -0,0 +1,1165 @@ +statsFile)) { + $this->initStats(); + } + + // 初始化配置文件(如果不存在) + if (!file_exists($this->configFile)) { + $this->initConfig(); + } + + // 初始化历史数据文件(如果不存在) + if (!file_exists($this->historyFile)) { + $this->initHistory(); + } + + // 初始化操作日志文件(如果不存在) + if (!file_exists($this->operationFile)) { + $this->initOperationLog(); + } + + // 初始化每日数据文件(如果不存在) + if (!file_exists($this->dailyDataFile)) { + $this->initDailyData(); + } + } + + /** + * 初始化统计数据 + */ + private function initStats() { + $initialStats = [ + 'total_visits' => 0, + 'today_visits' => 0, + 'unique_visitors' => 0, + 'today_unique_visitors' => 0, + 'last_reset' => date('Y-m-d'), + 'daily_stats' => [], + 'unique_ips' => [] + ]; + + file_put_contents($this->statsFile, json_encode($initialStats, JSON_PRETTY_PRINT)); + } + + /** + * 初始化配置文件 + */ + private function initConfig() { + $defaultConfig = [ + [ + "channel" => "0", + "fund_code" => "003766", + "investment" => 1000 + ], + [ + "channel" => "0", + "fund_code" => "004206", + "investment" => 1000 + ], + [ + "channel" => "0", + "fund_code" => "019432", + "investment" => 1000 + ], + [ + "channel" => "1", + "fund_code" => "003766", + "investment" => 1000 + ], + [ + "channel" => "1", + "fund_code" => "008327", + "investment" => 1000 + ], + [ + "channel" => "2", + "fund_code" => "017811", + "investment" => 1000 + ] + ]; + + file_put_contents($this->configFile, json_encode($defaultConfig, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE)); + } + + /** + * 初始化历史数据 + */ + private function initHistory() { + $initialHistory = [ + 'last_update_date' => date('Y-m-d'), + 'yesterday_data' => [], + 'today_data' => [] + ]; + + file_put_contents($this->historyFile, json_encode($initialHistory, JSON_PRETTY_PRINT)); + } + + /** + * 初始化操作日志 + */ + private function initOperationLog() { + $initialLog = [ + 'operations' => [] + ]; + + file_put_contents($this->operationFile, json_encode($initialLog, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE)); + } + + /** + * 初始化每日数据 + */ + private function initDailyData() { + $initialDailyData = [ + 'last_update' => date('Y-m-d'), + 'funds' => [] + ]; + + file_put_contents($this->dailyDataFile, json_encode($initialDailyData, JSON_PRETTY_PRINT)); + } + + /** + * 加载基金配置 + */ + private function loadConfig() { + if (!file_exists($this->configFile)) { + $this->initConfig(); + } + + $data = file_get_contents($this->configFile); + if (!$data) { + return []; + } + + $config = json_decode($data, true); + + return is_array($config) ? $config : []; + } + + /** + * 加载历史数据 + */ + private function loadHistory() { + if (!file_exists($this->historyFile)) { + $this->initHistory(); + } + + $data = file_get_contents($this->historyFile); + if (!$data) { + return $this->initHistory(); + } + + $history = json_decode($data, true); + + return is_array($history) ? $history : $this->initHistory(); + } + + /** + * 保存历史数据 + */ + private function saveHistory($history) { + return file_put_contents($this->historyFile, json_encode($history, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE)); + } + + /** + * 更新历史数据 + */ + private function updateHistory($fundsData) { + $history = $this->loadHistory(); + $today = date('Y-m-d'); + + // 确保数组结构完整 + if (!isset($history['yesterday_data']) || !is_array($history['yesterday_data'])) { + $history['yesterday_data'] = []; + } + if (!isset($history['today_data']) || !is_array($history['today_data'])) { + $history['today_data'] = []; + } + if (!isset($history['last_update_date'])) { + $history['last_update_date'] = $today; + } + + // 如果是新的一天,将昨天的数据移到历史记录中 + if ($history['last_update_date'] !== $today) { + // 将昨天的数据保存为历史数据 + // 确保今天的数据不为空才移动,避免覆盖已有的历史数据 + if (!empty($history['today_data'])) { + $history['yesterday_data'] = $history['today_data']; + } + // 清空今天的数据,为新数据做准备 + $history['today_data'] = []; + // 更新最后更新日期 + $history['last_update_date'] = $today; + } + + // 保存今天的数据 + foreach ($fundsData as $fundCode => $fund) { + $history['today_data'][$fundCode] = [ + 'date' => $today, + 'change' => floatval($fund['gszzl']), + 'name' => $fund['name'] ?? '未知基金' + ]; + } + + // 确保保存操作成功 + if (!$this->saveHistory($history)) { + // 保存失败时记录错误信息(可以根据需要扩展错误处理) + error_log('Failed to save history data on ' . $today); + } + + return $history; + } + + /** + * 获取基金的历史涨幅(昨天的数据) + */ + private function getFundHistory($fundCode) { + $history = $this->loadHistory(); + + if (isset($history['yesterday_data'][$fundCode])) { + return $history['yesterday_data'][$fundCode]['change']; + } + + return null; // 没有历史数据 + } + + /** + * 缓存路径 + */ + private function getFundCachePath($fundCode) { + return $this->cacheDir . "/fund_{$fundCode}.json"; + } + + /** + * 从缓存读取基金数据(短期) + */ + private function getFundFromCache($fundCode) { + $file = $this->getFundCachePath($fundCode); + if (!file_exists($file)) return false; + // 过期判断 + if (time() - filemtime($file) > $this->fundCacheTTL) return false; + $raw = @file_get_contents($file); + if ($raw === false) return false; + $data = json_decode($raw, true); + return is_array($data) ? $data : false; + } + + /** + * 写入缓存 + */ + private function cacheFundData($fundCode, $fundData) { + // 保证目录存在 + if (!is_dir($this->cacheDir)) { + @mkdir($this->cacheDir, 0777, true); + } + @file_put_contents($this->getFundCachePath($fundCode), json_encode($fundData, JSON_UNESCAPED_UNICODE)); + } + + /** + * 记录操作日志 + */ + private function logOperation($type, $fundCode, $channel = null, $investment = null, $details = '') { + $log = $this->loadOperationLog(); + + $operation = [ + 'id' => uniqid(), + 'type' => $type, // 'add', 'update', 'delete' + 'fund_code' => $fundCode, + 'channel' => $channel, + 'investment' => $investment, + 'details' => $details, + 'timestamp' => time(), + 'date' => date('Y-m-d H:i:s') + ]; + + $log['operations'][] = $operation; + + // 只保留最近100条操作记录 + if (count($log['operations']) > 100) { + $log['operations'] = array_slice($log['operations'], -100); + } + + file_put_contents($this->operationFile, json_encode($log, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE)); + + return $operation; + } + + /** + * 加载操作日志 + */ + private function loadOperationLog() { + if (!file_exists($this->operationFile)) { + $this->initOperationLog(); + } + + $data = file_get_contents($this->operationFile); + if (!$data) { + return ['operations' => []]; + } + + $log = json_decode($data, true); + + return is_array($log) ? $log : ['operations' => []]; + } + + /** + * 记录每日基金数据 + */ + private function recordDailyData($fundsData) { + $dailyData = $this->loadDailyData(); + $today = date('Y-m-d'); + + // 如果是新的一天,清理旧数据(只保留5天) + if ($dailyData['last_update'] !== $today) { + $fiveDaysAgo = date('Y-m-d', strtotime('-5 days')); + + foreach ($dailyData['funds'] as $fundCode => &$fundHistory) { + $fundHistory = array_filter($fundHistory, function($record) use ($fiveDaysAgo) { + return $record['date'] >= $fiveDaysAgo; + }); + // 重新索引数组 + $fundHistory = array_values($fundHistory); + } + + $dailyData['last_update'] = $today; + } + + // 记录今天的数据 + foreach ($fundsData as $fundCode => $fund) { + if (!isset($dailyData['funds'][$fundCode])) { + $dailyData['funds'][$fundCode] = []; + } + + $todayRecord = [ + 'date' => $today, + 'dwjz' => $fund['dwjz'], // 单位净值 + 'gsz' => $fund['gsz'], // 估算净值 + 'gszzl' => floatval($fund['gszzl']), // 估算涨幅 + 'name' => $fund['name'] ?? '未知基金' + ]; + + // 检查是否已经记录了今天的数据 + $todayExists = false; + foreach ($dailyData['funds'][$fundCode] as $record) { + if ($record['date'] === $today) { + $todayExists = true; + break; + } + } + + if (!$todayExists) { + $dailyData['funds'][$fundCode][] = $todayRecord; + + // 按日期排序 + usort($dailyData['funds'][$fundCode], function($a, $b) { + return strtotime($a['date']) - strtotime($b['date']); + }); + } + } + + file_put_contents($this->dailyDataFile, json_encode($dailyData, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE)); + + return $dailyData; + } + + /** + * 加载每日数据 + */ + private function loadDailyData() { + if (!file_exists($this->dailyDataFile)) { + $this->initDailyData(); + } + + $data = file_get_contents($this->dailyDataFile); + if (!$data) { + return ['last_update' => date('Y-m-d'), 'funds' => []]; + } + + $dailyData = json_decode($data, true); + + return is_array($dailyData) ? $dailyData : ['last_update' => date('Y-m-d'), 'funds' => []]; + } + + /** + * 获取基金的历史数据(5天内) + */ + private function getFundHistoryData($fundCode) { + $dailyData = $this->loadDailyData(); + + if (isset($dailyData['funds'][$fundCode])) { + return $dailyData['funds'][$fundCode]; + } + + return []; + } + + /** + * 获取操作日志 + */ + public function getOperationLog($limit = 20) { + try { + $log = $this->loadOperationLog(); + $operations = $log['operations']; + + // 按时间倒序排列 + usort($operations, function($a, $b) { + return $b['timestamp'] - $a['timestamp']; + }); + + // 限制返回数量 + $operations = array_slice($operations, 0, $limit); + + return [ + 'success' => true, + 'data' => $operations + ]; + } catch (Exception $e) { + return [ + 'success' => false, + 'message' => '获取操作日志失败: ' . $e->getMessage() + ]; + } + } + + /** + * 获取基金历史图表数据 + */ + public function getFundChartData($fundCode) { + try { + $historyData = $this->getFundHistoryData($fundCode); + + // 格式化图表数据 + $chartData = [ + 'labels' => [], + 'netValues' => [], + 'changes' => [] + ]; + + foreach ($historyData as $record) { + $chartData['labels'][] = date('m-d', strtotime($record['date'])); + $chartData['netValues'][] = floatval($record['gsz']); + $chartData['changes'][] = floatval($record['gszzl']); + } + + return [ + 'success' => true, + 'data' => $chartData + ]; + } catch (Exception $e) { + return [ + 'success' => false, + 'message' => '获取图表数据失败: ' . $e->getMessage() + ]; + } + } + + /** + * 记录访问 + */ + private function recordVisit() { + $clientIP = $this->getClientIP(); + $userAgent = $_SERVER['HTTP_USER_AGENT'] ?? 'Unknown'; + $timestamp = time(); + $date = date('Y-m-d H:i:s'); + + // 检查是否需要记录这次访问(避免短时间内重复计数) + if (!$this->shouldRecordVisit($clientIP, $timestamp)) { + return false; // 不需要记录 + } + + $visitorData = [ + 'ip' => $clientIP, + 'user_agent' => $userAgent, + 'timestamp' => $timestamp, + 'date' => $date, + 'referer' => $_SERVER['HTTP_REFERER'] ?? 'Direct' + ]; + + // 保存访问记录 + $visits = $this->loadVisits(); + $visits[] = $visitorData; + + // 只保留最近1000条记录,平衡数据完整性和存储压力 + if (count($visits) > 1000) { + $visits = array_slice($visits, -1000); + } + + file_put_contents($this->dataFile, json_encode($visits, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE)); + + // 更新统计 + $this->updateStats($clientIP); + + return true; + } + + /** + * 判断是否应该记录这次访问 + * 同一IP在10分钟内的访问只记录一次 + */ + private function shouldRecordVisit($clientIP, $currentTimestamp) { + $visits = $this->loadVisits(); + $timeThreshold = 10 * 60; // 10分钟(秒) + + // 检查最近的访问记录 + for ($i = count($visits) - 1; $i >= 0; $i--) { + $visit = $visits[$i]; + // 如果找到相同IP且时间间隔小于阈值,则不记录 + if ($visit['ip'] === $clientIP && ($currentTimestamp - $visit['timestamp']) < $timeThreshold) { + return false; + } + // 只检查最近的记录,避免遍历所有数据 + if (($currentTimestamp - $visit['timestamp']) > $timeThreshold) { + break; + } + } + + return true; + } + + /** + * 获取客户端IP + */ + private function getClientIP() { + $ip = 'Unknown'; + + if (!empty($_SERVER['HTTP_CLIENT_IP'])) { + $ip = $_SERVER['HTTP_CLIENT_IP']; + } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { + $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; + } elseif (!empty($_SERVER['REMOTE_ADDR'])) { + $ip = $_SERVER['REMOTE_ADDR']; + } + + // 处理多个IP的情况(如经过代理) + if (strpos($ip, ',') !== false) { + $ips = explode(',', $ip); + $ip = trim($ips[0]); + } + + return $ip; + } + + /** + * 加载访问记录 + */ + private function loadVisits() { + if (!file_exists($this->dataFile)) { + return []; + } + + $data = @file_get_contents($this->dataFile); + if (!$data) { + return []; + } + + $visits = json_decode($data, true); + return is_array($visits) ? $visits : []; + } + + /** + * 加载统计数据 + */ + private function loadStats() { + if (!file_exists($this->statsFile)) { + $this->initStats(); + } + + $data = @file_get_contents($this->statsFile); + if (!$data) { + $this->initStats(); + $data = file_get_contents($this->statsFile); + } + + $stats = json_decode($data, true); + + // 确保数据结构完整 + if (!isset($stats['unique_ips'])) { + $stats['unique_ips'] = []; + } + + return $stats; + } + + /** + * 更新统计数据 + */ + private function updateStats($clientIP) { + $stats = $this->loadStats(); + $visits = $this->loadVisits(); + + // 检查是否需要重置今日统计 + $today = date('Y-m-d'); + if ($stats['last_reset'] !== $today) { + $stats['today_visits'] = 0; + $stats['today_unique_visitors'] = 0; + $stats['last_reset'] = $today; + } + + // 更新总访问量 + $stats['total_visits'] = count($visits); + $stats['today_visits']++; + + // 更新独立访客统计 + $allIPs = array_column($visits, 'ip'); + $uniqueIPs = array_unique($allIPs); + $stats['unique_visitors'] = count($uniqueIPs); + + // 更新今日独立访客 + $todayVisits = array_filter($visits, function($visit) use ($today) { + return date('Y-m-d', $visit['timestamp']) === $today; + }); + $todayIPs = array_unique(array_column($todayVisits, 'ip')); + $stats['today_unique_visitors'] = count($todayIPs); + + // 更新每日统计 + $todayKey = date('Y-m-d'); + if (!isset($stats['daily_stats'][$todayKey])) { + $stats['daily_stats'][$todayKey] = 0; + } + $stats['daily_stats'][$todayKey]++; + + // 只保留最近30天的统计 + if (count($stats['daily_stats']) > 30) { + $stats['daily_stats'] = array_slice($stats['daily_stats'], -30, 30, true); + } + + // 保存唯一IP列表(用于快速计算) + $stats['unique_ips'] = array_values($uniqueIPs); + + file_put_contents($this->statsFile, json_encode($stats, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE)); + + return $stats; + } + + /** + * 获取访问统计 + */ + public function getVisitStats() { + $stats = $this->loadStats(); + $visits = $this->loadVisits(); + + // 获取最近访问记录(最新的10条) + $recentVisits = array_slice($visits, -10); + $recentVisits = array_reverse($recentVisits); // 最新的在前面 + + return [ + 'success' => true, + 'data' => [ + 'total_visits' => $stats['total_visits'], + 'today_visits' => $stats['today_visits'], + 'unique_visitors' => $stats['unique_visitors'], + 'today_unique_visitors' => $stats['today_unique_visitors'], + 'last_reset' => $stats['last_reset'], + 'daily_stats' => $stats['daily_stats'], + 'recent_visits' => $recentVisits + ] + ]; + } + + /** + * 批量获取基金数据 + */ + public function getBatchFundData($fundCodes) { + $fundsData = []; + $errors = []; + foreach ($fundCodes as $fundCode) { + $fundData = $this->getSingleFundData($fundCode); + if ($fundData) { + $fundsData[$fundCode] = $fundData; + } else { + $errors[] = "基金 {$fundCode} 数据获取失败"; + } + // 高频请求时移除延迟 + // usleep(150000); // 0.15秒 + } + return [ + 'success' => $fundsData, + 'errors' => $errors + ]; + } + + /** + * 获取单个基金数据 + */ + private function getSingleFundData($fundCode) { + // 先尝试短期缓存 + $cached = $this->getFundFromCache($fundCode); + if ($cached) return $cached; + + $apiUrl = "http://fundgz.1234567.com.cn/js/{$fundCode}.js?" . time(); + $context = stream_context_create([ + 'http' => [ + 'timeout' => 10, + 'header' => "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36\r\n", + 'ignore_errors' => true + ] + ]); + + $response = @file_get_contents($apiUrl, false, $context); + if (!$response) { + return false; + } + + // 兼容不同jsonp格式 + if (preg_match('/jsonpgz\d*\((.*)\);?/', $response, $matches)) { + $data = json_decode($matches[1], true); + // 检查数据是否有效 + if ($data && isset($data['fundcode']) && $data['fundcode'] == $fundCode) { + // 写入缓存以便后续短期复用 + $this->cacheFundData($fundCode, $data); + return $data; + } + } + return false; + } + + /** + * 计算各渠道统计信息 + */ + private function calculateChannelStats($fundsData, $fundChannelMap, $fundInvestmentMap) { + $channelStats = []; + + // 初始化渠道统计 + $channelNames = array_unique($fundChannelMap); + foreach ($channelNames as $channelName) { + $channelStats[$channelName] = [ + 'count' => 0, + 'totalChange' => 0, + 'upCount' => 0, + 'downCount' => 0, + 'totalInvestment' => 0, + 'totalCurrentValue' => 0, + 'totalProfitLoss' => 0, + 'funds' => [] + ]; + } + + // 统计各渠道数据 + foreach ($fundsData as $fundCode => $fund) { + $channelName = $fundChannelMap[$fundCode]; + // 明确使用当前的估算涨跌幅(gszzl),而不是历史数据 + $currentChange = floatval($fund['gszzl']); + $channelStats[$channelName]['totalChange'] += $currentChange; + + // 使用配置的投资金额 + $investment = $fundInvestmentMap[$fundCode] ?? 1000; + + // 更真实的基金计算方式 + // 1. 获取单位净值(使用昨日的单位净值作为购买时的净值) + $unitNetValue = floatval($fund['dwjz']) > 0 ? floatval($fund['dwjz']) : 1.0; + + // 2. 计算购买份额(投资金额 / 单位净值) + $shares = $investment / $unitNetValue; + + // 3. 获取当前估算净值 + $currentNetValue = floatval($fund['gsz']) > 0 ? floatval($fund['gsz']) : $unitNetValue; + + // 4. 计算当前价值(份额 * 当前估算净值) + $currentValue = $shares * $currentNetValue; + + // 5. 计算盈亏 + $profitLoss = $currentValue - $investment; + + // 正确计算昨日收盘时的价值 + // 使用正确的公式:昨日单位净值 = 当前单位净值 / (1 + 今日涨幅/100) * (1 + 昨日涨幅/100) + $todayChange = floatval($fund['gszzl']); + $yesterdayChange = floatval($fund['yesterday_change'] ?? 0); + + // 计算昨日单位净值 + // 如果今日涨幅为-100%(不可能),则使用替代方案 + $yesterdayUnitNetValue = ($todayChange == -100) ? + $unitNetValue : ($unitNetValue / (1 + $todayChange / 100)) * (1 + $yesterdayChange / 100); + + // 计算昨日价值 + $yesterdayValue = $shares * $yesterdayUnitNetValue; + + // 7. 计算今日盈亏(从昨日收盘价到当前估值) + $todayProfitLoss = $currentValue - $yesterdayValue; + + $channelStats[$channelName]['count']++; + $channelStats[$channelName]['totalInvestment'] += $investment; + $channelStats[$channelName]['totalCurrentValue'] += $currentValue; + $channelStats[$channelName]['totalProfitLoss'] += $profitLoss; + // 确保昨天涨幅数据也被包含在channelStats中 + $formattedYesterdayChange = $yesterdayChange !== null ? + ($yesterdayChange > 0 ? '+' : '') . $this->formatNumber($yesterdayChange) . '%' : '--'; + + $channelStats[$channelName]['funds'][$fundCode] = array_merge($fund, [ + 'investment' => $investment, + 'current_value' => $currentValue, + 'profit_loss' => $profitLoss, + 'shares' => $shares, + 'unit_net_value' => $unitNetValue, + 'current_net_value' => $currentNetValue, + 'yesterday_unit_net_value' => $yesterdayUnitNetValue, // 添加昨日单位净值 + 'yesterday_value' => $yesterdayValue, // 添加昨日收盘价值 + 'today_profit_loss' => $todayProfitLoss, // 添加今日盈亏 + 'yesterday_change' => $yesterdayChange, // 添加昨日涨幅 + 'formatted_yesterday_change' => $formattedYesterdayChange // 添加格式化的昨日涨幅 + ]); + + // 使用更严格的判断标准,避免浮点数精度问题 + if ($currentChange > 0.001) { + $channelStats[$channelName]['upCount']++; + } elseif ($currentChange < -0.001) { + $channelStats[$channelName]['downCount']++; + } + } + + // 计算平均涨跌幅和盈亏比例 + foreach ($channelStats as $channelName => &$stats) { + $stats['avgChange'] = $stats['count'] > 0 ? $stats['totalChange'] / $stats['count'] : 0; + $stats['profitLossRate'] = $stats['totalInvestment'] > 0 ? ($stats['totalProfitLoss'] / $stats['totalInvestment']) * 100 : 0; + } + + return $channelStats; + } + + /** + * 根据渠道索引获取渠道名称 + */ + private function getChannelName($channelIndex) { + $channels = ["招商银行", "天天基金", "支付宝"]; + return $channels[$channelIndex] ?? "未知渠道"; + } + + /** + * 获取渠道CSS类名 + */ + private function getChannelClass($channelName) { + $channelMap = [ + '招商银行' => 'cmb', + '天天基金' => 'tt', + '支付宝' => 'zfb' + ]; + return $channelMap[$channelName] ?? 'cmb'; + } + + /** + * 获取渠道图标 + */ + private function getChannelIcon($channelName) { + $iconMap = [ + '招商银行' => '🏦', + '天天基金' => '📱', + '支付宝' => '💙' + ]; + return $iconMap[$channelName] ?? '🏦'; + } + + /** + * 获取渠道描述 + */ + private function getChannelDescription($channelName) { + $descMap = [ + '招商银行' => '银行渠道,申购费率较低,服务稳定', + '天天基金' => '专业基金平台,品种齐全,数据精准', + '支付宝' => '便捷支付,操作简单,用户体验佳' + ]; + return $descMap[$channelName] ?? '基金购买渠道'; + } + + /** + * 格式化数字 + */ + private function formatNumber($number) { + return number_format($number, 2); + } + + /** + * 格式化货币金额 + */ + private function formatCurrency($amount) { + if ($amount >= 10000) { + return number_format($amount / 10000, 2) . '万元'; + } + return number_format($amount, 2) . '元'; + } + + /** + * 获取基金数据 + */ + public function getFundData() { + // 从配置文件读取基金配置 + $config = $this->loadConfig(); + + if (empty($config)) { + return [ + 'success' => false, + 'message' => '基金配置文件不存在或为空' + ]; + } + + // 按渠道分组基金代码 + $channelFunds = []; + foreach ($config as $fund) { + $channelIndex = $fund['channel']; + $fundCode = $fund['fund_code']; + + if (!isset($channelFunds[$channelIndex])) { + $channelFunds[$channelIndex] = ["$channelIndex"]; + } + + $channelFunds[$channelIndex][] = $fundCode; + } + + // 重新索引数组 + $channelFunds = array_values($channelFunds); + + // 合并所有基金代码 + $allFundCodes = []; + $fundChannelMap = []; // 基金代码到渠道的映射 + $fundInvestmentMap = []; // 基金代码到投资金额的映射 + + foreach ($channelFunds as $channelData) { + $channelIndex = $channelData[0]; + $channelName = $this->getChannelName($channelIndex); + + for ($i = 1; $i < count($channelData); $i++) { + $fundCode = $channelData[$i]; + $allFundCodes[] = $fundCode; + $fundChannelMap[$fundCode] = $channelName; + + // 查找对应的投资金额 + foreach ($config as $fund) { + if ($fund['fund_code'] === $fundCode && $fund['channel'] === $channelIndex) { + $fundInvestmentMap[$fundCode] = $fund['investment']; + break; + } + } + } + } + + // 获取基金数据 + $result = $this->getBatchFundData($allFundCodes); + $fundsData = $result['success']; + $errors = $result['errors']; + + // 首先计算总体统计信息,确保使用原始的当前数据,避免任何数据混淆 + // 总体统计信息 + $total = count($fundsData); + $upCount = 0; + $downCount = 0; + $flatCount = 0; + $totalChange = 0; + + // 添加总体盈亏统计 + $totalInvestment = 0; + $totalCurrentValue = 0; + $totalProfitLoss = 0; + $totalProfitLossRate = 0; + + foreach ($fundsData as $fundCode => $fund) { + // 明确使用当前的估算涨跌幅(gszzl),而不是历史数据 + // gszzl字段是当前基金的实时估算涨跌幅 + $currentChange = isset($fund['gszzl']) ? floatval($fund['gszzl']) : 0; + $totalChange += $currentChange; + + // 精确判断当前涨跌状态 + if ($currentChange > 0.001) $upCount++; // 当前上涨 + elseif ($currentChange < -0.001) $downCount++; // 当前下跌 + else $flatCount++; // 持平 + } + + // 然后再进行其他操作 + // 更新历史数据 - 记录今天的数据 + $this->updateHistory($fundsData); + + // 记录每日数据 + $this->recordDailyData($fundsData); + + // 为每个基金添加历史涨幅数据(昨天的数据) + foreach ($fundsData as $fundCode => &$fund) { + $yesterdayChange = $this->getFundHistory($fundCode); + // 确保yesterday_change始终有值,即使没有历史数据也提供默认值 + $fund['yesterday_change'] = $yesterdayChange !== null ? $yesterdayChange : 0; + $fund['formatted_yesterday_change'] = $yesterdayChange !== null ? + ($yesterdayChange > 0 ? '+' : '') . $this->formatNumber($yesterdayChange) . '%' : '--'; + } + + // 计算各渠道统计信息 + $channelStats = $this->calculateChannelStats($fundsData, $fundChannelMap, $fundInvestmentMap); + + // 使用配置的投资金额计算盈亏 - 更真实的计算方式 + foreach ($fundsData as $fundCode => &$fund) { + $investment = $fundInvestmentMap[$fundCode] ?? 1000; + + // 1. 获取单位净值 + $unitNetValue = floatval($fund['dwjz']) > 0 ? floatval($fund['dwjz']) : 1.0; + + // 2. 计算购买份额 + $shares = $investment / $unitNetValue; + + // 3. 获取当前估算净值 + $currentNetValue = floatval($fund['gsz']) > 0 ? floatval($fund['gsz']) : $unitNetValue; + + // 4. 计算当前价值 + $currentValue = $shares * $currentNetValue; + + $profitLoss = $currentValue - $investment; + + // 正确计算昨日收盘时的价值 + // 使用正确的公式:昨日单位净值 = 当前单位净值 / (1 + 今日涨幅/100) * (1 + 昨日涨幅/100) + $todayChange = floatval($fund['gszzl']); + $yesterdayChange = floatval($fund['yesterday_change'] ?? 0); + + // 计算昨日单位净值 + // 如果今日涨幅为-100%(不可能),则使用替代方案 + $yesterdayUnitNetValue = ($todayChange == -100) ? + $unitNetValue : ($unitNetValue / (1 + $todayChange / 100)) * (1 + $yesterdayChange / 100); + + // 计算昨日价值和今日盈亏 + $yesterdayValue = $shares * $yesterdayUnitNetValue; + $todayProfitLoss = $currentValue - $yesterdayValue; + + // 确保数据一致性 + $fund['yesterday_unit_net_value'] = $yesterdayUnitNetValue; + + $totalInvestment += $investment; + $totalCurrentValue += $currentValue; + $totalProfitLoss += $profitLoss; + } + + $avgChange = $total > 0 ? $totalChange / $total : 0; + $totalProfitLossRate = $totalInvestment > 0 ? ($totalProfitLoss / $totalInvestment) * 100 : 0; + + // 格式化数据返回 + return [ + 'success' => true, + 'data' => [ + 'summary' => [ + 'total' => $total, + 'upCount' => $upCount, + 'downCount' => $downCount, + 'flatCount' => $flatCount, + 'avgChange' => $avgChange, + 'totalInvestment' => $totalInvestment, + 'totalCurrentValue' => $totalCurrentValue, + 'totalProfitLoss' => $totalProfitLoss, + 'totalProfitLossRate' => $totalProfitLossRate, + 'formattedTotalInvestment' => $this->formatCurrency($totalInvestment), + 'formattedTotalCurrentValue' => $this->formatCurrency($totalCurrentValue), + 'formattedTotalProfitLoss' => $this->formatCurrency($totalProfitLoss), + 'formattedProfitLossRate' => $this->formatNumber($totalProfitLossRate), + 'profitLossClass' => $totalProfitLoss >= 0 ? 'profit' : 'loss', + 'profitLossIcon' => $totalProfitLoss >= 0 ? '📈' : '📉' + ], + 'channelStats' => $channelStats, + 'fundsData' => $fundsData, + 'fundChannelMap' => $fundChannelMap, + 'errors' => $errors, + 'timestamp' => date('Y-m-d H:i:s') + ] + ]; + } + + /** + * 处理API请求 + */ + public function handleRequest() { + try { + $method = $_SERVER['REQUEST_METHOD']; + + // 解析请求参数 + $queryString = $_SERVER['QUERY_STRING'] ?? ''; + parse_str($queryString, $params); + $action = $params['action'] ?? 'fund_data'; + + // 记录访问(除了统计接口本身) + if ($action !== 'get_stats') { + $this->recordVisit(); + } + + if ($method === 'GET') { + switch ($action) { + case 'fund_data': + case 'get_fund_data': + // 获取基金数据,同时支持get_fund_data和fund_data两种action + // 检查是否提供了单个fund_code参数 + $fundCode = isset($params['fund_code']) ? trim($params['fund_code']) : ''; + if (!empty($fundCode)) { + $fundData = $this->getSingleFundData($fundCode); + if ($fundData) { + $result = ['success' => true, 'data' => $fundData]; + } else { + $result = ['success' => false, 'message' => '获取基金数据失败: ' . $fundCode]; + } + } else { + // 否则获取所有基金数据 + $result = $this->getFundData(); + } + break; + + case 'get_stats': + // 获取访问统计 + $result = $this->getVisitStats(); + break; + + case 'get_operation_log': + $limit = isset($params['limit']) ? intval($params['limit']) : 20; + $result = $this->getOperationLog($limit); + break; + + case 'get_fund_chart': + $fundCode = isset($params['fund_code']) ? trim($params['fund_code']) : ''; + if (empty($fundCode)) { + $result = ['success' => false, 'message' => '基金代码不能为空']; + } else { + $result = $this->getFundChartData($fundCode); + } + break; + + default: + http_response_code(404); + $result = ['error' => 'Endpoint not found']; + } + + // 统一返回JSON响应 + echo json_encode($result, JSON_UNESCAPED_UNICODE); + } else { + http_response_code(405); + echo json_encode(['error' => 'Method not allowed'], JSON_UNESCAPED_UNICODE); + } + } catch (Exception $e) { + // 捕获异常,返回错误响应 + http_response_code(500); + echo json_encode(['success' => false, 'message' => '服务器内部错误: ' . $e->getMessage()], JSON_UNESCAPED_UNICODE); + } + } +} + +// 错误处理 +try { + // 处理API请求 + $api = new FundMonitorAPI(); + $api->handleRequest(); +} catch (Exception $e) { + http_response_code(500); + echo json_encode([ + 'success' => false, + 'error' => '服务器内部错误: ' . $e->getMessage() + ]); +} +?> diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..36719fc --- /dev/null +++ b/composer.json @@ -0,0 +1,5 @@ +{ + "require": { + "ccxt/ccxt": "^1.53" + } +} diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000..cb49fee --- /dev/null +++ b/composer.lock @@ -0,0 +1,446 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "7fe6ed9149491f865075a222db8f3a4a", + "packages": [ + { + "name": "ccxt/ccxt", + "version": "1.53.1", + "source": { + "type": "git", + "url": "https://github.com/ccxt/ccxt.git", + "reference": "df03acf6997ff35ee84abadc80bebcbe13e5efdc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ccxt/ccxt/zipball/df03acf6997ff35ee84abadc80bebcbe13e5efdc", + "reference": "df03acf6997ff35ee84abadc80bebcbe13e5efdc", + "shasum": "" + }, + "require": { + "ext-bcmath": "*", + "ext-curl": "*", + "ext-iconv": "*", + "ext-json": "*", + "ext-openssl": "*", + "ext-pcre": "*", + "pear/console_table": "1.3.1", + "php": ">=5.4.0", + "symfony/polyfill-mbstring": "^1.7" + }, + "suggest": { + "clue/buzz-react": "Required for asynchronous API calls to exchanges with PHP", + "clue/http-proxy-react": "Required for using a proxy when doing asynchronous API calls to exchanges with PHP", + "react/event-loop": "Required for asynchronous API calls to exchanges with PHP", + "recoil/react": "Required for asynchronous API calls to exchanges with PHP", + "recoil/recoil": "Required for asynchronous API calls to exchanges with PHP" + }, + "type": "library", + "autoload": { + "files": [ + "ccxt.php" + ], + "psr-4": { + "ccxt\\": "php/", + "ccxt_async\\": "php/async/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Igor Kroitor", + "email": "igor.kroitor@gmail.com", + "homepage": "https://github.com/kroitor", + "role": "Developer" + }, + { + "name": "Vitaly Gordon", + "email": "rocket.mind@gmail.com", + "homepage": "https://github.com/xpl", + "role": "Developer" + }, + { + "name": "Carlo Revelli", + "email": "carlo.revelli@berkeley.edu", + "homepage": "https://github.com/frosty00", + "role": "Junior Developer" + } + ], + "description": "A JavaScript / Python / PHP cryptocurrency trading library with support for more than 90 bitcoin/altcoin exchanges", + "homepage": "https://github.com/ccxt/ccxt", + "keywords": [ + "1BTCXE", + "1Broker", + "ACX", + "ANX", + "ANXPro", + "BL3P", + "BTC Markets", + "BTC Trade UA", + "BTCC", + "BTCChina", + "BTCExchange", + "BTCTrader", + "BTCTurk", + "BTCX", + "BX.in.th", + "Bit2C", + "BitBay", + "BitBays", + "BitMEX", + "BitMarket", + "Bitcoin.co.id", + "Bleutrade", + "BlinkTrade", + "BtcBox", + "Bter.com", + "C-CEX", + "CEX.IO", + "CHBTC", + "CNY", + "ChileBit", + "CoinMate", + "CoinSpot", + "Coinsecure", + "Crypto Capital", + "DOGE", + "EUR", + "EXMO", + "FYB-SE", + "FYB-SG", + "FoxBit", + "Gatecoin", + "Gemini", + "Huobi", + "HuobiPRO", + "LakeBTC", + "Liqui", + "LiveCoin", + "OKCoin", + "OKCoin.cn", + "OKCoin.com", + "OKEX", + "Paymium", + "Poloniex", + "QUOINE", + "Qryptos", + "QuadrigaCX", + "Southxchange", + "SurBitcoin", + "TheRockTrading", + "Tidex", + "USD", + "UrduBit", + "VBTC", + "Vaultoro", + "VirWoX", + "Wex", + "YoBit", + "Zaif", + "acx.io", + "algorithmic", + "algotrading", + "altcoin", + "altcoins", + "api", + "arbitrage", + "backtest", + "backtesting", + "binance", + "binance.com", + "bit2c.co.il", + "bitcoin", + "bitcoincoid", + "bitfinex", + "bitflyer", + "bitflyer.jp", + "bithumb", + "bithumb.com", + "bitlish", + "bitso", + "bitstamp", + "bittrex", + "bleutrade.com", + "bot", + "btc", + "btc-e", + "btc-trade.com.ua", + "btc-x", + "btcbox.co.jp", + "btce", + "btcexchange.ph", + "btcmarkets", + "btcmarkets.net", + "btctrader.com", + "btcturk.com", + "bter", + "ccex", + "cex", + "chilebit.net", + "coin", + "coincheck", + "coingi", + "coingi.com", + "coinmarketcap", + "coins", + "coinspot.com.au", + "crypto", + "crypto currency", + "crypto market", + "cryptocapital.co", + "cryptocurrency", + "currencies", + "currency", + "darkcoin", + "dash", + "digital currency", + "dogecoin", + "dsx", + "dsx.uk", + "e-commerce", + "etc", + "eth", + "ether", + "ethereum", + "exchange", + "exchanges", + "flowBTC", + "flowbtc.com", + "foxbit.exchange", + "framework", + "gdax", + "hitbtc", + "huobi.pro", + "independent reserve", + "independentreserve.com", + "invest", + "investing", + "investor", + "itBit", + "jubi.com", + "kraken", + "lakebtc.com", + "library", + "light", + "liqui.io", + "litecoin", + "ltc", + "luno", + "market", + "market data", + "markets", + "mercado", + "mercadobitcoin", + "mercadobitcoin.br", + "merchandise", + "merchant", + "minimal", + "mixcoins", + "mixcoins.com", + "nova", + "novaexchange", + "novaexchange.com", + "okex.com", + "order", + "order book", + "orderbook", + "price", + "price data", + "pricefeed", + "private", + "public", + "ripple", + "strategy", + "surbitcoin.com", + "tidex.com", + "toolkit", + "trade", + "trader", + "trading", + "urdubit.com", + "vbtc.exchange", + "vbtc.vn", + "volume", + "wex.nz", + "xBTCe", + "xbt", + "xbtce.com", + "xrp", + "yobit.net", + "yunbi", + "zec", + "zerocoin" + ], + "support": { + "issues": "https://github.com/ccxt/ccxt/issues", + "source": "https://github.com/ccxt/ccxt/tree/1.53.1" + }, + "funding": [ + { + "url": "https://opencollective.com/ccxt", + "type": "open_collective" + } + ], + "time": "2021-07-13T22:50:19+00:00" + }, + { + "name": "pear/console_table", + "version": "v1.3.1", + "source": { + "type": "git", + "url": "https://github.com/pear/Console_Table.git", + "reference": "1930c11897ca61fd24b95f2f785e99e0f36dcdea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pear/Console_Table/zipball/1930c11897ca61fd24b95f2f785e99e0f36dcdea", + "reference": "1930c11897ca61fd24b95f2f785e99e0f36dcdea", + "shasum": "" + }, + "require": { + "php": ">=5.2.0" + }, + "suggest": { + "pear/Console_Color2": ">=0.1.2" + }, + "type": "library", + "autoload": { + "classmap": [ + "Table.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Jan Schneider", + "homepage": "http://pear.php.net/user/yunosh" + }, + { + "name": "Tal Peer", + "homepage": "http://pear.php.net/user/tal" + }, + { + "name": "Xavier Noguer", + "homepage": "http://pear.php.net/user/xnoguer" + }, + { + "name": "Richard Heyes", + "homepage": "http://pear.php.net/user/richard" + } + ], + "description": "Library that makes it easy to build console style tables.", + "homepage": "http://pear.php.net/package/Console_Table/", + "keywords": [ + "console" + ], + "support": { + "issues": "http://pear.php.net/bugs/search.php?cmd=display&package_name[]=Console_Table", + "source": "https://github.com/pear/Console_Table" + }, + "time": "2018-01-25T20:47:17+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493", + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493", + "shasum": "" + }, + "require": { + "ext-iconv": "*", + "php": ">=7.2" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-12-23T08:48:59+00:00" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": {}, + "prefer-stable": false, + "prefer-lowest": false, + "platform": {}, + "platform-dev": {}, + "plugin-api-version": "2.6.0" +} diff --git a/data/cache/fund_001071.json b/data/cache/fund_001071.json new file mode 100644 index 0000000..0ccb1f1 --- /dev/null +++ b/data/cache/fund_001071.json @@ -0,0 +1 @@ +{"fundcode":"001071","name":"华安媒体互联网混合A","jzrq":"2025-11-04","dwjz":"4.0040","gsz":"4.0034","gszzl":"-0.01","gztime":"2025-11-05 14:32"} \ No newline at end of file diff --git a/data/cache/fund_003567.json b/data/cache/fund_003567.json new file mode 100644 index 0000000..ea9a36d --- /dev/null +++ b/data/cache/fund_003567.json @@ -0,0 +1 @@ +{"fundcode":"003567","name":"华夏行业景气混合A","jzrq":"2025-11-04","dwjz":"4.7305","gsz":"4.7463","gszzl":"0.33","gztime":"2025-11-05 14:31"} \ No newline at end of file diff --git a/data/cache/fund_003598.json b/data/cache/fund_003598.json new file mode 100644 index 0000000..0809de3 --- /dev/null +++ b/data/cache/fund_003598.json @@ -0,0 +1 @@ +{"fundcode":"003598","name":"华商润丰灵活配置混合A","jzrq":"2025-11-17","dwjz":"4.4470","gsz":"4.4728","gszzl":"0.58","gztime":"2025-11-18 11:30"} \ No newline at end of file diff --git a/data/cache/fund_003766.json b/data/cache/fund_003766.json new file mode 100644 index 0000000..f0a87b8 --- /dev/null +++ b/data/cache/fund_003766.json @@ -0,0 +1 @@ +{"fundcode":"003766","name":"广发创业板ETF发起式联接C","jzrq":"2025-11-17","dwjz":"1.6787","gsz":"1.6715","gszzl":"-0.43","gztime":"2025-11-18 11:30"} \ No newline at end of file diff --git a/data/cache/fund_004206.json b/data/cache/fund_004206.json new file mode 100644 index 0000000..077c12b --- /dev/null +++ b/data/cache/fund_004206.json @@ -0,0 +1 @@ +{"fundcode":"004206","name":"华商元亨混合A","jzrq":"2025-11-17","dwjz":"2.8457","gsz":"2.8656","gszzl":"0.70","gztime":"2025-11-18 11:30"} \ No newline at end of file diff --git a/data/cache/fund_005965.json b/data/cache/fund_005965.json new file mode 100644 index 0000000..994b47d --- /dev/null +++ b/data/cache/fund_005965.json @@ -0,0 +1 @@ +{"fundcode":"005965","name":"安信中证500指数增强A","jzrq":"2025-11-05","dwjz":"2.2797","gsz":"2.3164","gszzl":"1.61","gztime":"2025-11-06 15:00"} \ No newline at end of file diff --git a/data/cache/fund_008327.json b/data/cache/fund_008327.json new file mode 100644 index 0000000..50829ab --- /dev/null +++ b/data/cache/fund_008327.json @@ -0,0 +1 @@ +{"fundcode":"008327","name":"东财通信C","jzrq":"2025-11-17","dwjz":"2.2664","gsz":"2.3015","gszzl":"1.55","gztime":"2025-11-18 11:30"} \ No newline at end of file diff --git a/data/cache/fund_011103.json b/data/cache/fund_011103.json new file mode 100644 index 0000000..66b83cd --- /dev/null +++ b/data/cache/fund_011103.json @@ -0,0 +1 @@ +{"fundcode":"011103","name":"天弘中证光伏产业指数C","jzrq":"2025-11-17","dwjz":"0.8674","gsz":"0.8492","gszzl":"-2.10","gztime":"2025-11-18 11:30"} \ No newline at end of file diff --git a/data/cache/fund_011815.json b/data/cache/fund_011815.json new file mode 100644 index 0000000..7713c1e --- /dev/null +++ b/data/cache/fund_011815.json @@ -0,0 +1 @@ +{"fundcode":"011815","name":"恒越优势精选混合","jzrq":"2025-11-17","dwjz":"1.4577","gsz":"1.4411","gszzl":"-1.14","gztime":"2025-11-18 11:30"} \ No newline at end of file diff --git a/data/cache/fund_012863.json b/data/cache/fund_012863.json new file mode 100644 index 0000000..1618f2b --- /dev/null +++ b/data/cache/fund_012863.json @@ -0,0 +1 @@ +{"fundcode":"012863","name":"汇添富中证电池主题ETF发起式联接C","jzrq":"2025-11-17","dwjz":"0.8622","gsz":"0.8287","gszzl":"-3.89","gztime":"2025-11-18 11:30"} \ No newline at end of file diff --git a/data/cache/fund_014320.json b/data/cache/fund_014320.json new file mode 100644 index 0000000..038e260 --- /dev/null +++ b/data/cache/fund_014320.json @@ -0,0 +1 @@ +{"fundcode":"014320","name":"德邦半导体产业混合发起式C","jzrq":"2025-11-04","dwjz":"1.8891","gsz":"1.8863","gszzl":"-0.15","gztime":"2025-11-05 14:30"} \ No newline at end of file diff --git a/data/cache/fund_017560.json b/data/cache/fund_017560.json new file mode 100644 index 0000000..75e5805 --- /dev/null +++ b/data/cache/fund_017560.json @@ -0,0 +1 @@ +{"fundcode":"017560","name":"华安上证科创板芯片ETF发起式联接C","jzrq":"2025-11-17","dwjz":"2.0604","gsz":"2.1035","gszzl":"2.09","gztime":"2025-11-18 11:30"} \ No newline at end of file diff --git a/data/cache/fund_018994.json b/data/cache/fund_018994.json new file mode 100644 index 0000000..5938f36 --- /dev/null +++ b/data/cache/fund_018994.json @@ -0,0 +1 @@ +{"fundcode":"018994","name":"中欧数字经济混合发起C","jzrq":"2025-11-04","dwjz":"2.8974","gsz":"2.8941","gszzl":"-0.11","gztime":"2025-11-05 14:31"} \ No newline at end of file diff --git a/data/cache/fund_019432.json b/data/cache/fund_019432.json new file mode 100644 index 0000000..553856d --- /dev/null +++ b/data/cache/fund_019432.json @@ -0,0 +1 @@ +{"fundcode":"019432","name":"永赢睿信混合C","jzrq":"2025-11-04","dwjz":"2.0302","gsz":"2.0390","gszzl":"0.43","gztime":"2025-11-05 14:31"} \ No newline at end of file diff --git a/data/cache/fund_022364.json b/data/cache/fund_022364.json new file mode 100644 index 0000000..c30fe45 --- /dev/null +++ b/data/cache/fund_022364.json @@ -0,0 +1 @@ +{"fundcode":"022364","name":"永赢科技智选混合发起A","jzrq":"2025-11-17","dwjz":"3.2462","gsz":"3.2874","gszzl":"1.27","gztime":"2025-11-18 11:30"} \ No newline at end of file diff --git a/data/cache/fund_022365.json b/data/cache/fund_022365.json new file mode 100644 index 0000000..6b0652c --- /dev/null +++ b/data/cache/fund_022365.json @@ -0,0 +1 @@ +{"fundcode":"022365","name":"永赢科技智选混合发起C","jzrq":"2025-11-17","dwjz":"3.2251","gsz":"3.2661","gszzl":"1.27","gztime":"2025-11-18 11:30"} \ No newline at end of file diff --git a/data/cache/fund_023350.json b/data/cache/fund_023350.json new file mode 100644 index 0000000..bdbb7fb --- /dev/null +++ b/data/cache/fund_023350.json @@ -0,0 +1 @@ +{"fundcode":"023350","name":"诺安多策略混合C","jzrq":"2025-11-17","dwjz":"3.4440","gsz":"3.4001","gszzl":"-1.27","gztime":"2025-11-18 11:30"} \ No newline at end of file diff --git a/data/fund_config.json b/data/fund_config.json new file mode 100644 index 0000000..f9196c3 --- /dev/null +++ b/data/fund_config.json @@ -0,0 +1,70 @@ +[ + { + "channel": "1", + "fund_code": "003766", + "investment": 1000 + }, + { + "channel": "1", + "fund_code": "008327", + "investment": 1000 + }, + { + "channel": "1", + "fund_code": "012863", + "investment": 10000 + }, + { + "channel": "1", + "fund_code": "023350", + "investment": 1000 + }, + { + "channel": "1", + "fund_code": "017560", + "investment": 1000, + "name": "基金017560" + }, + { + "channel": "2", + "fund_code": "011815", + "investment": 1000, + "name": "基金011815" + }, + { + "channel": "2", + "fund_code": "003598", + "investment": 1000, + "name": "基金003598" + }, + { + "channel": "2", + "fund_code": "004206", + "investment": 1000, + "name": "基金004206" + }, + { + "channel": "2", + "fund_code": "022365", + "investment": 1000, + "name": "基金022365" + }, + { + "channel": "2", + "fund_code": "022364", + "investment": 1000, + "name": "基金022364" + }, + { + "channel": "2", + "fund_code": "011103", + "investment": 1000, + "name": "基金011103" + }, + { + "channel": "0", + "fund_code": "025825", + "investment": 1000, + "name": "基金025825" + } +] \ No newline at end of file diff --git a/data/fund_daily_data.json b/data/fund_daily_data.json new file mode 100644 index 0000000..397c816 --- /dev/null +++ b/data/fund_daily_data.json @@ -0,0 +1,417 @@ +{ + "last_update": "2025-11-18", + "funds": { + "003766": [ + { + "date": "2025-11-13", + "dwjz": "1.6881", + "gsz": "1.7333", + "gszzl": 2.68, + "name": "广发创业板ETF发起式联接C" + }, + { + "date": "2025-11-14", + "dwjz": "1.6881", + "gsz": "1.7311", + "gszzl": 2.55, + "name": "广发创业板ETF发起式联接C" + }, + { + "date": "2025-11-15", + "dwjz": "1.7298", + "gsz": "1.6810", + "gszzl": -2.82, + "name": "广发创业板ETF发起式联接C" + }, + { + "date": "2025-11-17", + "dwjz": "1.6821", + "gsz": "1.6687", + "gszzl": -0.8, + "name": "广发创业板ETF发起式联接C" + }, + { + "date": "2025-11-18", + "dwjz": "1.6787", + "gsz": "1.6715", + "gszzl": -0.43, + "name": "广发创业板ETF发起式联接C" + } + ], + "004206": [ + { + "date": "2025-11-13", + "dwjz": "2.8892", + "gsz": "2.8806", + "gszzl": -0.3, + "name": "华商元亨混合A" + }, + { + "date": "2025-11-14", + "dwjz": "2.8892", + "gsz": "2.8838", + "gszzl": -0.19, + "name": "华商元亨混合A" + }, + { + "date": "2025-11-15", + "dwjz": "2.8883", + "gsz": "2.8402", + "gszzl": -1.67, + "name": "华商元亨混合A" + }, + { + "date": "2025-11-17", + "dwjz": "2.8446", + "gsz": "2.8475", + "gszzl": 0.1, + "name": "华商元亨混合A" + }, + { + "date": "2025-11-18", + "dwjz": "2.8457", + "gsz": "2.8656", + "gszzl": 0.7, + "name": "华商元亨混合A" + } + ], + "019432": [], + "003598": [ + { + "date": "2025-11-13", + "dwjz": "4.5150", + "gsz": "4.5074", + "gszzl": -0.17, + "name": "华商润丰灵活配置混合A" + }, + { + "date": "2025-11-14", + "dwjz": "4.5150", + "gsz": "4.5110", + "gszzl": -0.09, + "name": "华商润丰灵活配置混合A" + }, + { + "date": "2025-11-15", + "dwjz": "4.5140", + "gsz": "4.4384", + "gszzl": -1.68, + "name": "华商润丰灵活配置混合A" + }, + { + "date": "2025-11-17", + "dwjz": "4.4460", + "gsz": "4.4501", + "gszzl": 0.09, + "name": "华商润丰灵活配置混合A" + }, + { + "date": "2025-11-18", + "dwjz": "4.4470", + "gsz": "4.4728", + "gszzl": 0.58, + "name": "华商润丰灵活配置混合A" + } + ], + "001071": [], + "018994": [], + "003567": [], + "008327": [ + { + "date": "2025-11-13", + "dwjz": "2.3307", + "gsz": "2.3179", + "gszzl": -0.55, + "name": "东财通信C" + }, + { + "date": "2025-11-14", + "dwjz": "2.3307", + "gsz": "2.3211", + "gszzl": -0.41, + "name": "东财通信C" + }, + { + "date": "2025-11-15", + "dwjz": "2.3215", + "gsz": "2.2421", + "gszzl": -3.42, + "name": "东财通信C" + }, + { + "date": "2025-11-17", + "dwjz": "2.2458", + "gsz": "2.2503", + "gszzl": 0.2, + "name": "东财通信C" + }, + { + "date": "2025-11-18", + "dwjz": "2.2664", + "gsz": "2.3015", + "gszzl": 1.55, + "name": "东财通信C" + } + ], + "012863": [ + { + "date": "2025-11-13", + "dwjz": "0.8305", + "gsz": "0.8876", + "gszzl": 6.88, + "name": "汇添富中证电池主题ETF发起式联接C" + }, + { + "date": "2025-11-14", + "dwjz": "0.8305", + "gsz": "0.8790", + "gszzl": 5.84, + "name": "汇添富中证电池主题ETF发起式联接C" + }, + { + "date": "2025-11-15", + "dwjz": "0.8749", + "gsz": "0.8536", + "gszzl": -2.43, + "name": "汇添富中证电池主题ETF发起式联接C" + }, + { + "date": "2025-11-17", + "dwjz": "0.8554", + "gsz": "0.8533", + "gszzl": -0.25, + "name": "汇添富中证电池主题ETF发起式联接C" + }, + { + "date": "2025-11-18", + "dwjz": "0.8622", + "gsz": "0.8287", + "gszzl": -3.89, + "name": "汇添富中证电池主题ETF发起式联接C" + } + ], + "017560": [ + { + "date": "2025-11-13", + "dwjz": "2.0965", + "gsz": "2.1388", + "gszzl": 2.02, + "name": "华安上证科创板芯片ETF发起式联接C" + }, + { + "date": "2025-11-14", + "dwjz": "2.0965", + "gsz": "2.1298", + "gszzl": 1.59, + "name": "华安上证科创板芯片ETF发起式联接C" + }, + { + "date": "2025-11-15", + "dwjz": "2.1276", + "gsz": "2.0595", + "gszzl": -3.2, + "name": "华安上证科创板芯片ETF发起式联接C" + }, + { + "date": "2025-11-17", + "dwjz": "2.0636", + "gsz": "2.0543", + "gszzl": -0.45, + "name": "华安上证科创板芯片ETF发起式联接C" + }, + { + "date": "2025-11-18", + "dwjz": "2.0604", + "gsz": "2.1035", + "gszzl": 2.09, + "name": "华安上证科创板芯片ETF发起式联接C" + } + ], + "014320": [], + "023350": [ + { + "date": "2025-11-13", + "dwjz": "3.3700", + "gsz": "3.3903", + "gszzl": 0.6, + "name": "诺安多策略混合C" + }, + { + "date": "2025-11-14", + "dwjz": "3.3700", + "gsz": "3.3953", + "gszzl": 0.75, + "name": "诺安多策略混合C" + }, + { + "date": "2025-11-15", + "dwjz": "3.3960", + "gsz": "3.3999", + "gszzl": 0.12, + "name": "诺安多策略混合C" + }, + { + "date": "2025-11-17", + "dwjz": "3.4210", + "gsz": "3.4273", + "gszzl": 0.19, + "name": "诺安多策略混合C" + }, + { + "date": "2025-11-18", + "dwjz": "3.4440", + "gsz": "3.4001", + "gszzl": -1.27, + "name": "诺安多策略混合C" + } + ], + "011815": [ + { + "date": "2025-11-13", + "dwjz": "1.4696", + "gsz": "1.4957", + "gszzl": 1.77, + "name": "恒越优势精选混合" + }, + { + "date": "2025-11-14", + "dwjz": "1.4696", + "gsz": "1.4972", + "gszzl": 1.88, + "name": "恒越优势精选混合" + }, + { + "date": "2025-11-15", + "dwjz": "1.5174", + "gsz": "1.4674", + "gszzl": -3.3, + "name": "恒越优势精选混合" + }, + { + "date": "2025-11-17", + "dwjz": "1.4704", + "gsz": "1.4620", + "gszzl": -0.57, + "name": "恒越优势精选混合" + }, + { + "date": "2025-11-18", + "dwjz": "1.4577", + "gsz": "1.4411", + "gszzl": -1.14, + "name": "恒越优势精选混合" + } + ], + "022365": [ + { + "date": "2025-11-13", + "dwjz": "3.3255", + "gsz": "3.3140", + "gszzl": -0.35, + "name": "永赢科技智选混合发起C" + }, + { + "date": "2025-11-14", + "dwjz": "3.3255", + "gsz": "3.3135", + "gszzl": -0.36, + "name": "永赢科技智选混合发起C" + }, + { + "date": "2025-11-15", + "dwjz": "3.3157", + "gsz": "3.2108", + "gszzl": -3.16, + "name": "永赢科技智选混合发起C" + }, + { + "date": "2025-11-17", + "dwjz": "3.2003", + "gsz": "3.1977", + "gszzl": -0.08, + "name": "永赢科技智选混合发起C" + }, + { + "date": "2025-11-18", + "dwjz": "3.2251", + "gsz": "3.2661", + "gszzl": 1.27, + "name": "永赢科技智选混合发起C" + } + ], + "022364": [ + { + "date": "2025-11-13", + "dwjz": "3.3470", + "gsz": "3.3354", + "gszzl": -0.35, + "name": "永赢科技智选混合发起A" + }, + { + "date": "2025-11-14", + "dwjz": "3.3470", + "gsz": "3.3349", + "gszzl": -0.36, + "name": "永赢科技智选混合发起A" + }, + { + "date": "2025-11-15", + "dwjz": "3.3372", + "gsz": "3.2316", + "gszzl": -3.16, + "name": "永赢科技智选混合发起A" + }, + { + "date": "2025-11-17", + "dwjz": "3.2210", + "gsz": "3.2184", + "gszzl": -0.08, + "name": "永赢科技智选混合发起A" + }, + { + "date": "2025-11-18", + "dwjz": "3.2462", + "gsz": "3.2874", + "gszzl": 1.27, + "name": "永赢科技智选混合发起A" + } + ], + "011103": [ + { + "date": "2025-11-13", + "dwjz": "0.8716", + "gsz": "0.8954", + "gszzl": 2.73, + "name": "天弘中证光伏产业指数C" + }, + { + "date": "2025-11-14", + "dwjz": "0.8716", + "gsz": "0.8887", + "gszzl": 1.96, + "name": "天弘中证光伏产业指数C" + }, + { + "date": "2025-11-15", + "dwjz": "0.8875", + "gsz": "0.8779", + "gszzl": -1.08, + "name": "天弘中证光伏产业指数C" + }, + { + "date": "2025-11-17", + "dwjz": "0.8786", + "gsz": "0.8612", + "gszzl": -1.98, + "name": "天弘中证光伏产业指数C" + }, + { + "date": "2025-11-18", + "dwjz": "0.8674", + "gsz": "0.8492", + "gszzl": -2.1, + "name": "天弘中证光伏产业指数C" + } + ] + } +} \ No newline at end of file diff --git a/data/fund_history.json b/data/fund_history.json new file mode 100644 index 0000000..d033511 --- /dev/null +++ b/data/fund_history.json @@ -0,0 +1,119 @@ +{ + "last_update": "2025-10-29", + "data": [], + "yesterday_data": { + "003766": { + "date": "2025-11-17", + "change": -0.07, + "name": "广发创业板ETF发起式联接C" + }, + "008327": { + "date": "2025-11-17", + "change": 1.14, + "name": "东财通信C" + }, + "012863": { + "date": "2025-11-17", + "change": 0.81, + "name": "汇添富中证电池主题ETF发起式联接C" + }, + "023350": { + "date": "2025-11-17", + "change": 0.11, + "name": "诺安多策略混合C" + }, + "017560": { + "date": "2025-11-17", + "change": 0.27, + "name": "华安上证科创板芯片ETF发起式联接C" + }, + "011815": { + "date": "2025-11-17", + "change": -0.36, + "name": "恒越优势精选混合" + }, + "003598": { + "date": "2025-11-17", + "change": 0.57, + "name": "华商润丰灵活配置混合A" + }, + "004206": { + "date": "2025-11-17", + "change": 0.58, + "name": "华商元亨混合A" + }, + "022365": { + "date": "2025-11-17", + "change": 0.62, + "name": "永赢科技智选混合发起C" + }, + "022364": { + "date": "2025-11-17", + "change": 0.62, + "name": "永赢科技智选混合发起A" + }, + "011103": { + "date": "2025-11-17", + "change": -1.26, + "name": "天弘中证光伏产业指数C" + } + }, + "today_data": { + "003766": { + "date": "2025-11-18", + "change": -0.43, + "name": "广发创业板ETF发起式联接C" + }, + "008327": { + "date": "2025-11-18", + "change": 1.55, + "name": "东财通信C" + }, + "012863": { + "date": "2025-11-18", + "change": -3.89, + "name": "汇添富中证电池主题ETF发起式联接C" + }, + "023350": { + "date": "2025-11-18", + "change": -1.27, + "name": "诺安多策略混合C" + }, + "017560": { + "date": "2025-11-18", + "change": 2.09, + "name": "华安上证科创板芯片ETF发起式联接C" + }, + "011815": { + "date": "2025-11-18", + "change": -1.14, + "name": "恒越优势精选混合" + }, + "003598": { + "date": "2025-11-18", + "change": 0.58, + "name": "华商润丰灵活配置混合A" + }, + "004206": { + "date": "2025-11-18", + "change": 0.7, + "name": "华商元亨混合A" + }, + "022365": { + "date": "2025-11-18", + "change": 1.27, + "name": "永赢科技智选混合发起C" + }, + "022364": { + "date": "2025-11-18", + "change": 1.27, + "name": "永赢科技智选混合发起A" + }, + "011103": { + "date": "2025-11-18", + "change": -2.1, + "name": "天弘中证光伏产业指数C" + } + }, + "last_update_date": "2025-11-18" +} \ No newline at end of file diff --git a/data/fund_names.json b/data/fund_names.json new file mode 100644 index 0000000..9a8e911 --- /dev/null +++ b/data/fund_names.json @@ -0,0 +1,22 @@ +{ + "003766": "汇添富医疗服务混合", + "0": "易方达消费行业股票", + "001714": "工银文体产业股票", + "000241": "中欧时代先锋股票", + "001475": "易方达国防军工混合", + "1": "招商中证白酒指数", + "000689": "前海开源新经济混合", + "001102": "前海开源国家比较优势混合", + "001593": "天弘创业板ETF联接", + "000971": "高升沪深300指数增强", + "004206": "华商元亨混合A", + "019432": "永赢睿信混合C", + "003598": "华商润丰灵活配置混合A", + "001071": "华安媒体互联网混合A", + "018994": "中欧数字经济混合发起C", + "003567": "华夏行业景气混合A", + "008327": "东财通信C", + "012863": "汇添富中证电池主题ETF发起式联接C", + "014320": "德邦半导体产业混合发起式C", + "023350": "诺安多策略混合C" +} \ No newline at end of file diff --git a/data/last_cleanup.txt b/data/last_cleanup.txt new file mode 100644 index 0000000..35b53de --- /dev/null +++ b/data/last_cleanup.txt @@ -0,0 +1 @@ +1762443884 \ No newline at end of file diff --git a/data/operation_log.json b/data/operation_log.json new file mode 100644 index 0000000..d9131e8 --- /dev/null +++ b/data/operation_log.json @@ -0,0 +1,269 @@ +{ + "0": { + "timestamp": "2025-11-11 13:41:58", + "action": "管理员登录", + "ip": "113.87.139.184" + }, + "1": { + "timestamp": "2025-11-06 08:31:27", + "action": "管理员登录", + "ip": "113.87.138.191" + }, + "2": { + "timestamp": "2025-11-05 14:45:57", + "action": "管理员登录", + "ip": "113.87.138.191" + }, + "3": { + "timestamp": "2025-11-05 14:34:30", + "action": "管理员登录", + "ip": "113.87.138.191" + }, + "4": { + "timestamp": "2025-11-05 09:47:16", + "action": "管理员登录", + "ip": "113.87.138.191" + }, + "5": { + "timestamp": "2025-11-01 23:18:46", + "action": "管理员登录", + "ip": "113.87.139.206" + }, + "6": { + "timestamp": "2025-10-31 23:11:13", + "action": "管理员登录", + "ip": "113.84.8.124" + }, + "7": { + "timestamp": "2025-10-31 10:20:41", + "action": "管理员注销", + "ip": "113.87.137.255" + }, + "8": { + "timestamp": "2025-10-31 10:18:31", + "action": "管理员登录", + "ip": "113.87.137.255" + }, + "9": { + "timestamp": "2025-10-31 09:08:47", + "action": "管理员登录", + "ip": "113.87.137.255" + }, + "10": { + "timestamp": "2025-10-30 21:05:23", + "action": "管理员登录", + "ip": "113.87.139.170" + }, + "11": { + "timestamp": "2025-10-30 17:28:24", + "action": "管理员注销", + "ip": "113.87.137.255" + }, + "12": { + "timestamp": "2025-10-30 17:14:21", + "action": "管理员登录", + "ip": "113.87.137.255" + }, + "operations": [ + { + "id": "6902c8ca52d34", + "type": "add", + "fund_code": "123123", + "channel": "0", + "investment": 1000, + "details": "添加基金", + "timestamp": 1761790154, + "date": "2025-10-30 10:09:14" + }, + { + "id": "6902c8d11928c", + "type": "delete", + "fund_code": "123123", + "channel": "0", + "investment": 1000, + "details": "删除基金", + "timestamp": 1761790161, + "date": "2025-10-30 10:09:21" + }, + { + "id": "690303ba12e0b", + "type": "delete", + "fund_code": "017560", + "channel": "1", + "investment": 1000, + "details": "删除基金", + "timestamp": 1761805242, + "date": "2025-10-30 14:20:42" + }, + { + "id": "690aeffc99bf3", + "type": "delete", + "fund_code": "003766", + "channel": "0", + "investment": 10000, + "details": "删除基金", + "timestamp": 1762324476, + "date": "2025-11-05 14:34:36" + }, + { + "id": "690af008d8578", + "type": "delete", + "fund_code": "018994", + "channel": "0", + "investment": 1000, + "details": "删除基金", + "timestamp": 1762324488, + "date": "2025-11-05 14:34:48" + }, + { + "id": "690af00b6106c", + "type": "delete", + "fund_code": "003567", + "channel": "0", + "investment": 1000, + "details": "删除基金", + "timestamp": 1762324491, + "date": "2025-11-05 14:34:51" + }, + { + "id": "690af00e849e6", + "type": "delete", + "fund_code": "014320", + "channel": "1", + "investment": 1000, + "details": "删除基金", + "timestamp": 1762324494, + "date": "2025-11-05 14:34:54" + }, + { + "id": "690af0623f151", + "type": "delete", + "fund_code": "001071", + "channel": "0", + "investment": 1000, + "details": "删除基金", + "timestamp": 1762324578, + "date": "2025-11-05 14:36:18" + }, + { + "id": "690af06459fbc", + "type": "delete", + "fund_code": "004206", + "channel": "0", + "investment": 1000, + "details": "删除基金", + "timestamp": 1762324580, + "date": "2025-11-05 14:36:20" + }, + { + "id": "690af06641d8c", + "type": "delete", + "fund_code": "019432", + "channel": "0", + "investment": 1000, + "details": "删除基金", + "timestamp": 1762324582, + "date": "2025-11-05 14:36:22" + }, + { + "id": "690af0683bed6", + "type": "delete", + "fund_code": "003598", + "channel": "0", + "investment": 1000, + "details": "删除基金", + "timestamp": 1762324584, + "date": "2025-11-05 14:36:24" + }, + { + "id": "690becaa0e959", + "type": "add", + "fund_code": "017560", + "channel": "1", + "investment": 1000, + "details": "添加基金", + "timestamp": 1762389162, + "date": "2025-11-06 08:32:42" + }, + { + "id": "6912cce74b4c7", + "type": "add", + "fund_code": "011815", + "channel": "1", + "investment": 1000, + "details": "添加基金", + "timestamp": 1762839783, + "date": "2025-11-11 13:43:03" + }, + { + "id": "6912cd0a18557", + "type": "update", + "fund_code": "011815", + "channel": "2", + "investment": 1000, + "details": "更新基金: 投资金额 1000 -> 1000", + "timestamp": 1762839818, + "date": "2025-11-11 13:43:38" + }, + { + "id": "6912cd214bbaa", + "type": "add", + "fund_code": "003598", + "channel": "2", + "investment": 1000, + "details": "添加基金", + "timestamp": 1762839841, + "date": "2025-11-11 13:44:01" + }, + { + "id": "6912cd2e79b67", + "type": "add", + "fund_code": "004206", + "channel": "2", + "investment": 1000, + "details": "添加基金", + "timestamp": 1762839854, + "date": "2025-11-11 13:44:14" + }, + { + "id": "6912cd3839737", + "type": "add", + "fund_code": "022365", + "channel": "2", + "investment": 1000, + "details": "添加基金", + "timestamp": 1762839864, + "date": "2025-11-11 13:44:24" + }, + { + "id": "6912cd4373db8", + "type": "add", + "fund_code": "022364", + "channel": "2", + "investment": 1000, + "details": "添加基金", + "timestamp": 1762839875, + "date": "2025-11-11 13:44:35" + }, + { + "id": "6912cd51cdd4c", + "type": "add", + "fund_code": "011103", + "channel": "2", + "investment": 1000, + "details": "添加基金", + "timestamp": 1762839889, + "date": "2025-11-11 13:44:49" + }, + { + "id": "6912cd644111a", + "type": "add", + "fund_code": "025825", + "channel": "0", + "investment": 1000, + "details": "添加基金", + "timestamp": 1762839908, + "date": "2025-11-11 13:45:08" + } + ] +} \ No newline at end of file diff --git a/data/recommend_logs.json b/data/recommend_logs.json new file mode 100644 index 0000000..ab4f591 --- /dev/null +++ b/data/recommend_logs.json @@ -0,0 +1,9 @@ +[ + { + "action": "recommend_fund", + "timestamp": "2025-10-31 16:33:53", + "fund_code": "005965", + "fund_name": "\u5b89\u4fe1\u4e2d\u8bc1500\u6307\u6570\u589e\u5f3aA", + "ip": "113.87.137.255" + } +] \ No newline at end of file diff --git a/data/recommended_funds.json b/data/recommended_funds.json new file mode 100644 index 0000000..124d59e --- /dev/null +++ b/data/recommended_funds.json @@ -0,0 +1,11 @@ +[ + { + "fund_code": "005965", + "ip": "113.87.137.255", + "timestamp": "2025-10-31 16:33:53", + "channel": "网站推荐", + "amount": 1000, + "status": "pending", + "fund_name": "安信中证500指数增强A" + } +] \ No newline at end of file diff --git a/data/stats.json b/data/stats.json new file mode 100644 index 0000000..692555a --- /dev/null +++ b/data/stats.json @@ -0,0 +1,93 @@ +{ + "total_visits": 613, + "today_visits": 1, + "unique_visitors": 63, + "last_reset": "2025-11-18", + "daily_stats": { + "2025-10-28": 55, + "2025-10-29": 195, + "2025-10-30": 206, + "2025-10-31": 18, + "2025-11-01": 4, + "2025-11-02": 2, + "2025-11-03": 12, + "2025-11-04": 6, + "2025-11-05": 11, + "2025-11-06": 9, + "2025-11-07": 7, + "2025-11-10": 5, + "2025-11-11": 11, + "2025-11-12": 10, + "2025-11-13": 10, + "2025-11-14": 10, + "2025-11-15": 1, + "2025-11-17": 5, + "2025-11-18": 1 + }, + "unique_ips": [ + "113.87.138.21", + "113.84.209.129", + "113.87.137.255", + "23.27.145.18", + "112.97.82.77", + "113.84.82.28", + "178.239.124.106", + "23.27.145.162", + "14.116.140.45", + "18.207.197.68", + "14.116.140.24", + "183.211.90.28", + "113.201.15.72", + "42.232.246.99", + "81.71.101.51", + "113.84.138.211", + "14.116.140.135", + "113.84.42.84", + "113.87.139.170", + "180.101.245.251", + "220.196.160.101", + "103.219.192.68", + "112.97.84.103", + "149.57.180.103", + "113.84.8.124", + "23.27.145.45", + "66.249.75.226", + "27.38.135.37", + "205.169.39.29", + "34.123.170.104", + "205.169.39.25", + "113.87.139.206", + "205.169.39.148", + "112.97.87.32", + "113.84.192.103", + "113.87.138.191", + "146.70.185.32", + "14.116.140.239", + "113.87.137.193", + "220.196.160.146", + "110.249.201.169", + "113.84.33.37", + "14.116.140.86", + "113.87.136.77", + "180.101.244.13", + "180.101.244.15", + "14.116.140.42", + "113.84.83.15", + "113.87.139.184", + "113.84.193.224", + "129.211.162.158", + "113.87.139.12", + "113.84.169.220", + "14.31.17.219", + "220.196.160.144", + "14.31.17.35", + "112.97.80.134", + "66.249.77.193", + "35.165.215.140", + "113.87.139.101", + "113.87.136.32", + "205.169.39.16", + "113.84.33.13" + ], + "today_unique_visitors": 1 +} \ No newline at end of file diff --git a/data/visits.json b/data/visits.json new file mode 100644 index 0000000..d958585 --- /dev/null +++ b/data/visits.json @@ -0,0 +1,4293 @@ +[ + { + "ip": "113.87.138.21", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36", + "timestamp": 1761624054, + "date": "2025-10-28 12:00:54", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.138.21", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36", + "timestamp": 1761624067, + "date": "2025-10-28 12:01:07", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.138.21", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36", + "timestamp": 1761624076, + "date": "2025-10-28 12:01:16", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.138.21", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36", + "timestamp": 1761624085, + "date": "2025-10-28 12:01:25", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.138.21", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36", + "timestamp": 1761624094, + "date": "2025-10-28 12:01:34", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.138.21", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36", + "timestamp": 1761624103, + "date": "2025-10-28 12:01:43", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.138.21", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36", + "timestamp": 1761624103, + "date": "2025-10-28 12:01:43", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.138.21", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36", + "timestamp": 1761624355, + "date": "2025-10-28 12:05:55", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.138.21", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36", + "timestamp": 1761624655, + "date": "2025-10-28 12:10:55", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.138.21", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36", + "timestamp": 1761624955, + "date": "2025-10-28 12:15:55", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.138.21", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36", + "timestamp": 1761625255, + "date": "2025-10-28 12:20:55", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.138.21", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36", + "timestamp": 1761625555, + "date": "2025-10-28 12:25:55", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.84.209.129", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/7.16.7.917 Mobile Safari\/537.36", + "timestamp": 1761625683, + "date": "2025-10-28 12:28:03", + "referer": "http:\/\/api.tsama.cn\/" + }, + { + "ip": "113.84.209.129", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/7.16.7.917 Mobile Safari\/537.36", + "timestamp": 1761625695, + "date": "2025-10-28 12:28:15", + "referer": "http:\/\/api.tsama.cn\/" + }, + { + "ip": "113.84.209.129", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/7.16.7.917 Mobile Safari\/537.36", + "timestamp": 1761625705, + "date": "2025-10-28 12:28:25", + "referer": "http:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.138.21", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36", + "timestamp": 1761625855, + "date": "2025-10-28 12:30:55", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.138.21", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36", + "timestamp": 1761626155, + "date": "2025-10-28 12:35:55", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.138.21", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36", + "timestamp": 1761626455, + "date": "2025-10-28 12:40:55", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.138.21", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36", + "timestamp": 1761626755, + "date": "2025-10-28 12:45:55", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.138.21", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36", + "timestamp": 1761627055, + "date": "2025-10-28 12:50:55", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.138.21", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36", + "timestamp": 1761627355, + "date": "2025-10-28 12:55:55", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.138.21", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36", + "timestamp": 1761627655, + "date": "2025-10-28 13:00:55", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.138.21", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36", + "timestamp": 1761627955, + "date": "2025-10-28 13:05:55", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.138.21", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36", + "timestamp": 1761628255, + "date": "2025-10-28 13:10:55", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.138.21", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36", + "timestamp": 1761628555, + "date": "2025-10-28 13:15:55", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.138.21", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36", + "timestamp": 1761628855, + "date": "2025-10-28 13:20:55", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.138.21", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36", + "timestamp": 1761629155, + "date": "2025-10-28 13:25:55", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/7.16.7.917 Mobile Safari\/537.36", + "timestamp": 1761629306, + "date": "2025-10-28 13:28:26", + "referer": "http:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/7.16.7.917 Mobile Safari\/537.36", + "timestamp": 1761629306, + "date": "2025-10-28 13:28:26", + "referer": "http:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.138.21", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36", + "timestamp": 1761629455, + "date": "2025-10-28 13:30:55", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.138.21", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36", + "timestamp": 1761629755, + "date": "2025-10-28 13:35:55", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.138.21", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36", + "timestamp": 1761630055, + "date": "2025-10-28 13:40:55", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.138.21", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36", + "timestamp": 1761630355, + "date": "2025-10-28 13:45:55", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "23.27.145.18", + "user_agent": "Mozilla\/5.0 (X11; Linux x86_64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/119.0.0.0 Safari\/537.36", + "timestamp": 1761630482, + "date": "2025-10-28 13:48:02", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "23.27.145.18", + "user_agent": "Mozilla\/5.0 (X11; Linux x86_64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/119.0.0.0 Safari\/537.36", + "timestamp": 1761630482, + "date": "2025-10-28 13:48:02", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.138.21", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36", + "timestamp": 1761630655, + "date": "2025-10-28 13:50:55", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.138.21", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36", + "timestamp": 1761630681, + "date": "2025-10-28 13:51:21", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.138.21", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36", + "timestamp": 1761630884, + "date": "2025-10-28 13:54:44", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.138.21", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36", + "timestamp": 1761631054, + "date": "2025-10-28 13:57:34", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.138.21", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36", + "timestamp": 1761631105, + "date": "2025-10-28 13:58:25", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.138.21", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36", + "timestamp": 1761631360, + "date": "2025-10-28 14:02:40", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.138.21", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36", + "timestamp": 1761631407, + "date": "2025-10-28 14:03:27", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.138.21", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36", + "timestamp": 1761631448, + "date": "2025-10-28 14:04:08", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.138.21", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36", + "timestamp": 1761631487, + "date": "2025-10-28 14:04:47", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761631619, + "date": "2025-10-28 14:06:59", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761631662, + "date": "2025-10-28 14:07:42", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "112.97.82.77", + "user_agent": "Mozilla\/5.0 (iPhone; CPU iPhone OS 18_7 like Mac OS X) AppleWebKit\/605.1.15 (KHTML, like Gecko) Version\/26.0.1 Mobile\/15E148 Safari\/604.1", + "timestamp": 1761631824, + "date": "2025-10-28 14:10:24", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761631920, + "date": "2025-10-28 14:12:00", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.84.82.28", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/7.16.7.917 Mobile Safari\/537.36", + "timestamp": 1761632183, + "date": "2025-10-28 14:16:23", + "referer": "http:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761632220, + "date": "2025-10-28 14:17:00", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761632520, + "date": "2025-10-28 14:22:00", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761632595, + "date": "2025-10-28 14:23:15", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "178.239.124.106", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761632674, + "date": "2025-10-28 14:24:34", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761632909, + "date": "2025-10-28 14:28:29", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761632957, + "date": "2025-10-28 14:29:17", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761633257, + "date": "2025-10-28 14:34:17", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761633557, + "date": "2025-10-28 14:39:17", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761633857, + "date": "2025-10-28 14:44:17", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761634075, + "date": "2025-10-28 14:47:55", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761634157, + "date": "2025-10-28 14:49:17", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761634457, + "date": "2025-10-28 14:54:17", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761634562, + "date": "2025-10-28 14:56:02", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761634862, + "date": "2025-10-28 15:01:02", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761635162, + "date": "2025-10-28 15:06:02", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761636303, + "date": "2025-10-28 15:25:03", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761636604, + "date": "2025-10-28 15:30:04", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761636605, + "date": "2025-10-28 15:30:05", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761636904, + "date": "2025-10-28 15:35:04", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761637204, + "date": "2025-10-28 15:40:04", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761637504, + "date": "2025-10-28 15:45:04", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761637804, + "date": "2025-10-28 15:50:04", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761638104, + "date": "2025-10-28 15:55:04", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761638106, + "date": "2025-10-28 15:55:06", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761638404, + "date": "2025-10-28 16:00:04", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761638704, + "date": "2025-10-28 16:05:04", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761639005, + "date": "2025-10-28 16:10:05", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761639006, + "date": "2025-10-28 16:10:06", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761639304, + "date": "2025-10-28 16:15:04", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761639604, + "date": "2025-10-28 16:20:04", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761639904, + "date": "2025-10-28 16:25:04", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761639905, + "date": "2025-10-28 16:25:05", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761640204, + "date": "2025-10-28 16:30:04", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761640504, + "date": "2025-10-28 16:35:04", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761640804, + "date": "2025-10-28 16:40:04", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761640806, + "date": "2025-10-28 16:40:06", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761641104, + "date": "2025-10-28 16:45:04", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761641404, + "date": "2025-10-28 16:50:04", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761641704, + "date": "2025-10-28 16:55:04", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761641706, + "date": "2025-10-28 16:55:06", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "23.27.145.162", + "user_agent": "Mozilla\/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/119.0.0.0 Safari\/537.36", + "timestamp": 1761643284, + "date": "2025-10-28 17:21:24", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761703824, + "date": "2025-10-29 10:10:24", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761704125, + "date": "2025-10-29 10:15:25", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761704126, + "date": "2025-10-29 10:15:26", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761704425, + "date": "2025-10-29 10:20:25", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/7.16.7.917 Mobile Safari\/537.36", + "timestamp": 1761704715, + "date": "2025-10-29 10:25:15", + "referer": "http:\/\/api.tsama.cn\/" + }, + { + "ip": "14.116.140.45", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/7.16.7.917 Mobile Safari\/537.36", + "timestamp": 1761704715, + "date": "2025-10-29 10:25:15", + "referer": "http:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761706306, + "date": "2025-10-29 10:51:46", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.138.21", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36", + "timestamp": 1761706433, + "date": "2025-10-29 10:53:53", + "referer": "http:\/\/tsama.cn\/" + }, + { + "ip": "113.87.138.21", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36", + "timestamp": 1761706442, + "date": "2025-10-29 10:54:02", + "referer": "http:\/\/tsama.cn\/" + }, + { + "ip": "113.87.138.21", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36", + "timestamp": 1761706450, + "date": "2025-10-29 10:54:10", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761706607, + "date": "2025-10-29 10:56:47", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761706609, + "date": "2025-10-29 10:56:49", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761706907, + "date": "2025-10-29 11:01:47", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "18.207.197.68", + "user_agent": "Mozilla\/5.0 (X11; Linux x86_64) AppleWebKit\/537.36 (KHTML, like Gecko) HeadlessChrome\/138.0.7204.23 Safari\/537.36", + "timestamp": 1761707158, + "date": "2025-10-29 11:05:58", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761707206, + "date": "2025-10-29 11:06:46", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761707507, + "date": "2025-10-29 11:11:47", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761707509, + "date": "2025-10-29 11:11:49", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.138.21", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36", + "timestamp": 1761707660, + "date": "2025-10-29 11:14:20", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761707807, + "date": "2025-10-29 11:16:47", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.138.21", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36", + "timestamp": 1761707850, + "date": "2025-10-29 11:17:30", + "referer": "https:\/\/tsama.cn\/index.html" + }, + { + "ip": "113.87.138.21", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36", + "timestamp": 1761707852, + "date": "2025-10-29 11:17:32", + "referer": "https:\/\/tsama.cn\/index.html" + }, + { + "ip": "113.87.138.21", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36", + "timestamp": 1761707853, + "date": "2025-10-29 11:17:33", + "referer": "https:\/\/tsama.cn\/index.html" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761708117, + "date": "2025-10-29 11:21:57", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761708407, + "date": "2025-10-29 11:26:47", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.138.21", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36", + "timestamp": 1761708547, + "date": "2025-10-29 11:29:07", + "referer": "https:\/\/tsama.cn\/index.html" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761708707, + "date": "2025-10-29 11:31:47", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.138.21", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36", + "timestamp": 1761708950, + "date": "2025-10-29 11:35:50", + "referer": "https:\/\/tsama.cn\/index.html" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761709007, + "date": "2025-10-29 11:36:47", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.138.21", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36", + "timestamp": 1761709079, + "date": "2025-10-29 11:37:59", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.138.21", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36", + "timestamp": 1761709306, + "date": "2025-10-29 11:41:46", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761709307, + "date": "2025-10-29 11:41:47", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761709308, + "date": "2025-10-29 11:41:48", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.138.21", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36", + "timestamp": 1761709446, + "date": "2025-10-29 11:44:06", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.138.21", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36", + "timestamp": 1761709463, + "date": "2025-10-29 11:44:23", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761709606, + "date": "2025-10-29 11:46:46", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "14.116.140.24", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/7.16.7.917 Mobile Safari\/537.36", + "timestamp": 1761709664, + "date": "2025-10-29 11:47:44", + "referer": "http:\/\/tsama.cn\/" + }, + { + "ip": "113.84.82.28", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/7.16.7.917 Mobile Safari\/537.36", + "timestamp": 1761709665, + "date": "2025-10-29 11:47:45", + "referer": "http:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761709907, + "date": "2025-10-29 11:51:47", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761710206, + "date": "2025-10-29 11:56:46", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.84.82.28", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/7.16.7.917 Mobile Safari\/537.36", + "timestamp": 1761710309, + "date": "2025-10-29 11:58:29", + "referer": "http:\/\/tsama.cn\/" + }, + { + "ip": "14.116.140.24", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/7.16.7.917 Mobile Safari\/537.36", + "timestamp": 1761710309, + "date": "2025-10-29 11:58:29", + "referer": "http:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761716174, + "date": "2025-10-29 13:36:14", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761716475, + "date": "2025-10-29 13:41:15", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761716775, + "date": "2025-10-29 13:46:15", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761717076, + "date": "2025-10-29 13:51:16", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761722197, + "date": "2025-10-29 15:16:37", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.84.82.28", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/7.16.7.917 Mobile Safari\/537.36", + "timestamp": 1761726539, + "date": "2025-10-29 16:28:59", + "referer": "http:\/\/tsama.cn\/" + }, + { + "ip": "113.84.82.28", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/7.16.7.917 Mobile Safari\/537.36", + "timestamp": 1761727326, + "date": "2025-10-29 16:42:06", + "referer": "http:\/\/tsama.cn\/" + }, + { + "ip": "113.84.82.28", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/7.16.7.917 Mobile Safari\/537.36", + "timestamp": 1761727365, + "date": "2025-10-29 16:42:45", + "referer": "http:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761727826, + "date": "2025-10-29 16:50:26", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761727966, + "date": "2025-10-29 16:52:46", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761727997, + "date": "2025-10-29 16:53:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761728297, + "date": "2025-10-29 16:58:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761728599, + "date": "2025-10-29 17:03:19", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761728600, + "date": "2025-10-29 17:03:20", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.138.21", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36", + "timestamp": 1761728812, + "date": "2025-10-29 17:06:52", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761728897, + "date": "2025-10-29 17:08:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.138.21", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36", + "timestamp": 1761729040, + "date": "2025-10-29 17:10:40", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761729197, + "date": "2025-10-29 17:13:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.138.21", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36", + "timestamp": 1761729341, + "date": "2025-10-29 17:15:41", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761729497, + "date": "2025-10-29 17:18:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.138.21", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36", + "timestamp": 1761729511, + "date": "2025-10-29 17:18:31", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.138.21", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36", + "timestamp": 1761729521, + "date": "2025-10-29 17:18:41", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.138.21", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36", + "timestamp": 1761729555, + "date": "2025-10-29 17:19:15", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761729797, + "date": "2025-10-29 17:23:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.138.21", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36", + "timestamp": 1761729856, + "date": "2025-10-29 17:24:16", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.138.21", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36", + "timestamp": 1761730053, + "date": "2025-10-29 17:27:33", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761730097, + "date": "2025-10-29 17:28:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.138.21", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36", + "timestamp": 1761730156, + "date": "2025-10-29 17:29:16", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761730397, + "date": "2025-10-29 17:33:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.138.21", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36", + "timestamp": 1761730453, + "date": "2025-10-29 17:34:13", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761730698, + "date": "2025-10-29 17:38:18", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.138.21", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36", + "timestamp": 1761730755, + "date": "2025-10-29 17:39:15", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.138.21", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36", + "timestamp": 1761730928, + "date": "2025-10-29 17:42:08", + "referer": "https:\/\/tsama.cn\/admin.html" + }, + { + "ip": "113.87.138.21", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36", + "timestamp": 1761730938, + "date": "2025-10-29 17:42:18", + "referer": "https:\/\/tsama.cn\/admin.html" + }, + { + "ip": "113.87.138.21", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36", + "timestamp": 1761730941, + "date": "2025-10-29 17:42:21", + "referer": "https:\/\/tsama.cn\/admin.html" + }, + { + "ip": "113.87.138.21", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36", + "timestamp": 1761730946, + "date": "2025-10-29 17:42:26", + "referer": "https:\/\/tsama.cn\/admin.html" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761730997, + "date": "2025-10-29 17:43:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.138.21", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36", + "timestamp": 1761731055, + "date": "2025-10-29 17:44:15", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.138.21", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36", + "timestamp": 1761731177, + "date": "2025-10-29 17:46:17", + "referer": "https:\/\/tsama.cn\/admin.html" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761731297, + "date": "2025-10-29 17:48:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.84.82.28", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/7.16.7.917 Mobile Safari\/537.36", + "timestamp": 1761731494, + "date": "2025-10-29 17:51:34", + "referer": "http:\/\/tsama.cn\/" + }, + { + "ip": "113.84.82.28", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/7.16.7.917 Mobile Safari\/537.36", + "timestamp": 1761731527, + "date": "2025-10-29 17:52:07", + "referer": "http:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761731598, + "date": "2025-10-29 17:53:18", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761731600, + "date": "2025-10-29 17:53:20", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.84.82.28", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/7.16.7.917 Mobile Safari\/537.36", + "timestamp": 1761731600, + "date": "2025-10-29 17:53:20", + "referer": "http:\/\/tsama.cn\/admin.html" + }, + { + "ip": "113.84.82.28", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/7.16.7.917 Mobile Safari\/537.36", + "timestamp": 1761731617, + "date": "2025-10-29 17:53:37", + "referer": "http:\/\/tsama.cn\/admin.html" + }, + { + "ip": "113.84.82.28", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/7.16.7.917 Mobile Safari\/537.36", + "timestamp": 1761731625, + "date": "2025-10-29 17:53:45", + "referer": "http:\/\/tsama.cn\/admin.html" + }, + { + "ip": "113.84.82.28", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/7.16.7.917 Mobile Safari\/537.36", + "timestamp": 1761731648, + "date": "2025-10-29 17:54:08", + "referer": "http:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761731897, + "date": "2025-10-29 17:58:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761732197, + "date": "2025-10-29 18:03:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761732497, + "date": "2025-10-29 18:08:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761732498, + "date": "2025-10-29 18:08:18", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761732797, + "date": "2025-10-29 18:13:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761733097, + "date": "2025-10-29 18:18:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761733400, + "date": "2025-10-29 18:23:20", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761733697, + "date": "2025-10-29 18:28:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761733997, + "date": "2025-10-29 18:33:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761734297, + "date": "2025-10-29 18:38:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761734597, + "date": "2025-10-29 18:43:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761734598, + "date": "2025-10-29 18:43:18", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761734897, + "date": "2025-10-29 18:48:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761735197, + "date": "2025-10-29 18:53:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761735497, + "date": "2025-10-29 18:58:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761735502, + "date": "2025-10-29 18:58:22", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761735797, + "date": "2025-10-29 19:03:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761736097, + "date": "2025-10-29 19:08:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761736397, + "date": "2025-10-29 19:13:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761736399, + "date": "2025-10-29 19:13:19", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761736697, + "date": "2025-10-29 19:18:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761736997, + "date": "2025-10-29 19:23:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761737298, + "date": "2025-10-29 19:28:18", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761737597, + "date": "2025-10-29 19:33:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761737897, + "date": "2025-10-29 19:38:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761737899, + "date": "2025-10-29 19:38:19", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761738197, + "date": "2025-10-29 19:43:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761738498, + "date": "2025-10-29 19:48:18", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761738499, + "date": "2025-10-29 19:48:19", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761738797, + "date": "2025-10-29 19:53:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761739097, + "date": "2025-10-29 19:58:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761739397, + "date": "2025-10-29 20:03:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761739400, + "date": "2025-10-29 20:03:20", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761739697, + "date": "2025-10-29 20:08:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761739997, + "date": "2025-10-29 20:13:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761740297, + "date": "2025-10-29 20:18:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761740298, + "date": "2025-10-29 20:18:18", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761740597, + "date": "2025-10-29 20:23:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761740897, + "date": "2025-10-29 20:28:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761740900, + "date": "2025-10-29 20:28:20", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761741197, + "date": "2025-10-29 20:33:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761741497, + "date": "2025-10-29 20:38:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761741797, + "date": "2025-10-29 20:43:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761741801, + "date": "2025-10-29 20:43:21", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761742097, + "date": "2025-10-29 20:48:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761742397, + "date": "2025-10-29 20:53:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761742697, + "date": "2025-10-29 20:58:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761742699, + "date": "2025-10-29 20:58:19", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761742997, + "date": "2025-10-29 21:03:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761743297, + "date": "2025-10-29 21:08:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761743299, + "date": "2025-10-29 21:08:19", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761743597, + "date": "2025-10-29 21:13:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761743897, + "date": "2025-10-29 21:18:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761744198, + "date": "2025-10-29 21:23:18", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761744497, + "date": "2025-10-29 21:28:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761744800, + "date": "2025-10-29 21:33:20", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761744801, + "date": "2025-10-29 21:33:21", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761745097, + "date": "2025-10-29 21:38:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761745397, + "date": "2025-10-29 21:43:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761745697, + "date": "2025-10-29 21:48:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761745706, + "date": "2025-10-29 21:48:26", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761745997, + "date": "2025-10-29 21:53:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761746297, + "date": "2025-10-29 21:58:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761746597, + "date": "2025-10-29 22:03:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761746601, + "date": "2025-10-29 22:03:21", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761746897, + "date": "2025-10-29 22:08:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.138.21", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/7.16.7.917 Mobile Safari\/537.36", + "timestamp": 1761746948, + "date": "2025-10-29 22:09:08", + "referer": "http:\/\/tsama.cn\/" + }, + { + "ip": "113.87.138.21", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/7.16.7.917 Mobile Safari\/537.36", + "timestamp": 1761747091, + "date": "2025-10-29 22:11:31", + "referer": "http:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761747197, + "date": "2025-10-29 22:13:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "183.211.90.28", + "user_agent": "Mozilla\/5.0 (Linux; Android 14; 22041216UC Build\/UP1A.231005.007; wv) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/121.0.6167.71 MQQBrowser\/6.2 TBS\/047919 Mobile Safari\/537.36 V1_AND_SQ_9.2.15_11480_YYB_D QQ\/9.2.15.29600 NetType\/WIFI WebP\/0.3.0 AppId\/537312181 Pixel\/1080 StatusBarHeight\/100 SimpleUISwitch\/0 QQTheme\/1000 StudyMode\/0 CurrentMode\/0 CurrentFontScale\/1.0 GlobalDensityScale\/0.9818182 AllowLandscape\/false InMagicWin\/0", + "timestamp": 1761747214, + "date": "2025-10-29 22:13:34", + "referer": "http:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761747497, + "date": "2025-10-29 22:18:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.138.21", + "user_agent": "Mozilla\/5.0 (Linux; Android 15; 23116PN5BC Build\/AQ3A.240627.003; wv) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/121.0.6167.71 MQQBrowser\/6.2 TBS\/047907 Mobile Safari\/537.36 V1_AND_SQ_9.2.20_11650_YYB_D QQ\/9.2.20.30025 NetType\/WIFI WebP\/0.3.0 AppId\/537315791 Pixel\/1080 StatusBarHeight\/110 SimpleUISwitch\/0 QQTheme\/1000 StudyMode\/0 CurrentMode\/0 CurrentFontScale\/0.87 GlobalDensityScale\/1.0285715 AllowLandscape\/false InMagicWin\/0", + "timestamp": 1761747605, + "date": "2025-10-29 22:20:05", + "referer": "http:\/\/tsama.cn\/" + }, + { + "ip": "183.211.90.28", + "user_agent": "Mozilla\/5.0 (Linux; Android 14; 22041216UC Build\/UP1A.231005.007; wv) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/121.0.6167.71 MQQBrowser\/6.2 TBS\/047919 Mobile Safari\/537.36 V1_AND_SQ_9.2.15_11480_YYB_D QQ\/9.2.15.29600 NetType\/WIFI WebP\/0.3.0 AppId\/537312181 Pixel\/1080 StatusBarHeight\/100 SimpleUISwitch\/0 QQTheme\/1000 StudyMode\/0 CurrentMode\/0 CurrentFontScale\/1.0 GlobalDensityScale\/0.9818182 AllowLandscape\/false InMagicWin\/0", + "timestamp": 1761747631, + "date": "2025-10-29 22:20:31", + "referer": "http:\/\/tsama.cn\/" + }, + { + "ip": "113.201.15.72", + "user_agent": "Mozilla\/5.0 (iPhone; CPU iPhone OS 18_6_2 like Mac OS X) AppleWebKit\/605.1.15 (KHTML, like Gecko) Mobile\/15E148 QQ\/9.2.25.606 V1_IPH_SQ_9.2.25_1_APP_A Pixel\/1179 MiniAppEnable SimpleUISwitch\/0 StudyMode\/0 CurrentMode\/0 CurrentFontScale\/1.000000 QQTheme\/1000 AppId\/537317157 Core\/WKWebView Device\/Apple(iPhone X) NetType\/WIFI QBWebViewType\/1 WKType\/1", + "timestamp": 1761747631, + "date": "2025-10-29 22:20:31", + "referer": "http:\/\/tsama.cn\/" + }, + { + "ip": "113.201.15.72", + "user_agent": "Mozilla\/5.0 (iPhone; CPU iPhone OS 18_6_2 like Mac OS X) AppleWebKit\/605.1.15 (KHTML, like Gecko) Mobile\/15E148 QQ\/9.2.25.606 V1_IPH_SQ_9.2.25_1_APP_A Pixel\/1179 MiniAppEnable SimpleUISwitch\/0 StudyMode\/0 CurrentMode\/0 CurrentFontScale\/1.000000 QQTheme\/1000 AppId\/537317157 Core\/WKWebView Device\/Apple(iPhone X) NetType\/WIFI QBWebViewType\/1 WKType\/1", + "timestamp": 1761747633, + "date": "2025-10-29 22:20:33", + "referer": "http:\/\/tsama.cn\/" + }, + { + "ip": "113.201.15.72", + "user_agent": "Mozilla\/5.0 (iPhone; CPU iPhone OS 18_6_2 like Mac OS X) AppleWebKit\/605.1.15 (KHTML, like Gecko) Mobile\/15E148 QQ\/9.2.25.606 V1_IPH_SQ_9.2.25_1_APP_A Pixel\/1179 MiniAppEnable SimpleUISwitch\/0 StudyMode\/0 CurrentMode\/0 CurrentFontScale\/1.000000 QQTheme\/1000 AppId\/537317157 Core\/WKWebView Device\/Apple(iPhone X) NetType\/WIFI QBWebViewType\/1 WKType\/1", + "timestamp": 1761747634, + "date": "2025-10-29 22:20:34", + "referer": "http:\/\/tsama.cn\/" + }, + { + "ip": "42.232.246.99", + "user_agent": "Mozilla\/5.0 (Linux; Android 15; V2307A Build\/AP3A.240905.015.A1; wv) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/121.0.6167.71 MQQBrowser\/6.2 TBS\/047919 Mobile Safari\/537.36 V1_AND_SQ_9.2.20_11650_YYB_D QQ\/9.2.20.30025 NetType\/WIFI WebP\/0.3.0 AppId\/537315788 Pixel\/1260 StatusBarHeight\/133 SimpleUISwitch\/0 QQTheme\/1000 StudyMode\/0 CurrentMode\/0 CurrentFontScale\/1.0 GlobalDensityScale\/0.90000004 AllowLandscape\/false InMagicWin\/0", + "timestamp": 1761747642, + "date": "2025-10-29 22:20:42", + "referer": "http:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761747797, + "date": "2025-10-29 22:23:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761747801, + "date": "2025-10-29 22:23:21", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.138.21", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/7.16.7.917 Mobile Safari\/537.36", + "timestamp": 1761747878, + "date": "2025-10-29 22:24:38", + "referer": "http:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761748097, + "date": "2025-10-29 22:28:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.138.21", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/7.16.7.917 Mobile Safari\/537.36", + "timestamp": 1761748287, + "date": "2025-10-29 22:31:27", + "referer": "http:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761748397, + "date": "2025-10-29 22:33:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761748698, + "date": "2025-10-29 22:38:18", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761748997, + "date": "2025-10-29 22:43:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761749297, + "date": "2025-10-29 22:48:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761749598, + "date": "2025-10-29 22:53:18", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761749599, + "date": "2025-10-29 22:53:19", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761749897, + "date": "2025-10-29 22:58:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761750197, + "date": "2025-10-29 23:03:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761750498, + "date": "2025-10-29 23:08:18", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761750797, + "date": "2025-10-29 23:13:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761751097, + "date": "2025-10-29 23:18:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.138.21", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/7.16.7.917 Mobile Safari\/537.36", + "timestamp": 1761751108, + "date": "2025-10-29 23:18:28", + "referer": "http:\/\/tsama.cn\/" + }, + { + "ip": "113.87.138.21", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/7.16.7.917 Mobile Safari\/537.36", + "timestamp": 1761751112, + "date": "2025-10-29 23:18:32", + "referer": "http:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761751398, + "date": "2025-10-29 23:23:18", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761751697, + "date": "2025-10-29 23:28:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761751701, + "date": "2025-10-29 23:28:21", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761751997, + "date": "2025-10-29 23:33:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761752297, + "date": "2025-10-29 23:38:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761752598, + "date": "2025-10-29 23:43:18", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761752599, + "date": "2025-10-29 23:43:19", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761752897, + "date": "2025-10-29 23:48:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761753197, + "date": "2025-10-29 23:53:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761753199, + "date": "2025-10-29 23:53:19", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761753497, + "date": "2025-10-29 23:58:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761753797, + "date": "2025-10-30 00:03:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761754098, + "date": "2025-10-30 00:08:18", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761754397, + "date": "2025-10-30 00:13:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761754697, + "date": "2025-10-30 00:18:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761754997, + "date": "2025-10-30 00:23:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761755297, + "date": "2025-10-30 00:28:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761755597, + "date": "2025-10-30 00:33:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761755897, + "date": "2025-10-30 00:38:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761755898, + "date": "2025-10-30 00:38:18", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761756197, + "date": "2025-10-30 00:43:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761756497, + "date": "2025-10-30 00:48:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761756797, + "date": "2025-10-30 00:53:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761757097, + "date": "2025-10-30 00:58:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761757102, + "date": "2025-10-30 00:58:22", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761757397, + "date": "2025-10-30 01:03:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761757697, + "date": "2025-10-30 01:08:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761757997, + "date": "2025-10-30 01:13:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761757998, + "date": "2025-10-30 01:13:18", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761758297, + "date": "2025-10-30 01:18:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761758597, + "date": "2025-10-30 01:23:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761758898, + "date": "2025-10-30 01:28:18", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761759197, + "date": "2025-10-30 01:33:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "81.71.101.51", + "user_agent": "Mozilla\/5.0 (Linux; Android 11; Redmi Note 8 Pro Build\/RP1A.200720.011; wv) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/89.0.4389.72 MQQBrowser\/6.2 TBS\/045913 Mobile Safari\/537.36 V1_AND_SQ_8.8.68_2538_YYB_D A_8086800 QQ\/8.8.68.7265 NetType\/WIFI WebP\/0.3.0 Pixel\/1080 StatusBarHeight\/76 SimpleUISwitch\/1 QQTheme\/2971 InMagicWin\/0 StudyMode\/0 CurrentMode\/1 CurrentFontScale\/1.0 GlobalDensityScale\/0.9818182 AppId\/537112567 Edg\/98.0.4758.102", + "timestamp": 1761759308, + "date": "2025-10-30 01:35:08", + "referer": "http:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761759497, + "date": "2025-10-30 01:38:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761759798, + "date": "2025-10-30 01:43:18", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761760097, + "date": "2025-10-30 01:48:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761760397, + "date": "2025-10-30 01:53:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761760400, + "date": "2025-10-30 01:53:20", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761760697, + "date": "2025-10-30 01:58:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761760997, + "date": "2025-10-30 02:03:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761761297, + "date": "2025-10-30 02:08:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761761299, + "date": "2025-10-30 02:08:19", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761761597, + "date": "2025-10-30 02:13:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761761897, + "date": "2025-10-30 02:18:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761762198, + "date": "2025-10-30 02:23:18", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761762497, + "date": "2025-10-30 02:28:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761762797, + "date": "2025-10-30 02:33:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761763097, + "date": "2025-10-30 02:38:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761763099, + "date": "2025-10-30 02:38:19", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761763397, + "date": "2025-10-30 02:43:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761763697, + "date": "2025-10-30 02:48:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761763699, + "date": "2025-10-30 02:48:19", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761763997, + "date": "2025-10-30 02:53:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761764297, + "date": "2025-10-30 02:58:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761764598, + "date": "2025-10-30 03:03:18", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761764897, + "date": "2025-10-30 03:08:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761765197, + "date": "2025-10-30 03:13:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761765497, + "date": "2025-10-30 03:18:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761765498, + "date": "2025-10-30 03:18:18", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761765797, + "date": "2025-10-30 03:23:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761766097, + "date": "2025-10-30 03:28:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761766398, + "date": "2025-10-30 03:33:18", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761766704, + "date": "2025-10-30 03:38:24", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761766704, + "date": "2025-10-30 03:38:24", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761766998, + "date": "2025-10-30 03:43:18", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761767297, + "date": "2025-10-30 03:48:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761767598, + "date": "2025-10-30 03:53:18", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761767897, + "date": "2025-10-30 03:58:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761768197, + "date": "2025-10-30 04:03:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761768497, + "date": "2025-10-30 04:08:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761768499, + "date": "2025-10-30 04:08:19", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761768797, + "date": "2025-10-30 04:13:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761769097, + "date": "2025-10-30 04:18:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761769398, + "date": "2025-10-30 04:23:18", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761769697, + "date": "2025-10-30 04:28:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761769997, + "date": "2025-10-30 04:33:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761770298, + "date": "2025-10-30 04:38:18", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761770299, + "date": "2025-10-30 04:38:19", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761770597, + "date": "2025-10-30 04:43:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761770897, + "date": "2025-10-30 04:48:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761771198, + "date": "2025-10-30 04:53:18", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761771497, + "date": "2025-10-30 04:58:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761771797, + "date": "2025-10-30 05:03:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761772097, + "date": "2025-10-30 05:08:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761772397, + "date": "2025-10-30 05:13:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761772400, + "date": "2025-10-30 05:13:20", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761772697, + "date": "2025-10-30 05:18:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761772997, + "date": "2025-10-30 05:23:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761773298, + "date": "2025-10-30 05:28:18", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761773300, + "date": "2025-10-30 05:28:20", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761773597, + "date": "2025-10-30 05:33:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761773897, + "date": "2025-10-30 05:38:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761774197, + "date": "2025-10-30 05:43:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761774199, + "date": "2025-10-30 05:43:19", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761774497, + "date": "2025-10-30 05:48:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761774797, + "date": "2025-10-30 05:53:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761775098, + "date": "2025-10-30 05:58:18", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761775397, + "date": "2025-10-30 06:03:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761775697, + "date": "2025-10-30 06:08:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761775998, + "date": "2025-10-30 06:13:18", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761775999, + "date": "2025-10-30 06:13:19", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761776297, + "date": "2025-10-30 06:18:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761776597, + "date": "2025-10-30 06:23:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761776897, + "date": "2025-10-30 06:28:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761776899, + "date": "2025-10-30 06:28:19", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761777197, + "date": "2025-10-30 06:33:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761777498, + "date": "2025-10-30 06:38:18", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761777797, + "date": "2025-10-30 06:43:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761778097, + "date": "2025-10-30 06:48:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761778098, + "date": "2025-10-30 06:48:18", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761778397, + "date": "2025-10-30 06:53:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761778698, + "date": "2025-10-30 06:58:18", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761778997, + "date": "2025-10-30 07:03:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761778999, + "date": "2025-10-30 07:03:19", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761779297, + "date": "2025-10-30 07:08:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761779597, + "date": "2025-10-30 07:13:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761779897, + "date": "2025-10-30 07:18:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761779899, + "date": "2025-10-30 07:18:19", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761780197, + "date": "2025-10-30 07:23:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761780497, + "date": "2025-10-30 07:28:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761780804, + "date": "2025-10-30 07:33:24", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761780804, + "date": "2025-10-30 07:33:24", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761781098, + "date": "2025-10-30 07:38:18", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761781397, + "date": "2025-10-30 07:43:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761781698, + "date": "2025-10-30 07:48:18", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761781699, + "date": "2025-10-30 07:48:19", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761781997, + "date": "2025-10-30 07:53:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761782297, + "date": "2025-10-30 07:58:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "14.116.140.24", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/7.16.7.917 Mobile Safari\/537.36", + "timestamp": 1761782808, + "date": "2025-10-30 08:06:48", + "referer": "http:\/\/tsama.cn\/" + }, + { + "ip": "113.84.138.211", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/7.16.7.917 Mobile Safari\/537.36", + "timestamp": 1761782811, + "date": "2025-10-30 08:06:51", + "referer": "http:\/\/tsama.cn\/" + }, + { + "ip": "113.84.138.211", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/7.16.7.917 Mobile Safari\/537.36", + "timestamp": 1761782821, + "date": "2025-10-30 08:07:01", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "14.116.140.135", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/7.16.7.917 Mobile Safari\/537.36", + "timestamp": 1761782821, + "date": "2025-10-30 08:07:01", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761782897, + "date": "2025-10-30 08:08:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761782907, + "date": "2025-10-30 08:08:27", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761783197, + "date": "2025-10-30 08:13:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761783497, + "date": "2025-10-30 08:18:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761783797, + "date": "2025-10-30 08:23:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761783800, + "date": "2025-10-30 08:23:20", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761784097, + "date": "2025-10-30 08:28:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761784397, + "date": "2025-10-30 08:33:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761784681, + "date": "2025-10-30 08:38:01", + "referer": "https:\/\/tsama.cn\/admin.html" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761784726, + "date": "2025-10-30 08:38:46", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761787833, + "date": "2025-10-30 09:30:33", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "14.116.140.135", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/7.16.7.917 Mobile Safari\/537.36", + "timestamp": 1761788446, + "date": "2025-10-30 09:40:46", + "referer": "https:\/\/tsama.cn\/admin.html" + }, + { + "ip": "113.84.42.84", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/7.16.7.917 Mobile Safari\/537.36", + "timestamp": 1761788446, + "date": "2025-10-30 09:40:46", + "referer": "https:\/\/tsama.cn\/admin.html" + }, + { + "ip": "113.84.42.84", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/7.16.7.917 Mobile Safari\/537.36", + "timestamp": 1761788457, + "date": "2025-10-30 09:40:57", + "referer": "https:\/\/tsama.cn\/admin.html" + }, + { + "ip": "113.84.42.84", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/7.16.7.917 Mobile Safari\/537.36", + "timestamp": 1761788458, + "date": "2025-10-30 09:40:58", + "referer": "https:\/\/tsama.cn\/admin.html" + }, + { + "ip": "113.84.42.84", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/7.16.7.917 Mobile Safari\/537.36", + "timestamp": 1761788461, + "date": "2025-10-30 09:41:01", + "referer": "https:\/\/tsama.cn\/admin.html" + }, + { + "ip": "113.84.42.84", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/7.16.7.917 Mobile Safari\/537.36", + "timestamp": 1761788465, + "date": "2025-10-30 09:41:05", + "referer": "https:\/\/tsama.cn\/admin.html" + }, + { + "ip": "113.84.42.84", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/7.16.7.917 Mobile Safari\/537.36", + "timestamp": 1761788473, + "date": "2025-10-30 09:41:13", + "referer": "https:\/\/tsama.cn\/admin.html" + }, + { + "ip": "113.84.42.84", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/7.16.7.917 Mobile Safari\/537.36", + "timestamp": 1761788480, + "date": "2025-10-30 09:41:20", + "referer": "https:\/\/tsama.cn\/index.html" + }, + { + "ip": "113.84.42.84", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/7.16.7.917 Mobile Safari\/537.36", + "timestamp": 1761788641, + "date": "2025-10-30 09:44:01", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.139.170", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36", + "timestamp": 1761790165, + "date": "2025-10-30 10:09:25", + "referer": "https:\/\/tsama.cn\/admin.html" + }, + { + "ip": "113.87.139.170", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36", + "timestamp": 1761790170, + "date": "2025-10-30 10:09:30", + "referer": "https:\/\/tsama.cn\/index.html" + }, + { + "ip": "180.101.245.251", + "user_agent": "Mozilla\/5.0 (iPhone; CPU iPhone OS 18_4 like Mac OS X) AppleWebKit\/605.1.15 (KHTML, like Gecko) Version\/18.4 Mobile\/15E148 Safari\/604.1", + "timestamp": 1761793567, + "date": "2025-10-30 11:06:07", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "220.196.160.101", + "user_agent": "Mozilla\/5.0 (iPhone; CPU iPhone OS 18_4 like Mac OS X) AppleWebKit\/605.1.15 (KHTML, like Gecko) Version\/18.4 Mobile\/15E148 Safari\/604.1", + "timestamp": 1761793567, + "date": "2025-10-30 11:06:07", + "referer": "http:\/\/tsama.cn\/" + }, + { + "ip": "113.84.42.84", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/7.16.7.917 Mobile Safari\/537.36", + "timestamp": 1761793952, + "date": "2025-10-30 11:12:32", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "103.219.192.68", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761794686, + "date": "2025-10-30 11:24:46", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761794987, + "date": "2025-10-30 11:29:47", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761795287, + "date": "2025-10-30 11:34:47", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761795587, + "date": "2025-10-30 11:39:47", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761795888, + "date": "2025-10-30 11:44:48", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.84.42.84", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/7.16.7.917 Mobile Safari\/537.36", + "timestamp": 1761796768, + "date": "2025-10-30 11:59:28", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "112.97.84.103", + "user_agent": "Mozilla\/5.0 (iPhone; CPU iPhone OS 18_7 like Mac OS X) AppleWebKit\/605.1.15 (KHTML, like Gecko) Version\/26.0.1 Mobile\/15E148 Safari\/604.1", + "timestamp": 1761802027, + "date": "2025-10-30 13:27:07", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761802368, + "date": "2025-10-30 13:32:48", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761802669, + "date": "2025-10-30 13:37:49", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761802969, + "date": "2025-10-30 13:42:49", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761803269, + "date": "2025-10-30 13:47:49", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761803569, + "date": "2025-10-30 13:52:49", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761803869, + "date": "2025-10-30 13:57:49", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761804169, + "date": "2025-10-30 14:02:49", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761804469, + "date": "2025-10-30 14:07:49", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761804769, + "date": "2025-10-30 14:12:49", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "112.97.84.103", + "user_agent": "Mozilla\/5.0 (iPhone; CPU iPhone OS 18_7 like Mac OS X) AppleWebKit\/605.1.15 (KHTML, like Gecko) Version\/26.0.1 Mobile\/15E148 Safari\/604.1", + "timestamp": 1761804787, + "date": "2025-10-30 14:13:07", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "112.97.84.103", + "user_agent": "Mozilla\/5.0 (iPhone; CPU iPhone OS 18_7 like Mac OS X) AppleWebKit\/605.1.15 (KHTML, like Gecko) Version\/26.0.1 Mobile\/15E148 Safari\/604.1", + "timestamp": 1761804788, + "date": "2025-10-30 14:13:08", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761805068, + "date": "2025-10-30 14:17:48", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761805203, + "date": "2025-10-30 14:20:03", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761805253, + "date": "2025-10-30 14:20:53", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761805554, + "date": "2025-10-30 14:25:54", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761805854, + "date": "2025-10-30 14:30:54", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761806154, + "date": "2025-10-30 14:35:54", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761806158, + "date": "2025-10-30 14:35:58", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761806454, + "date": "2025-10-30 14:40:54", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761806754, + "date": "2025-10-30 14:45:54", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761807054, + "date": "2025-10-30 14:50:54", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761807354, + "date": "2025-10-30 14:55:54", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761807355, + "date": "2025-10-30 14:55:55", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761807654, + "date": "2025-10-30 15:00:54", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761807891, + "date": "2025-10-30 15:04:51", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761807891, + "date": "2025-10-30 15:04:51", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761808192, + "date": "2025-10-30 15:09:52", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761808435, + "date": "2025-10-30 15:13:55", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761808492, + "date": "2025-10-30 15:14:52", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761808792, + "date": "2025-10-30 15:19:52", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761809092, + "date": "2025-10-30 15:24:52", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761809392, + "date": "2025-10-30 15:29:52", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761809616, + "date": "2025-10-30 15:33:36", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761809802, + "date": "2025-10-30 15:36:42", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761810102, + "date": "2025-10-30 15:41:42", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761810358, + "date": "2025-10-30 15:45:58", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761810658, + "date": "2025-10-30 15:50:58", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761810958, + "date": "2025-10-30 15:55:58", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761811258, + "date": "2025-10-30 16:00:58", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761811261, + "date": "2025-10-30 16:01:01", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761811558, + "date": "2025-10-30 16:05:58", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761811858, + "date": "2025-10-30 16:10:58", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761812159, + "date": "2025-10-30 16:15:59", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761813734, + "date": "2025-10-30 16:42:14", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761814361, + "date": "2025-10-30 16:52:41", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.84.42.84", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/7.16.7.917 Mobile Safari\/537.36", + "timestamp": 1761814878, + "date": "2025-10-30 17:01:18", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761815623, + "date": "2025-10-30 17:13:43", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761817486, + "date": "2025-10-30 17:44:46", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.139.170", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36", + "timestamp": 1761824484, + "date": "2025-10-30 19:41:24", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.139.170", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36", + "timestamp": 1761829493, + "date": "2025-10-30 21:04:53", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.139.170", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36", + "timestamp": 1761830144, + "date": "2025-10-30 21:15:44", + "referer": "https:\/\/tsama.cn\/index.php" + }, + { + "ip": "113.87.139.170", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36", + "timestamp": 1761830744, + "date": "2025-10-30 21:25:44", + "referer": "https:\/\/tsama.cn\/index.php" + }, + { + "ip": "149.57.180.103", + "user_agent": "Mozilla\/5.0 (X11; Linux x86_64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/119.0.0.0 Safari\/537.36", + "timestamp": 1761848888, + "date": "2025-10-31 02:28:08", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761872163, + "date": "2025-10-31 08:56:03", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761872788, + "date": "2025-10-31 09:06:28", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761875859, + "date": "2025-10-31 09:57:39", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761876596, + "date": "2025-10-31 10:09:56", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.84.8.124", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/7.16.7.917 Mobile Safari\/537.36", + "timestamp": 1761877720, + "date": "2025-10-31 10:28:40", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.84.8.124", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/7.16.7.917 Mobile Safari\/537.36", + "timestamp": 1761889597, + "date": "2025-10-31 13:46:37", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.84.8.124", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/7.16.7.917 Mobile Safari\/537.36", + "timestamp": 1761893205, + "date": "2025-10-31 14:46:45", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "23.27.145.45", + "user_agent": "Mozilla\/5.0 (X11; Linux x86_64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/119.0.0.0 Safari\/537.36", + "timestamp": 1761893353, + "date": "2025-10-31 14:49:13", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761899368, + "date": "2025-10-31 16:29:28", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.84.8.124", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/7.16.7.917 Mobile Safari\/537.36", + "timestamp": 1761899978, + "date": "2025-10-31 16:39:38", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1761900345, + "date": "2025-10-31 16:45:45", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.84.8.124", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/7.16.7.917 Mobile Safari\/537.36", + "timestamp": 1761903411, + "date": "2025-10-31 17:36:51", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.255", + "user_agent": "Mozilla\/5.0 (iPhone; CPU iPhone OS 18_7 like Mac OS X) AppleWebKit\/605.1.15 (KHTML, like Gecko) Version\/26.0.1 Mobile\/15E148 Safari\/604.1", + "timestamp": 1761904706, + "date": "2025-10-31 17:58:26", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "66.249.75.226", + "user_agent": "Mozilla\/5.0 (Linux; Android 6.0.1; Nexus 5X Build\/MMB29P) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.7390.122 Mobile Safari\/537.36 (compatible; Googlebot\/2.1; +http:\/\/www.google.com\/bot.html)", + "timestamp": 1761915402, + "date": "2025-10-31 20:56:42", + "referer": "http:\/\/tsama.cn\/" + }, + { + "ip": "113.84.8.124", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/7.16.7.917 Mobile Safari\/537.36", + "timestamp": 1761923428, + "date": "2025-10-31 23:10:28", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "27.38.135.37", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/7.16.7.917 Mobile Safari\/537.36", + "timestamp": 1761923523, + "date": "2025-10-31 23:12:03", + "referer": "https:\/\/tsama.cn\/admin.php" + }, + { + "ip": "14.116.140.135", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/7.16.7.917 Mobile Safari\/537.36", + "timestamp": 1761923596, + "date": "2025-10-31 23:13:16", + "referer": "https:\/\/tsama.cn\/admin.php" + }, + { + "ip": "205.169.39.29", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/117.0.5938.132 Safari\/537.36", + "timestamp": 1761943560, + "date": "2025-11-01 04:46:00", + "referer": "http:\/\/tsama.cn\/" + }, + { + "ip": "34.123.170.104", + "user_agent": "Mozilla\/5.0 (X11; Linux x86_64) AppleWebKit\/537.36 (KHTML, like Gecko) HeadlessChrome\/125.0.6422.60 Safari\/537.36", + "timestamp": 1761943572, + "date": "2025-11-01 04:46:12", + "referer": "http:\/\/tsama.cn\/" + }, + { + "ip": "205.169.39.25", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/106.0.0.0 Safari\/537.36", + "timestamp": 1761943598, + "date": "2025-11-01 04:46:38", + "referer": "Direct" + }, + { + "ip": "113.87.139.206", + "user_agent": "Mozilla\/5.0 (iPhone; CPU iPhone OS 18_7 like Mac OS X) AppleWebKit\/605.1.15 (KHTML, like Gecko) Version\/26.0.1 Mobile\/15E148 Safari\/604.1", + "timestamp": 1762010256, + "date": "2025-11-01 23:17:36", + "referer": "https:\/\/api.tsama.cn\/" + }, + { + "ip": "205.169.39.148", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/79.0.3945.79 Safari\/537.36", + "timestamp": 1762045878, + "date": "2025-11-02 09:11:18", + "referer": "http:\/\/tsama.cn\/" + }, + { + "ip": "112.97.87.32", + "user_agent": "Mozilla\/5.0 (iPhone; CPU iPhone OS 18_7 like Mac OS X) AppleWebKit\/605.1.15 (KHTML, like Gecko) Version\/26.0.1 Mobile\/15E148 Safari\/604.1", + "timestamp": 1762084199, + "date": "2025-11-02 19:49:59", + "referer": "https:\/\/tsama.cn\/index.php" + }, + { + "ip": "112.97.87.32", + "user_agent": "Mozilla\/5.0 (iPhone; CPU iPhone OS 18_7 like Mac OS X) AppleWebKit\/605.1.15 (KHTML, like Gecko) Version\/26.0.1 Mobile\/15E148 Safari\/604.1", + "timestamp": 1762133889, + "date": "2025-11-03 09:38:09", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.84.192.103", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.573", + "timestamp": 1762136048, + "date": "2025-11-03 10:14:08", + "referer": "https:\/\/tsama.cn\/index.php" + }, + { + "ip": "113.87.138.191", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.580", + "timestamp": 1762139542, + "date": "2025-11-03 11:12:22", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "146.70.185.32", + "user_agent": "Mozilla\/5.0 (X11; Linux x86_64) AppleWebKit\/537.36 (KHTML, like Gecko) HeadlessChrome\/140.0.7339.16 Safari\/537.36", + "timestamp": 1762141713, + "date": "2025-11-03 11:48:33", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.84.192.103", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/10.0.0.950 Mobile Safari\/537.36", + "timestamp": 1762144582, + "date": "2025-11-03 12:36:22", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "14.116.140.239", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/10.0.0.950 Mobile Safari\/537.36", + "timestamp": 1762144582, + "date": "2025-11-03 12:36:22", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.138.191", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.580", + "timestamp": 1762149991, + "date": "2025-11-03 14:06:31", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "14.116.140.45", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/10.0.0.950 Mobile Safari\/537.36", + "timestamp": 1762151534, + "date": "2025-11-03 14:32:14", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.84.192.103", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/10.0.0.950 Mobile Safari\/537.36", + "timestamp": 1762151535, + "date": "2025-11-03 14:32:15", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "14.116.140.45", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/10.0.0.950 Mobile Safari\/537.36", + "timestamp": 1762157446, + "date": "2025-11-03 16:10:46", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.84.192.103", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/10.0.0.950 Mobile Safari\/537.36", + "timestamp": 1762157446, + "date": "2025-11-03 16:10:46", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.137.193", + "user_agent": "Mozilla\/5.0 (iPhone; CPU iPhone OS 18_7 like Mac OS X) AppleWebKit\/605.1.15 (KHTML, like Gecko) Version\/26.0.1 Mobile\/15E148 Safari\/604.1", + "timestamp": 1762165155, + "date": "2025-11-03 18:19:15", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.138.191", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.580", + "timestamp": 1762222260, + "date": "2025-11-04 10:11:00", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.138.191", + "user_agent": "Mozilla\/5.0 (iPhone; CPU iPhone OS 18_7 like Mac OS X) AppleWebKit\/605.1.15 (KHTML, like Gecko) Version\/26.0.1 Mobile\/15E148 Safari\/604.1", + "timestamp": 1762239504, + "date": "2025-11-04 14:58:24", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.138.191", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.580", + "timestamp": 1762245743, + "date": "2025-11-04 16:42:23", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.138.191", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.580", + "timestamp": 1762249652, + "date": "2025-11-04 17:47:32", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "220.196.160.146", + "user_agent": "Mozilla\/5.0 (iPhone; CPU iPhone OS 18_4 like Mac OS X) AppleWebKit\/605.1.15 (KHTML, like Gecko) Version\/18.4 Mobile\/15E148 Safari\/604.1", + "timestamp": 1762252266, + "date": "2025-11-04 18:31:06", + "referer": "http:\/\/tsama.cn\/" + }, + { + "ip": "180.101.245.251", + "user_agent": "Mozilla\/5.0 (iPhone; CPU iPhone OS 18_4 like Mac OS X) AppleWebKit\/605.1.15 (KHTML, like Gecko) Version\/18.4 Mobile\/15E148 Safari\/604.1", + "timestamp": 1762252269, + "date": "2025-11-04 18:31:09", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "110.249.201.169", + "user_agent": "Mozilla\/5.0 (Linux; Android 5.0) AppleWebKit\/537.36 (KHTML, like Gecko) Mobile Safari\/537.36 (compatible; Bytespider; https:\/\/zhanzhang.toutiao.com\/)", + "timestamp": 1762300106, + "date": "2025-11-05 07:48:26", + "referer": "http:\/\/tsama.cn\/" + }, + { + "ip": "113.87.138.191", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.580", + "timestamp": 1762306702, + "date": "2025-11-05 09:38:22", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.138.191", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.580", + "timestamp": 1762313983, + "date": "2025-11-05 11:39:43", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.138.191", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.580", + "timestamp": 1762315159, + "date": "2025-11-05 11:59:19", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.138.191", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.580", + "timestamp": 1762323337, + "date": "2025-11-05 14:15:37", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.138.191", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.580", + "timestamp": 1762323991, + "date": "2025-11-05 14:26:31", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.138.191", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.580", + "timestamp": 1762324598, + "date": "2025-11-05 14:36:38", + "referer": "https:\/\/tsama.cn\/index.php" + }, + { + "ip": "14.116.140.24", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/10.0.1.951 Mobile Safari\/537.36", + "timestamp": 1762339194, + "date": "2025-11-05 18:39:54", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.84.33.37", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/10.0.1.951 Mobile Safari\/537.36", + "timestamp": 1762339194, + "date": "2025-11-05 18:39:54", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "14.116.140.86", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/10.0.1.951 Mobile Safari\/537.36", + "timestamp": 1762358049, + "date": "2025-11-05 23:54:09", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.136.77", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/10.0.1.951 Mobile Safari\/537.36", + "timestamp": 1762358049, + "date": "2025-11-05 23:54:09", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.138.191", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.580", + "timestamp": 1762389048, + "date": "2025-11-06 08:30:48", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.138.191", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.580", + "timestamp": 1762389691, + "date": "2025-11-06 08:41:31", + "referer": "https:\/\/tsama.cn\/index.php" + }, + { + "ip": "180.101.244.13", + "user_agent": "Mozilla\/5.0 (iPhone; CPU iPhone OS 18_4 like Mac OS X) AppleWebKit\/605.1.15 (KHTML, like Gecko) Version\/18.4 Mobile\/15E148 Safari\/604.1", + "timestamp": 1762397331, + "date": "2025-11-06 10:48:51", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "180.101.244.15", + "user_agent": "Mozilla\/5.0 (iPhone; CPU iPhone OS 18_4 like Mac OS X) AppleWebKit\/605.1.15 (KHTML, like Gecko) Version\/18.4 Mobile\/15E148 Safari\/604.1", + "timestamp": 1762397332, + "date": "2025-11-06 10:48:52", + "referer": "http:\/\/tsama.cn\/" + }, + { + "ip": "113.87.138.191", + "user_agent": "Mozilla\/5.0 (iPhone; CPU iPhone OS 18_7 like Mac OS X) AppleWebKit\/605.1.15 (KHTML, like Gecko) Version\/26.1 Mobile\/15E148 Safari\/604.1", + "timestamp": 1762406577, + "date": "2025-11-06 13:22:57", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.138.191", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.580", + "timestamp": 1762412167, + "date": "2025-11-06 14:56:07", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.136.77", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/10.0.1.951 Mobile Safari\/537.36", + "timestamp": 1762443818, + "date": "2025-11-06 23:43:38", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "14.116.140.239", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/10.0.1.951 Mobile Safari\/537.36", + "timestamp": 1762443819, + "date": "2025-11-06 23:43:39", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "14.116.140.42", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/10.0.1.951 Mobile Safari\/537.36", + "timestamp": 1762443851, + "date": "2025-11-06 23:44:11", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.138.191", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.580", + "timestamp": 1762479827, + "date": "2025-11-07 09:43:47", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.138.191", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.580", + "timestamp": 1762480471, + "date": "2025-11-07 09:54:31", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.84.83.15", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/10.0.2.952 Mobile Safari\/537.36", + "timestamp": 1762500708, + "date": "2025-11-07 15:31:48", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "14.116.140.135", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/10.0.2.952 Mobile Safari\/537.36", + "timestamp": 1762500708, + "date": "2025-11-07 15:31:48", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.84.83.15", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/10.0.2.952 Mobile Safari\/537.36", + "timestamp": 1762501327, + "date": "2025-11-07 15:42:07", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.84.83.15", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/10.0.2.952 Mobile Safari\/537.36", + "timestamp": 1762531061, + "date": "2025-11-07 23:57:41", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "14.116.140.45", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/10.0.2.952 Mobile Safari\/537.36", + "timestamp": 1762531061, + "date": "2025-11-07 23:57:41", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.139.184", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.580", + "timestamp": 1762744545, + "date": "2025-11-10 11:15:45", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.139.184", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.580", + "timestamp": 1762746568, + "date": "2025-11-10 11:49:28", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.139.184", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.580", + "timestamp": 1762754144, + "date": "2025-11-10 13:55:44", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.139.184", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.580", + "timestamp": 1762754792, + "date": "2025-11-10 14:06:32", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.139.184", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.580", + "timestamp": 1762755395, + "date": "2025-11-10 14:16:35", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.139.184", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.580", + "timestamp": 1762829799, + "date": "2025-11-11 10:56:39", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "14.116.140.135", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/10.0.3.953 Mobile Safari\/537.36", + "timestamp": 1762838913, + "date": "2025-11-11 13:28:33", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.84.193.224", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/10.0.3.953 Mobile Safari\/537.36", + "timestamp": 1762838913, + "date": "2025-11-11 13:28:33", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.139.184", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.580", + "timestamp": 1762839710, + "date": "2025-11-11 13:41:50", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.139.184", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.580", + "timestamp": 1762840352, + "date": "2025-11-11 13:52:32", + "referer": "https:\/\/tsama.cn\/index.php" + }, + { + "ip": "113.87.139.184", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.580", + "timestamp": 1762840952, + "date": "2025-11-11 14:02:32", + "referer": "https:\/\/tsama.cn\/index.php" + }, + { + "ip": "113.87.139.184", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.580", + "timestamp": 1762847085, + "date": "2025-11-11 15:44:45", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "180.101.244.15", + "user_agent": "Mozilla\/5.0 (iPhone; CPU iPhone OS 18_4 like Mac OS X) AppleWebKit\/605.1.15 (KHTML, like Gecko) Version\/18.4 Mobile\/15E148 Safari\/604.1", + "timestamp": 1762856575, + "date": "2025-11-11 18:22:55", + "referer": "http:\/\/tsama.cn\/" + }, + { + "ip": "129.211.162.158", + "user_agent": "Mozilla\/5.0 (iPhone; CPU iPhone OS 18_4 like Mac OS X) AppleWebKit\/605.1.15 (KHTML, like Gecko) Version\/18.4 Mobile\/15E148 Safari\/604.1", + "timestamp": 1762856584, + "date": "2025-11-11 18:23:04", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.139.12", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/10.0.3.953 Mobile Safari\/537.36", + "timestamp": 1762876151, + "date": "2025-11-11 23:49:11", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "14.116.140.135", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/10.0.3.953 Mobile Safari\/537.36", + "timestamp": 1762876152, + "date": "2025-11-11 23:49:12", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "14.116.140.86", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/10.0.3.953 Mobile Safari\/537.36", + "timestamp": 1762916890, + "date": "2025-11-12 11:08:10", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.84.169.220", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/10.0.3.953 Mobile Safari\/537.36", + "timestamp": 1762916897, + "date": "2025-11-12 11:08:17", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "14.116.140.239", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/10.0.3.953 Mobile Safari\/537.36", + "timestamp": 1762929145, + "date": "2025-11-12 14:32:25", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.139.184", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/10.0.3.953 Mobile Safari\/537.36", + "timestamp": 1762929145, + "date": "2025-11-12 14:32:25", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.139.184", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.580", + "timestamp": 1762930300, + "date": "2025-11-12 14:51:40", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.139.184", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.0.0 Safari\/537.36 Edg\/141.0.0.0", + "timestamp": 1762933489, + "date": "2025-11-12 15:44:49", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "14.116.140.135", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/10.0.3.953 Mobile Safari\/537.36", + "timestamp": 1762938731, + "date": "2025-11-12 17:12:11", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "14.31.17.219", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/10.0.3.953 Mobile Safari\/537.36", + "timestamp": 1762938732, + "date": "2025-11-12 17:12:12", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.139.12", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/10.0.3.953 Mobile Safari\/537.36", + "timestamp": 1762962301, + "date": "2025-11-12 23:45:01", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "14.116.140.239", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/10.0.3.953 Mobile Safari\/537.36", + "timestamp": 1762962301, + "date": "2025-11-12 23:45:01", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "220.196.160.144", + "user_agent": "Mozilla\/5.0 (iPhone; CPU iPhone OS 18_4 like Mac OS X) AppleWebKit\/605.1.15 (KHTML, like Gecko) Version\/18.4 Mobile\/15E148 Safari\/604.1", + "timestamp": 1763008494, + "date": "2025-11-13 12:34:54", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "180.101.245.251", + "user_agent": "Mozilla\/5.0 (iPhone; CPU iPhone OS 18_4 like Mac OS X) AppleWebKit\/605.1.15 (KHTML, like Gecko) Version\/18.4 Mobile\/15E148 Safari\/604.1", + "timestamp": 1763008509, + "date": "2025-11-13 12:35:09", + "referer": "http:\/\/tsama.cn\/" + }, + { + "ip": "14.31.17.35", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/10.0.3.953 Mobile Safari\/537.36", + "timestamp": 1763008809, + "date": "2025-11-13 12:40:09", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "14.116.140.239", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/10.0.3.953 Mobile Safari\/537.36", + "timestamp": 1763008809, + "date": "2025-11-13 12:40:09", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.139.184", + "user_agent": "Mozilla\/5.0 (iPhone; CPU iPhone OS 18_7 like Mac OS X) AppleWebKit\/605.1.15 (KHTML, like Gecko) Version\/26.1 Mobile\/15E148 Safari\/604.1", + "timestamp": 1763027006, + "date": "2025-11-13 17:43:26", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "14.116.140.239", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/10.0.3.953 Mobile Safari\/537.36", + "timestamp": 1763027843, + "date": "2025-11-13 17:57:23", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.139.184", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/10.0.3.953 Mobile Safari\/537.36", + "timestamp": 1763027843, + "date": "2025-11-13 17:57:23", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "112.97.80.134", + "user_agent": "Mozilla\/5.0 (iPhone; CPU iPhone OS 18_7 like Mac OS X) AppleWebKit\/605.1.15 (KHTML, like Gecko) Version\/26.1 Mobile\/15E148 Safari\/604.1", + "timestamp": 1763028442, + "date": "2025-11-13 18:07:22", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "14.31.17.35", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/10.0.3.953 Mobile Safari\/537.36", + "timestamp": 1763028884, + "date": "2025-11-13 18:14:44", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "66.249.77.193", + "user_agent": "Mozilla\/5.0 (Linux; Android 6.0.1; Nexus 5X Build\/MMB29P) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/141.0.7390.122 Mobile Safari\/537.36 (compatible; Googlebot\/2.1; +http:\/\/www.google.com\/bot.html)", + "timestamp": 1763044679, + "date": "2025-11-13 22:37:59", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "14.31.17.35", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/10.0.3.953 Mobile Safari\/537.36", + "timestamp": 1763049822, + "date": "2025-11-14 00:03:42", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "14.116.140.24", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/10.0.3.953 Mobile Safari\/537.36", + "timestamp": 1763049822, + "date": "2025-11-14 00:03:42", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "35.165.215.140", + "user_agent": "Mozilla\/5.0 (X11; Linux x86_64) AppleWebKit\/537.36 (KHTML, like Gecko) HeadlessChrome\/141.0.0.0 Safari\/537.36", + "timestamp": 1763069448, + "date": "2025-11-14 05:30:48", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.139.101", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/10.0.3.953 Mobile Safari\/537.36", + "timestamp": 1763086725, + "date": "2025-11-14 10:18:45", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "14.116.140.45", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/10.0.3.953 Mobile Safari\/537.36", + "timestamp": 1763086726, + "date": "2025-11-14 10:18:46", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.139.101", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/10.0.3.953 Mobile Safari\/537.36", + "timestamp": 1763087373, + "date": "2025-11-14 10:29:33", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.136.32", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.580", + "timestamp": 1763100138, + "date": "2025-11-14 14:02:18", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.136.32", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.580", + "timestamp": 1763100752, + "date": "2025-11-14 14:12:32", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.136.32", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.580", + "timestamp": 1763101352, + "date": "2025-11-14 14:22:32", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.136.32", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/130.0.0.0 Safari\/537.36 QuarkPC\/4.6.5.580", + "timestamp": 1763101952, + "date": "2025-11-14 14:32:32", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "205.169.39.16", + "user_agent": "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/117.0.5938.132 Safari\/537.36", + "timestamp": 1763216882, + "date": "2025-11-15 22:28:02", + "referer": "http:\/\/tsama.cn\/" + }, + { + "ip": "14.116.140.239", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/10.0.5.960 Mobile Safari\/537.36", + "timestamp": 1763351072, + "date": "2025-11-17 11:44:32", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.84.33.13", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/10.0.5.960 Mobile Safari\/537.36", + "timestamp": 1763351072, + "date": "2025-11-17 11:44:32", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "112.97.80.134", + "user_agent": "Mozilla\/5.0 (iPhone; CPU iPhone OS 18_7 like Mac OS X) AppleWebKit\/605.1.15 (KHTML, like Gecko) Version\/26.1 Mobile\/15E148 Safari\/604.1", + "timestamp": 1763357429, + "date": "2025-11-17 13:30:29", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.84.33.13", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/10.0.5.960 Mobile Safari\/537.36", + "timestamp": 1763361926, + "date": "2025-11-17 14:45:26", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "14.116.140.135", + "user_agent": "Mozilla\/5.0 (Linux; U; Android 15; zh-CN; 23116PN5BC Build\/AQ3A.240627.003) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/123.0.6312.80 Quark\/10.0.5.960 Mobile Safari\/537.36", + "timestamp": 1763361926, + "date": "2025-11-17 14:45:26", + "referer": "https:\/\/tsama.cn\/" + }, + { + "ip": "113.87.136.32", + "user_agent": "Mozilla\/5.0 (iPhone; CPU iPhone OS 18_7 like Mac OS X) AppleWebKit\/605.1.15 (KHTML, like Gecko) Version\/26.1 Mobile\/15E148 Safari\/604.1", + "timestamp": 1763437464, + "date": "2025-11-18 11:44:24", + "referer": "https:\/\/tsama.cn\/" + } +] \ No newline at end of file diff --git a/index.php b/index.php new file mode 100644 index 0000000..5ca2b7a --- /dev/null +++ b/index.php @@ -0,0 +1,82 @@ + + + + + + + 🚀 组合基金监控 + + + + + +
+
+
+

基金监控

+

实时投资组合追踪

+
+ + + + + +
+
+
+ + + + +
+
+
+

正在加载基金数据...

+
+
+ + +
+ + + + diff --git a/login.php b/login.php new file mode 100644 index 0000000..f68c734 --- /dev/null +++ b/login.php @@ -0,0 +1,241 @@ + date('Y-m-d H:i:s'), + 'action' => '管理员登录', + 'ip' => $_SERVER['REMOTE_ADDR'] + ]; + + // 保存登录日志 + saveLog($log_entry); + + // 跳转到管理页面 + header('Location: admin.php'); + exit; + } else { + // 登录失败 + $error = '密码错误,请重试'; + } +} + +// 保存日志函数 +function saveLog($log_entry) { + $log_file = 'data/operation_log.json'; + + // 检查目录是否存在,不存在则创建 + if (!file_exists(dirname($log_file))) { + mkdir(dirname($log_file), 0777, true); + } + + // 读取现有日志 + $logs = []; + if (file_exists($log_file)) { + $content = file_get_contents($log_file); + if (!empty($content)) { + $logs = json_decode($content, true); + } + } + + // 添加新日志 + array_unshift($logs, $log_entry); + + // 限制日志数量,只保留最新的500条 + if (count($logs) > 500) { + $logs = array_slice($logs, 0, 500); + } + + // 保存日志 + file_put_contents($log_file, json_encode($logs, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT)); +} +?> + + + + + + 🚀 基金监控 - 登录 + + + + +
+ + + +
+ +
+ + +
+
+ + +
+ + + + +
+ + +
+ + \ No newline at end of file diff --git a/recommend_fund.css b/recommend_fund.css new file mode 100644 index 0000000..d65ca81 --- /dev/null +++ b/recommend_fund.css @@ -0,0 +1,711 @@ +/* 推荐基金页面专用样式 */ + +/* 容器样式 */ +.recommend-container { + max-width: 880px; + margin: 0 auto; + padding: 20px; +} + +/* 表单样式 */ +.recommend-form { + background: white; + padding: 30px; + border-radius: 12px; + margin-bottom: 30px; + box-shadow: 0 4px 12px rgba(0,0,0,0.08); +} + +.recommend-form h2 { + margin-top: 0; + margin-bottom: 25px; + color: #374151; + font-size: 1.4rem; +} + +.form-group { + margin-bottom: 25px; +} + +.form-group label { + display: block; + margin-bottom: 10px; + font-weight: 600; + color: #4b5563; + font-size: 1rem; +} + +.form-group input { + width: 100%; + padding: 12px 16px; + border: 2px solid #e5e7eb; + border-radius: 10px; + font-size: 1rem; + transition: all 0.3s ease; + background: #f9fafb; +} + +.form-group input:focus { + outline: none; + border-color: #6366f1; + box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.1); + background: white; +} + +.submit-btn { + background: linear-gradient(135deg, #6366f1, #8b5cf6); + color: white; + border: none; + padding: 12px 24px; + border-radius: 10px; + font-size: 1rem; + font-weight: 600; + cursor: pointer; + transition: all 0.3s ease; + display: inline-flex; + align-items: center; + gap: 8px; +} + +.submit-btn:hover { + transform: translateY(-2px); + box-shadow: 0 6px 20px rgba(99, 102, 241, 0.3); +} + +/* 消息提示样式 */ +.message { + padding: 15px 20px; + margin-bottom: 20px; + border-radius: 10px; + font-weight: 600; + transition: all 0.3s ease; + box-shadow: 0 2px 8px rgba(0,0,0,0.1); +} + +.message.success { + background: linear-gradient(135deg, #d1fae5, #06d6a0); + color: #065f46; + border: none; +} + +.message.error { + background: linear-gradient(135deg, #fee2e2, #ef4444); + color: #991b1b; + border: none; +} + +/* 统计显示样式 */ +.stats-display { + display: flex; + justify-content: space-between; + margin-bottom: 25px; + gap: 15px; + flex-wrap: wrap; +} + +.stat-item { + text-align: center; + flex: 1; + min-width: 180px; + padding: 20px 15px; + background: white; + border-radius: 12px; + margin: 0; + box-shadow: 0 4px 12px rgba(0,0,0,0.08); + transition: all 0.3s ease; + position: relative; + overflow: hidden; +} + +.stat-item:hover { + transform: translateY(-5px); + box-shadow: 0 8px 25px rgba(0,0,0,0.12); +} + +.stat-item::before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 4px; + height: 100%; + background: linear-gradient(180deg, #6366f1, #8b5cf6); +} + +.stat-number { + font-size: 2.2rem; + font-weight: 700; + color: #6366f1; + margin-bottom: 8px; + display: block; +} + +.stat-label { + font-size: 0.95rem; + color: #6b7280; + font-weight: 500; +} + +/* 信息框样式 */ +.info-box { + background: linear-gradient(135deg, #dbeafe, #3b82f6); + color: #1e40af; + padding: 20px; + border-radius: 12px; + margin-bottom: 25px; + box-shadow: 0 4px 12px rgba(0,0,0,0.08); +} + +.info-box strong { + display: block; + margin-bottom: 12px; + font-size: 1.1rem; +} + +.info-box ul { + margin: 0; + padding-left: 25px; +} + +.info-box li { + margin-bottom: 6px; + font-weight: 500; +} + +/* 警告框样式 */ +.warning-box { + background: linear-gradient(135deg, #fef3c7, #f59e0b); + color: #92400e; + padding: 20px; + border-radius: 12px; + margin-bottom: 25px; + box-shadow: 0 4px 12px rgba(0,0,0,0.08); +} + +.warning-box strong { + display: block; + margin-bottom: 12px; + font-size: 1.1rem; +} + +/* 基金列表样式 */ +.fund-list { + background: white; + padding: 30px; + border-radius: 12px; + box-shadow: 0 4px 12px rgba(0,0,0,0.08); + margin-top: 30px; +} + +.fund-list h3 { + margin-top: 0; + color: #374151; + margin-bottom: 25px; + font-size: 1.3rem; + position: relative; + padding-bottom: 12px; +} + +.fund-list h3::after { + content: ''; + position: absolute; + bottom: 0; + left: 0; + width: 60px; + height: 4px; + background: linear-gradient(90deg, #6366f1, #8b5cf6); + border-radius: 2px; +} + +/* 下拉框容器 */ +.dropdown-container { + margin-top: 0; +} + +/* 下拉框项样式 */ +.dropdown-item { + margin-bottom: 16px; + border: 2px solid #e5e7eb; + border-radius: 12px; + overflow: hidden; + transition: all 0.3s ease; + background: white; +} + +.dropdown-item:hover { + border-color: #d1d5db; + box-shadow: 0 4px 12px rgba(0,0,0,0.05); +} + +.dropdown-item.user-ip { + border-color: #6366f1; + background-color: #f8fafc; + box-shadow: 0 4px 12px rgba(99, 102, 241, 0.15); +} + +/* 下拉框头部 */ +.dropdown-header { + display: flex; + justify-content: space-between; + align-items: center; + padding: 18px 20px; + background: linear-gradient(135deg, #f8fafc, #e2e8f0); + cursor: pointer; + transition: all 0.3s ease; + position: relative; +} + +.dropdown-header:hover { + background: linear-gradient(135deg, #e2e8f0, #cbd5e1); +} + +.dropdown-item.user-ip .dropdown-header { + background: linear-gradient(135deg, #eff6ff, #dbeafe); +} + +.dropdown-item.user-ip .dropdown-header:hover { + background: linear-gradient(135deg, #dbeafe, #bfdbfe); +} + +/* 下拉框信息 */ +.dropdown-info { + display: flex; + flex-wrap: wrap; + gap: 25px; + align-items: center; +} + +.dropdown-info > strong { + color: #6366f1; + font-size: 1.1rem; +} + +.dropdown-time, +.dropdown-count, +.dropdown-total-change { + font-size: 0.95rem; + color: #4b5563; + font-weight: 500; +} + +.dropdown-time strong, +.dropdown-count strong { + color: #374151; +} + +.dropdown-total-change { + font-weight: 700; + padding: 6px 12px; + border-radius: 6px; + background: #f3f4f6; + transition: all 0.3s ease; +} + +.dropdown-total-change.positive { + background: #dcfce7; + color: #166534; +} + +.dropdown-total-change.negative { + background: #fee2e2; + color: #991b1b; +} + +/* 下拉框箭头 */ +.dropdown-arrow i { + transition: transform 0.3s ease; + font-size: 1.1rem; + color: #6366f1; +} + +.dropdown-item.open .dropdown-arrow i { + transform: rotate(180deg); +} + +/* 下拉框内容 */ +.dropdown-content { + max-height: 0; + overflow: hidden; + transition: max-height 0.4s cubic-bezier(0.4, 0, 0.2, 1); + background-color: white; +} + +.dropdown-item.open .dropdown-content { + max-height: 800px; +} + +/* 基金详情表格 */ +.fund-details-table { + width: 100%; + border-collapse: collapse; + font-size: 0.95rem; +} + +.fund-details-table th, +.fund-details-table td { + padding: 15px 20px; + text-align: left; + border-bottom: 1px solid #f1f5f9; + transition: all 0.3s ease; +} + +.fund-details-table th { + background: #f8fafc; + font-weight: 600; + color: #374151; + font-size: 0.9rem; + text-transform: uppercase; + letter-spacing: 0.5px; +} + +.fund-details-table tr:hover { + background: #f8fafc; + transform: translateX(2px); +} + +.fund-details-table tr:last-child td { + border-bottom: none; +} + +/* 基金涨幅样式 */ +.fund-change { + font-weight: 700; + padding: 4px 8px; + border-radius: 4px; + transition: all 0.3s ease; +} + +.fund-change.positive { + background: #fee2e2; + color: #dc2626; +} + +.fund-change.negative { + background: #dcfce7; + color: #16a34a; +} + +/* 错误状态样式 */ +.fund-change.error { + background: #f3f4f6; + color: #6b7280; + font-style: italic; + box-shadow: 0 2px 5px rgba(107, 114, 128, 0.1); +} + +.error-text { + color: #6b7280; + font-style: italic; + font-size: 0.9em; + display: flex; + align-items: center; + gap: 5px; +} + +.error-text::before { + content: '⚠️'; + font-size: 1em; +} + +.error-row { + background: linear-gradient(90deg, #fffbeb, #fef3c7); + border-left: 3px solid #f59e0b; + transition: all 0.3s ease; +} + +.error-row:hover { + background: linear-gradient(90deg, #fef3c7, #fde68a); + transform: translateX(2px); +} + +.error-icon { + color: #f59e0b; + font-weight: bold; + font-size: 1.2em; +} + +/* 返回按钮样式 */ +.back-btn { + display: inline-block; + margin-bottom: 25px; + color: #000000ff; + text-decoration: none; + padding: 10px 20px; + border: 2px solid #0004d3; + border-radius: 10px; + transition: all 0.3s ease; + font-weight: 600; + display: inline-flex; + align-items: center; + gap: 8px; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); +} + +.back-btn:hover { + background: linear-gradient(135deg, #6366f1, #8b5cf6); + color: white; + transform: translateY(-2px); + box-shadow: 0 6px 20px rgba(99, 102, 241, 0.3); +} + +/* 加载指示器样式 */ +.loading-overlay { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(0, 0, 0, 0.5); + display: flex; + justify-content: center; + align-items: center; + z-index: 1000; + backdrop-filter: blur(3px); +} + +.loading-spinner { + background: white; + padding: 40px; + border-radius: 15px; + text-align: center; + box-shadow: 0 10px 40px rgba(0, 0, 0, 0.3); + animation: fadeIn 0.3s ease; +} + +.loading-spinner i { + font-size: 48px; + color: #6366f1; + margin-bottom: 20px; + display: block; + animation: spin 1s linear infinite; +} + +.loading-spinner span { + font-size: 18px; + font-weight: 600; + color: #495057; +} + +@keyframes spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} + +@keyframes fadeIn { + from { + opacity: 0; + transform: scale(0.9); + } + to { + opacity: 1; + transform: scale(1); + } +} + +/* 改进错误显示效果 */ +.error-container { + background: linear-gradient(135deg, #fee2e2, #fecaca); + border: 2px solid #ef4444; + border-radius: 12px; + padding: 20px; + margin-bottom: 25px; + box-shadow: 0 4px 15px rgba(239, 68, 68, 0.15); + position: relative; +} + +.error-container::before { + content: '⚠️'; + position: absolute; + top: 15px; + right: 20px; + font-size: 24px; +} + +.error-container h4 { + color: #991b1b; + margin-top: 0; + margin-bottom: 10px; + font-size: 1.2rem; + display: flex; + align-items: center; + gap: 8px; +} + +.error-container p { + color: #7f1d1d; + margin: 0; + font-weight: 500; +} + +/* 空状态样式 */ +.empty-state { + text-align: center; + padding: 60px 20px; + color: #6b7280; + background: linear-gradient(135deg, #f9fafb, #f3f4f6); + border-radius: 12px; + border: 2px dashed #d1d5db; +} + +.empty-state i { + font-size: 72px; + margin-bottom: 20px; + opacity: 0.3; + color: #6366f1; +} + +.empty-state h3 { + font-size: 24px; + margin-bottom: 10px; + color: #4b5563; +} + +.empty-state p { + font-size: 16px; + max-width: 400px; + margin: 0 auto; +} + +/* 高亮动画样式 */ +.highlight { + animation: highlight 0.3s ease-in-out; +} + +@keyframes highlight { + 0% { background-color: transparent; } + 50% { background-color: rgba(255, 255, 0, 0.3); } + 100% { background-color: transparent; } +} +/* ===== UI优化追加样式(覆盖同名规则) ===== */ +.stat-icon { + width: 40px; + height: 40px; + border-radius: 12px; + display: inline-flex; + align-items: center; + justify-content: center; + background: linear-gradient(135deg, var(--primary), var(--primary-dark)); + color: #fff; + margin-bottom: 10px; + box-shadow: 0 6px 18px rgba(99, 102, 241, 0.35); +} + +.dropdown-total-change.neutral { + background: #f3f4f6; + color: #374151; +} + +.fund-change.neutral { + background: #f3f4f6; + color: #374151; +} + +.fund-change.highlight, +.dropdown-total-change.highlight { + box-shadow: 0 0 0 6px rgba(99,102,241,0.08) inset; +} + +.back-btn { + color: var(--dark); + border: 2px solid var(--primary); +} + +.ip-badge { + display: inline-flex; + align-items: center; + gap: 6px; + padding: 6px 10px; + border-radius: 999px; + background: linear-gradient(135deg, var(--info), var(--primary)); + color: #fff; + font-size: 0.85rem; + font-weight: 600; +} + +@media (max-width: 680px) { + .fund-details-table thead { display: none; } + .fund-details-table, + .fund-details-table tbody, + .fund-details-table tr, + .fund-details-table td { display: block; width: 100%; } + .fund-details-table tr { + background: #fff; + border: 1px solid var(--border); + border-radius: 12px; + margin-bottom: 12px; + box-shadow: 0 4px 12px rgba(0,0,0,0.05); + padding: 6px 0; + } + .fund-details-table td { + display: flex; + align-items: center; + justify-content: space-between; + padding: 10px 16px; + border-bottom: none; + } + .fund-details-table td:nth-child(1)::before { content: '基金代码'; color: #6b7280; font-weight: 600; margin-right: 12px; } + .fund-details-table td:nth-child(2)::before { content: '推荐时间'; color: #6b7280; font-weight: 600; margin-right: 12px; } + .fund-details-table td:nth-child(3)::before { content: '基金名称'; color: #6b7280; font-weight: 600; margin-right: 12px; } + .fund-details-table td:nth-child(4)::before { content: '当前涨幅'; color: #6b7280; font-weight: 600; margin-right: 12px; } +} +/* 排序工具条样式 */ +.sort-toolbar { + display: flex; + gap: 12px; + margin-bottom: 16px; + flex-wrap: wrap; +} + +.sort-btn { + display: inline-flex; + align-items: center; + gap: 8px; + padding: 8px 14px; + border-radius: 10px; + border: 2px solid var(--border); + background: #fff; + color: var(--dark); + font-weight: 600; + cursor: pointer; + transition: all 0.2s ease; +} + +.sort-btn .order-indicator { + font-size: 0.9rem; + color: var(--gray); +} + +.sort-btn:hover { + border-color: var(--primary); + box-shadow: 0 4px 12px rgba(99, 102, 241, 0.15); +} + +.sort-btn.active { + background: linear-gradient(135deg, var(--primary), var(--primary-dark)); + color: #fff; + border-color: transparent; +} + +.sort-btn.active .order-indicator { + color: #fff; +} + +/* 重置按钮样式 */ +.sort-reset { + display: inline-flex; + align-items: center; + gap: 8px; + padding: 8px 14px; + border-radius: 10px; + border: 2px solid var(--border); + background: #fff; + color: var(--dark); + font-weight: 600; + cursor: pointer; + transition: all 0.2s ease; +} + +.sort-reset:hover { + border-color: var(--primary); + box-shadow: 0 4px 12px rgba(99, 102, 241, 0.15); +} diff --git a/recommend_fund.js b/recommend_fund.js new file mode 100644 index 0000000..faf6841 --- /dev/null +++ b/recommend_fund.js @@ -0,0 +1,657 @@ +/** + * 推荐基金页面JavaScript功能 + */ + +// 配置常量 +const API_TIMEOUT = 5000; // API 请求超时时间(毫秒) +const MAX_RETRY_COUNT = 3; // 最大重试次数 +const RETRY_DELAY = 1000; // 重试延迟(毫秒) +const BATCH_SIZE = 10; // 批量请求数量 +const UPDATE_INTERVAL = 60000; // 自动更新间隔(毫秒) +const HIGHLIGHT_DURATION = 300; // 高亮效果持续时间 + +// 全局状态 +let updateIntervalId = null; +let isLoading = false; +let fundDataCache = {}; // 缓存基金数据 +let lastData = {}; // 上一次的数据,用于比较变化 +let errorCount = 0; +const MAX_ERROR_COUNT = 5; // 连续错误次数上限 + +/** + * 格式化数字(保留两位小数) + * @param {number} num - 要格式化的数字 + * @returns {string} 格式化后的字符串 + */ +function formatNumber(num) { + if (typeof num !== 'number' || isNaN(num)) { + return '--'; + } + return num.toFixed(2); +} + +/** + * 显示加载状态 + * @param {boolean} show - 是否显示 + */ +function showLoading(show) { + const loadingElement = document.getElementById('loading-indicator'); + if (!loadingElement && show) { + // 创建加载指示器 + const div = document.createElement('div'); + div.id = 'loading-indicator'; + div.className = 'loading-overlay'; + div.innerHTML = ` +
+ + 加载基金数据中... +
+ `; + document.body.appendChild(div); + } else if (loadingElement) { + loadingElement.style.display = show ? 'flex' : 'none'; + } +} + +/** + * 清理JSONP请求的资源 + * @param {string} scriptId - script标签ID + * @param {string} callbackName - 回调函数名 + */ +function cleanupResources(scriptId, callbackName) { + // 清理script标签 + const script = document.getElementById(scriptId); + if (script && script.parentNode) { + script.parentNode.removeChild(script); + } + + // 清理回调函数 + if (window[callbackName]) { + delete window[callbackName]; + } +} + +/** + * 处理API错误 + * @param {string} errorMessage - 错误消息 + */ +function handleApiError(errorMessage) { + errorCount++; + console.error(errorMessage); + + // 如果连续错误次数过多,显示错误提示 + if (errorCount >= MAX_ERROR_COUNT) { + updateErrorDisplay('获取基金数据时遇到问题,请稍后再试', true); + } +} + +/** + * 获取单个基金数据(使用 JSONP 方式,支持预加载) + * @param {string} fundCode - 基金代码 + * @param {number} retryCount - 当前重试次数 + * @returns {Promise} 基金数据对象 + */ +function fetchFundData(fundCode, retryCount = 0) { + // 清理基金代码,确保只包含数字和字母 + const cleanFundCode = String(fundCode).replace(/[^\dA-Za-z]/g, '').trim(); + + if (!cleanFundCode) { + console.error('无效的基金代码:', fundCode); + return Promise.resolve({ + success: false, + error: '无效的基金代码', + fundCode: fundCode + }); + } + + // 1. 检查是否有预加载数据 + if (window.preloadedFundData && window.preloadedFundData[cleanFundCode]) { + console.log(`使用预加载数据: ${cleanFundCode}`); + return Promise.resolve({ + success: true, + data: window.preloadedFundData[cleanFundCode], + fromCache: true + }); + } + + // 2. 检查缓存 + const cachedData = fundDataCache[cleanFundCode]; + if (cachedData && (Date.now() - cachedData.timestamp) < 30000) { // 30秒缓存 + return Promise.resolve({ + success: true, + data: cachedData.data, + fromCache: true + }); + } + + return new Promise((resolve, reject) => { + // 设置超时 + const timeoutId = setTimeout(() => { + reject(new Error('请求超时')); + }, API_TIMEOUT); + + // 创建唯一的回调函数名 + const callbackName = `jsonp_callback_${cleanFundCode}_${Date.now()}`; + const scriptId = `jsonp_script_${cleanFundCode}`; + + // 定义全局回调函数 + window[callbackName] = function(data) { + clearTimeout(timeoutId); + + // 检查数据有效性 + if (!data || !data.fundcode || data.fundcode !== cleanFundCode) { + cleanupResources(scriptId, callbackName); + handleApiError(`基金${cleanFundCode}数据格式错误`); + resolve({ + success: false, + error: '数据格式错误', + fundCode: cleanFundCode + }); + return; + } + + // 缓存数据 + fundDataCache[cleanFundCode] = { + data: data, + timestamp: Date.now() + }; + + // 重置错误计数 + errorCount = 0; + + // 清理资源并返回结果 + cleanupResources(scriptId, callbackName); + resolve({ + success: true, + data: data + }); + }; + + // 创建脚本元素 + const script = document.createElement('script'); + script.id = scriptId; + script.src = `http://fundgz.1234567.com.cn/js/${cleanFundCode}.js?callback=${callbackName}`; + script.onerror = function() { + clearTimeout(timeoutId); + cleanupResources(scriptId, callbackName); + reject(new Error('脚本加载失败')); + }; + + // 添加到文档中 + document.body.appendChild(script); + }).catch(error => { + console.error(`获取基金 ${cleanFundCode} 数据失败:`, error.message); + + // 重试逻辑 + if (retryCount < MAX_RETRY_COUNT) { + console.log(`尝试重试 ${cleanFundCode}, 第 ${retryCount + 1} 次`); + return new Promise(resolve => { + setTimeout(() => { + resolve(fetchFundData(cleanFundCode, retryCount + 1)); + }, RETRY_DELAY * (retryCount + 1)); + }); + } + + handleApiError(`获取基金 ${cleanFundCode} 数据失败`); + return { + success: false, + error: error.message, + fundCode: cleanFundCode + }; + }); +} + +/** + * 批量获取基金数据 + * @param {Array} fundCodes - 基金代码数组 + * @returns {Promise} 基金数据结果数组 + */ +async function fetchFundsDataInBatch(fundCodes) { + // 分批处理,避免一次请求过多 + const batches = []; + for (let i = 0; i < fundCodes.length; i += BATCH_SIZE) { + batches.push(fundCodes.slice(i, i + BATCH_SIZE)); + } + + const allResults = []; + + // 逐批处理 + for (const batch of batches) { + // 使用Promise.allSettled确保所有请求都完成 + const batchPromises = batch.map(code => fetchFundData(code)); + const batchResults = await Promise.allSettled(batchPromises); + + batchResults.forEach((result, index) => { + if (result.status === 'fulfilled') { + allResults.push(result.value); + } else { + console.error(`处理批处理中基金 ${batch[index]} 时出错:`, result.reason); + allResults.push({ + success: false, + error: result.reason?.message || '未知错误', + fundCode: batch[index] + }); + } + }); + + // 批处理之间添加短暂延迟,避免请求过于密集 + if (batches.indexOf(batch) < batches.length - 1) { + await new Promise(resolve => setTimeout(resolve, 500)); + } + } + + return allResults; +} + +/** + * 更新基金错误状态显示 + * @param {string} fundCode - 基金代码 + */ +function updateFundError(fundCode) { + // 更新基金名称显示 + document.querySelectorAll(`.fund-name[data-fund-code="${fundCode}"]`).forEach(el => { + if (el.textContent === '加载中...') { + el.textContent = `${fundCode} (数据获取失败)`; + el.classList.add('error-text'); + } + }); + + // 更新涨幅显示 + document.querySelectorAll(`.fund-change[data-fund-code="${fundCode}"]`).forEach(el => { + el.textContent = '--'; + el.classList.add('error'); + }); +} + +/** + * 加载所有基金信息 + */ +async function loadAllFundInfo() { + if (isLoading) return; + isLoading = true; + showLoading(true); + + try { + // 保存旧数据用于比较 + lastData = {}; + for (const fundCode in fundDataCache) { + lastData[fundCode] = fundDataCache[fundCode].data; + } + + // 获取所有需要的基金代码 + const fundElements = document.querySelectorAll('[data-fund-code]'); + const fundCodes = Array.from(new Set(Array.from(fundElements).map(el => { + const code = el.getAttribute('data-fund-code'); + // 清理基金代码 + return String(code || '').replace(/[^\dA-Za-z]/g, '').trim(); + }))).filter(code => code.length > 0); // 过滤空代码 + + if (fundCodes.length === 0) { + console.log('没有找到需要加载的基金'); + return; + } + + console.log(`开始加载 ${fundCodes.length} 支基金数据`, fundCodes); + + // 批量获取基金数据 + const results = await fetchFundsDataInBatch(fundCodes); + + // 更新UI + let successCount = 0; + results.forEach(result => { + if (result.success && result.data) { + updateFundDisplay(result.data); + successCount++; + } else { + // 对于失败的请求,尝试更新为错误状态 + if (result.fundCode) { + updateFundError(result.fundCode); + } + } + }); + + // 更新IP组的总涨幅 + updateIpTotalChanges(); + + console.log(`基金数据加载完成: 成功${successCount}/${fundCodes.length}`); + } catch (error) { + console.error('加载基金信息时发生错误:', error); + updateErrorDisplay('加载基金数据失败,请稍后重试', true); + } finally { + isLoading = false; + showLoading(false); + } +} + +/** + * 更新单个基金的显示信息 + * @param {Object} fundData - 基金数据 + */ +function updateFundDisplay(fundData) { + if (!fundData || !fundData.fundcode) return; + + const fundCode = fundData.fundcode; + const name = fundData.name || '未知名称'; + const gszzl = parseFloat(fundData.gszzl) || 0; + + // 检查是否有数据变化 + const oldData = lastData[fundCode]; + const hasChanged = !oldData || oldData.gszzl !== fundData.gszzl; + + // 更新基金名称 + document.querySelectorAll(`.fund-name[data-fund-code="${fundCode}"]`).forEach(el => { + el.textContent = name; + }); + + // 更新基金涨幅 + document.querySelectorAll(`.fund-change[data-fund-code="${fundCode}"]`).forEach(el => { + const oldValue = el.textContent; + + el.textContent = `${formatNumber(gszzl)}%`; + + // 根据涨跌设置颜色 + el.classList.remove('positive', 'negative', 'neutral', 'highlight'); + if (gszzl > 0) { + el.classList.add('positive'); + } else if (gszzl < 0) { + el.classList.add('negative'); + } else { + el.classList.add('neutral'); + } + + // 如果有变化,添加高亮效果 + if (hasChanged) { + el.classList.add('highlight'); + setTimeout(() => { + el.classList.remove('highlight'); + }, HIGHLIGHT_DURATION); + } + }); +} + +/** + * 更新IP组的总涨幅 + */ +function updateIpTotalChanges() { + // 获取所有IP分组 + const ipGroups = document.querySelectorAll('[id^="ip-"]'); + + ipGroups.forEach(group => { + const ipId = group.id; + const changeElements = group.querySelectorAll('.fund-change'); + let totalChange = 0; + let validCount = 0; + + changeElements.forEach(el => { + const text = el.textContent.trim(); + if (text !== '--' && text !== '') { + const change = parseFloat(text.replace('%', '')); + if (!isNaN(change)) { + totalChange += change; + validCount++; + } + } + }); + + // 计算平均涨幅 + const avgChange = validCount > 0 ? totalChange / validCount : 0; + + // 更新显示 + const totalChangeElement = document.querySelector(`#total-change-${ipId.split('-')[1]}`); + if (totalChangeElement) { + const oldValue = totalChangeElement.textContent; + const newValue = `${formatNumber(avgChange)}%`; + + totalChangeElement.textContent = newValue; + + // 如果有变化,添加高亮效果 + if (oldValue !== newValue) { + totalChangeElement.classList.add('highlight'); + setTimeout(() => { + totalChangeElement.classList.remove('highlight'); + }, HIGHLIGHT_DURATION); + } + + // 根据涨跌设置颜色 + totalChangeElement.classList.remove('positive', 'negative', 'neutral'); + if (avgChange > 0) { + totalChangeElement.classList.add('positive'); + } else if (avgChange < 0) { + totalChangeElement.classList.add('negative'); + } else { + totalChangeElement.classList.add('neutral'); + } + + // 将平均涨幅写入分组容器的data属性,便于排序 + const dropdownItem = document.getElementById(ipId)?.closest('.dropdown-item'); + if (dropdownItem) { + dropdownItem.dataset.avgChange = String(avgChange); + } + } + }); +} + +/** + * 更新错误显示 + * @param {string} message - 错误信息 + * @param {boolean} show - 是否显示错误 + */ +function updateErrorDisplay(message, show = true) { + let errorElement = document.getElementById('api-error'); + + if (!errorElement) { + errorElement = document.createElement('div'); + errorElement.id = 'api-error'; + errorElement.className = 'error-message'; + document.body.prepend(errorElement); + } + + if (show) { + errorElement.textContent = message; + errorElement.style.display = 'block'; + + // 5秒后自动隐藏错误信息 + setTimeout(() => { + errorElement.style.display = 'none'; + }, 5000); + } else { + errorElement.style.display = 'none'; + } +} + +/** + * 切换下拉菜单显示/隐藏 + * @param {string} id - 要切换的元素ID + */ +function toggleDropdown(id) { + const element = document.getElementById(id); + if (element) { + element.classList.toggle('show'); + + // 切换箭头方向 + const header = element.previousElementSibling; + if (header) { + const arrow = header.querySelector('.dropdown-arrow i'); + if (arrow) { + arrow.classList.toggle('fa-chevron-down'); + arrow.classList.toggle('fa-chevron-up'); + } + } + } +} + +/** + * 初始化函数 + */ +function init() { + // 初始加载基金数据 + loadAllFundInfo(); + + // 设置自动更新 + updateIntervalId = setInterval(loadAllFundInfo, UPDATE_INTERVAL); + + // 清理函数 + window.addEventListener('beforeunload', cleanup); + + // 为所有下拉菜单添加点击事件委托 + document.addEventListener('click', function(e) { + // 检查是否点击了下拉菜单标题 + const dropdownHeader = e.target.closest('.dropdown-header'); + + if (dropdownHeader) { + // 获取父级dropdown-item元素 + const dropdownItem = dropdownHeader.closest('.dropdown-item'); + if (dropdownItem) { + // 关闭所有其他下拉菜单 + document.querySelectorAll('.dropdown-item').forEach(item => { + if (item !== dropdownItem) { + item.classList.remove('open'); + const arrow = item.querySelector('.dropdown-arrow i'); + if (arrow) { + arrow.classList.remove('fa-chevron-up'); + arrow.classList.add('fa-chevron-down'); + } + } + }); + + // 切换当前下拉菜单 + dropdownItem.classList.toggle('open'); + + // 切换箭头方向 + const arrow = dropdownHeader.querySelector('.dropdown-arrow i'); + if (arrow) { + arrow.classList.toggle('fa-chevron-down'); + arrow.classList.toggle('fa-chevron-up'); + } + } + } else { + // 点击其他地方,关闭所有下拉菜单 + document.querySelectorAll('.dropdown-item').forEach(item => { + item.classList.remove('open'); + const arrow = item.querySelector('.dropdown-arrow i'); + if (arrow) { + arrow.classList.remove('fa-chevron-up'); + arrow.classList.add('fa-chevron-down'); + } + }); + } + }); + + // 初始化排序工具条 + initSortToolbar(); +} + +/** + * 清理函数 + */ +function cleanup() { + if (updateIntervalId) { + clearInterval(updateIntervalId); + updateIntervalId = null; + } + + // 清理所有可能的JSONP回调函数 + Object.keys(window).forEach(key => { + if (key.startsWith('jsonp_callback_')) { + delete window[key]; + } + }); + + // 清理所有JSONP脚本标签 + document.querySelectorAll('script[id^="jsonp_script_"]').forEach(script => { + if (script.parentNode) { + script.parentNode.removeChild(script); + } + }); +} + +// 页面加载完成后初始化 +if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', init); +} else { + init(); +} +/** + * 初始化排序工具条 + */ +function initSortToolbar() { + const container = document.querySelector('.dropdown-container'); + const buttons = document.querySelectorAll('.sort-btn'); + const resetBtn = document.querySelector('.sort-reset'); + if (!container || buttons.length === 0) return; + + const applyActive = (activeBtn) => { + buttons.forEach(btn => btn.classList.toggle('active', btn === activeBtn)); + // 更新箭头指示符 + buttons.forEach(btn => { + const indicator = btn.querySelector('.order-indicator'); + if (indicator) { + indicator.textContent = btn.dataset.order === 'asc' ? '↑' : '↓'; + } + }); + }; + + const sortIpGroups = (key, order) => { + const items = Array.from(container.querySelectorAll('.dropdown-item')); + const getVal = (el) => { + switch (key) { + case 'time': { + const t = el.dataset.latestTime || ''; + // 兼容 YYYY-MM-DD HH:mm:ss + const timeNum = Date.parse(t.replace(/-/g, '/')) || 0; + return timeNum; + } + case 'count': + return parseInt(el.dataset.fundCount || '0', 10); + case 'avg': + return parseFloat(el.dataset.avgChange || '0'); + default: + return 0; + } + }; + + items.sort((a, b) => { + const av = getVal(a); + const bv = getVal(b); + if (av === bv) return 0; + return order === 'asc' ? (av - bv) : (bv - av); + }); + + // 重新插入排序后的元素 + items.forEach(el => container.appendChild(el)); + }; + + // 绑定按钮事件 + buttons.forEach(btn => { + btn.addEventListener('click', () => { + const sortKey = btn.dataset.sort; + const currentOrder = btn.dataset.order || 'desc'; + // 如果重复点击同一按钮,切换升降序 + const newOrder = (btn.classList.contains('active') && currentOrder === 'desc') ? 'asc' : 'desc'; + btn.dataset.order = newOrder; + applyActive(btn); + sortIpGroups(sortKey, newOrder); + }); + }); + + // 重置排序:恢复时间倒序 + if (resetBtn) { + resetBtn.addEventListener('click', () => { + // 所有按钮恢复箭头为倒序 + buttons.forEach(b => { b.dataset.order = 'desc'; }); + const defaultBtn = document.querySelector('.sort-btn[data-sort="time"]'); + if (defaultBtn) { + defaultBtn.dataset.order = 'desc'; + applyActive(defaultBtn); + sortIpGroups('time', 'desc'); + } + }); + } + + // 默认执行一次“按时间倒序”排序,保持与服务端一致 + const defaultBtn = document.querySelector('.sort-btn[data-sort="time"]'); + if (defaultBtn) { + applyActive(defaultBtn); + sortIpGroups('time', defaultBtn.dataset.order || 'desc'); + } +} diff --git a/recommend_fund.php b/recommend_fund.php new file mode 100644 index 0000000..bff077f --- /dev/null +++ b/recommend_fund.php @@ -0,0 +1,566 @@ + 0) { + $file = DATA_DIR . '/recommended_funds.json'; + file_put_contents($file, json_encode($fundsToKeep, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE)); + + // 记录清理日志 + logAction('clean_nonexistent_funds', ['funds_removed' => $fundsRemoved]); + } + + return $fundsRemoved; +} + +/** + * 记录操作日志 + * @param string $action 操作类型 + * @param array $data 操作数据 + */ +function logAction($action, $data = []) { + $logFile = DATA_DIR . '/recommend_logs.json'; + $logs = []; + if (file_exists($logFile)) { + $logs = json_decode(file_get_contents($logFile), true) ?? []; + } + + $logs[] = array_merge([ + 'action' => $action, + 'timestamp' => date('Y-m-d H:i:s') + ], $data); + + file_put_contents($logFile, json_encode($logs, JSON_PRETTY_PRINT)); +} + +/** + * 获取基金缓存文件路径 + * @param string $fundCode 基金代码 + * @return string 缓存文件路径 + */ +function getFundCachePath($fundCode) { + return CACHE_DIR . "/fund_{$fundCode}.json"; +} + +/** + * 从缓存获取基金数据 + * @param string $fundCode 基金代码 + * @return array|false 基金数据或false + */ +function getFundFromCache($fundCode) { + $cacheFile = getFundCachePath($fundCode); + if (!file_exists($cacheFile)) { + return false; + } + + // 检查缓存是否过期 + if (time() - filemtime($cacheFile) > FUND_CACHE_TTL) { + return false; + } + + $data = file_get_contents($cacheFile); + if ($data === false) { + return false; + } + + $fundData = json_decode($data, true); + return is_array($fundData) ? $fundData : false; +} + +/** + * 缓存基金数据 + * @param string $fundCode 基金代码 + * @param array $fundData 基金数据 + */ +function cacheFundData($fundCode, $fundData) { + $cacheFile = getFundCachePath($fundCode); + file_put_contents($cacheFile, json_encode($fundData, JSON_UNESCAPED_UNICODE)); +} + +/** + * 从API获取基金信息 + * @param string $fundCode 基金代码 + * @return array|false 基金数据或false + */ +function fetchFundDataFromAPI($fundCode) { + $apiUrl = "http://fundgz.1234567.com.cn/js/{$fundCode}.js?" . time(); + $context = stream_context_create([ + 'http' => [ + 'timeout' => 5, + 'header' => "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36\r\n", + 'ignore_errors' => true + ] + ]); + + $response = @file_get_contents($apiUrl, false, $context); + + if (!$response) { + return false; + } + + // 解析返回的数据 + if (preg_match('/jsonpgz\d*\((.*)\);?/', $response, $matches)) { + $data = json_decode($matches[1], true); + + // 检查数据是否有效 + if (is_array($data) && isset($data['fundcode']) && $data['fundcode'] == $fundCode) { + return $data; + } + } + + return false; +} + +/** + * 检查基金是否存在 + * @param string $fundCode 基金代码 + * @return bool 基金是否存在 + */ +function checkFundExists($fundCode) { + // 基金代码格式验证 + if (!preg_match('/^\d{6}$/', $fundCode)) { + return false; + } + + // 尝试从缓存获取 + $cachedData = getFundFromCache($fundCode); + if ($cachedData) { + return true; + } + + // 从API获取 + $fundData = fetchFundDataFromAPI($fundCode); + if ($fundData) { + // 缓存基金数据 + cacheFundData($fundCode, $fundData); + return true; + } + + return false; +} + +/** + * 获取基金详细信息 + * @param string $fundCode 基金代码 + * @return array|false 基金详细数据或false + */ +function getFundInfo($fundCode) { + // 先尝试从缓存获取 + $cachedData = getFundFromCache($fundCode); + if ($cachedData) { + return $cachedData; + } + + // 从API获取 + $fundData = fetchFundDataFromAPI($fundCode); + if ($fundData) { + // 缓存基金数据 + cacheFundData($fundCode, $fundData); + return $fundData; + } + + return false; +} + +/** + * 保存推荐基金 + * @param string $fundCode 基金代码 + * @param string $ip 用户IP + * @return array 操作结果 + */ +function saveRecommendedFund($fundCode, $ip) { + // 首先检查基金号是否存在 + if (!checkFundExists($fundCode)) { + return ['success' => false, 'message' => '基金号不存在,请输入正确的6位基金代码!']; + } + + // 检查数量限制 + $funds = loadRecommendedFunds(); + $timestamp = date('Y-m-d H:i:s'); + + // 检查基金总数是否已达到上限 + if (count($funds) >= MAX_TOTAL_FUNDS) { + return ['success' => false, 'message' => "推荐基金数量已达到上限({MAX_TOTAL_FUNDS}支)"]; + } + + // 检查IP推荐次数和基金是否已被推荐 + $ipCount = 0; + foreach ($funds as $fund) { + if ($fund['ip'] == $ip) { + $ipCount++; + } + if ($fund['fund_code'] == $fundCode) { + return ['success' => false, 'message' => '该基金已被推荐过']; + } + } + + if ($ipCount >= MAX_FUNDS_PER_IP) { + return ['success' => false, 'message' => "每个IP最多只能推荐{MAX_FUNDS_PER_IP}只基金"]; + } + + // 获取基金信息 + $fundInfo = getFundInfo($fundCode); + $fundName = $fundInfo ? ($fundInfo['name'] ?? '未知基金') : '未知基金'; + + // 添加新基金 + $newFund = [ + 'fund_code' => $fundCode, + 'ip' => $ip, + 'timestamp' => $timestamp, + 'channel' => '网站推荐', + 'amount' => 1000, + 'status' => 'pending', // 默认设为待审核,需要管理员批准 + 'fund_name' => $fundName // 保存基金名称 + ]; + + $funds[] = $newFund; + + // 保存到文件 + $file = DATA_DIR . '/recommended_funds.json'; + file_put_contents($file, json_encode($funds, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE)); + + // 记录操作日志 + logAction('recommend_fund', [ + 'fund_code' => $fundCode, + 'fund_name' => $fundName, + 'ip' => $ip + ]); + + return ['success' => true, 'message' => '基金推荐成功!']; +} + +// 处理推荐请求 +// 从session中获取消息(如果有) +$message = isset($_SESSION['message']) ? $_SESSION['message'] : ''; +$messageType = isset($_SESSION['messageType']) ? $_SESSION['messageType'] : ''; + +// 清除session中的消息,防止刷新页面再次显示 +unset($_SESSION['message'], $_SESSION['messageType']); + +// 定期清理不存在的基金(每10分钟执行一次) +$cleanupFile = DATA_DIR . '/last_cleanup.txt'; +$lastCleanup = @file_get_contents($cleanupFile); +$currentTime = time(); + +// 如果距离上次清理超过10分钟,执行清理 +if (!$lastCleanup || ($currentTime - $lastCleanup) > 600) { + $removedCount = cleanNonExistentFunds(); + file_put_contents($cleanupFile, $currentTime); + + // 如果有基金被清理,记录日志但不显示给用户 + if ($removedCount > 0) { + error_log("清理了{$removedCount}个不存在的基金"); + } +} + +if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['fund_code'])) { + $fundCode = trim($_POST['fund_code']); + $ip = getUserIP(); + + // 简单验证基金代码格式(假设为6位数字) + if (!preg_match('/^\d{6}$/', $fundCode)) { + $_SESSION['message'] = '基金代码格式不正确,请输入6位数字'; + $_SESSION['messageType'] = 'error'; + } else { + $result = saveRecommendedFund($fundCode, $ip); + $_SESSION['message'] = $result['message']; + $_SESSION['messageType'] = $result['success'] ? 'success' : 'error'; + } + + // 重定向到同一页面,实现POST-REDIRECT-GET模式 + header('Location: ' . $_SERVER['PHP_SELF']); + exit; +} + +// 获取IP推荐次数 +$userIp = getUserIP(); +$recommendedFunds = loadRecommendedFunds(); +$userRecommendCount = 0; +foreach ($recommendedFunds as $fund) { + if (isset($fund['ip']) && $fund['ip'] == $userIp) { + $userRecommendCount++; + } +} + +$totalFunds = count($recommendedFunds); + +// 预加载部分基金数据到页面中,提高初始加载速度 +$preloadedFundData = []; +$preloadLimit = 10; // 预加载10个基金的数据 +$preloadCount = 0; + +foreach ($recommendedFunds as $fund) { + if ($preloadCount >= $preloadLimit) break; + + $fundCode = $fund['fund_code'] ?? ''; + if (!empty($fundCode)) { + $fundInfo = getFundInfo($fundCode); + if ($fundInfo) { + $preloadedFundData[$fundCode] = $fundInfo; + $preloadCount++; + } + } +} +?> + + + + + + 基金推荐 - 组合基金监控 + + + + + +
+
+
+

基金推荐

+

推荐您关注的优质基金

+
+
+ +
+ 返回主页 + +
+
+
+
+
您已推荐基金数
+
+
+
+
+
剩余推荐次数
+
+
+
+
+
总推荐基金数
+
+
+ + +
+ +
+ + +
+ 推荐规则: +
    +
  • 每个IP地址最多只能推荐3只基金
  • +
  • 系统最多接受3000支基金推荐
  • +
  • 基金代码为6位数字
  • +
  • 推荐的基金将由管理员审核
  • +
+
+ + = 3 || $totalFunds >= 3000): ?> +
+ 提示: + = 3): ?> + 您已达到每个IP最多推荐3只基金的限制。 + + 系统已达到最大推荐基金数量(3000支)。 + +
+ +
+

推荐新基金

+
+ + +
+ +
+ + + +
+

已推荐基金列表

+ +
+ + + + +
+ + + +
+ +
+ + +
+ + + + + diff --git a/script.js b/script.js new file mode 100644 index 0000000..f53d6ff --- /dev/null +++ b/script.js @@ -0,0 +1,1014 @@ +// API配置 +const API_URL = 'api.php?action=fund_data'; +const STATS_URL = 'api.php?action=get_stats'; +const FUND_CHART_API = (code) => `api.php?action=get_fund_chart&fund_code=${code}`; + +// 全局数据存储 +let fundData = null; +let visitStats = null; +// 自动刷新相关变量 +let autoRefreshInterval = null; +const AUTO_REFRESH_INTERVAL = 10000; // 10秒自动刷新一次 +// 取消控制器,避免并发请求 +let fundController = null; +const cardCharts = new Map(); + +// 页面加载完成后初始化 +document.addEventListener('DOMContentLoaded', function() { + // 应用已保存的主题(优先使用用户选择,其次匹配系统偏好) + applySavedTheme(); + + // 添加动画样式 + addAnimationStyles(); + + loadFundData(); + loadVisitStats(); + + // 启动自动刷新 + startAutoRefresh(); + + document.getElementById('refreshBtn').addEventListener('click', function() { + loadFundData(); + loadVisitStats(); + }); + document.getElementById('themeBtn').addEventListener('click', toggleTheme); + document.getElementById('statsBtn').addEventListener('click', function() { + toggleStats(); + loadVisitStats(); // 刷新统计数据 + }); +}); + +/** + * 启动自动刷新基金数据 + */ +function startAutoRefresh() { + // 清除可能存在的旧定时器 + if (autoRefreshInterval) { + clearInterval(autoRefreshInterval); + } + + // 添加防抖变量 + let isLoading = false; + + // 设置新的定时器 + autoRefreshInterval = setInterval(function() { + // 如果上一个请求还在处理中,跳过本次请求 + if (isLoading) { + console.log('上一个请求未完成,跳过本次刷新...'); + return; + } + + console.log('自动刷新基金数据...'); + isLoading = true; + + loadFundData(true).finally(() => { + isLoading = false; + }); + }, AUTO_REFRESH_INTERVAL); +} + +/** + * 停止自动刷新 + */ +function stopAutoRefresh() { + if (autoRefreshInterval) { + clearInterval(autoRefreshInterval); + autoRefreshInterval = null; + } +} + +/** + * 更新页面元素的数值(不刷新整个UI) + * @param {Object} newData - 新的基金数据 + * @param {Object} oldData - 旧的基金数据 + */ +function updateElements(newData, oldData) { + if (!oldData) return; + + const { summary: newSummary, channelStats: newChannelStats } = newData; + const { summary: oldSummary, channelStats: oldChannelStats } = oldData; + + // 更新仪表盘统计数据 + if (newSummary.total !== oldSummary.total) { + const el = document.querySelector('[data-stat="total-funds"]'); + if (el) { + el.textContent = newSummary.total; + el.classList.add('highlight'); + setTimeout(() => el.classList.remove('highlight'), 300); + } + } + if (newSummary.upCount !== oldSummary.upCount) { + const el = document.querySelector('[data-stat="up-funds"]'); + if (el) { + el.textContent = newSummary.upCount; + el.classList.add('highlight'); + setTimeout(() => el.classList.remove('highlight'), 300); + } + } + if (newSummary.downCount !== oldSummary.downCount) { + const el = document.querySelector('[data-stat="down-funds"]'); + if (el) { + el.textContent = newSummary.downCount; + el.classList.add('highlight'); + setTimeout(() => el.classList.remove('highlight'), 300); + } + } + if (formatNumber(newSummary.avgChange) !== formatNumber(oldSummary.avgChange)) { + const el = document.querySelector('[data-stat="avg-change"]'); + if (el) { + el.textContent = formatNumber(newSummary.avgChange) + '%'; + el.classList.add('highlight'); + setTimeout(() => el.classList.remove('highlight'), 300); + } + } + + // 更新总盈亏 + if (newSummary.formattedTotalProfitLoss !== oldSummary.formattedTotalProfitLoss) { + const el = document.querySelector('[data-stat="total-profit"]'); + if (el) { + const profitClass = newSummary.profitLossClass; + el.innerHTML = ` + ${newSummary.profitLossIcon} ${newSummary.formattedTotalProfitLoss} + + ${newSummary.formattedProfitLossRate}% + + `; + el.classList.add('highlight'); + setTimeout(() => el.classList.remove('highlight'), 300); + } + } + + // 更新渠道统计数据 + for (const [channelName, newStats] of Object.entries(newChannelStats)) { + const oldStats = oldChannelStats[channelName]; + if (!oldStats) continue; + + // 更新平均涨跌 + if (formatNumber(newStats.avgChange) !== formatNumber(oldStats.avgChange)) { + const elements = document.querySelectorAll(`.channel-avg-change[data-channel="${channelName}"]`); + elements.forEach(el => { + el.textContent = formatNumber(newStats.avgChange) + '%'; + // 高亮变化的元素 + el.classList.add('highlight'); + setTimeout(() => el.classList.remove('highlight'), 300); + }); + } + + // 更新渠道盈亏 + if (newStats.totalProfitLoss !== oldStats.totalProfitLoss) { + const profitClass = newStats.totalProfitLoss > 0 ? 'profit-positive' : 'profit-negative'; + const profitIcon = newStats.totalProfitLoss > 0 ? '📈' : '📉'; + const elements = document.querySelectorAll(`.channel-profit-section[data-channel="${channelName}"]`); + elements.forEach(el => { + el.className = 'channel-profit-section ' + profitClass; + el.textContent = `${profitIcon} 渠道盈亏: ${formatCurrency(newStats.totalProfitLoss)} (${formatNumber(newStats.profitLossRate)}%)`; + // 高亮变化的元素 + el.classList.add('highlight'); + setTimeout(() => el.classList.remove('highlight'), 300); + }); + } + } + + // 更新基金卡片数据 + for (const [channelName, newStats] of Object.entries(newChannelStats)) { + const oldStats = oldChannelStats[channelName]; + if (!oldStats) continue; + + for (const [fundCode, newFund] of Object.entries(newStats.funds)) { + const oldFund = oldStats.funds[fundCode]; + if (!oldFund) continue; + + // 解析基本数据 + const parsedUnitNetValue = parseFloat(newFund.unit_net_value || newFund.dwjz) || 1; + const parsedCurrentNetValue = parseFloat(newFund.current_net_value || newFund.gsz) || 1; + const parsedShares = parseFloat(newFund.shares || (newFund.investment / parsedUnitNetValue)) || 0; + const todayProfitLoss = parsedShares * (parsedCurrentNetValue - parsedUnitNetValue); + + const oldParsedUnitNetValue = parseFloat(oldFund.unit_net_value || oldFund.dwjz) || 1; + const oldParsedCurrentNetValue = parseFloat(oldFund.current_net_value || oldFund.gsz) || 1; + const oldParsedShares = parseFloat(oldFund.shares || (oldFund.investment / oldParsedUnitNetValue)) || 0; + const oldTodayProfitLoss = oldParsedShares * (oldParsedCurrentNetValue - oldParsedUnitNetValue); + + // 更新估算净值 + if (newFund.gsz !== oldFund.gsz) { + const gszEl = document.querySelector(`.est-net-value[data-fund="${fundCode}"]`); + if (gszEl) { + gszEl.textContent = newFund.gsz; + gszEl.classList.add('highlight'); + setTimeout(() => gszEl.classList.remove('highlight'), 300); + } + } + + // 更新涨跌幅 + if (newFund.gszzl !== oldFund.gszzl) { + const changeEl = document.querySelector(`.change-display[data-fund="${fundCode}"]`); + if (changeEl) { + const change = parseFloat(newFund.gszzl); + const changeDisplayClass = change > 0 ? 'change-positive' : 'change-negative'; + const changeIcon = change > 0 ? '📈' : (change < 0 ? '📉' : '➡️'); + const changeDisplay = change > 0 ? '+' + newFund.gszzl + '%' : newFund.gszzl + '%'; + + changeEl.className = 'change-display ' + changeDisplayClass + ' highlight'; + changeEl.innerHTML = `${changeIcon}${changeDisplay}`; + setTimeout(() => changeEl.classList.remove('highlight'), 300); + } + } + + // 更新今日盈亏 + if (Math.abs(todayProfitLoss - oldTodayProfitLoss) > 0.01) { + const todayProfitEl = document.querySelector(`.today-profit[data-fund="${fundCode}"]`); + if (todayProfitEl) { + const todayProfitClass = todayProfitLoss >= 0 ? 'profit-positive' : 'profit-negative'; + const todayProfitIcon = todayProfitLoss >= 0 ? '📈' : '📉'; + + todayProfitEl.className = 'profit-value today-profit ' + todayProfitClass + ' highlight'; + todayProfitEl.textContent = `${todayProfitIcon} ${formatCurrency(todayProfitLoss)}`; + setTimeout(() => todayProfitEl.classList.remove('highlight'), 300); + } + } + + // 更新更新时间 + if (newFund.gztime !== oldFund.gztime) { + const timeEl = document.querySelector(`.update-time[data-fund="${fundCode}"]`); + if (timeEl) { + timeEl.innerHTML = ` ${newFund.gztime}`; + } + } + } + } +} + +/** + * 加载基金数据 + * @param {boolean} isAutoRefresh - 是否为自动刷新模式 + * @returns {Promise} - 返回Promise以便使用finally方法 + */ +async function loadFundData(isAutoRefresh = false) { + try { + // 只有手动刷新时才显示加载动画 + if (!isAutoRefresh) { + showLoading(); + } + // 若存在未完成的请求,则取消 + if (fundController) { + try { fundController.abort(); } catch (e) {} + } + fundController = new AbortController(); + const response = await fetch(API_URL, { signal: fundController.signal }); + const result = await response.json(); + + if (result.success) { + // 保存旧数据用于比较 + const oldData = { ...fundData }; + + // 更新数据 + fundData = result.data; + + // 更新最后更新时间 + document.getElementById('lastUpdate').innerHTML = ` + 最后更新: ${fundData.timestamp} + `; + + if (isAutoRefresh && oldData) { + // 自动刷新时只更新变化的元素,不重新渲染整个页面 + updateElements(fundData, oldData); + + // 检查是否有数据变化 + const hasDataChanged = JSON.stringify(fundData) !== JSON.stringify(oldData); + if (hasDataChanged) { + showUpdateNotification(); + } + } else { + // 首次加载或手动刷新时重新渲染整个页面 + renderPage(); + } + } else { + throw new Error('API返回错误'); + } + } catch (error) { + // 忽略主动取消造成的错误 + if (error && (error.name === 'AbortError' || error.message === 'The operation was aborted.')) { + return; + } + console.error('加载基金数据失败:', error); + // 只有手动刷新时才显示错误信息 + if (!isAutoRefresh) { + showError('数据加载失败,请稍后重试'); + } + // 重新抛出错误以便外部捕获 + throw error; + } +} + +/** + * 显示数据更新通知 + */ +function showUpdateNotification() { + // 检查是否已存在通知元素 + let notification = document.getElementById('updateNotification'); + + // 如果不存在,创建通知元素 + if (!notification) { + notification = document.createElement('div'); + notification.id = 'updateNotification'; + notification.style.cssText = ` + position: fixed; + bottom: 20px; + right: 20px; + background-color: #4CAF50; + color: white; + padding: 12px 20px; + border-radius: 6px; + box-shadow: 0 2px 10px rgba(0,0,0,0.2); + z-index: 1000; + opacity: 0; + transition: opacity 0.3s ease; + font-size: 14px; + `; + document.body.appendChild(notification); + } + + // 设置通知内容 + notification.textContent = '基金数据已更新'; + + // 显示通知 + notification.style.opacity = '1'; + + // 3秒后隐藏通知 + setTimeout(() => { + notification.style.opacity = '0'; + }, 3000); + + // 添加数据变化的视觉反馈 + highlightChangedElements(); +} + +/** + * 高亮显示变化的元素 + */ +function highlightChangedElements() { + // 为关键数据元素添加高亮效果 + const keyElements = document.querySelectorAll('.fund-item .fund-value, .fund-item .fund-change, .fund-item .fund-profit, .stat-card .stat-number'); + + keyElements.forEach(element => { + // 保存原始样式 + const originalBackground = element.style.backgroundColor; + const originalTransition = element.style.transition; + + // 添加高亮样式 + element.style.backgroundColor = '#fff3cd2d'; + element.style.transition = 'background-color 0.5s ease'; + + // 1.5秒后恢复原始样式 + setTimeout(() => { + element.style.backgroundColor = originalBackground; + element.style.transition = originalTransition; + }, 1500); + }); + + // 为上涨/下跌状态变化的元素添加特殊效果 + const statusElements = document.querySelectorAll('.fund-item .fund-status'); + statusElements.forEach(element => { + // 添加闪烁动画 + element.style.animation = 'pulse 1s ease-in-out 2'; + + // 动画结束后移除动画样式 + setTimeout(() => { + element.style.animation = ''; + }, 2000); + }); +} + +// 添加动画样式 +function addAnimationStyles() { + // 检查是否已存在动画样式 + if (document.getElementById('animationStyles')) return; + + const styleElement = document.createElement('style'); + styleElement.id = 'animationStyles'; + styleElement.textContent = ` + @keyframes pulse { + 0% { opacity: 1; transform: scale(1); } + 50% { opacity: 0.7; transform: scale(1.05); } + 100% { opacity: 1; transform: scale(1); } + } + + .highlight { + animation: highlight 0.3s ease-in-out; + } + + @keyframes highlight { + 0% { background-color: transparent; } + 50% { background-color: rgba(255, 255, 0, 0.03); } + 100% { background-color: transparent; } + } + `; + document.head.appendChild(styleElement); +} + +// 加载访问统计 +async function loadVisitStats() { + try { + const response = await fetch(STATS_URL); + const result = await response.json(); + + if (result.success) { + visitStats = result.data; + updateStatsDisplay(); + } + } catch (error) { + console.error('加载访问统计失败:', error); + } +} + +// 更新统计显示 +function updateStatsDisplay() { + if (!visitStats) return; + + // 更新页脚统计 + document.getElementById('todayVisits').textContent = visitStats.today_visits; + document.getElementById('totalVisits').textContent = visitStats.total_visits; + document.getElementById('uniqueVisitors').textContent = visitStats.unique_visitors; + + // 更新统计面板 + const statsGrid = document.getElementById('statsGrid'); + const recentVisits = document.getElementById('recentVisits'); + + if (statsGrid) { + statsGrid.innerHTML = ` +
+
${visitStats.total_visits}
+
三天访问量
+
+
+
${visitStats.today_visits}
+
今日访问
+
+
+
${visitStats.unique_visitors}
+
独立访客
+
+
+
${visitStats.today_unique_visitors}
+
今日独立访客
+
+ `; + } + + if (recentVisits && visitStats.recent_visits) { + let visitsHTML = '

最近访问记录

'; + + if (visitStats.recent_visits.length === 0) { + visitsHTML += '

暂无访问记录

'; + } else { + visitStats.recent_visits.forEach(visit => { + visitsHTML += ` +
+
+ ${visit.ip} + ${getBrowserInfo(visit.user_agent)} +
+
${formatTime(visit.date)}
+
+ `; + }); + } + + recentVisits.innerHTML = visitsHTML; + } +} + +// 获取浏览器信息 +function getBrowserInfo(userAgent) { + if (userAgent.includes('Chrome')) return 'Chrome'; + if (userAgent.includes('Firefox')) return 'Firefox'; + if (userAgent.includes('Safari')) return 'Safari'; + if (userAgent.includes('Edge')) return 'Edge'; + if (userAgent.includes('MSIE') || userAgent.includes('Trident')) return 'IE'; + return '其他浏览器'; +} + +// 显示/隐藏统计面板 +function toggleStats() { + const panel = document.getElementById('statsPanel'); + if (panel.style.display === 'none') { + panel.style.display = 'block'; + loadVisitStats(); // 确保数据最新 + } else { + panel.style.display = 'none'; + } +} + +// 格式化时间 +function formatTime(dateString) { + const date = new Date(dateString); + const now = new Date(); + const diff = now - date; + + if (diff < 60000) { // 1分钟内 + return '刚刚'; + } else if (diff < 3600000) { // 1小时内 + return Math.floor(diff / 60000) + '分钟前'; + } else if (diff < 86400000) { // 1天内 + return Math.floor(diff / 3600000) + '小时前'; + } else { + return date.toLocaleDateString() + ' ' + date.toLocaleTimeString([], {hour: '2-digit', minute:'2-digit'}); + } +} + +// 显示加载状态 +function showLoading() { + document.getElementById('content').innerHTML = ` +
+
+

正在加载基金数据...

+
+ `; +} + +// 显示错误信息 +function showError(message) { + document.getElementById('content').innerHTML = ` +
+

数据加载失败

+

${message}

+
+ `; +} + +// 渲染页面 +function renderPage() { + if (!fundData) return; + + const { summary, channelStats, errors, timestamp } = fundData; + + // 更新最后更新时间 + document.getElementById('lastUpdate').innerHTML = ` + 最后更新: ${timestamp} + `; + + // 构建页面内容 + let contentHTML = ` +
+
+
+
${summary.total}
+
监控基金
+
+ +
+
+
${summary.upCount}
+
上涨
+
+ +
+
+
${summary.downCount}
+
下跌
+
+ +
+
+
${formatNumber(summary.avgChange)}%
+
平均涨跌
+
+ +
+
+
${summary.formattedTotalInvestment}
+
总投资
+
+ +
+
+
+ ${summary.profitLossIcon} ${summary.formattedTotalProfitLoss} + + ${summary.formattedProfitLossRate}% + +
+
总盈亏
+
+
+ `; + + // 渠道统计 + contentHTML += '
'; + for (const [channelName, stats] of Object.entries(channelStats)) { + const channelClass = getChannelClass(channelName); + const profitClass = stats.totalProfitLoss > 0 ? 'profit-positive' : 'profit-negative'; + const profitIcon = stats.totalProfitLoss > 0 ? '📈' : '📉'; + + contentHTML += ` +
+
+
${getChannelIcon(channelName)}
+
${channelName}
+
+
+
+
基金数量
+
${stats.count} 只
+
+
+
平均涨跌
+
${formatNumber(stats.avgChange)}%
+
+
+
投资金额
+
${formatCurrency(stats.totalInvestment)}
+
+
+
当前价值
+
${formatCurrency(stats.totalCurrentValue)}
+
+
+
+ ${profitIcon} 渠道盈亏: ${formatCurrency(stats.totalProfitLoss)} (${formatNumber(stats.profitLossRate)}%) +
+
+ `; + } + contentHTML += '
'; + + // 错误信息 + if (errors && errors.length > 0) { + contentHTML += ` +
+

数据获取异常

+
    + ${errors.map(error => `
  • ${error}
  • `).join('')} +
+
+ `; + } + + // 基金卡片 + contentHTML += generateChannelSections(channelStats); + + document.getElementById('content').innerHTML = contentHTML; + + // 添加动画效果 + setTimeout(() => { + const cards = document.querySelectorAll('.fund-card, .stat-card, .channel-stat-card'); + cards.forEach((card, index) => { + card.style.animationDelay = (index * 0.05) + 's'; + }); + }, 100); + + // 绑定基金卡片点击翻转与图表加载 + bindFundCardFlipEvents(); +} + +// 绑定基金卡片翻转与图表加载 +function bindFundCardFlipEvents() { + const cards = document.querySelectorAll('.flip-card'); + cards.forEach(card => { + card.addEventListener('click', async (e) => { + const fundCode = card.getAttribute('data-fundcode'); + const isFlipped = card.classList.contains('flipped'); + if (!isFlipped) { + card.classList.add('flipped'); + await loadCardChart(fundCode, card); + } else { + card.classList.remove('flipped'); + destroyCardChart(fundCode); + } + }); + + // 背面关闭按钮只控制翻回 + const closeBtn = card.querySelector('.flip-close'); + if (closeBtn) { + closeBtn.addEventListener('click', (e) => { + e.stopPropagation(); + card.classList.remove('flipped'); + const fundCode = card.getAttribute('data-fundcode'); + destroyCardChart(fundCode); + }); + } + + // 阻止点击图表容器导致翻回(便于交互) + const chartContainer = card.querySelector('.card-back .chart-container'); + if (chartContainer) { + chartContainer.addEventListener('click', (e) => e.stopPropagation()); + chartContainer.addEventListener('touchstart', (e) => e.stopPropagation(), { passive: true }); + } + }); +} + +async function loadCardChart(fundCode, cardEl) { + try { + const response = await fetch(FUND_CHART_API(fundCode)); + const result = await response.json(); + if (!result.success) throw new Error(result.message || '图表数据加载失败'); + renderCardChart(fundCode, result.data, cardEl); + } catch (err) { + console.error('加载卡片图表失败:', err); + const container = cardEl.querySelector('.card-back .chart-container'); + if (container) { + container.innerHTML = `
图表加载失败:${err.message}
`; + } + } +} + +function renderCardChart(fundCode, chartData, cardEl) { + const canvas = cardEl.querySelector(`#fund-chart-${fundCode}`); + if (!canvas) return; + const ctx = canvas.getContext('2d'); + const isDark = document.body.classList.contains('theme-dark'); + const axisColor = isDark ? '#cbd5e1' : '#374151'; + const gridColor = isDark ? 'rgba(203,213,225,0.15)' : 'rgba(55,65,81,0.15)'; + const lineColor = '#6366f1'; + const fillColor = isDark ? 'rgba(99,102,241,0.15)' : 'rgba(99,102,241,0.2)'; + + if (cardCharts.has(fundCode)) { + try { cardCharts.get(fundCode).destroy(); } catch (e) {} + cardCharts.delete(fundCode); + } + + const chart = new Chart(ctx, { + type: 'line', + data: { + labels: chartData.labels, + datasets: [{ + label: '估算净值', + data: chartData.netValues, + borderColor: lineColor, + backgroundColor: fillColor, + borderWidth: 3, + fill: true, + tension: 0.4, + pointRadius: 3, + pointHoverRadius: 6, + pointBackgroundColor: '#ffffff', + pointBorderColor: lineColor, + pointBorderWidth: 2 + }] + }, + options: { + responsive: true, + maintainAspectRatio: false, + plugins: { + legend: { display: false }, + tooltip: { mode: 'index', intersect: false } + }, + scales: { + x: { ticks: { color: axisColor }, grid: { color: gridColor } }, + y: { ticks: { color: axisColor }, grid: { color: gridColor } } + } + } + }); + cardCharts.set(fundCode, chart); +} + +function destroyCardChart(fundCode) { + if (cardCharts.has(fundCode)) { + try { cardCharts.get(fundCode).destroy(); } catch (e) {} + cardCharts.delete(fundCode); + } +} + +// 生成渠道分组的基金卡片 +function generateChannelSections(channelStats) { + let html = ''; + + for (const [channelName, stats] of Object.entries(channelStats)) { + // 按涨跌幅排序 + const sortedFunds = Object.entries(stats.funds) + .sort(([,a], [,b]) => parseFloat(b.gszzl) - parseFloat(a.gszzl)); + + const channelClass = getChannelClass(channelName); + const channelIcon = getChannelIcon(channelName); + + html += ` +
+
+
${channelIcon}
+
+

${channelName}渠道

+

${getChannelDescription(channelName)}

+
+
+
+ `; + + let rank = 1; + for (const [fundCode, fund] of sortedFunds) { + const change = parseFloat(fund.gszzl); + const changeClass = change > 0 ? 'positive' : (change < 0 ? 'negative' : ''); + const changeDisplayClass = change > 0 ? 'change-positive' : 'change-negative'; + const changeIcon = change > 0 ? '📈' : (change < 0 ? '📉' : '➡️'); + const changeDisplay = change > 0 ? '+' + fund.gszzl + '%' : fund.gszzl + '%'; + + // 历史涨幅样式 + // 添加调试代码确保昨日涨幅数据正确处理 + console.log(`基金${fund.fundcode}昨日涨幅数据:`, { + yesterday_change: fund.yesterday_change, + formatted_yesterday_change: fund.formatted_yesterday_change + }); + + const yesterdayChange = fund.yesterday_change || 0; // 确保有默认值 + const yesterdayChangeClass = yesterdayChange > 0 ? 'profit-positive' : (yesterdayChange < 0 ? 'profit-negative' : ''); + + // 盈亏信息 + const investment = fund.investment; + const currentValue = fund.current_value; + const profitLoss = fund.profit_loss; + const profitLossRate = (profitLoss / investment) * 100; + + // 份额和净值信息(从后端新计算的数据) + const shares = (fund.shares || (investment / (parseFloat(fund.dwjz) || 1))).toFixed(4); + const unitNetValue = (fund.unit_net_value || parseFloat(fund.dwjz)).toFixed(4); + const currentNetValue = (fund.current_net_value || parseFloat(fund.gsz)).toFixed(4); + + // 解析基本数据 + const parsedCurrentNetValue = parseFloat(currentNetValue); // 当日净值 + const parsedUnitNetValue = parseFloat(unitNetValue); // 前一日净值(昨日单位净值) + const parsedShares = parseFloat(shares); // 份额 + + // 计算标准涨幅 + const todayChange = parsedUnitNetValue !== 0 ? ((parsedCurrentNetValue - parsedUnitNetValue) / parsedUnitNetValue) * 100 : 0; + + // 计算今日盈亏(基于净值变化) + const todayProfitLoss = parsedShares * (parsedCurrentNetValue - parsedUnitNetValue); + + // 计算今日价值(累计方式) + const calculatedCurrentValue = parsedShares * parsedCurrentNetValue; // 直接计算当前价值 + + // 添加日志以调试计算问题 + // if (fund.fundcode === '012863') { + // console.log(`基金012863计算详情:`); + // console.log(`- 份额: ${parsedShares.toFixed(4)}`); + // console.log(`- 前一日净值: ${parsedUnitNetValue.toFixed(4)}`); + // console.log(`- 当日净值: ${parsedCurrentNetValue.toFixed(4)}`); + // console.log(`- 计算的标准涨幅: ${todayChange.toFixed(2)}%`); + // console.log(`- 投资金额: ${investment.toFixed(2)}元`); + // console.log(`- 今日盈亏: ${todayProfitLoss.toFixed(2)}元 (份额 × (当日净值 - 昨日单位净值))`); + // console.log(`- 当前价值: ${calculatedCurrentValue.toFixed(2)}元 (份额 × 当日净值)`); + // } + + + + // 今日盈亏样式 + const todayProfitClass = todayProfitLoss >= 0 ? 'profit-positive' : 'profit-negative'; + const todayProfitIcon = todayProfitLoss >= 0 ? '📈' : '📉'; + + html += ` +
+
+
+
+
+ ${fund.name} + #${rank} +
+
${fund.fundcode}
+
+ +
+
+
单位净值
+
${fund.dwjz}
+
+
+
估算净值
+
${fund.gsz}
+
+
+
昨日涨幅
+
+ ${fund.formatted_yesterday_change} +
+
+
+ +
+ ${changeIcon} + ${changeDisplay} +
+ +
+
+ 持仓: + ${formatCurrency(investment)} +
+
+ 份额: + ${shares} +
+
+ 净值: + ${unitNetValue} +
+
+ 当前净值: + ${currentNetValue} +
+ + +
+ 今日盈亏: + + ${todayProfitIcon} ${formatCurrency(todayProfitLoss)} + +
+ +
+ +
+
+ ${channelIcon} ${channelName} +
+
+ ${fund.gztime} +
+
+ +
+ 建议: ${channelName}申购 +
+
+
+ +
+ +
+
+
+
+ `; + rank++; + } + + html += '
'; + } + + return html; +} + +// 工具函数 +function formatNumber(number) { + return Number(number).toFixed(2); +} + +function formatCurrency(amount) { + if (amount >= 10000) { + return (amount / 10000).toFixed(2) + '万元'; + } + return amount.toFixed(2) + '元'; +} + +function getChannelClass(channelName) { + const channelMap = { + '招商银行': 'cmb', + '天天基金': 'tt', + '支付宝': 'zfb' + }; + return channelMap[channelName] || 'cmb'; +} + +function getChannelIcon(channelName) { + const iconMap = { + '招商银行': '🏦', + '天天基金': '📱', + '支付宝': '💙' + }; + return iconMap[channelName] || '🏦'; +} + +function getChannelDescription(channelName) { + const descMap = { + '招商银行': '银行渠道,申购费率较低,服务稳定', + '天天基金': '专业基金平台,品种齐全,数据精准', + '支付宝': '便捷支付,操作简单,用户体验佳' + }; + return descMap[channelName] || '基金购买渠道'; +} + +function toggleTheme() { + const body = document.body; + const isDark = body.classList.toggle('theme-dark'); + try { + localStorage.setItem('theme', isDark ? 'dark' : 'light'); + } catch (e) { /* 忽略存储错误 */ } +} + +/** + * 根据本地存储或系统偏好应用主题 + */ +function applySavedTheme() { + let saved = null; + try { + saved = localStorage.getItem('theme'); + } catch (e) { /* 忽略 */ } + const prefersDark = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches; + const useDark = saved ? (saved === 'dark') : prefersDark; + if (useDark) { + document.body.classList.add('theme-dark'); + } else { + document.body.classList.remove('theme-dark'); + } +} + +// 自动刷新机制已在startAutoRefresh函数中实现 diff --git a/styles.css b/styles.css new file mode 100644 index 0000000..0a2df45 --- /dev/null +++ b/styles.css @@ -0,0 +1,967 @@ +:root { + --primary: #6366f1; + --primary-dark: #4f46e5; + --success: #10b981; + --danger: #ef4444; + --warning: #f59e0b; + --info: #3b82f6; + --dark: #1f2937; + --light: #f8fafc; + --gray: #6b7280; + --border: #e5e7eb; +} + +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: 'Segoe UI', system-ui, -apple-system, sans-serif; + background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + min-height: 100vh; + color: #334155; + line-height: 1.5; +} + +/* 暗色主题背景与基础颜色 */ +body.theme-dark { + background: linear-gradient(135deg, #0f172a 0%, #1f2937 100%); + color: #e5e7eb; +} + +.container { + max-width: 1400px; + margin: 0 auto; + padding: 15px; +} + +/* 头部样式 */ +.header { + text-align: center; + margin-bottom: 25px; + color: white; +} + +.header-content { + background: rgba(255, 255, 255, 0.1); + backdrop-filter: blur(10px); + padding: 20px; + border-radius: 16px; + border: 1px solid rgba(255, 255, 255, 0.2); +} + +.header h1 { + font-size: 2.2rem; + font-weight: 700; + margin-bottom: 8px; + background: linear-gradient(45deg, #fff, #e0f2fe); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; +} + +.header p { + font-size: 1rem; + opacity: 0.9; + margin-bottom: 15px; +} + +/* 控制按钮 */ +.controls { + display: flex; + justify-content: center; + gap: 12px; + margin-bottom: 20px; + flex-wrap: wrap; +} + +.btn { + padding: 10px 18px; + border: none; + border-radius: 10px; + font-size: 0.9rem; + font-weight: 600; + cursor: pointer; + transition: all 0.3s ease; + display: flex; + align-items: center; + gap: 6px; +} + +.btn-primary { + background: linear-gradient(135deg, var(--primary), var(--primary-dark)); + color: white; +} + +.btn-primary:hover { + transform: translateY(-2px); +} + +.btn-outline { + background: rgba(255, 255, 255, 0.1); + color: white; + border: 2px solid rgba(255, 255, 255, 0.3); +} + +.btn-outline:hover { + background: rgba(255, 255, 255, 0.2); +} + +/* 暗色主题下的卡片与边框微调 */ +body.theme-dark .stat-card, +body.theme-dark .fund-card, +body.theme-dark .channel-stat-card, +body.theme-dark .content { + background: #111827; + border-color: rgba(255, 255, 255, 0.08); + color: #e5e7eb; +} +body.theme-dark .stat-label { opacity: 0.85; } +body.theme-dark .last-update { color: #e5e7eb; } + +/* 统计面板样式 */ +.stats-panel { + background: rgba(255, 255, 255, 0.1); + backdrop-filter: blur(10px); + border-radius: 16px; + padding: 20px; + margin-bottom: 25px; + border: 1px solid rgba(255, 255, 255, 0.2); + color: white; +} + +.stats-header { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 15px; +} + +.stats-title { + font-size: 1.3rem; + font-weight: 700; + display: flex; + align-items: center; + gap: 10px; +} + +.stats-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); + gap: 15px; +} + +.stat-item { + background: rgba(255, 255, 255, 0.1); + padding: 15px; + border-radius: 12px; + text-align: center; + border: 1px solid rgba(255, 255, 255, 0.1); +} + +.stat-value { + font-size: 1.8rem; + font-weight: 800; + margin-bottom: 5px; + background: linear-gradient(45deg, #fff, #e0f2fe); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; +} + +.stat-label { + font-size: 0.85rem; + opacity: 0.9; +} + +.stats-toggle { + background: rgba(255, 255, 255, 0.2); + border: none; + color: white; + padding: 8px 16px; + border-radius: 8px; + cursor: pointer; + font-size: 0.9rem; + transition: all 0.3s ease; +} + +.stats-toggle:hover { + background: rgba(255, 255, 255, 0.3); +} + +.recent-visits { + margin-top: 20px; + padding-top: 20px; + border-top: 1px solid rgba(255, 255, 255, 0.2); +} + +.visit-item { + display: flex; + justify-content: space-between; + align-items: center; + padding: 8px 0; + border-bottom: 1px solid rgba(255, 255, 255, 0.1); + font-size: 0.85rem; +} + +.visit-item:last-child { + border-bottom: none; +} + +.visit-ip { + font-family: 'Monaco', 'Consolas', monospace; + background: rgba(255, 255, 255, 0.1); + padding: 2px 6px; + border-radius: 4px; +} + +.visit-time { + opacity: 0.8; +} + +/* 仪表盘样式 */ +.dashboard { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); + gap: 16px; + margin-bottom: 25px; +} + +.stat-card { + background: white; + padding: 20px 15px; + border-radius: 14px; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08); + text-align: center; + transition: all 0.3s ease; + border: 1px solid var(--border); +} + +.stat-card:hover { + transform: translateY(-3px); + box-shadow: 0 6px 20px rgba(0, 0, 0, 0.12); +} + +.stat-icon { + font-size: 1.8rem; + margin-bottom: 10px; + opacity: 0.8; +} + +.stat-number { + font-size: 1.6rem; + font-weight: 800; + margin-bottom: 5px; + line-height: 1.2; +} + +.stat-label { + font-size: 0.85rem; + color: var(--gray); + font-weight: 600; +} + +.stat-subtext { + font-size: 0.75rem; + color: var(--gray); + margin-top: 4px; + opacity: 0.7; +} + +/* 特殊卡片样式 */ +.total-funds .stat-number { color: var(--info); } +.up-funds .stat-number { color: var(--danger); } +.down-funds .stat-number { color: var(--success); } +.avg-change .stat-number { color: var(--warning); } +.total-investment .stat-number { color: var(--primary); } + +.total-profit .stat-number { + display: flex; + align-items: center; + justify-content: center; + gap: 8px; + flex-wrap: wrap; +} + +.profit-badge, .loss-badge { + color: white; + padding: 4px 10px; + border-radius: 12px; + font-size: 0.8rem; + font-weight: 600; +} + +.profit-badge { + background: linear-gradient(135deg, var(--success), #059669); +} + +.loss-badge { + background: linear-gradient(135deg, var(--danger), #dc2626); +} + +/* 渠道统计 */ +.channel-dashboard { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); + gap: 16px; + margin-bottom: 25px; +} + +.channel-stat-card { + background: white; + padding: 18px; + border-radius: 14px; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08); + transition: all 0.3s ease; + border-left: 4px solid; +} + +.channel-stat-card:hover { + transform: translateY(-3px); + box-shadow: 0 6px 20px rgba(0, 0, 0, 0.12); +} + +.channel-stat-card.cmb { border-left-color: #e74c3c; } +.channel-stat-card.tt { border-left-color: #3498db; } +.channel-stat-card.zfb { border-left-color: #27ae60; } + +.channel-header { + display: flex; + align-items: center; + margin-bottom: 15px; +} + +.channel-icon { + font-size: 1.5rem; + margin-right: 10px; + width: 40px; + height: 40px; + border-radius: 10px; + display: flex; + align-items: center; + justify-content: center; + background: linear-gradient(135deg, #667eea, #764ba2); + color: white; +} + +.channel-name { + font-size: 1.1rem; + font-weight: 700; + color: var(--dark); +} + +.channel-details { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 10px; + margin-bottom: 15px; +} + +.channel-detail-item { + text-align: center; + padding: 8px; + background: #f8fafc; + border-radius: 8px; +} + +.channel-detail-label { + font-size: 0.75rem; + color: var(--gray); + margin-bottom: 4px; + font-weight: 600; +} + +.channel-detail-value { + font-size: 0.9rem; + font-weight: 700; + color: var(--dark); +} + +.channel-profit-section { + text-align: center; + padding: 10px; + border-radius: 8px; + font-weight: 700; + font-size: 0.9rem; + margin-top: 8px; +} + +.profit-positive { + background: linear-gradient(135deg, #dcfce7, #bbf7d0); + color: #166534; +} + +.profit-negative { + background: linear-gradient(135deg, #fee2e2, #fecaca); + color: #dc2626; +} + +/* 基金卡片网格 */ +.funds-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); + gap: 16px; + margin-bottom: 25px; +} + +.fund-card { + background: white; + border-radius: 14px; + padding: 18px; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08); + transition: all 0.3s ease; + border-left: 4px solid var(--info); +} + +.fund-card:hover { + transform: translateY(-3px); + box-shadow: 0 6px 20px rgba(0, 0, 0, 0.12); +} + +.fund-card.positive { + border-left-color: var(--danger); + background: linear-gradient(135deg, #fff, #fef2f2); +} + +.fund-card.negative { + border-left-color: var(--success); + background: linear-gradient(135deg, #fff, #f0fdf4); +} + +.fund-header { + display: flex; + justify-content: space-between; + align-items: flex-start; + margin-bottom: 12px; +} + +.fund-name { + font-size: 1rem; + font-weight: 700; + color: var(--dark); + flex: 1; + line-height: 1.3; +} + +.fund-code { + background: #eef2ff; + padding: 4px 8px; + border-radius: 10px; + font-size: 0.8rem; + color: var(--primary); + font-weight: 600; + font-family: 'Monaco', 'Consolas', monospace; +} + +.fund-details { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 10px; + margin-bottom: 12px; +} + +.detail-item { + text-align: center; + padding: 10px; + background: #f8fafc; + border-radius: 8px; +} + +.detail-label { + font-size: 0.75rem; + color: var(--gray); + margin-bottom: 4px; + font-weight: 600; +} + +.detail-value { + font-size: 0.9rem; + font-weight: 700; + color: var(--dark); +} + +/* 昨天涨幅显示样式 */ +.yesterday-change { + font-weight: 800; + font-size: 0.95rem; + transition: all 0.3s ease; +} + +.change-display { + text-align: center; + padding: 10px; + border-radius: 10px; + font-size: 1.1rem; + font-weight: 800; + margin-bottom: 12px; +} + +.change-positive { + background: linear-gradient(135deg, #fef2f2, #fee2e2); + color: var(--danger); +} + +.change-negative { + background: linear-gradient(135deg, #f0fdf4, #dcfce7); + color: var(--success); +} + +.change-icon { + font-size: 1rem; + margin-right: 5px; +} + +.profit-section { + background: #f8fafc; + border-radius: 10px; + padding: 12px; + margin-bottom: 12px; +} + +.profit-row { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 6px; + font-size: 0.85rem; +} + +.profit-row:last-child { + margin-bottom: 0; + padding-top: 6px; + border-top: 1px solid var(--border); + font-weight: 800; +} + +.profit-label { + color: var(--gray); + font-weight: 600; +} + +.profit-value { + font-weight: 700; +} + +.profit-positive { + color: var(--danger); +} + +.profit-negative { + color: var(--success); +} + +.channel-info { + display: flex; + justify-content: space-between; + align-items: center; + margin-top: 10px; + padding-top: 10px; + border-top: 1px solid var(--border); +} + +.channel-badge { + padding: 5px 10px; + border-radius: 12px; + font-size: 0.75rem; + font-weight: 700; + color: red; + display: flex; + align-items: center; + gap: 4px; +} + +.channel-cmb { + background: linear-gradient(135deg, #e74c3c, #c0392b); +} + +.channel-tt { + background: linear-gradient(135deg, #3498db, #2980b9); +} + +.channel-zfb { + background: linear-gradient(135deg, #27ae60, #229954); +} + +.update-time { + font-size: 0.75rem; + color: var(--gray); + font-weight: 600; +} + +.rank-badge { + background: linear-gradient(135deg, var(--primary), var(--primary-dark)); + color: white; + padding: 2px 8px; + border-radius: 10px; + font-size: 0.7rem; + font-weight: 700; + margin-left: 6px; +} + +.buy-hint { + font-size: 0.75rem; + color: #000000; + margin-top: 8px; + padding: 8px; + background: #f8fafc; + border-radius: 6px; + border-left: 3px solid var(--warning); +} + +/* 错误信息 */ +.error-section { + background: linear-gradient(135deg, #fef3c7, #fef3c7); + border: 1px solid #f59e0b; + border-radius: 10px; + padding: 15px; + margin-bottom: 20px; +} + +.error-section h3 { + color: #92400e; + margin-bottom: 10px; + display: flex; + align-items: center; + gap: 6px; + font-size: 1rem; +} + +.error-list { + list-style: none; +} + +.error-list li { + padding: 4px 0; + color: #92400e; + display: flex; + align-items: center; + gap: 6px; + font-size: 0.85rem; +} + +/* 页脚 */ +.footer { + text-align: center; + color: white; + margin-top: 30px; + padding-top: 20px; + border-top: 1px solid rgba(255, 255, 255, 0.3); +} + +.last-update { + background: rgba(255, 255, 255, 0.1); + backdrop-filter: blur(10px); + padding: 12px; + border-radius: 10px; + margin-bottom: 12px; + font-size: 0.9rem; +} + +/* 动画 */ +@keyframes fadeInUp { + from { + opacity: 0; + transform: translateY(20px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +.fund-card, .stat-card, .channel-stat-card { + animation: fadeInUp 0.4s ease-out forwards; + opacity: 0; +} + +/* 加载状态 */ +.loading { + text-align: center; + padding: 40px; + color: white; + font-size: 1.2rem; +} + +.loading-spinner { + display: inline-block; + width: 40px; + height: 40px; + border: 4px solid rgba(255, 255, 255, 0.3); + border-radius: 50%; + border-top-color: #fff; + animation: spin 1s ease-in-out infinite; + margin-bottom: 15px; +} + +@keyframes spin { + to { transform: rotate(360deg); } +} + +/* 遵循系统减少动画偏好 */ +@media (prefers-reduced-motion: reduce) { + * { + animation: none !important; + transition: none !important; + } +} + +/* 响应式设计 */ +@media (max-width: 768px) { + .container { + padding: 10px; + } + + .header h1 { + font-size: 1.8rem; + } + + .dashboard { + grid-template-columns: repeat(2, 1fr); + gap: 12px; + } + + .channel-dashboard { + grid-template-columns: 1fr; + } + + .funds-grid { + grid-template-columns: 1fr; + } + + .fund-details { + grid-template-columns: 1fr; + } + + .channel-details { + grid-template-columns: 1fr; + } + + .controls { + flex-direction: column; + } + + .btn { + width: 100%; + justify-content: center; + } + + .channel-info { + flex-direction: column; + gap: 8px; + align-items: flex-start; + } + + .profit-row { + flex-direction: column; + align-items: flex-start; + gap: 2px; + } + + .stats-grid { + grid-template-columns: repeat(2, 1fr); + } + + .stats-header { + flex-direction: column; + gap: 10px; + align-items: flex-start; + } +} + +@media (max-width: 480px) { + .dashboard { + grid-template-columns: 1fr; + } + + .stat-card { + padding: 15px 10px; + } + + .fund-card { + padding: 15px; + } + + .stats-grid { + grid-template-columns: 1fr; + } +} +/* 昨日涨幅样式 */ +.yesterday-change { + font-weight: 700; + font-size: 0.9rem; +} + +.yesterday-change.profit-positive { + color: var(--danger); + font-weight: 800; +} + +.yesterday-change.profit-negative { + color: var(--success); + font-weight: 800; +} + +/* 响应式调整 */ +@media (max-width: 768px) { + .fund-details { + grid-template-columns: 1fr; + } +} + +/* 暗黑主题:变量覆盖与文字对比度修复 */ +body.theme-dark { + /* 提升暗黑模式下的全局文字可读性 */ + --dark: #e5e7eb; /* 原为深灰,暗黑下改为浅灰 */ + --gray: #cbd5e1; /* 次级文字颜色变浅 */ + --border: #1f2937; /* 边框在暗色背景下的可见性 */ +} + +/* 基金卡片整体与常见文本 */ +body.theme-dark .fund-card { + background: #111827; + color: #e5e7eb; + border-color: var(--border); +} + +/* 正/负卡片在暗黑主题下不再使用浅色渐变,保持一致暗底 */ +body.theme-dark .fund-card.positive, +body.theme-dark .fund-card.negative { + background: #0b1320; +} + +/* 卡片内标题与数值文字提升对比度 */ +body.theme-dark .fund-name, +body.theme-dark .detail-value, +body.theme-dark .channel-name, +body.theme-dark .channel-detail-value { + color: #74a2ff; +} + +/* 次要说明文字颜色适配暗黑主题 */ +body.theme-dark .detail-label, +body.theme-dark .update-time, +body.theme-dark .profit-label, +body.theme-dark .stat-label, +body.theme-dark .stat-subtext { + color: #cbd5e1; +} + +/* 代码徽章在暗色背景下的可读性提升 */ +body.theme-dark .fund-code { + background: #1f2937; + color: #93c5fd; /* 浅蓝提高对比 */ +} + +/* 细节块与收益块背景统一暗色,并提升边框对比 */ +body.theme-dark .channel-detail-item, +body.theme-dark .detail-item, +body.theme-dark .profit-section { + background: #0b1320; + border-color: var(--border); +} + +/* 渠道统计卡片暗黑配色 */ +body.theme-dark .channel-dashboard .channel-stat-card { + background: #111827; + color: #e5e7eb; +} + +/* 涨跌显示在暗底下采用更清晰的配色 */ +body.theme-dark .change-positive { + background: linear-gradient(135deg, #1f2937, #0b1320); + color: #fca5a5; /* 浅红 */ +} +body.theme-dark .change-negative { + background: linear-gradient(135deg, #1f2937, #0b1320); + color: #86efac; /* 浅绿 */ +} + +/* 卡片翻转动画样式 */ +.flip-card { + perspective: 1000px; +} + +.flip-inner { + position: relative; + width: 100%; + height: 100%; + transform-style: preserve-3d; + transition: transform 0.6s ease; +} + +.flip-card.flipped .flip-inner { + transform: rotateY(180deg); +} + +.card-face { + position: absolute; + top: 0; + left: 0; + width: 100%; + backface-visibility: hidden; +} + +.card-front { + position: relative; +} + +.card-back { + transform: rotateY(180deg); + padding: 10px; +} + +/* 卡片背面图表容器 */ +.card-back .chart-container { + width: 100%; + height: 220px; +} + +.card-back canvas { + width: 100% !important; + height: 220px !important; +} + +/* 暗色主题下卡片背面 */ +body.theme-dark .card-back { + background: #111827; +} + +/* 移动端适配:翻转卡片与图表尺寸 */ +@media (max-width: 480px) { + .flip-card { + touch-action: manipulation; + } + .card-back .chart-container { + height: 160px; + } + .card-back canvas { + height: 160px !important; + } +} + +/* 卡片背面关闭按钮 */ +.flip-close { + position: absolute; + top: 8px; + right: 8px; + background: rgba(0,0,0,0.05); + border: none; + color: #374151; + padding: 6px 10px; + border-radius: 8px; + cursor: pointer; + font-weight: 700; + line-height: 1; +} + +.flip-close:hover { + background: rgba(0,0,0,0.1); +} + +body.theme-dark .flip-close { + background: rgba(255,255,255,0.06); + color: #e5e7eb; +} +body.theme-dark .flip-close:hover { + background: rgba(255,255,255,0.12); +}