❌ 数据库文件不存在!请确认路径正确。'); } // 获取请求参数 $action = isset($_GET['action']) ? $_GET['action'] : ''; $dateFilter = isset($_GET['date']) ? $_GET['date'] : ''; $limit = isset($_GET['limit']) ? intval($_GET['limit']) : 50; // 限制最大记录数 if ($limit > 200 || $limit < 1) { $limit = 50; } /** * 连接SQLite数据库 */ function getDatabaseConnection($dbPath) { try { $db = new PDO("sqlite:" . $dbPath); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); return $db; } catch (PDOException $e) { error_log("数据库连接失败: " . $e->getMessage()); return null; } } /** * 格式化日期显示 */ function formatDate($dateStr) { if (empty($dateStr)) return '未知时间'; $timestamp = strtotime($dateStr); if ($timestamp === false) { return $dateStr; } return date('Y-m-d H:i:s', $timestamp); } /** * 截断文本到指定长度 */ function truncateText($text, $maxLength = 200) { if (empty($text)) return ''; if (mb_strlen($text, 'UTF-8') <= $maxLength) return $text; return mb_substr($text, 0, $maxLength, 'UTF-8') . '...'; } /** * 获取安全新闻数据 */ function getSecNews($db, $dateFilter = '', $limit = 50) { if ($dateFilter) { $sql = "SELECT article_title, link, author, description, source, upload_time, category FROM sec_news WHERE DATE(upload_time) = :date ORDER BY upload_time DESC LIMIT :limit"; $stmt = $db->prepare($sql); $stmt->bindValue(':date', $dateFilter, PDO::PARAM_STR); $stmt->bindValue(':limit', $limit, PDO::PARAM_INT); } else { $sql = "SELECT article_title, link, author, description, source, upload_time, category FROM sec_news ORDER BY upload_time DESC LIMIT :limit"; $stmt = $db->prepare($sql); $stmt->bindValue(':limit', $limit, PDO::PARAM_INT); } $stmt->execute(); return $stmt->fetchAll(); } /** * 获取技术文章数据 */ function getTechPassage($db, $dateFilter = '', $limit = 50) { if ($dateFilter) { $sql = "SELECT article_title, link, author, description, source, upload_time, category FROM tech_passage WHERE DATE(upload_time) = :date ORDER BY upload_time DESC LIMIT :limit"; $stmt = $db->prepare($sql); $stmt->bindValue(':date', $dateFilter, PDO::PARAM_STR); $stmt->bindValue(':limit', $limit, PDO::PARAM_INT); } else { $sql = "SELECT article_title, link, author, description, source, upload_time, category FROM tech_passage ORDER BY upload_time DESC LIMIT :limit"; $stmt = $db->prepare($sql); $stmt->bindValue(':limit', $limit, PDO::PARAM_INT); } $stmt->execute(); return $stmt->fetchAll(); } /** * 获取百度新闻数据 */ function getBaiduNews($db, $dateFilter = '', $limit = 50) { if ($dateFilter) { $sql = "SELECT article_title, link, description, source, upload_time, keyword FROM baidu WHERE DATE(upload_time) = :date ORDER BY upload_time DESC LIMIT :limit"; $stmt = $db->prepare($sql); $stmt->bindValue(':date', $dateFilter, PDO::PARAM_STR); $stmt->bindValue(':limit', $limit, PDO::PARAM_INT); } else { $sql = "SELECT article_title, link, description, source, upload_time, keyword FROM baidu ORDER BY upload_time DESC LIMIT :limit"; $stmt = $db->prepare($sql); $stmt->bindValue(':limit', $limit, PDO::PARAM_INT); } $stmt->execute(); return $stmt->fetchAll(); } /** * 获取GitHub动态数据 */ function getGithubNews($db, $dateFilter = '', $limit = 50) { if ($dateFilter) { $sql = "SELECT article_title, link, description, author, upload_time, keyword, language, source FROM github WHERE DATE(upload_time) = :date ORDER BY upload_time DESC LIMIT :limit"; $stmt = $db->prepare($sql); $stmt->bindValue(':date', $dateFilter, PDO::PARAM_STR); $stmt->bindValue(':limit', $limit, PDO::PARAM_INT); } else { $sql = "SELECT article_title, link, description, author, upload_time, keyword, language, source FROM github ORDER BY upload_time DESC LIMIT :limit"; $stmt = $db->prepare($sql); $stmt->bindValue(':limit', $limit, PDO::PARAM_INT); } $stmt->execute(); return $stmt->fetchAll(); } /** * 获取微信文章数据(搜狗微信) */ function getWxNews($db, $dateFilter = '', $limit = 50) { if ($dateFilter) { $sql = "SELECT article_title, link, description, upload_time, author, keyword FROM wx_news WHERE DATE(upload_time) = :date ORDER BY upload_time DESC LIMIT :limit"; $stmt = $db->prepare($sql); $stmt->bindValue(':date', $dateFilter, PDO::PARAM_STR); $stmt->bindValue(':limit', $limit, PDO::PARAM_INT); } else { $sql = "SELECT article_title, link, description, upload_time, author, keyword FROM wx_news ORDER BY upload_time DESC LIMIT :limit"; $stmt = $db->prepare($sql); $stmt->bindValue(':limit', $limit, PDO::PARAM_INT); } $stmt->execute(); return $stmt->fetchAll(); } /** * 获取其他RSS源数据(uni_rss表) */ function getOtherRss($db, $dateFilter = '', $limit = 50) { if ($dateFilter) { $sql = "SELECT article_title, link, description, upload_time, author, source FROM uni_rss WHERE DATE(upload_time) = :date ORDER BY upload_time DESC LIMIT :limit"; $stmt = $db->prepare($sql); $stmt->bindValue(':date', $dateFilter, PDO::PARAM_STR); $stmt->bindValue(':limit', $limit, PDO::PARAM_INT); } else { $sql = "SELECT article_title, link, description, upload_time, author, source FROM uni_rss ORDER BY upload_time DESC LIMIT :limit"; $stmt = $db->prepare($sql); $stmt->bindValue(':limit', $limit, PDO::PARAM_INT); } $stmt->execute(); return $stmt->fetchAll(); } /** * 渲染安全新闻HTML */ function renderSecNews($articles) { if (empty($articles)) { return '

❌ 暂无安全新闻数据

'; } $html = ''; foreach ($articles as $article) { $html .= '
'; $html .= '

' . htmlspecialchars($article['article_title']) . '

'; $html .= '
'; if (!empty($article['author'])) { $html .= '作者:' . htmlspecialchars($article['author']) . ''; } $html .= '上传时间:' . formatDate($article['upload_time']) . ''; if (!empty($article['source'])) { $html .= '来源:' . htmlspecialchars($article['source']) . ''; } if (!empty($article['category'])) { $html .= '类型:' . htmlspecialchars($article['category']) . ''; } $html .= '
'; if (!empty($article['description'])) { $html .= '
' . htmlspecialchars(truncateText($article['description'], 300)) . '
'; } $html .= '
'; $html .= '
'; } return $html; } /** * 渲染技术文章HTML */ function renderTechPassage($articles) { if (empty($articles)) { return '

❌ 暂无技术文章数据

'; } $html = ''; foreach ($articles as $article) { $html .= '
'; $html .= '

' . htmlspecialchars($article['article_title']) . '

'; $html .= '
'; if (!empty($article['author'])) { $html .= '作者:' . htmlspecialchars($article['author']) . ''; } $html .= '上传时间:' . formatDate($article['upload_time']) . ''; if (!empty($article['source'])) { $html .= '来源:' . htmlspecialchars($article['source']) . ''; } if (!empty($article['category'])) { $html .= '类型:' . htmlspecialchars($article['category']) . ''; } $html .= '
'; if (!empty($article['description'])) { $html .= '
' . htmlspecialchars(truncateText($article['description'], 300)) . '
'; } $html .= '
'; $html .= '
'; } return $html; } /** * 渲染百度新闻HTML */ function renderBaiduNews($articles) { if (empty($articles)) { return '

❌ 暂无百度新闻数据

'; } $html = ''; foreach ($articles as $article) { $html .= '
'; $html .= '

' . htmlspecialchars($article['article_title']) . '

'; $html .= '
'; $html .= '上传时间:' . formatDate($article['upload_time']) . ''; if (!empty($article['source'])) { $html .= '来源:' . htmlspecialchars($article['source']) . ''; } if (!empty($article['keyword'])) { $html .= '关键词:' . htmlspecialchars($article['keyword']) . ''; } $html .= '
'; if (!empty($article['description'])) { $html .= '
' . htmlspecialchars(truncateText($article['description'], 300)) . '
'; } $html .= '
'; $html .= '
'; } return $html; } /** * 渲染GitHub动态HTML(根据source字段区分四种情况) */ function renderGithubNews($articles) { if (empty($articles)) { return '

❌ 暂无GitHub动态数据

'; } $html = ''; foreach ($articles as $article) { $html .= '
'; // 获取source字段 $source = isset($article['source']) ? trim($article['source']) : ''; $title = htmlspecialchars($article['article_title']); $link = htmlspecialchars($article['link']); // 根据source值判断显示格式 if ($source === 'New project') { $keyword = !empty($article['keyword']) ? '【' . htmlspecialchars($article['keyword']) . '】' : ''; $html .= '

关键词' . $keyword . '发现新项目:' . $title . '

'; if (!empty($article['description'])) { $html .= '
项目描述:' . htmlspecialchars(truncateText($article['description'], 300)) . '
'; } $html .= '
'; $html .= '上传时间:' . formatDate($article['upload_time']) . ''; if (!empty($article['language'])) { $html .= '开发语言:' . htmlspecialchars($article['language']) . ''; } if (!empty($article['author'])) { $html .= '作者:' . htmlspecialchars($article['author']) . ''; } $html .= '
'; } elseif ($source === 'Project update') { $html .= '

项目 ' . $title . ' 存在更新!!!

'; $html .= '
'; $html .= '更新时间:' . formatDate($article['upload_time']) . ''; if (!empty($article['author'])) { $html .= '提交者:' . htmlspecialchars($article['author']) . ''; } $html .= '
'; if (!empty($article['description'])) { $html .= '
更新描述:' . htmlspecialchars(truncateText($article['description'], 300)) . '
'; } if (!empty($article['keyword'])) { $html .= '
点此查看提交详情
'; } } elseif ($source === 'New tool') { $author = !empty($article['author']) ? '【' . htmlspecialchars($article['author']) . '】' : '【未知作者】'; $html .= '

大佬' . $author . '上传了一个新工具:' . $title . '

'; if (!empty($article['description'])) { $html .= '
项目描述:' . htmlspecialchars(truncateText($article['description'], 300)) . '
'; } $html .= '
上传时间:' . formatDate($article['upload_time']) . '
'; } elseif ($source === 'New version') { $author = !empty($article['author']) ? '【' . htmlspecialchars($article['author']) . '】' : '【未知作者】'; $html .= '

' . $author . '为 ' . $title . ' 发布了新版本,请及时查收!

'; $html .= '
发布时间:' . formatDate($article['upload_time']) . '
'; } else { // 默认格式 $html .= '

' . $title . '

'; $html .= '
'; if (!empty($article['author'])) { $html .= '作者:' . htmlspecialchars($article['author']) . ''; } $html .= '更新时间:' . formatDate($article['upload_time']) . ''; if (!empty($article['keyword'])) { $html .= '关键词:' . htmlspecialchars($article['keyword']) . ''; } if (!empty($article['language'])) { $html .= '语言:' . htmlspecialchars($article['language']) . ''; } if (!empty($source)) { $html .= '类型:' . htmlspecialchars($source) . ''; } $html .= '
'; if (!empty($article['description'])) { $html .= '
' . htmlspecialchars(truncateText($article['description'], 300)) . '
'; } } $html .= '
'; $html .= '
'; } return $html; } /** * 渲染微信文章HTML(搜狗微信) */ function renderWxNews($articles) { if (empty($articles)) { return '

❌ 暂无微信文章数据

'; } $html = ''; foreach ($articles as $article) { $html .= '
'; $keyword = isset($article['keyword']) ? trim($article['keyword']) : ''; $title = htmlspecialchars($article['article_title']); $link = htmlspecialchars($article['link']); if (!empty($keyword)) { $html .= '

关键词【' . htmlspecialchars($keyword) . '】发现新文章:' . $title . '

'; } else { $html .= '

' . $title . '

'; } $html .= '
'; if (!empty($article['description'])) { $html .= '描述:' . htmlspecialchars(truncateText($article['description'], 300)) . ''; } $html .= '上传时间:' . formatDate($article['upload_time']) . ''; if (!empty($article['author'])) { $html .= '作者:' . htmlspecialchars($article['author']) . ''; } $html .= '
'; $html .= '
'; $html .= '
'; } return $html; } /** * 渲染其他RSS源HTML(uni_rss) */ function renderOtherRss($articles) { if (empty($articles)) { return '

❌ 暂无其他RSS源数据

'; } $html = ''; foreach ($articles as $article) { $html .= '
'; $source = isset($article['source']) ? trim($article['source']) : ''; $title = htmlspecialchars($article['article_title']); $link = htmlspecialchars($article['link']); if (!empty($source)) { $html .= '

【' . htmlspecialchars($source) . '】RSS源发现新文章:' . $title . '

'; } else { $html .= '

' . $title . '

'; } $html .= '
'; if (!empty($article['description'])) { $html .= '描述:' . htmlspecialchars(truncateText($article['description'], 300)) . ''; } $html .= '上传时间:' . formatDate($article['upload_time']) . ''; if (!empty($article['author'])) { $html .= '作者:' . htmlspecialchars($article['author']) . ''; } $html .= '
'; $html .= '
'; $html .= '
'; } return $html; } // 处理AJAX请求 if ($action === 'ajax') { header('Content-Type: application/json; charset=utf-8'); $type = isset($_GET['type']) ? $_GET['type'] : 'sec-news'; $dateFilter = isset($_GET['date']) ? $_GET['date'] : ''; $limit = isset($_GET['limit']) ? intval($_GET['limit']) : 50; $db = getDatabaseConnection($dbPath); if (!$db) { echo json_encode(['success' => false, 'message' => '数据库连接失败']); exit; } $data = []; $title = ''; switch ($type) { case 'sec-news': $data = getSecNews($db, $dateFilter, $limit); $title = '🔒 安全新闻'; break; case 'tech-passage': $data = getTechPassage($db, $dateFilter, $limit); $title = '💻 技术文章'; break; case 'baidu-news': $data = getBaiduNews($db, $dateFilter, $limit); $title = '📊 百度新闻'; break; case 'github-news': $data = getGithubNews($db, $dateFilter, $limit); $title = '🐙 GitHub动态'; break; case 'wx-news': $data = getWxNews($db, $dateFilter, $limit); $title = '💬 微信文章'; break; case 'other-rss': $data = getOtherRss($db, $dateFilter, $limit); $title = '📡 其他来源'; break; default: echo json_encode(['success' => false, 'message' => '无效的类型']); exit; } echo json_encode([ 'success' => true, 'title' => $title, 'count' => count($data), 'data' => $data ]); exit; } // 获取初始数据(默认显示安全新闻) $db = getDatabaseConnection($dbPath); $initialData = []; $initialTitle = '🔒 安全新闻'; if ($db) { $initialData = getSecNews($db, $dateFilter, $limit); } ?> 资讯推送Web端

📋 选择资讯类型