setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 创建壁纸表 (预留备用字段1-3) $db->exec(" CREATE TABLE IF NOT EXISTS wallpapers ( id INTEGER PRIMARY KEY AUTOINCREMENT, hash TEXT UNIQUE, -- 图片唯一标识 title TEXT, copyright TEXT, copyrightlink TEXT, url TEXT, -- UHD图片地址 url_1080p TEXT, -- 1080P图片地址 date TEXT, -- 日期 enddate year INTEGER, -- 年份(用于分类) month INTEGER, -- 月份(用于分类) reserve1 TEXT, -- 备用字段1 reserve2 TEXT, -- 备用字段2 reserve3 TEXT, -- 备用字段3 created_at DATETIME DEFAULT CURRENT_TIMESTAMP ) "); // 创建索引 $db->exec("CREATE INDEX IF NOT EXISTS idx_year_month ON wallpapers (year, month)"); $db->exec("CREATE INDEX IF NOT EXISTS idx_date ON wallpapers (date)"); } catch (PDOException $e) { die("数据库初始化失败: " . $e->getMessage()); } // ================================================== // 获取当前脚本完整URL(用于生成链接) $self = $_SERVER['PHP_SELF']; $base_url = (isset($_SERVER['HTTPS']) ? 'https://' : 'http://') . $_SERVER['HTTP_HOST'] . rtrim(dirname($_SERVER['SCRIPT_NAME']), '/') . '/'; // ================== 获取必应壁纸函数 ================== function getBingWallpaper($db, $cache_file, $cache_time) { // 检查缓存是否存在且未过期 $use_cache = false; $bing_data = null; $result = null; if (file_exists($cache_file)) { $cache_mtime = filemtime($cache_file); $current_time = time(); // 如果缓存文件在12小时内,则使用缓存 if (($current_time - $cache_mtime) < $cache_time) { $cached_content = file_get_contents($cache_file); $cached_data = json_decode($cached_content, true); // 验证缓存数据是否有效 if (isset($cached_data['success']) && $cached_data['success']) { $result = $cached_data; $use_cache = true; } } } // 如果缓存无效或过期,则从必应获取新数据 if (!$use_cache) { // 获取bing每日壁纸 $bing_url = 'https://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=zh-CN'; // 使用curl获取bing数据 $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $bing_url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_TIMEOUT, 10); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'); $bing_raw_data = curl_exec($ch); $curl_error = curl_error($ch); curl_close($ch); if ($bing_raw_data && !$curl_error) { $bing_json = json_decode($bing_raw_data, true); if (isset($bing_json['images'][0])) { $image = $bing_json['images'][0]; $base_url = 'https://www.bing.com'; // 获取高清版图片(替换为UHD版本) $image_url = $base_url . $image['url']; $uhd_url = str_replace('1920x1080', 'UHD', $image_url); // 解析年月 $enddate = $image['enddate'] ?? ''; $year = $month = 0; if (strlen($enddate) >= 6) { $year = intval(substr($enddate, 0, 4)); $month = intval(substr($enddate, 4, 2)); } else { $year = intval(date('Y')); $month = intval(date('m')); } // 构建返回数据 $result = array( 'success' => true, 'title' => $image['title'] ?? '必应每日壁纸', 'copyright' => $image['copyright'] ?? '', 'copyrightlink' => isset($image['copyrightlink']) ? $base_url . $image['copyrightlink'] : '', 'url' => $uhd_url, 'url_1080p' => $base_url . $image['url'], 'date' => $enddate, 'hash' => $image['hsh'] ?? '', 'cache_time' => date('Y-m-d H:i:s', time()), 'cache_expire' => date('Y-m-d H:i:s', time() + $cache_time) ); // 保存到缓存文件 file_put_contents($cache_file, json_encode($result, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE), LOCK_EX); // 存入SQLite数据库(如果不存在) try { $stmt = $db->prepare("SELECT id FROM wallpapers WHERE hash = ?"); $stmt->execute([$result['hash']]); if (!$stmt->fetch()) { $insert = $db->prepare(" INSERT INTO wallpapers (hash, title, copyright, copyrightlink, url, url_1080p, date, year, month, reserve1, reserve2, reserve3) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, '', '', '') "); $insert->execute([ $result['hash'], $result['title'], $result['copyright'], $result['copyrightlink'], $result['url'], $result['url_1080p'], $result['date'], $year, $month ]); } } catch (PDOException $e) { error_log("SQLite insert error: " . $e->getMessage()); } } else { $result = array( 'success' => false, 'error' => '获取必应壁纸失败:数据格式错误' ); } } else { $result = array( 'success' => false, 'error' => '获取必应壁纸失败:' . ($curl_error ?: '未知错误') ); } } return $result; } // ================== 路由处理 ================== $action = isset($_GET['action']) ? $_GET['action'] : ''; // 1. 壁纸列表页面 (带年月分类) if ($action === 'list') { $page = isset($_GET['page']) ? max(1, intval($_GET['page'])) : 1; $per_page = 20; $offset = ($page - 1) * $per_page; // 获取年月筛选 $selected_year = isset($_GET['year']) ? intval($_GET['year']) : 0; $selected_month = isset($_GET['month']) ? intval($_GET['month']) : 0; // 获取所有可用的年份月份 $year_month_list = []; $stmt = $db->query("SELECT DISTINCT year, month FROM wallpapers WHERE year IS NOT NULL AND month IS NOT NULL ORDER BY year DESC, month DESC"); while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { $year_month_list[] = $row; } // 构建查询条件 $where_sql = "1=1"; $params = []; if ($selected_year > 0) { $where_sql .= " AND year = :year"; $params[':year'] = $selected_year; if ($selected_month > 0) { $where_sql .= " AND month = :month"; $params[':month'] = $selected_month; } } // 查询总数 $count_stmt = $db->prepare("SELECT COUNT(*) FROM wallpapers WHERE $where_sql"); foreach ($params as $key => $val) $count_stmt->bindValue($key, $val); $count_stmt->execute(); $total = $count_stmt->fetchColumn(); $total_pages = ceil($total / $per_page); // 查询当前页数据 $sql = "SELECT * FROM wallpapers WHERE $where_sql ORDER BY date DESC, id DESC LIMIT :limit OFFSET :offset"; $stmt = $db->prepare($sql); foreach ($params as $key => $val) $stmt->bindValue($key, $val); $stmt->bindValue(':limit', $per_page, PDO::PARAM_INT); $stmt->bindValue(':offset', $offset, PDO::PARAM_INT); $stmt->execute(); $wallpapers = $stmt->fetchAll(PDO::FETCH_ASSOC); ?> 必应壁纸列表 - 按年月归档

📅 必应壁纸归档 🏠 返回首页

✨ 暂无壁纸记录,先去首页获取一张吧~
<?php echo htmlspecialchars($item['title']); ?>
1): ?>
prepare("SELECT * FROM wallpapers WHERE id = ?"); $stmt->execute([$id]); $item = $stmt->fetch(PDO::FETCH_ASSOC); if (!$item) { header('Location: ' . $self . '?action=list'); exit; } // 直接重定向到高清图片 header('Location: ' . $item['url']); exit; } // 3. 必应API数据接口 (原bz逻辑) if (isset($_GET['bz'])) { $result = getBingWallpaper($db, BING_CACHE_FILE, BING_CACHE_TIME); // 如果请求参数中有 json,返回JSON数据 if (isset($_GET['json'])) { header('Content-Type: application/json; charset=utf-8'); echo json_encode($result, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE); exit; } // 默认:重定向到图片 if ($result['success']) { header('Location: ' . $result['url']); } else { header('Content-Type: application/json; charset=utf-8'); echo json_encode($result, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE); } exit; } // ================== 首页:全屏展示当前壁纸 ================== // 获取今日壁纸(优先缓存,没有则实时获取) $wallpaper = getBingWallpaper($db, BING_CACHE_FILE, BING_CACHE_TIME); // 如果获取失败,尝试从数据库获取最新的一张作为备用 if (!$wallpaper['success']) { $stmt = $db->query("SELECT * FROM wallpapers ORDER BY date DESC, id DESC LIMIT 1"); $latest = $stmt->fetch(PDO::FETCH_ASSOC); if ($latest) { $wallpaper = [ 'success' => true, 'title' => $latest['title'], 'copyright' => $latest['copyright'], 'url' => $latest['url'], 'id' => $latest['id'] ]; } } // 查询上一张壁纸 (按id倒序,取比当前小的最大id) $prev = null; if (isset($wallpaper['id']) && $wallpaper['id'] > 0) { $stmt = $db->prepare("SELECT * FROM wallpapers WHERE id < ? ORDER BY id DESC LIMIT 1"); $stmt->execute([$wallpaper['id']]); $prev = $stmt->fetch(PDO::FETCH_ASSOC); } else { // 如果没有id(刚获取还没存入数据库?但getBingWallpaper已经存入,所以应该有id) // 或者取最新的一张作为当前,然后取上一张 $stmt = $db->query("SELECT * FROM wallpapers ORDER BY id DESC LIMIT 1"); $current = $stmt->fetch(PDO::FETCH_ASSOC); if ($current) { $wallpaper['id'] = $current['id']; $wallpaper['title'] = $current['title']; $wallpaper['copyright'] = $current['copyright']; $wallpaper['url'] = $current['url']; // 再查上一张 $stmt2 = $db->prepare("SELECT * FROM wallpapers WHERE id < ? ORDER BY id DESC LIMIT 1"); $stmt2->execute([$current['id']]); $prev = $stmt2->fetch(PDO::FETCH_ASSOC); } } ?> 必应每日壁纸 · 全屏
必应壁纸
无法获取壁纸,请稍后刷新重试
查看历史壁纸