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);
?>
必应壁纸列表 - 按年月归档
✨ 暂无壁纸记录,先去首页获取一张吧~
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);
}
}
?>
必应每日壁纸 · 全屏