From b139fb14d9ffea7c9980a46e39b1bd7689e9fad1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A0=91=E8=90=8C=E8=8A=BD?= <3205788256@qq.com> Date: Tue, 2 Sep 2025 08:40:37 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8A=8A=E5=A4=A7=E8=87=B4=E6=A1=86=E6=9E=B6?= =?UTF-8?q?=E6=90=AD=E5=A5=BD1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- .../随机JavaScript趣味题/css/background.css | 190 + .../随机JavaScript趣味题/css/style.css | 597 ++ .../娱乐消遣/随机JavaScript趣味题/index.html | 89 + .../随机JavaScript趣味题/js/script.js | 565 ++ .../随机JavaScript趣味题/接口集合.json | 7 + .../随机JavaScript趣味题/返回接口.json | 17 + .../娱乐消遣/随机KFC文案/css/background.css | 81 + .../60sapi/娱乐消遣/随机KFC文案/css/style.css | 339 + .../60sapi/娱乐消遣/随机KFC文案/index.html | 46 + .../60sapi/娱乐消遣/随机KFC文案/js/main.js | 240 + .../60sapi/娱乐消遣/随机KFC文案/接口集合.json | 7 + .../60sapi/娱乐消遣/随机KFC文案/返回接口.json | 1 + .../娱乐消遣/随机一言/css/background.css | 167 + .../60sapi/娱乐消遣/随机一言/css/style.css | 357 ++ frontend/60sapi/娱乐消遣/随机一言/index.html | 52 + .../60sapi/娱乐消遣/随机一言/js/script.js | 225 + .../60sapi/娱乐消遣/随机一言/接口集合.json | 7 + .../60sapi/娱乐消遣/随机一言/返回接口.json | 8 + .../娱乐消遣/随机唱歌音频/css/style.css | 251 + .../60sapi/娱乐消遣/随机唱歌音频/index.html | 67 + .../60sapi/娱乐消遣/随机唱歌音频/js/script.js | 252 + .../娱乐消遣/随机唱歌音频/接口集合.json | 7 + .../娱乐消遣/随机唱歌音频/返回接口.json | 32 + .../实用功能/EpicGames免费游戏/css/style.css | 330 + .../实用功能/EpicGames免费游戏/index.html | 63 + .../实用功能/EpicGames免费游戏/js/script.js | 266 + .../实用功能/EpicGames免费游戏/接口集合.json | 7 + .../实用功能/EpicGames免费游戏/返回接口.json | 66 + .../实用功能/农历信息/css/background.css | 89 + .../60sapi/实用功能/农历信息/css/style.css | 1105 ++++ frontend/60sapi/实用功能/农历信息/index.html | 71 + .../60sapi/实用功能/农历信息/js/script.js | 485 ++ .../60sapi/实用功能/农历信息/接口集合.json | 7 + .../60sapi/实用功能/农历信息/返回接口.json | 647 ++ .../实用功能/实时天气/css/background.css | 145 + .../60sapi/实用功能/实时天气/css/style.css | 409 ++ frontend/60sapi/实用功能/实时天气/index.html | 140 + .../60sapi/实用功能/实时天气/js/script.js | 252 + .../60sapi/实用功能/实时天气/接口集合.json | 7 + .../60sapi/实用功能/实时天气/返回接口.json | 68 + .../实用功能/生成二维码/css/background.css | 132 + .../60sapi/实用功能/生成二维码/css/style.css | 468 ++ .../60sapi/实用功能/生成二维码/index.html | 98 + .../60sapi/实用功能/生成二维码/js/script.js | 417 ++ .../60sapi/实用功能/生成二维码/接口集合.json | 7 + .../60sapi/实用功能/生成二维码/返回接口.json | 10 + .../实用功能/百度百科词条/css/background.css | 192 + .../实用功能/百度百科词条/css/style.css | 530 ++ .../60sapi/实用功能/百度百科词条/index.html | 83 + .../60sapi/实用功能/百度百科词条/js/script.js | 324 + .../实用功能/百度百科词条/接口集合.json | 7 + .../实用功能/百度百科词条/返回接口.json | 12 + .../日更资讯/历史上的今天/css/style.css | 388 ++ .../60sapi/日更资讯/历史上的今天/index.html | 83 + .../60sapi/日更资讯/历史上的今天/js/script.js | 295 + .../日更资讯/历史上的今天/接口集合.json | 7 + .../日更资讯/历史上的今天/返回接口.json | 102 + .../日更资讯/必应每日壁纸/css/style.css | 326 + .../60sapi/日更资讯/必应每日壁纸/index.html | 42 + .../60sapi/日更资讯/必应每日壁纸/js/script.js | 315 + .../日更资讯/必应每日壁纸/接口集合.json | 7 + .../日更资讯/必应每日壁纸/返回接口.json | 15 + .../日更资讯/每天60s读懂世界/css/style.css | 327 + .../日更资讯/每天60s读懂世界/index.html | 49 + .../日更资讯/每天60s读懂世界/js/script.js | 305 + .../日更资讯/每天60s读懂世界/接口集合.json | 7 + .../日更资讯/每天60s读懂世界/返回接口.json | 66 + .../日更资讯/每日国际汇率/css/style.css | 409 ++ .../60sapi/日更资讯/每日国际汇率/index.html | 86 + .../60sapi/日更资讯/每日国际汇率/js/script.js | 520 ++ .../日更资讯/每日国际汇率/接口集合.json | 7 + .../日更资讯/每日国际汇率/返回接口.json | 1 + .../HackerNews榜单/css/background.css | 106 + .../热搜榜单/HackerNews榜单/css/style.css | 1037 +++ .../60sapi/热搜榜单/HackerNews榜单/index.html | 77 + .../热搜榜单/HackerNews榜单/js/script.js | 338 + .../热搜榜单/HackerNews榜单/接口集合.json | 7 + .../热搜榜单/HackerNews榜单/返回接口.json | 87 + .../热搜榜单/微博热搜榜/css/background.css | 40 + .../60sapi/热搜榜单/微博热搜榜/css/style.css | 155 + .../60sapi/热搜榜单/微博热搜榜/index.html | 34 + .../60sapi/热搜榜单/微博热搜榜/js/main.js | 94 + .../60sapi/热搜榜单/微博热搜榜/接口集合.json | 7 + .../60sapi/热搜榜单/微博热搜榜/返回接口.json | 261 + .../热搜榜单/抖音热搜榜/css/background.css | 52 + .../60sapi/热搜榜单/抖音热搜榜/css/style.css | 956 +++ .../60sapi/热搜榜单/抖音热搜榜/index.html | 60 + .../60sapi/热搜榜单/抖音热搜榜/js/script.js | 300 + .../60sapi/热搜榜单/抖音热搜榜/接口集合.json | 7 + .../60sapi/热搜榜单/抖音热搜榜/返回接口.json | 496 ++ .../热搜榜单/猫眼票房排行榜/css/style.css | 495 ++ .../60sapi/热搜榜单/猫眼票房排行榜/index.html | 40 + .../热搜榜单/猫眼票房排行榜/js/script.js | 249 + .../热搜榜单/猫眼票房排行榜/接口集合.json | 7 + .../热搜榜单/猫眼票房排行榜/返回接口.json | 171 + .../热搜榜单/网易云榜单列表/接口集合.json | 7 + .../热搜榜单/网易云榜单列表/返回接口.json | 750 +++ .../网易云榜单详情/css/background.css | 123 + .../热搜榜单/网易云榜单详情/css/style.css | 483 ++ .../60sapi/热搜榜单/网易云榜单详情/index.html | 69 + .../热搜榜单/网易云榜单详情/js/script.js | 349 + .../热搜榜单/网易云榜单详情/接口集合.json | 7 + .../热搜榜单/网易云榜单详情/返回接口.json | 5612 +++++++++++++++++ frontend/60sapi/生成要求模板.txt | 8 + 生成要求.txt | 2 - 用户数据模板.json | 4 + 项目架构说明.txt | 10 + 108 files changed, 25897 insertions(+), 3 deletions(-) create mode 100644 frontend/60sapi/娱乐消遣/随机JavaScript趣味题/css/background.css create mode 100644 frontend/60sapi/娱乐消遣/随机JavaScript趣味题/css/style.css create mode 100644 frontend/60sapi/娱乐消遣/随机JavaScript趣味题/index.html create mode 100644 frontend/60sapi/娱乐消遣/随机JavaScript趣味题/js/script.js create mode 100644 frontend/60sapi/娱乐消遣/随机JavaScript趣味题/接口集合.json create mode 100644 frontend/60sapi/娱乐消遣/随机JavaScript趣味题/返回接口.json create mode 100644 frontend/60sapi/娱乐消遣/随机KFC文案/css/background.css create mode 100644 frontend/60sapi/娱乐消遣/随机KFC文案/css/style.css create mode 100644 frontend/60sapi/娱乐消遣/随机KFC文案/index.html create mode 100644 frontend/60sapi/娱乐消遣/随机KFC文案/js/main.js create mode 100644 frontend/60sapi/娱乐消遣/随机KFC文案/接口集合.json create mode 100644 frontend/60sapi/娱乐消遣/随机KFC文案/返回接口.json create mode 100644 frontend/60sapi/娱乐消遣/随机一言/css/background.css create mode 100644 frontend/60sapi/娱乐消遣/随机一言/css/style.css create mode 100644 frontend/60sapi/娱乐消遣/随机一言/index.html create mode 100644 frontend/60sapi/娱乐消遣/随机一言/js/script.js create mode 100644 frontend/60sapi/娱乐消遣/随机一言/接口集合.json create mode 100644 frontend/60sapi/娱乐消遣/随机一言/返回接口.json create mode 100644 frontend/60sapi/娱乐消遣/随机唱歌音频/css/style.css create mode 100644 frontend/60sapi/娱乐消遣/随机唱歌音频/index.html create mode 100644 frontend/60sapi/娱乐消遣/随机唱歌音频/js/script.js create mode 100644 frontend/60sapi/娱乐消遣/随机唱歌音频/接口集合.json create mode 100644 frontend/60sapi/娱乐消遣/随机唱歌音频/返回接口.json create mode 100644 frontend/60sapi/实用功能/EpicGames免费游戏/css/style.css create mode 100644 frontend/60sapi/实用功能/EpicGames免费游戏/index.html create mode 100644 frontend/60sapi/实用功能/EpicGames免费游戏/js/script.js create mode 100644 frontend/60sapi/实用功能/EpicGames免费游戏/接口集合.json create mode 100644 frontend/60sapi/实用功能/EpicGames免费游戏/返回接口.json create mode 100644 frontend/60sapi/实用功能/农历信息/css/background.css create mode 100644 frontend/60sapi/实用功能/农历信息/css/style.css create mode 100644 frontend/60sapi/实用功能/农历信息/index.html create mode 100644 frontend/60sapi/实用功能/农历信息/js/script.js create mode 100644 frontend/60sapi/实用功能/农历信息/接口集合.json create mode 100644 frontend/60sapi/实用功能/农历信息/返回接口.json create mode 100644 frontend/60sapi/实用功能/实时天气/css/background.css create mode 100644 frontend/60sapi/实用功能/实时天气/css/style.css create mode 100644 frontend/60sapi/实用功能/实时天气/index.html create mode 100644 frontend/60sapi/实用功能/实时天气/js/script.js create mode 100644 frontend/60sapi/实用功能/实时天气/接口集合.json create mode 100644 frontend/60sapi/实用功能/实时天气/返回接口.json create mode 100644 frontend/60sapi/实用功能/生成二维码/css/background.css create mode 100644 frontend/60sapi/实用功能/生成二维码/css/style.css create mode 100644 frontend/60sapi/实用功能/生成二维码/index.html create mode 100644 frontend/60sapi/实用功能/生成二维码/js/script.js create mode 100644 frontend/60sapi/实用功能/生成二维码/接口集合.json create mode 100644 frontend/60sapi/实用功能/生成二维码/返回接口.json create mode 100644 frontend/60sapi/实用功能/百度百科词条/css/background.css create mode 100644 frontend/60sapi/实用功能/百度百科词条/css/style.css create mode 100644 frontend/60sapi/实用功能/百度百科词条/index.html create mode 100644 frontend/60sapi/实用功能/百度百科词条/js/script.js create mode 100644 frontend/60sapi/实用功能/百度百科词条/接口集合.json create mode 100644 frontend/60sapi/实用功能/百度百科词条/返回接口.json create mode 100644 frontend/60sapi/日更资讯/历史上的今天/css/style.css create mode 100644 frontend/60sapi/日更资讯/历史上的今天/index.html create mode 100644 frontend/60sapi/日更资讯/历史上的今天/js/script.js create mode 100644 frontend/60sapi/日更资讯/历史上的今天/接口集合.json create mode 100644 frontend/60sapi/日更资讯/历史上的今天/返回接口.json create mode 100644 frontend/60sapi/日更资讯/必应每日壁纸/css/style.css create mode 100644 frontend/60sapi/日更资讯/必应每日壁纸/index.html create mode 100644 frontend/60sapi/日更资讯/必应每日壁纸/js/script.js create mode 100644 frontend/60sapi/日更资讯/必应每日壁纸/接口集合.json create mode 100644 frontend/60sapi/日更资讯/必应每日壁纸/返回接口.json create mode 100644 frontend/60sapi/日更资讯/每天60s读懂世界/css/style.css create mode 100644 frontend/60sapi/日更资讯/每天60s读懂世界/index.html create mode 100644 frontend/60sapi/日更资讯/每天60s读懂世界/js/script.js create mode 100644 frontend/60sapi/日更资讯/每天60s读懂世界/接口集合.json create mode 100644 frontend/60sapi/日更资讯/每天60s读懂世界/返回接口.json create mode 100644 frontend/60sapi/日更资讯/每日国际汇率/css/style.css create mode 100644 frontend/60sapi/日更资讯/每日国际汇率/index.html create mode 100644 frontend/60sapi/日更资讯/每日国际汇率/js/script.js create mode 100644 frontend/60sapi/日更资讯/每日国际汇率/接口集合.json create mode 100644 frontend/60sapi/日更资讯/每日国际汇率/返回接口.json create mode 100644 frontend/60sapi/热搜榜单/HackerNews榜单/css/background.css create mode 100644 frontend/60sapi/热搜榜单/HackerNews榜单/css/style.css create mode 100644 frontend/60sapi/热搜榜单/HackerNews榜单/index.html create mode 100644 frontend/60sapi/热搜榜单/HackerNews榜单/js/script.js create mode 100644 frontend/60sapi/热搜榜单/HackerNews榜单/接口集合.json create mode 100644 frontend/60sapi/热搜榜单/HackerNews榜单/返回接口.json create mode 100644 frontend/60sapi/热搜榜单/微博热搜榜/css/background.css create mode 100644 frontend/60sapi/热搜榜单/微博热搜榜/css/style.css create mode 100644 frontend/60sapi/热搜榜单/微博热搜榜/index.html create mode 100644 frontend/60sapi/热搜榜单/微博热搜榜/js/main.js create mode 100644 frontend/60sapi/热搜榜单/微博热搜榜/接口集合.json create mode 100644 frontend/60sapi/热搜榜单/微博热搜榜/返回接口.json create mode 100644 frontend/60sapi/热搜榜单/抖音热搜榜/css/background.css create mode 100644 frontend/60sapi/热搜榜单/抖音热搜榜/css/style.css create mode 100644 frontend/60sapi/热搜榜单/抖音热搜榜/index.html create mode 100644 frontend/60sapi/热搜榜单/抖音热搜榜/js/script.js create mode 100644 frontend/60sapi/热搜榜单/抖音热搜榜/接口集合.json create mode 100644 frontend/60sapi/热搜榜单/抖音热搜榜/返回接口.json create mode 100644 frontend/60sapi/热搜榜单/猫眼票房排行榜/css/style.css create mode 100644 frontend/60sapi/热搜榜单/猫眼票房排行榜/index.html create mode 100644 frontend/60sapi/热搜榜单/猫眼票房排行榜/js/script.js create mode 100644 frontend/60sapi/热搜榜单/猫眼票房排行榜/接口集合.json create mode 100644 frontend/60sapi/热搜榜单/猫眼票房排行榜/返回接口.json create mode 100644 frontend/60sapi/热搜榜单/网易云榜单列表/接口集合.json create mode 100644 frontend/60sapi/热搜榜单/网易云榜单列表/返回接口.json create mode 100644 frontend/60sapi/热搜榜单/网易云榜单详情/css/background.css create mode 100644 frontend/60sapi/热搜榜单/网易云榜单详情/css/style.css create mode 100644 frontend/60sapi/热搜榜单/网易云榜单详情/index.html create mode 100644 frontend/60sapi/热搜榜单/网易云榜单详情/js/script.js create mode 100644 frontend/60sapi/热搜榜单/网易云榜单详情/接口集合.json create mode 100644 frontend/60sapi/热搜榜单/网易云榜单详情/返回接口.json create mode 100644 frontend/60sapi/生成要求模板.txt delete mode 100644 生成要求.txt create mode 100644 用户数据模板.json create mode 100644 项目架构说明.txt diff --git a/README.md b/README.md index 88c79770..ed4dad6e 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ # InfoGenie 神奇万事通,一个支持Windows,Android和web的app,聚合了许多神奇有趣的功能,帮助用户一键化解决问题 - 前端使用React框架,后端使用Python的Flask框架 + diff --git a/frontend/60sapi/娱乐消遣/随机JavaScript趣味题/css/background.css b/frontend/60sapi/娱乐消遣/随机JavaScript趣味题/css/background.css new file mode 100644 index 00000000..7a44dec9 --- /dev/null +++ b/frontend/60sapi/娱乐消遣/随机JavaScript趣味题/css/background.css @@ -0,0 +1,190 @@ +/* 背景样式文件 */ + +/* 主体背景 */ +body { + background: linear-gradient(135deg, #e8f5e8 0%, #c8e6c9 50%, #a5d6a7 100%); + background-attachment: fixed; + background-size: 400% 400%; + animation: gradientShift 15s ease infinite; +} + +/* 背景动画 */ +@keyframes gradientShift { + 0% { + background-position: 0% 50%; + } + 50% { + background-position: 100% 50%; + } + 100% { + background-position: 0% 50%; + } +} + +/* 装饰性背景元素 */ +body::before { + content: ''; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-image: + radial-gradient(circle at 20% 80%, rgba(76, 175, 80, 0.1) 0%, transparent 50%), + radial-gradient(circle at 80% 20%, rgba(129, 199, 132, 0.1) 0%, transparent 50%), + radial-gradient(circle at 40% 40%, rgba(165, 214, 167, 0.08) 0%, transparent 50%); + pointer-events: none; + z-index: -1; +} + +/* 浮动装饰圆点 */ +body::after { + content: ''; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-image: + radial-gradient(2px 2px at 20px 30px, rgba(76, 175, 80, 0.3), transparent), + radial-gradient(2px 2px at 40px 70px, rgba(129, 199, 132, 0.2), transparent), + radial-gradient(1px 1px at 90px 40px, rgba(165, 214, 167, 0.3), transparent), + radial-gradient(1px 1px at 130px 80px, rgba(76, 175, 80, 0.2), transparent), + radial-gradient(2px 2px at 160px 30px, rgba(129, 199, 132, 0.3), transparent); + background-repeat: repeat; + background-size: 200px 100px; + animation: float 20s linear infinite; + pointer-events: none; + z-index: -1; + opacity: 0.6; +} + +@keyframes float { + 0% { + transform: translateY(0px); + } + 50% { + transform: translateY(-10px); + } + 100% { + transform: translateY(0px); + } +} + +/* 题目容器背景增强 */ +.question-container { + background: rgba(255, 255, 255, 0.95); + backdrop-filter: blur(10px); + -webkit-backdrop-filter: blur(10px); + border: 1px solid rgba(255, 255, 255, 0.2); + box-shadow: + 0 8px 32px rgba(26, 77, 26, 0.1), + inset 0 1px 0 rgba(255, 255, 255, 0.2); +} + +/* 错误容器背景 */ +.error-container { + background: rgba(255, 255, 255, 0.95); + backdrop-filter: blur(10px); + -webkit-backdrop-filter: blur(10px); +} + +/* 结果容器背景 */ +.result-container { + background: rgba(255, 255, 255, 0.9); + backdrop-filter: blur(5px); + -webkit-backdrop-filter: blur(5px); +} + +/* 代码块背景 */ +.code-block { + background: rgba(248, 249, 250, 0.9); + backdrop-filter: blur(5px); + -webkit-backdrop-filter: blur(5px); +} + +/* 选项背景 */ +.option { + background: rgba(255, 255, 255, 0.8); + backdrop-filter: blur(5px); + -webkit-backdrop-filter: blur(5px); +} + +.option:hover { + background: rgba(76, 175, 80, 0.05); +} + +.option.selected { + background: linear-gradient(135deg, rgba(76, 175, 80, 0.15), rgba(76, 175, 80, 0.08)); +} + +/* 按钮背景增强 */ +.submit-btn { + background: linear-gradient(135deg, #4caf50, #45a049); + box-shadow: 0 4px 15px rgba(76, 175, 80, 0.2); +} + +.show-answer-btn { + background: linear-gradient(135deg, #2196f3, #1976d2); + box-shadow: 0 4px 15px rgba(33, 150, 243, 0.2); +} + +.retry-btn { + background: linear-gradient(135deg, #ff9800, #f57c00); + box-shadow: 0 4px 15px rgba(255, 152, 0, 0.2); +} + +.refresh-btn { + background: linear-gradient(135deg, #4caf50, #45a049); + box-shadow: 0 4px 15px rgba(76, 175, 80, 0.2); +} + +/* 移动端背景优化 */ +@media (max-width: 768px) { + body { + background-attachment: scroll; + } + + body::after { + opacity: 0.4; + background-size: 150px 75px; + } + + .question-container { + backdrop-filter: blur(8px); + -webkit-backdrop-filter: blur(8px); + } +} + +/* 高对比度模式支持 */ +@media (prefers-contrast: high) { + body { + background: #f0f8f0; + } + + body::before, + body::after { + display: none; + } + + .question-container { + background: #ffffff; + border: 2px solid #4caf50; + } +} + +/* 减少动画模式支持 */ +@media (prefers-reduced-motion: reduce) { + body { + animation: none; + background: #e8f5e8; + } + + body::after { + animation: none; + } + + .refresh-btn:hover { + transform: scale(1.1); + } +} \ No newline at end of file diff --git a/frontend/60sapi/娱乐消遣/随机JavaScript趣味题/css/style.css b/frontend/60sapi/娱乐消遣/随机JavaScript趣味题/css/style.css new file mode 100644 index 00000000..2ad05653 --- /dev/null +++ b/frontend/60sapi/娱乐消遣/随机JavaScript趣味题/css/style.css @@ -0,0 +1,597 @@ +/* 基础样式重置 */ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', sans-serif; + line-height: 1.6; + color: #2d5a27; + min-height: 100vh; + overflow-x: hidden; +} + +/* 容器布局 */ +.container { + max-width: 1200px; + margin: 0 auto; + padding: 20px; + min-height: 100vh; + display: flex; + flex-direction: column; +} + +/* 头部样式 */ +.header { + text-align: center; + margin-bottom: 40px; + padding: 30px 0; +} + +.header h1 { + font-size: 2.5rem; + color: #1a4d1a; + margin-bottom: 10px; + font-weight: 700; + text-shadow: 0 2px 4px rgba(26, 77, 26, 0.1); +} + +.subtitle { + font-size: 1.1rem; + color: #4a7c59; + opacity: 0.8; +} + +/* 主内容区域 */ +.main-content { + flex: 1; + display: flex; + justify-content: center; + align-items: flex-start; +} + +/* 加载动画 */ +.loading { + text-align: center; + padding: 60px 20px; +} + +.spinner { + width: 50px; + height: 50px; + border: 4px solid #e8f5e8; + border-top: 4px solid #4caf50; + border-radius: 50%; + animation: spin 1s linear infinite; + margin: 0 auto 20px; +} + +@keyframes spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} + +.loading p { + color: #4a7c59; + font-size: 1.1rem; +} + +/* 题目容器 */ +.question-container { + background: rgba(255, 255, 255, 0.95); + border-radius: 20px; + padding: 40px; + box-shadow: 0 10px 30px rgba(26, 77, 26, 0.1); + border: 2px solid rgba(76, 175, 80, 0.2); + width: 100%; + max-width: 800px; + backdrop-filter: blur(10px); +} + +/* 题目头部 */ +.question-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 30px; + padding-bottom: 15px; + border-bottom: 2px solid #e8f5e8; +} + +.question-id { + font-size: 1.1rem; + color: #4caf50; + font-weight: 600; + background: linear-gradient(135deg, #e8f5e8, #c8e6c9); + padding: 8px 16px; + border-radius: 20px; +} + +.refresh-btn { + background: linear-gradient(135deg, #4caf50, #45a049); + border: none; + border-radius: 50%; + width: 45px; + height: 45px; + color: white; + cursor: pointer; + transition: all 0.3s ease; + display: flex; + align-items: center; + justify-content: center; +} + +.refresh-btn:hover { + transform: rotate(180deg) scale(1.1); + box-shadow: 0 5px 15px rgba(76, 175, 80, 0.3); +} + +/* 题目文本 */ +.question-text h2 { + font-size: 1.5rem; + color: #1a4d1a; + margin-bottom: 25px; + text-align: center; +} + +/* 代码块 */ +.code-block { + background: #f8f9fa; + border: 2px solid #e8f5e8; + border-radius: 12px; + margin: 25px 0; + overflow-x: auto; + position: relative; +} + +.code-block pre { + margin: 0; + padding: 25px; + font-family: 'Consolas', 'Monaco', 'Courier New', monospace; + font-size: 0.95rem; + line-height: 1.5; + color: #2d5a27; + white-space: pre-wrap; + word-wrap: break-word; + background: transparent !important; +} + +.code-block code { + font-family: 'Consolas', 'Monaco', 'Courier New', monospace; + background: transparent !important; +} + +/* 代码高亮自定义样式 - 丰富的语法高亮 */ +.code-block .hljs { + background: transparent !important; + color: #333333 !important; +} + +/* JavaScript 关键字 - 蓝色 */ +.code-block .hljs-keyword { + color: #0066cc !important; + font-weight: 600; +} + +/* 字符串 - 绿色 */ +.code-block .hljs-string { + color: #22aa22 !important; +} + +/* 数字 - 橙色 */ +.code-block .hljs-number { + color: #ff6600 !important; +} + +/* 函数名 - 紫色 */ +.code-block .hljs-function, +.code-block .hljs-title.function_ { + color: #9933cc !important; + font-weight: 600; +} + +/* 变量名 - 深蓝色 */ +.code-block .hljs-variable, +.code-block .hljs-name { + color: #0066aa !important; +} + +/* 注释 - 灰色 */ +.code-block .hljs-comment { + color: #888888 !important; + font-style: italic; +} + +/* 内置对象和方法 - 深紫色 */ +.code-block .hljs-built_in { + color: #663399 !important; + font-weight: 500; +} + +/* 字面量 (true, false, null) - 红色 */ +.code-block .hljs-literal { + color: #cc0000 !important; + font-weight: 600; +} + +/* 操作符 - 深灰色 */ +.code-block .hljs-operator { + color: #666666 !important; +} + +/* 标点符号 - 深灰色 */ +.code-block .hljs-punctuation { + color: #666666 !important; +} + +/* 属性名 - 深蓝色 */ +.code-block .hljs-property, +.code-block .hljs-attr { + color: #0066aa !important; +} + +/* 类名和构造函数 - 深绿色 */ +.code-block .hljs-title.class_, +.code-block .hljs-title { + color: #228833 !important; + font-weight: 600; +} + +/* 参数 - 深蓝色 */ +.code-block .hljs-params { + color: #0066aa !important; +} + +/* 正则表达式 - 深红色 */ +.code-block .hljs-regexp { + color: #aa0066 !important; +} + +/* 模板字符串 - 深绿色 */ +.code-block .hljs-template-variable, +.code-block .hljs-template-tag { + color: #228833 !important; +} + +/* 选项容器 */ +.options-container { + margin: 30px 0; +} + +.option { + background: rgba(255, 255, 255, 0.8); + border: 2px solid #e8f5e8; + border-radius: 12px; + padding: 15px 20px; + margin: 12px 0; + cursor: pointer; + transition: all 0.3s ease; + font-size: 1rem; + position: relative; + overflow: hidden; +} + +.option:hover { + border-color: #4caf50; + background: rgba(76, 175, 80, 0.05); + transform: translateX(5px); +} + +.option.selected { + border-color: #4caf50; + background: linear-gradient(135deg, rgba(76, 175, 80, 0.1), rgba(76, 175, 80, 0.05)); + color: #1a4d1a; + font-weight: 600; +} + +.option.correct { + border-color: #4caf50; + background: linear-gradient(135deg, rgba(76, 175, 80, 0.2), rgba(76, 175, 80, 0.1)); + color: #1a4d1a; +} + +.option.incorrect { + border-color: #f44336; + background: linear-gradient(135deg, rgba(244, 67, 54, 0.1), rgba(244, 67, 54, 0.05)); + color: #c62828; +} + +/* 按钮样式 */ +.action-buttons { + display: flex; + gap: 15px; + margin: 30px 0; + justify-content: center; + flex-wrap: wrap; +} + +.submit-btn, .show-answer-btn, .retry-btn, .export-btn { + padding: 12px 30px; + border: none; + border-radius: 25px; + font-size: 1rem; + font-weight: 600; + cursor: pointer; + transition: all 0.3s ease; + min-width: 120px; + display: flex; + align-items: center; + justify-content: center; + gap: 8px; +} + +.submit-btn { + background: linear-gradient(135deg, #4caf50, #45a049); + color: white; +} + +.submit-btn:hover:not(:disabled) { + transform: translateY(-2px); + box-shadow: 0 5px 15px rgba(76, 175, 80, 0.3); +} + +.submit-btn:disabled { + background: #cccccc; + cursor: not-allowed; + transform: none; + box-shadow: none; +} + +.show-answer-btn { + background: linear-gradient(135deg, #2196f3, #1976d2); + color: white; +} + +.show-answer-btn:hover { + transform: translateY(-2px); + box-shadow: 0 5px 15px rgba(33, 150, 243, 0.3); +} + +.retry-btn { + background: linear-gradient(135deg, #ff9800, #f57c00); + color: white; +} + +.retry-btn:hover { + transform: translateY(-2px); + box-shadow: 0 5px 15px rgba(255, 152, 0, 0.3); +} + +.export-btn { + background: linear-gradient(135deg, #9c27b0, #7b1fa2); + color: white; +} + +.export-btn:hover { + transform: translateY(-2px); + box-shadow: 0 5px 15px rgba(156, 39, 176, 0.3); +} + +.export-btn svg { + width: 16px; + height: 16px; +} + +/* 结果容器 */ +.result-container { + margin-top: 30px; + padding: 25px; + background: rgba(255, 255, 255, 0.9); + border-radius: 15px; + border: 2px solid #e8f5e8; +} + +.result-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 20px; + padding-bottom: 15px; + border-bottom: 1px solid #e8f5e8; +} + +.result-status { + font-size: 1.2rem; + font-weight: 600; +} + +.result-status.correct { + color: #4caf50; +} + +.result-status.incorrect { + color: #f44336; +} + +.correct-answer { + font-weight: 600; + color: #4caf50; + background: rgba(76, 175, 80, 0.1); + padding: 5px 12px; + border-radius: 15px; +} + +.explanation { + color: #2d5a27; + line-height: 1.7; + font-size: 1rem; +} + +.explanation pre { + background: #f8f9fa; + border: 1px solid #e8f5e8; + border-radius: 8px; + padding: 15px; + margin: 15px 0; + overflow-x: auto; + font-family: 'Consolas', 'Monaco', 'Courier New', monospace; +} + +/* 错误容器 */ +.error-container { + text-align: center; + padding: 60px 20px; + background: rgba(255, 255, 255, 0.9); + border-radius: 20px; + border: 2px solid rgba(244, 67, 54, 0.2); + max-width: 500px; + margin: 0 auto; +} + +.error-icon { + font-size: 3rem; + margin-bottom: 20px; +} + +.error-container h3 { + color: #f44336; + margin-bottom: 15px; + font-size: 1.5rem; +} + +.error-container p { + color: #666; + margin-bottom: 25px; + font-size: 1.1rem; +} + +/* 底部 */ +.footer { + text-align: center; + padding: 30px 0; + margin-top: 40px; + color: #4a7c59; + opacity: 0.7; + border-top: 1px solid rgba(76, 175, 80, 0.2); +} + +/* 平板端适配 (768px - 1024px) */ +@media (max-width: 1024px) and (min-width: 768px) { + .container { + padding: 15px; + } + + .header h1 { + font-size: 2.2rem; + } + + .question-container { + padding: 30px; + } + + .action-buttons { + flex-wrap: wrap; + } +} + +/* 手机端适配 (最大768px) */ +@media (max-width: 768px) { + .container { + padding: 10px; + } + + .header { + margin-bottom: 25px; + padding: 20px 0; + } + + .header h1 { + font-size: 1.8rem; + } + + .subtitle { + font-size: 1rem; + } + + .question-container { + padding: 20px; + border-radius: 15px; + } + + .question-header { + flex-direction: column; + gap: 15px; + text-align: center; + } + + .question-text h2 { + font-size: 1.3rem; + } + + .code-block pre { + padding: 15px; + font-size: 0.85rem; + } + + .option { + padding: 12px 15px; + font-size: 0.95rem; + } + + .action-buttons { + flex-direction: column; + align-items: center; + } + + .submit-btn, .show-answer-btn, .retry-btn { + width: 100%; + max-width: 200px; + } + + .result-header { + flex-direction: column; + gap: 10px; + text-align: center; + } + + .explanation { + font-size: 0.95rem; + } + + .explanation pre { + padding: 10px; + font-size: 0.8rem; + } +} + +/* 小屏手机适配 (最大480px) */ +@media (max-width: 480px) { + .container { + padding: 8px; + } + + .header h1 { + font-size: 1.6rem; + } + + .question-container { + padding: 15px; + } + + .question-id { + font-size: 1rem; + padding: 6px 12px; + } + + .refresh-btn { + width: 40px; + height: 40px; + } + + .code-block pre { + font-size: 0.8rem; + padding: 12px; + } + + .option { + padding: 10px 12px; + font-size: 0.9rem; + } + + .submit-btn, .show-answer-btn, .retry-btn { + padding: 10px 20px; + font-size: 0.95rem; + } +} \ No newline at end of file diff --git a/frontend/60sapi/娱乐消遣/随机JavaScript趣味题/index.html b/frontend/60sapi/娱乐消遣/随机JavaScript趣味题/index.html new file mode 100644 index 00000000..310880a4 --- /dev/null +++ b/frontend/60sapi/娱乐消遣/随机JavaScript趣味题/index.html @@ -0,0 +1,89 @@ + + + + + + 随机JavaScript趣味题 + + + + + + + +
+
+

JavaScript趣味题

+

测试你的JavaScript知识

+
+ +
+
+
+

正在加载题目...

+
+ + + + +
+ + +
+ + + + \ No newline at end of file diff --git a/frontend/60sapi/娱乐消遣/随机JavaScript趣味题/js/script.js b/frontend/60sapi/娱乐消遣/随机JavaScript趣味题/js/script.js new file mode 100644 index 00000000..dd4812c0 --- /dev/null +++ b/frontend/60sapi/娱乐消遣/随机JavaScript趣味题/js/script.js @@ -0,0 +1,565 @@ +// JavaScript趣味题应用 +class JSQuizApp { + constructor() { + this.apiEndpoints = [ + 'https://60s-cf.viki.moe', + 'https://60s.viki.moe', + 'https://60s.b23.run', + 'https://60s.114128.xyz', + 'https://60s-cf.114128.xyz' + ]; + this.currentApiIndex = 0; + this.currentQuestion = null; + this.selectedOption = null; + this.isAnswered = false; + + this.initElements(); + this.bindEvents(); + this.loadQuestion(); + } + + // 初始化DOM元素 + initElements() { + this.elements = { + loading: document.getElementById('loading'), + questionContainer: document.getElementById('questionContainer'), + errorContainer: document.getElementById('errorContainer'), + questionId: document.getElementById('questionId'), + questionText: document.getElementById('questionText'), + codeContent: document.getElementById('codeContent'), + optionsContainer: document.getElementById('optionsContainer'), + submitBtn: document.getElementById('submitBtn'), + showAnswerBtn: document.getElementById('showAnswerBtn'), + refreshBtn: document.getElementById('refreshBtn'), + retryBtn: document.getElementById('retryBtn'), + exportBtn: document.getElementById('exportBtn'), + resultContainer: document.getElementById('resultContainer'), + resultStatus: document.getElementById('resultStatus'), + correctAnswer: document.getElementById('correctAnswer'), + explanation: document.getElementById('explanation'), + errorMessage: document.getElementById('errorMessage') + }; + } + + // 绑定事件 + bindEvents() { + this.elements.submitBtn.addEventListener('click', () => this.submitAnswer()); + this.elements.showAnswerBtn.addEventListener('click', () => this.showAnswer()); + this.elements.refreshBtn.addEventListener('click', () => this.loadQuestion()); + this.elements.retryBtn.addEventListener('click', () => this.loadQuestion()); + this.elements.exportBtn.addEventListener('click', () => this.exportToMarkdown()); + } + + // 显示加载状态 + showLoading() { + this.elements.loading.style.display = 'block'; + this.elements.questionContainer.style.display = 'none'; + this.elements.errorContainer.style.display = 'none'; + } + + // 显示题目 + showQuestion() { + this.elements.loading.style.display = 'none'; + this.elements.questionContainer.style.display = 'block'; + this.elements.errorContainer.style.display = 'none'; + } + + // 显示错误 + showError(message) { + this.elements.loading.style.display = 'none'; + this.elements.questionContainer.style.display = 'none'; + this.elements.errorContainer.style.display = 'block'; + this.elements.errorMessage.textContent = message; + } + + // 获取当前API地址 + getCurrentApiUrl() { + return `${this.apiEndpoints[this.currentApiIndex]}/v2/awesome-js`; + } + + // 切换到下一个API + switchToNextApi() { + this.currentApiIndex = (this.currentApiIndex + 1) % this.apiEndpoints.length; + } + + // 加载题目 + async loadQuestion() { + this.showLoading(); + this.resetQuestion(); + + let attempts = 0; + const maxAttempts = this.apiEndpoints.length; + + while (attempts < maxAttempts) { + try { + const response = await fetch(this.getCurrentApiUrl(), { + method: 'GET', + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/json' + }, + timeout: 10000 + }); + + if (!response.ok) { + throw new Error(`HTTP ${response.status}: ${response.statusText}`); + } + + const data = await response.json(); + + if (data.code === 200 && data.data) { + this.currentQuestion = data.data; + this.displayQuestion(); + return; + } else { + throw new Error(data.message || '数据格式错误'); + } + + } catch (error) { + console.warn(`API ${this.getCurrentApiUrl()} 请求失败:`, error.message); + attempts++; + + if (attempts < maxAttempts) { + this.switchToNextApi(); + console.log(`切换到备用API: ${this.getCurrentApiUrl()}`); + } else { + this.showError(`所有API接口都无法访问,请检查网络连接后重试。\n最后尝试的错误: ${error.message}`); + return; + } + } + } + } + + // 重置题目状态 + resetQuestion() { + this.selectedOption = null; + this.isAnswered = false; + this.elements.resultContainer.style.display = 'none'; + this.elements.submitBtn.disabled = true; + this.elements.submitBtn.textContent = '提交答案'; + this.elements.showAnswerBtn.style.display = 'inline-block'; + + // 清空选项容器,防止重复显示 + this.elements.optionsContainer.innerHTML = ''; + + // 移除所有选项的事件监听器 + const existingOptions = document.querySelectorAll('.option'); + existingOptions.forEach(option => { + option.removeEventListener('click', this.selectOption); + }); + } + + // 显示题目内容 + displayQuestion() { + const question = this.currentQuestion; + + console.log('显示题目:', question); + + // 设置题目ID + this.elements.questionId.textContent = `题目 #${question.id}`; + + // 设置题目文本 + this.elements.questionText.innerHTML = `

${this.escapeHtml(question.question)}

`; + + // 设置代码内容并应用语法高亮 + this.elements.codeContent.textContent = question.code; + + // 应用语法高亮 + if (typeof hljs !== 'undefined') { + hljs.highlightElement(this.elements.codeContent); + } + + // 确保选项容器已清空 + this.elements.optionsContainer.innerHTML = ''; + + // 生成选项 + this.generateOptions(question.options); + + this.showQuestion(); + } + + // 生成选项 + generateOptions(options) { + // 确保清空容器 + this.elements.optionsContainer.innerHTML = ''; + + // 验证选项数据 + if (!Array.isArray(options) || options.length === 0) { + console.error('选项数据无效:', options); + return; + } + + // 移除可能存在的重复选项 + const uniqueOptions = [...new Set(options)]; + + uniqueOptions.forEach((option, index) => { + const optionElement = document.createElement('div'); + optionElement.className = 'option'; + optionElement.textContent = option; + optionElement.dataset.index = index; + optionElement.dataset.value = option.charAt(0); // A, B, C, D + + optionElement.addEventListener('click', () => this.selectOption(optionElement)); + + this.elements.optionsContainer.appendChild(optionElement); + }); + + console.log('生成选项:', uniqueOptions); + } + + // 选择选项 + selectOption(optionElement) { + if (this.isAnswered) return; + + // 移除之前的选中状态 + document.querySelectorAll('.option.selected').forEach(el => { + el.classList.remove('selected'); + }); + + // 设置当前选中 + optionElement.classList.add('selected'); + this.selectedOption = optionElement.dataset.value; + + // 启用提交按钮 + this.elements.submitBtn.disabled = false; + } + + // 提交答案 + submitAnswer() { + if (!this.selectedOption || this.isAnswered) return; + + this.isAnswered = true; + this.elements.submitBtn.disabled = true; + this.elements.submitBtn.textContent = '已提交'; + this.elements.showAnswerBtn.style.display = 'none'; + + const isCorrect = this.selectedOption === this.currentQuestion.answer; + + // 显示结果 + this.showResult(isCorrect); + + // 标记选项 + this.markOptions(); + } + + // 显示答案 + showAnswer() { + this.isAnswered = true; + this.elements.submitBtn.disabled = true; + this.elements.submitBtn.textContent = '已显示答案'; + this.elements.showAnswerBtn.style.display = 'none'; + + // 显示结果(不判断对错) + this.showResult(null); + + // 标记正确答案 + this.markCorrectAnswer(); + } + + // 显示结果 + showResult(isCorrect) { + const resultContainer = this.elements.resultContainer; + const resultStatus = this.elements.resultStatus; + const correctAnswer = this.elements.correctAnswer; + const explanation = this.elements.explanation; + + // 设置结果状态 + if (isCorrect === true) { + resultStatus.textContent = '✅ 回答正确!'; + resultStatus.className = 'result-status correct'; + } else if (isCorrect === false) { + resultStatus.textContent = '❌ 回答错误'; + resultStatus.className = 'result-status incorrect'; + } else { + resultStatus.textContent = '💡 答案解析'; + resultStatus.className = 'result-status'; + } + + // 设置正确答案 + correctAnswer.textContent = `正确答案: ${this.currentQuestion.answer}`; + + // 设置解析内容 + explanation.innerHTML = this.formatExplanation(this.currentQuestion.explanation); + + // 显示结果容器 + resultContainer.style.display = 'block'; + + // 滚动到结果区域 + setTimeout(() => { + resultContainer.scrollIntoView({ behavior: 'smooth', block: 'nearest' }); + }, 100); + } + + // 标记选项 + markOptions() { + const options = document.querySelectorAll('.option'); + const correctAnswer = this.currentQuestion.answer; + + options.forEach(option => { + const optionValue = option.dataset.value; + + if (optionValue === correctAnswer) { + option.classList.add('correct'); + } else if (option.classList.contains('selected')) { + option.classList.add('incorrect'); + } + + // 禁用点击 + option.style.pointerEvents = 'none'; + }); + } + + // 标记正确答案 + markCorrectAnswer() { + const options = document.querySelectorAll('.option'); + const correctAnswer = this.currentQuestion.answer; + + options.forEach(option => { + const optionValue = option.dataset.value; + + if (optionValue === correctAnswer) { + option.classList.add('correct'); + } + + // 禁用点击 + option.style.pointerEvents = 'none'; + }); + } + + // 格式化解析内容 + formatExplanation(explanation) { + // 转义HTML + let formatted = this.escapeHtml(explanation); + + // 处理代码块 + formatted = formatted.replace(/```js\n([\s\S]*?)\n```/g, '
$1
'); + formatted = formatted.replace(/```javascript\n([\s\S]*?)\n```/g, '
$1
'); + formatted = formatted.replace(/```([\s\S]*?)```/g, '
$1
'); + + // 处理行内代码 + formatted = formatted.replace(/`([^`]+)`/g, '$1'); + + // 处理换行 + formatted = formatted.replace(/\n\n/g, '

'); + formatted = formatted.replace(/\n/g, '
'); + + // 包装段落 + if (!formatted.includes('

')) { + formatted = '

' + formatted + '

'; + } + + return formatted; + } + + // HTML转义 + escapeHtml(text) { + const div = document.createElement('div'); + div.textContent = text; + return div.innerHTML; + } + + // 导出为Markdown + exportToMarkdown() { + if (!this.currentQuestion) { + alert('请先加载题目后再导出!'); + return; + } + + const question = this.currentQuestion; + const timestamp = new Date().toLocaleString('zh-CN'); + + // 构建Markdown内容 + let markdown = `# JavaScript趣味题 #${question.id}\n\n`; + markdown += `> 导出时间: ${timestamp}\n\n`; + + // 题目部分 + markdown += `## 题目\n\n`; + markdown += `${question.question}\n\n`; + + // 代码部分 + markdown += `## 代码\n\n`; + markdown += `\`\`\`javascript\n${question.code}\n\`\`\`\n\n`; + + // 选项部分 + markdown += `## 选项\n\n`; + question.options.forEach((option, index) => { + const letter = String.fromCharCode(65 + index); // A, B, C, D + const isCorrect = letter === question.answer; + markdown += `${letter}. ${option}${isCorrect ? ' ✅' : ''}\n`; + }); + markdown += `\n`; + + // 答案部分 + markdown += `## 正确答案\n\n`; + markdown += `**${question.answer}**\n\n`; + + // 解析部分 + markdown += `## 答案解析\n\n`; + // 清理解析内容中的HTML标签,转换为Markdown格式 + let explanation = question.explanation; + explanation = explanation.replace(//gi, '\n'); + explanation = explanation.replace(/

/gi, '\n'); + explanation = explanation.replace(/<\/p>/gi, '\n'); + explanation = explanation.replace(/]*>/gi, '`'); + explanation = explanation.replace(/<\/code>/gi, '`'); + explanation = explanation.replace(/

/gi, '\n```javascript\n');
+        explanation = explanation.replace(/<\/code><\/pre>/gi, '\n```\n');
+        explanation = explanation.replace(/<[^>]*>/g, ''); // 移除其他HTML标签
+        explanation = explanation.replace(/\n\s*\n/g, '\n\n'); // 清理多余空行
+        markdown += explanation.trim() + '\n\n';
+        
+        // 添加页脚
+        markdown += `---\n\n`;
+        markdown += `*本题目来源于JavaScript趣味题集合*\n`;
+        markdown += `*导出工具: JavaScript趣味题网页版*\n`;
+        
+        // 创建下载
+        this.downloadMarkdown(markdown, `JavaScript趣味题_${question.id}_${new Date().getTime()}.md`);
+    }
+    
+    // 下载Markdown文件
+    downloadMarkdown(content, filename) {
+        const blob = new Blob([content], { type: 'text/markdown;charset=utf-8' });
+        const url = URL.createObjectURL(blob);
+        
+        const link = document.createElement('a');
+        link.href = url;
+        link.download = filename;
+        link.style.display = 'none';
+        
+        document.body.appendChild(link);
+        link.click();
+        document.body.removeChild(link);
+        
+        // 清理URL对象
+        setTimeout(() => {
+            URL.revokeObjectURL(url);
+        }, 100);
+        
+        // 显示成功提示
+        this.showExportSuccess(filename);
+    }
+    
+    // 显示导出成功提示
+    showExportSuccess(filename) {
+        // 创建临时提示元素
+        const toast = document.createElement('div');
+        toast.style.cssText = `
+            position: fixed;
+            top: 20px;
+            right: 20px;
+            background: linear-gradient(135deg, #4caf50, #45a049);
+            color: white;
+            padding: 15px 20px;
+            border-radius: 8px;
+            box-shadow: 0 4px 12px rgba(76, 175, 80, 0.3);
+            z-index: 10000;
+            font-size: 14px;
+            max-width: 300px;
+            word-wrap: break-word;
+            animation: slideInRight 0.3s ease-out;
+        `;
+        
+        toast.innerHTML = `
+            
+ + + +
+
导出成功!
+
${filename}
+
+
+ `; + + // 添加动画样式 + const style = document.createElement('style'); + style.textContent = ` + @keyframes slideInRight { + from { + transform: translateX(100%); + opacity: 0; + } + to { + transform: translateX(0); + opacity: 1; + } + } + @keyframes slideOutRight { + from { + transform: translateX(0); + opacity: 1; + } + to { + transform: translateX(100%); + opacity: 0; + } + } + `; + document.head.appendChild(style); + + document.body.appendChild(toast); + + // 3秒后自动消失 + setTimeout(() => { + toast.style.animation = 'slideOutRight 0.3s ease-in'; + setTimeout(() => { + if (toast.parentNode) { + document.body.removeChild(toast); + } + if (style.parentNode) { + document.head.removeChild(style); + } + }, 300); + }, 3000); + } +} + +// 页面加载完成后初始化应用 +document.addEventListener('DOMContentLoaded', () => { + new JSQuizApp(); +}); + +// 添加键盘快捷键支持 +document.addEventListener('keydown', (e) => { + // 按R键刷新题目 + if (e.key.toLowerCase() === 'r' && !e.ctrlKey && !e.metaKey) { + const refreshBtn = document.getElementById('refreshBtn'); + if (refreshBtn && !document.querySelector('.loading').style.display !== 'none') { + refreshBtn.click(); + } + } + + // 按数字键1-4选择选项 + if (['1', '2', '3', '4'].includes(e.key)) { + const options = document.querySelectorAll('.option'); + const index = parseInt(e.key) - 1; + if (options[index] && !options[index].style.pointerEvents) { + options[index].click(); + } + } + + // 按Enter键提交答案 + if (e.key === 'Enter') { + const submitBtn = document.getElementById('submitBtn'); + if (submitBtn && !submitBtn.disabled) { + submitBtn.click(); + } + } +}); + +// 添加触摸设备支持 +if ('ontouchstart' in window) { + document.addEventListener('touchstart', () => {}, { passive: true }); +} + +// 添加网络状态监听 +if ('navigator' in window && 'onLine' in navigator) { + window.addEventListener('online', () => { + console.log('网络连接已恢复'); + }); + + window.addEventListener('offline', () => { + console.log('网络连接已断开'); + }); +} \ No newline at end of file diff --git a/frontend/60sapi/娱乐消遣/随机JavaScript趣味题/接口集合.json b/frontend/60sapi/娱乐消遣/随机JavaScript趣味题/接口集合.json new file mode 100644 index 00000000..04e92b7f --- /dev/null +++ b/frontend/60sapi/娱乐消遣/随机JavaScript趣味题/接口集合.json @@ -0,0 +1,7 @@ +[ + "https://60s-cf.viki.moe", + "https://60s.viki.moe", + "https://60s.b23.run", + "https://60s.114128.xyz", + "https://60s-cf.114128.xyz" +] diff --git a/frontend/60sapi/娱乐消遣/随机JavaScript趣味题/返回接口.json b/frontend/60sapi/娱乐消遣/随机JavaScript趣味题/返回接口.json new file mode 100644 index 00000000..d6592cc8 --- /dev/null +++ b/frontend/60sapi/娱乐消遣/随机JavaScript趣味题/返回接口.json @@ -0,0 +1,17 @@ +{ + "code": 200, + "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", + "data": { + "id": 11, + "question": "输出是什么?", + "code": "function Person(firstName, lastName) {\n this.firstName = firstName;\n this.lastName = lastName;\n}\n\nconst member = new Person(\"Lydia\", \"Hallie\");\nPerson.getFullName = function () {\n return `${this.firstName} ${this.lastName}`;\n}\n\nconsole.log(member.getFullName());", + "options": [ + "A: `TypeError`", + "B: `SyntaxError`", + "C: `Lydia Hallie`", + "D: `undefined` `undefined`" + ], + "answer": "A", + "explanation": "你不能像常规对象那样,给构造函数添加属性。如果你想一次性给所有实例添加特性,你应该使用原型。因此本例中,使用如下方式:\n\n```js\nPerson.prototype.getFullName = function () {\n return `${this.firstName} ${this.lastName}`;\n}\n```\n\n这才会使 `member.getFullName()` 起作用。为什么这么做有益的?假设我们将这个方法添加到构造函数本身里。也许不是每个 `Person` 实例都需要这个方法。这将浪费大量内存空间,因为它们仍然具有该属性,这将占用每个实例的内存空间。相反,如果我们只将它添加到原型中,那么它只存在于内存中的一个位置,但是所有实例都可以访问它!" + } +} \ No newline at end of file diff --git a/frontend/60sapi/娱乐消遣/随机KFC文案/css/background.css b/frontend/60sapi/娱乐消遣/随机KFC文案/css/background.css new file mode 100644 index 00000000..84d3b43d --- /dev/null +++ b/frontend/60sapi/娱乐消遣/随机KFC文案/css/background.css @@ -0,0 +1,81 @@ +/* 背景样式文件 */ +body { + background: linear-gradient(135deg, #a8e6cf 0%, #dcedc1 25%, #ffd3a5 50%, #a8e6cf 75%, #88d8a3 100%); + background-size: 400% 400%; + animation: gradientShift 15s ease infinite; + position: relative; +} + +/* 背景动画 */ +@keyframes gradientShift { + 0% { + background-position: 0% 50%; + } + 50% { + background-position: 100% 50%; + } + 100% { + background-position: 0% 50%; + } +} + +/* 背景装饰元素 */ +body::before { + content: ''; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-image: + radial-gradient(circle at 20% 80%, rgba(39, 174, 96, 0.1) 0%, transparent 50%), + radial-gradient(circle at 80% 20%, rgba(46, 204, 113, 0.1) 0%, transparent 50%), + radial-gradient(circle at 40% 40%, rgba(26, 188, 156, 0.05) 0%, transparent 50%); + pointer-events: none; + z-index: -1; +} + +/* 浮动装饰圆点 */ +body::after { + content: ''; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-image: + radial-gradient(2px 2px at 20px 30px, rgba(39, 174, 96, 0.3), transparent), + radial-gradient(2px 2px at 40px 70px, rgba(46, 204, 113, 0.2), transparent), + radial-gradient(1px 1px at 90px 40px, rgba(26, 188, 156, 0.3), transparent), + radial-gradient(1px 1px at 130px 80px, rgba(39, 174, 96, 0.2), transparent), + radial-gradient(2px 2px at 160px 30px, rgba(46, 204, 113, 0.3), transparent); + background-repeat: repeat; + background-size: 200px 100px; + animation: floatDots 20s linear infinite; + pointer-events: none; + z-index: -1; +} + +@keyframes floatDots { + 0% { + transform: translateY(0px); + } + 100% { + transform: translateY(-100px); + } +} + +/* 响应式背景调整 */ +@media (max-width: 768px) { + body::after { + background-size: 150px 75px; + animation-duration: 25s; + } +} + +@media (max-width: 480px) { + body::after { + background-size: 100px 50px; + animation-duration: 30s; + } +} \ No newline at end of file diff --git a/frontend/60sapi/娱乐消遣/随机KFC文案/css/style.css b/frontend/60sapi/娱乐消遣/随机KFC文案/css/style.css new file mode 100644 index 00000000..b1bef2cc --- /dev/null +++ b/frontend/60sapi/娱乐消遣/随机KFC文案/css/style.css @@ -0,0 +1,339 @@ +/* 基础样式重置 */ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: 'Microsoft YaHei', 'PingFang SC', 'Helvetica Neue', Arial, sans-serif; + line-height: 1.6; + color: #2c3e50; + min-height: 100vh; + overflow-x: hidden; +} + +/* 容器布局 */ +.container { + min-height: 100vh; + display: flex; + flex-direction: column; + max-width: 1200px; + margin: 0 auto; + padding: 20px; +} + +/* 头部样式 */ +.header { + text-align: center; + margin-bottom: 40px; + padding: 30px 0; +} + +.title { + font-size: 2.5rem; + font-weight: 700; + color: #27ae60; + margin-bottom: 10px; + text-shadow: 0 2px 4px rgba(39, 174, 96, 0.2); +} + +.subtitle { + font-size: 1.1rem; + color: #7f8c8d; + font-weight: 400; +} + +/* 主要内容区域 */ +.main { + flex: 1; + display: flex; + justify-content: center; + align-items: center; +} + +.content-card { + background: rgba(255, 255, 255, 0.95); + border-radius: 20px; + padding: 40px; + box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1); + backdrop-filter: blur(10px); + border: 1px solid rgba(39, 174, 96, 0.1); + width: 100%; + max-width: 600px; + transition: transform 0.3s ease, box-shadow 0.3s ease; +} + +.content-card:hover { + transform: translateY(-5px); + box-shadow: 0 15px 40px rgba(0, 0, 0, 0.15); +} + +/* KFC文案内容 */ +.kfc-content { + min-height: 200px; + padding: 30px; + background: linear-gradient(135deg, #f8f9fa 0%, #e9ecef 100%); + border-radius: 15px; + border-left: 5px solid #27ae60; + margin-bottom: 30px; + position: relative; + overflow: hidden; +} + +.kfc-content::before { + content: '"'; + position: absolute; + top: 10px; + left: 15px; + font-size: 3rem; + color: #27ae60; + opacity: 0.3; + font-family: serif; +} + +.kfc-content p { + font-size: 1.1rem; + line-height: 1.8; + color: #2c3e50; + margin-left: 20px; + position: relative; + z-index: 1; +} + +.loading-text { + text-align: center; + color: #7f8c8d; + font-style: italic; +} + +/* 按钮组 */ +.button-group { + display: flex; + gap: 15px; + justify-content: center; + margin-bottom: 20px; +} + +.generate-btn, .copy-btn { + padding: 15px 30px; + border: none; + border-radius: 50px; + font-size: 1rem; + font-weight: 600; + cursor: pointer; + transition: all 0.3s ease; + position: relative; + overflow: hidden; +} + +.generate-btn { + background: linear-gradient(135deg, #27ae60 0%, #2ecc71 100%); + color: white; + box-shadow: 0 4px 15px rgba(39, 174, 96, 0.3); +} + +.generate-btn:hover { + transform: translateY(-2px); + box-shadow: 0 6px 20px rgba(39, 174, 96, 0.4); +} + +.generate-btn:active { + transform: translateY(0); +} + +.generate-btn:disabled { + opacity: 0.7; + cursor: not-allowed; + transform: none; +} + +.copy-btn { + background: linear-gradient(135deg, #3498db 0%, #5dade2 100%); + color: white; + box-shadow: 0 4px 15px rgba(52, 152, 219, 0.3); +} + +.copy-btn:hover { + transform: translateY(-2px); + box-shadow: 0 6px 20px rgba(52, 152, 219, 0.4); +} + +/* 编号信息 */ +.index-info { + text-align: center; + padding: 10px; + background: rgba(39, 174, 96, 0.1); + border-radius: 10px; + border: 1px solid rgba(39, 174, 96, 0.2); +} + +.index-text { + color: #27ae60; + font-weight: 600; + font-size: 0.9rem; +} + +#indexNumber { + color: #2c3e50; + font-weight: 700; +} + +/* 底部 */ +.footer { + text-align: center; + padding: 20px 0; + color: #7f8c8d; + font-size: 0.9rem; + margin-top: 40px; +} + +/* 提示框 */ +.toast { + position: fixed; + top: 20px; + right: 20px; + background: #27ae60; + color: white; + padding: 15px 25px; + border-radius: 10px; + box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2); + transform: translateX(400px); + transition: transform 0.3s ease; + z-index: 1000; + font-weight: 600; +} + +.toast.show { + transform: translateX(0); +} + +/* 平板端适配 (768px - 1024px) */ +@media (max-width: 1024px) and (min-width: 768px) { + .container { + padding: 15px; + } + + .title { + font-size: 2.2rem; + } + + .content-card { + padding: 35px; + max-width: 550px; + } + + .kfc-content { + padding: 25px; + min-height: 180px; + } + + .button-group { + flex-direction: row; + gap: 12px; + } + + .generate-btn, .copy-btn { + padding: 12px 25px; + font-size: 0.95rem; + } +} + +/* 手机端适配 (最大768px) */ +@media (max-width: 768px) { + .container { + padding: 10px; + } + + .header { + margin-bottom: 30px; + padding: 20px 0; + } + + .title { + font-size: 1.8rem; + margin-bottom: 8px; + } + + .subtitle { + font-size: 1rem; + } + + .content-card { + padding: 25px; + margin: 0 5px; + border-radius: 15px; + } + + .kfc-content { + padding: 20px; + min-height: 150px; + margin-bottom: 25px; + } + + .kfc-content::before { + font-size: 2.5rem; + top: 5px; + left: 10px; + } + + .kfc-content p { + font-size: 1rem; + line-height: 1.7; + margin-left: 15px; + } + + .button-group { + flex-direction: column; + gap: 10px; + } + + .generate-btn, .copy-btn { + padding: 12px 20px; + font-size: 0.9rem; + width: 100%; + } + + .footer { + font-size: 0.8rem; + margin-top: 30px; + } + + .toast { + right: 10px; + left: 10px; + transform: translateY(-100px); + font-size: 0.9rem; + } + + .toast.show { + transform: translateY(0); + } +} + +/* 小屏手机适配 (最大480px) */ +@media (max-width: 480px) { + .title { + font-size: 1.6rem; + } + + .content-card { + padding: 20px; + margin: 0; + } + + .kfc-content { + padding: 15px; + min-height: 120px; + } + + .kfc-content p { + font-size: 0.95rem; + margin-left: 10px; + } + + .generate-btn, .copy-btn { + padding: 10px 15px; + font-size: 0.85rem; + } +} \ No newline at end of file diff --git a/frontend/60sapi/娱乐消遣/随机KFC文案/index.html b/frontend/60sapi/娱乐消遣/随机KFC文案/index.html new file mode 100644 index 00000000..72ab0627 --- /dev/null +++ b/frontend/60sapi/娱乐消遣/随机KFC文案/index.html @@ -0,0 +1,46 @@ + + + + + + 随机KFC文案生成器 + + + + +
+
+

🍗 随机KFC文案生成器

+

疯狂星期四,文案来一套!

+
+ +
+
+
+

点击按钮获取随机KFC文案...

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

© 2024 KFC文案生成器 | 让每个星期四都疯狂起来

+
+
+ +
+ + + + \ No newline at end of file diff --git a/frontend/60sapi/娱乐消遣/随机KFC文案/js/main.js b/frontend/60sapi/娱乐消遣/随机KFC文案/js/main.js new file mode 100644 index 00000000..526c4750 --- /dev/null +++ b/frontend/60sapi/娱乐消遣/随机KFC文案/js/main.js @@ -0,0 +1,240 @@ +// KFC文案生成器主要功能 +class KFCGenerator { + constructor() { + this.apiEndpoints = []; + this.currentApiIndex = 0; + this.isLoading = false; + + this.init(); + } + + // 初始化 + async init() { + await this.loadApiEndpoints(); + this.bindEvents(); + } + + // 加载API接口列表 + async loadApiEndpoints() { + try { + const response = await fetch('./接口集合.json'); + this.apiEndpoints = await response.json(); + } catch (error) { + console.error('加载API接口列表失败:', error); + this.showToast('加载接口配置失败', 'error'); + } + } + + // 绑定事件 + bindEvents() { + const generateBtn = document.getElementById('generateBtn'); + const copyBtn = document.getElementById('copyBtn'); + + generateBtn.addEventListener('click', () => this.generateKFC()); + copyBtn.addEventListener('click', () => this.copyContent()); + } + + // 生成KFC文案 + async generateKFC() { + if (this.isLoading) return; + + this.setLoadingState(true); + + let success = false; + let attempts = 0; + const maxAttempts = this.apiEndpoints.length; + + while (!success && attempts < maxAttempts) { + try { + const apiUrl = this.apiEndpoints[this.currentApiIndex]; + const data = await this.fetchKFCData(apiUrl); + + if (data && data.code === 200 && data.data && data.data.kfc) { + this.displayKFC(data.data); + success = true; + } else { + throw new Error('API返回数据格式错误'); + } + } catch (error) { + console.error(`API ${this.currentApiIndex + 1} 请求失败:`, error); + this.currentApiIndex = (this.currentApiIndex + 1) % this.apiEndpoints.length; + attempts++; + } + } + + if (!success) { + this.showError('所有API接口都无法访问,请稍后重试'); + } + + this.setLoadingState(false); + } + + // 请求KFC数据 + async fetchKFCData(apiUrl) { + const controller = new AbortController(); + const timeoutId = setTimeout(() => controller.abort(), 10000); // 10秒超时 + + try { + const response = await fetch(`${apiUrl}/v2/kfc`, { + method: 'GET', + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/json' + }, + signal: controller.signal + }); + + clearTimeout(timeoutId); + + if (!response.ok) { + throw new Error(`HTTP ${response.status}: ${response.statusText}`); + } + + return await response.json(); + } catch (error) { + clearTimeout(timeoutId); + throw error; + } + } + + // 显示KFC文案 + displayKFC(data) { + const contentElement = document.getElementById('kfcContent'); + const indexElement = document.getElementById('indexNumber'); + const indexInfo = document.getElementById('indexInfo'); + const copyBtn = document.getElementById('copyBtn'); + + // 显示文案内容 + contentElement.innerHTML = `

${this.escapeHtml(data.kfc)}

`; + + // 显示编号信息 + if (data.index) { + indexElement.textContent = data.index; + indexInfo.style.display = 'block'; + } else { + indexInfo.style.display = 'none'; + } + + // 显示复制按钮 + copyBtn.style.display = 'inline-block'; + + // 添加显示动画 + contentElement.style.opacity = '0'; + contentElement.style.transform = 'translateY(20px)'; + + setTimeout(() => { + contentElement.style.transition = 'all 0.5s ease'; + contentElement.style.opacity = '1'; + contentElement.style.transform = 'translateY(0)'; + }, 100); + } + + // 显示错误信息 + showError(message) { + const contentElement = document.getElementById('kfcContent'); + contentElement.innerHTML = `

${this.escapeHtml(message)}

`; + + const copyBtn = document.getElementById('copyBtn'); + const indexInfo = document.getElementById('indexInfo'); + copyBtn.style.display = 'none'; + indexInfo.style.display = 'none'; + } + + // 复制文案内容 + async copyContent() { + const contentElement = document.getElementById('kfcContent'); + const textContent = contentElement.querySelector('p')?.textContent; + + if (!textContent || textContent.includes('点击按钮获取') || textContent.includes('失败')) { + this.showToast('没有可复制的内容', 'error'); + return; + } + + try { + if (navigator.clipboard && window.isSecureContext) { + await navigator.clipboard.writeText(textContent); + } else { + // 降级方案 + const textArea = document.createElement('textarea'); + textArea.value = textContent; + textArea.style.position = 'fixed'; + textArea.style.left = '-999999px'; + textArea.style.top = '-999999px'; + document.body.appendChild(textArea); + textArea.focus(); + textArea.select(); + document.execCommand('copy'); + textArea.remove(); + } + + this.showToast('文案已复制到剪贴板', 'success'); + } catch (error) { + console.error('复制失败:', error); + this.showToast('复制失败,请手动选择复制', 'error'); + } + } + + // 设置加载状态 + setLoadingState(loading) { + this.isLoading = loading; + const generateBtn = document.getElementById('generateBtn'); + const btnText = generateBtn.querySelector('.btn-text'); + const btnLoading = generateBtn.querySelector('.btn-loading'); + + if (loading) { + generateBtn.disabled = true; + btnText.style.display = 'none'; + btnLoading.style.display = 'inline'; + } else { + generateBtn.disabled = false; + btnText.style.display = 'inline'; + btnLoading.style.display = 'none'; + } + } + + // 显示提示消息 + showToast(message, type = 'success') { + const toast = document.getElementById('toast'); + toast.textContent = message; + toast.className = `toast ${type}`; + toast.classList.add('show'); + + setTimeout(() => { + toast.classList.remove('show'); + }, 3000); + } + + // HTML转义 + escapeHtml(text) { + const div = document.createElement('div'); + div.textContent = text; + return div.innerHTML; + } +} + +// 页面加载完成后初始化 +document.addEventListener('DOMContentLoaded', () => { + const generator = new KFCGenerator(); + // 页面加载完成后自动生成一条文案 + setTimeout(() => { + generator.generateKFC(); + }, 1000); +}); + +// 添加键盘快捷键支持 +document.addEventListener('keydown', (event) => { + // 按空格键生成文案 + if (event.code === 'Space' && event.target.tagName !== 'INPUT' && event.target.tagName !== 'TEXTAREA') { + event.preventDefault(); + document.getElementById('generateBtn').click(); + } + + // Ctrl+C 复制文案 + if (event.ctrlKey && event.key === 'c' && event.target.tagName !== 'INPUT' && event.target.tagName !== 'TEXTAREA') { + const copyBtn = document.getElementById('copyBtn'); + if (copyBtn.style.display !== 'none') { + event.preventDefault(); + copyBtn.click(); + } + } +}); \ No newline at end of file diff --git a/frontend/60sapi/娱乐消遣/随机KFC文案/接口集合.json b/frontend/60sapi/娱乐消遣/随机KFC文案/接口集合.json new file mode 100644 index 00000000..04e92b7f --- /dev/null +++ b/frontend/60sapi/娱乐消遣/随机KFC文案/接口集合.json @@ -0,0 +1,7 @@ +[ + "https://60s-cf.viki.moe", + "https://60s.viki.moe", + "https://60s.b23.run", + "https://60s.114128.xyz", + "https://60s-cf.114128.xyz" +] diff --git a/frontend/60sapi/娱乐消遣/随机KFC文案/返回接口.json b/frontend/60sapi/娱乐消遣/随机KFC文案/返回接口.json new file mode 100644 index 00000000..0f729ba8 --- /dev/null +++ b/frontend/60sapi/娱乐消遣/随机KFC文案/返回接口.json @@ -0,0 +1 @@ +{"code":200,"message":"获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841","data":{"index":369,"kfc":"我不想你带着情绪过夜,这样会把你推的越来越远,我不想你离开我,我希望你可以多爱我一点,我不想因为一点点小问题就让我们两之间的感情产生隔阂。对我来说,双向奔赴的感情相处才有意义,看不到希望的事情我没办法坚持太久,我不想浪费时间在一些无意义无结果的事情上,时间应该用来做我该做的事情。很多人走不到最后,是因为理解不同步,但我跟你在一起,我知道你什样的人,我了解你甚至比了解自己还多,我和你在一起,不是因为其他,而是因为今天肯德基疯狂星期四,我希望你能请我吃!"}} \ No newline at end of file diff --git a/frontend/60sapi/娱乐消遣/随机一言/css/background.css b/frontend/60sapi/娱乐消遣/随机一言/css/background.css new file mode 100644 index 00000000..3a10cfda --- /dev/null +++ b/frontend/60sapi/娱乐消遣/随机一言/css/background.css @@ -0,0 +1,167 @@ +/* 背景样式文件 - 金色光辉主题 */ + +/* 主背景 */ +body { + background: linear-gradient( + 135deg, + #fff8dc 0%, + #ffeaa7 25%, + #fdcb6e 50%, + #e17055 75%, + #d63031 100% + ); + background-size: 400% 400%; + animation: gradientShift 15s ease infinite; + position: relative; +} + +/* 背景装饰层 */ +body::before { + content: ''; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: + radial-gradient(circle at 20% 80%, rgba(255, 215, 0, 0.1) 0%, transparent 50%), + radial-gradient(circle at 80% 20%, rgba(255, 223, 0, 0.1) 0%, transparent 50%), + radial-gradient(circle at 40% 40%, rgba(212, 175, 55, 0.05) 0%, transparent 50%); + pointer-events: none; + z-index: 1; +} + +/* 动态光点效果 */ +body::after { + content: ''; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-image: + radial-gradient(2px 2px at 20px 30px, rgba(255, 215, 0, 0.3), transparent), + radial-gradient(2px 2px at 40px 70px, rgba(255, 223, 0, 0.2), transparent), + radial-gradient(1px 1px at 90px 40px, rgba(212, 175, 55, 0.4), transparent), + radial-gradient(1px 1px at 130px 80px, rgba(255, 215, 0, 0.2), transparent), + radial-gradient(2px 2px at 160px 30px, rgba(255, 223, 0, 0.3), transparent); + background-repeat: repeat; + background-size: 200px 100px; + animation: sparkle 20s linear infinite; + pointer-events: none; + z-index: 2; +} + +/* 背景动画 */ +@keyframes gradientShift { + 0% { + background-position: 0% 50%; + } + 50% { + background-position: 100% 50%; + } + 100% { + background-position: 0% 50%; + } +} + +@keyframes sparkle { + 0% { + transform: translateY(0); + opacity: 1; + } + 100% { + transform: translateY(-100vh); + opacity: 0; + } +} + +/* 响应式背景调整 */ + +/* 平板端背景 */ +@media (min-width: 768px) and (max-width: 1024px) { + body::after { + background-size: 250px 120px; + } +} + +/* 电脑端背景 */ +@media (min-width: 1024px) { + body { + background-size: 300% 300%; + } + + body::after { + background-size: 300px 150px; + animation-duration: 25s; + } +} + +/* 手机端背景优化 */ +@media (max-width: 767px) { + body { + background-size: 200% 200%; + animation-duration: 10s; + } + + body::before { + background: + radial-gradient(circle at 30% 70%, rgba(255, 215, 0, 0.08) 0%, transparent 40%), + radial-gradient(circle at 70% 30%, rgba(255, 223, 0, 0.08) 0%, transparent 40%); + } + + body::after { + background-size: 150px 80px; + animation-duration: 15s; + } +} + +/* 超小屏幕背景 */ +@media (max-width: 479px) { + body { + background: linear-gradient( + 135deg, + #fff8dc 0%, + #ffeaa7 50%, + #fdcb6e 100% + ); + background-size: 150% 150%; + } + + body::after { + background-size: 120px 60px; + } +} + +/* 深色模式支持 */ +@media (prefers-color-scheme: dark) { + body { + background: linear-gradient( + 135deg, + #2c1810 0%, + #3d2914 25%, + #4a3319 50%, + #5c3e1f 75%, + #6b4423 100% + ); + } + + body::before { + background: + radial-gradient(circle at 20% 80%, rgba(255, 215, 0, 0.05) 0%, transparent 50%), + radial-gradient(circle at 80% 20%, rgba(255, 223, 0, 0.05) 0%, transparent 50%); + } +} + +/* 减少动画效果(用户偏好) */ +@media (prefers-reduced-motion: reduce) { + body, + body::before, + body::after { + animation: none; + } + + body { + background: linear-gradient(135deg, #fff8dc 0%, #ffeaa7 50%, #fdcb6e 100%); + } +} \ No newline at end of file diff --git a/frontend/60sapi/娱乐消遣/随机一言/css/style.css b/frontend/60sapi/娱乐消遣/随机一言/css/style.css new file mode 100644 index 00000000..b84b1125 --- /dev/null +++ b/frontend/60sapi/娱乐消遣/随机一言/css/style.css @@ -0,0 +1,357 @@ +/* 基础样式重置 */ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: 'Microsoft YaHei', 'PingFang SC', 'Helvetica Neue', Arial, sans-serif; + line-height: 1.6; + color: #2c1810; + overflow-x: hidden; +} + +/* 容器布局 */ +.container { + min-height: 100vh; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + padding: 20px; + position: relative; +} + +/* 头部样式 */ +.header { + text-align: center; + margin-bottom: 40px; + z-index: 10; +} + +.title { + font-size: 3rem; + font-weight: 700; + color: #d4af37; + text-shadow: + 0 0 10px rgba(212, 175, 55, 0.8), + 0 0 20px rgba(212, 175, 55, 0.6), + 0 0 30px rgba(212, 175, 55, 0.4); + margin-bottom: 10px; + animation: titleGlow 3s ease-in-out infinite alternate; +} + +.subtitle { + font-size: 1.2rem; + color: #b8860b; + opacity: 0.9; + text-shadow: 0 0 5px rgba(184, 134, 11, 0.5); +} + +/* 主内容区域 */ +.main-content { + width: 100%; + max-width: 800px; + z-index: 10; +} + +/* 一言容器 */ +.quote-container { + background: linear-gradient(135deg, rgba(255, 215, 0, 0.1), rgba(255, 223, 0, 0.05)); + border: 2px solid rgba(212, 175, 55, 0.3); + border-radius: 20px; + padding: 40px; + margin-bottom: 30px; + backdrop-filter: blur(10px); + box-shadow: + 0 8px 32px rgba(212, 175, 55, 0.2), + inset 0 1px 0 rgba(255, 255, 255, 0.1); + position: relative; + overflow: hidden; +} + +.quote-container::before { + content: ''; + position: absolute; + top: -2px; + left: -2px; + right: -2px; + bottom: -2px; + background: linear-gradient(45deg, #ffd700, #ffed4e, #ffd700, #ffed4e); + border-radius: 22px; + z-index: -1; + animation: borderGlow 4s linear infinite; +} + +/* 加载状态 */ +.loading { + display: none; + text-align: center; + color: #d4af37; +} + +.loading.show { + display: block; +} + +.loading-spinner { + width: 40px; + height: 40px; + border: 4px solid rgba(212, 175, 55, 0.3); + border-top: 4px solid #d4af37; + border-radius: 50%; + margin: 0 auto 15px; + animation: spin 1s linear infinite; +} + +/* 一言显示 */ +.quote-display { + display: block; + text-align: center; +} + +.quote-display.hide { + display: none; +} + +.quote-text { + font-size: 1.8rem; + line-height: 1.8; + color: #2c1810; + margin-bottom: 20px; + text-shadow: 0 1px 2px rgba(212, 175, 55, 0.1); + font-weight: 500; +} + +.quote-index { + font-size: 0.9rem; + color: #b8860b; + opacity: 0.8; +} + +/* 错误信息 */ +.error-message { + display: none; + text-align: center; + color: #cd853f; +} + +.error-message.show { + display: block; +} + +.error-icon { + font-size: 2rem; + margin-bottom: 10px; +} + +.error-text { + font-size: 1.1rem; + line-height: 1.5; +} + +/* 控制按钮 */ +.controls { + text-align: center; +} + +.refresh-btn { + background: linear-gradient(135deg, #ffd700, #ffed4e); + border: none; + border-radius: 50px; + padding: 15px 30px; + font-size: 1.1rem; + font-weight: 600; + color: #2c1810; + cursor: pointer; + display: inline-flex; + align-items: center; + gap: 10px; + transition: all 0.3s ease; + box-shadow: + 0 4px 15px rgba(212, 175, 55, 0.3), + inset 0 1px 0 rgba(255, 255, 255, 0.3); + position: relative; + overflow: hidden; +} + +.refresh-btn:hover { + transform: translateY(-2px); + box-shadow: + 0 6px 20px rgba(212, 175, 55, 0.4), + inset 0 1px 0 rgba(255, 255, 255, 0.3); +} + +.refresh-btn:active { + transform: translateY(0); +} + +.refresh-btn:disabled { + opacity: 0.6; + cursor: not-allowed; + transform: none; +} + +.btn-icon { + font-size: 1.2rem; + transition: transform 0.3s ease; +} + +.refresh-btn:hover .btn-icon { + transform: rotate(180deg); +} + +/* 底部 */ +.footer { + margin-top: 40px; + text-align: center; + color: #b8860b; + opacity: 0.8; + font-size: 0.9rem; +} + +/* 动画效果 */ +@keyframes titleGlow { + 0% { + text-shadow: + 0 0 10px rgba(212, 175, 55, 0.8), + 0 0 20px rgba(212, 175, 55, 0.6), + 0 0 30px rgba(212, 175, 55, 0.4); + } + 100% { + text-shadow: + 0 0 15px rgba(212, 175, 55, 1), + 0 0 25px rgba(212, 175, 55, 0.8), + 0 0 35px rgba(212, 175, 55, 0.6); + } +} + +@keyframes borderGlow { + 0% { + background-position: 0% 50%; + } + 50% { + background-position: 100% 50%; + } + 100% { + background-position: 0% 50%; + } +} + +@keyframes spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} + +/* 平板端适配 (768px - 1024px) */ +@media (min-width: 768px) and (max-width: 1024px) { + .container { + padding: 30px; + } + + .title { + font-size: 3.5rem; + } + + .subtitle { + font-size: 1.3rem; + } + + .quote-container { + padding: 50px; + } + + .quote-text { + font-size: 2rem; + } +} + +/* 电脑端适配 (1024px+) */ +@media (min-width: 1024px) { + .container { + padding: 40px; + } + + .title { + font-size: 4rem; + } + + .subtitle { + font-size: 1.4rem; + } + + .quote-container { + padding: 60px; + max-width: 900px; + } + + .quote-text { + font-size: 2.2rem; + line-height: 1.9; + } + + .refresh-btn { + padding: 18px 36px; + font-size: 1.2rem; + } +} + +/* 手机端适配 (小于768px) */ +@media (max-width: 767px) { + .container { + padding: 15px; + } + + .header { + margin-bottom: 30px; + } + + .title { + font-size: 2.5rem; + } + + .subtitle { + font-size: 1rem; + } + + .quote-container { + padding: 25px; + border-radius: 15px; + } + + .quote-text { + font-size: 1.4rem; + line-height: 1.6; + } + + .refresh-btn { + padding: 12px 24px; + font-size: 1rem; + } + + .footer { + margin-top: 30px; + font-size: 0.8rem; + } +} + +/* 超小屏幕适配 (小于480px) */ +@media (max-width: 479px) { + .title { + font-size: 2rem; + } + + .quote-container { + padding: 20px; + } + + .quote-text { + font-size: 1.2rem; + } + + .refresh-btn { + padding: 10px 20px; + font-size: 0.9rem; + } +} \ No newline at end of file diff --git a/frontend/60sapi/娱乐消遣/随机一言/index.html b/frontend/60sapi/娱乐消遣/随机一言/index.html new file mode 100644 index 00000000..4ef88f30 --- /dev/null +++ b/frontend/60sapi/娱乐消遣/随机一言/index.html @@ -0,0 +1,52 @@ + + + + + + 随机一言 - 金色光辉 + + + + +
+
+

随机一言

+

每一句话都是心灵的光芒

+
+ +
+
+
+
+

正在获取一言...

+
+ +
+
+ 点击下方按钮获取一言 +
+
+
+ +
+
⚠️
+
+
+
+ +
+ +
+
+ +
+

愿每一句话都能温暖你的心

+
+
+ + + + \ No newline at end of file diff --git a/frontend/60sapi/娱乐消遣/随机一言/js/script.js b/frontend/60sapi/娱乐消遣/随机一言/js/script.js new file mode 100644 index 00000000..5ce4546a --- /dev/null +++ b/frontend/60sapi/娱乐消遣/随机一言/js/script.js @@ -0,0 +1,225 @@ +// 随机一言 JavaScript 功能实现 + +class HitokotoApp { + constructor() { + // API接口列表 + this.apiEndpoints = [ + "https://60s-cf.viki.moe", + "https://60s.viki.moe", + "https://60s.b23.run", + "https://60s.114128.xyz", + "https://60s-cf.114128.xyz" + ]; + + this.currentEndpointIndex = 0; + this.isLoading = false; + + // DOM 元素 + this.elements = { + loading: document.getElementById('loading'), + quoteDisplay: document.getElementById('quoteDisplay'), + quoteText: document.getElementById('quoteText'), + quoteIndex: document.getElementById('quoteIndex'), + errorMessage: document.getElementById('errorMessage'), + errorText: document.getElementById('errorText'), + refreshBtn: document.getElementById('refreshBtn') + }; + + this.init(); + } + + // 初始化应用 + init() { + this.bindEvents(); + this.hideAllStates(); + this.showQuoteDisplay(); + } + + // 绑定事件 + bindEvents() { + this.elements.refreshBtn.addEventListener('click', () => { + this.fetchHitokoto(); + }); + + // 键盘快捷键支持 + document.addEventListener('keydown', (e) => { + if (e.code === 'Space' && !this.isLoading) { + e.preventDefault(); + this.fetchHitokoto(); + } + }); + } + + // 隐藏所有状态 + hideAllStates() { + this.elements.loading.classList.remove('show'); + this.elements.quoteDisplay.classList.remove('hide'); + this.elements.errorMessage.classList.remove('show'); + } + + // 显示加载状态 + showLoading() { + this.hideAllStates(); + this.elements.loading.classList.add('show'); + this.elements.quoteDisplay.classList.add('hide'); + this.elements.refreshBtn.disabled = true; + this.isLoading = true; + } + + // 显示一言内容 + showQuoteDisplay() { + this.hideAllStates(); + this.elements.quoteDisplay.classList.remove('hide'); + this.elements.refreshBtn.disabled = false; + this.isLoading = false; + } + + // 显示错误信息 + showError(message) { + this.hideAllStates(); + this.elements.errorMessage.classList.add('show'); + this.elements.errorText.textContent = message; + this.elements.refreshBtn.disabled = false; + this.isLoading = false; + } + + // 获取一言数据 + async fetchHitokoto() { + if (this.isLoading) return; + + this.showLoading(); + + // 尝试所有API接口 + for (let i = 0; i < this.apiEndpoints.length; i++) { + const endpointIndex = (this.currentEndpointIndex + i) % this.apiEndpoints.length; + const endpoint = this.apiEndpoints[endpointIndex]; + + try { + const result = await this.tryFetchFromEndpoint(endpoint); + if (result.success) { + this.currentEndpointIndex = endpointIndex; + this.displayHitokoto(result.data); + return; + } + } catch (error) { + console.warn(`接口 ${endpoint} 请求失败:`, error.message); + continue; + } + } + + // 所有接口都失败 + this.showError('所有接口都无法访问,请检查网络连接或稍后重试'); + } + + // 尝试从指定接口获取数据 + async tryFetchFromEndpoint(endpoint) { + const controller = new AbortController(); + const timeoutId = setTimeout(() => controller.abort(), 10000); // 10秒超时 + + try { + const response = await fetch(`${endpoint}/v2/hitokoto?encoding=text`, { + method: 'GET', + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/json' + }, + signal: controller.signal + }); + + clearTimeout(timeoutId); + + if (!response.ok) { + throw new Error(`HTTP ${response.status}: ${response.statusText}`); + } + + const data = await response.json(); + + // 验证返回数据格式 + if (data.code === 200 && data.data && data.data.hitokoto) { + return { + success: true, + data: data.data + }; + } else { + throw new Error('返回数据格式不正确'); + } + + } catch (error) { + clearTimeout(timeoutId); + + if (error.name === 'AbortError') { + throw new Error('请求超时'); + } + + throw error; + } + } + + // 显示一言内容 + displayHitokoto(data) { + // 更新一言文本 + this.elements.quoteText.textContent = data.hitokoto; + + // 更新序号信息 + if (data.index) { + this.elements.quoteIndex.textContent = `第 ${data.index} 条`; + } else { + this.elements.quoteIndex.textContent = ''; + } + + // 添加淡入动画效果 + this.elements.quoteText.style.opacity = '0'; + this.elements.quoteIndex.style.opacity = '0'; + + setTimeout(() => { + this.elements.quoteText.style.transition = 'opacity 0.5s ease'; + this.elements.quoteIndex.style.transition = 'opacity 0.5s ease'; + this.elements.quoteText.style.opacity = '1'; + this.elements.quoteIndex.style.opacity = '1'; + }, 100); + + this.showQuoteDisplay(); + + // 控制台输出调试信息 + console.log('一言获取成功:', { + content: data.hitokoto, + index: data.index, + endpoint: this.apiEndpoints[this.currentEndpointIndex] + }); + } + + // 获取随机接口(用于负载均衡) + getRandomEndpoint() { + const randomIndex = Math.floor(Math.random() * this.apiEndpoints.length); + return this.apiEndpoints[randomIndex]; + } +} + +// 页面加载完成后初始化应用 +document.addEventListener('DOMContentLoaded', () => { + const app = new HitokotoApp(); + + // 添加全局错误处理 + window.addEventListener('error', (event) => { + console.error('页面发生错误:', event.error); + }); + + window.addEventListener('unhandledrejection', (event) => { + console.error('未处理的Promise拒绝:', event.reason); + }); + + // 页面可见性变化时的处理 + document.addEventListener('visibilitychange', () => { + if (!document.hidden && !app.isLoading) { + // 页面重新可见时,可以选择刷新内容 + console.log('页面重新可见'); + } + }); + + console.log('随机一言应用初始化完成'); +}); + +// 导出应用类(如果需要在其他地方使用) +if (typeof module !== 'undefined' && module.exports) { + module.exports = HitokotoApp; +} \ No newline at end of file diff --git a/frontend/60sapi/娱乐消遣/随机一言/接口集合.json b/frontend/60sapi/娱乐消遣/随机一言/接口集合.json new file mode 100644 index 00000000..04e92b7f --- /dev/null +++ b/frontend/60sapi/娱乐消遣/随机一言/接口集合.json @@ -0,0 +1,7 @@ +[ + "https://60s-cf.viki.moe", + "https://60s.viki.moe", + "https://60s.b23.run", + "https://60s.114128.xyz", + "https://60s-cf.114128.xyz" +] diff --git a/frontend/60sapi/娱乐消遣/随机一言/返回接口.json b/frontend/60sapi/娱乐消遣/随机一言/返回接口.json new file mode 100644 index 00000000..29342ebc --- /dev/null +++ b/frontend/60sapi/娱乐消遣/随机一言/返回接口.json @@ -0,0 +1,8 @@ +{ + "code": 200, + "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", + "data": { + "index": 2862, + "hitokoto": "你带上罪恶之冠,即使背负上所有罪恶和孤独,绝不让你受伤" + } +} \ No newline at end of file diff --git a/frontend/60sapi/娱乐消遣/随机唱歌音频/css/style.css b/frontend/60sapi/娱乐消遣/随机唱歌音频/css/style.css new file mode 100644 index 00000000..c6b6f0d6 --- /dev/null +++ b/frontend/60sapi/娱乐消遣/随机唱歌音频/css/style.css @@ -0,0 +1,251 @@ +/* 随机唱歌音频 - 淡绿色清新风格样式 */ + +/* 重置样式 */ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; + background: linear-gradient(135deg, #a8e6cf 0%, #dcedc1 50%, #ffd3a5 100%); + min-height: 100vh; + color: #2d5016; + line-height: 1.6; + overflow-x: hidden; +} + +.container { + max-width: 900px; + margin: 0 auto; + padding: 20px; +} + +/* 头部 */ +.header { + text-align: center; + margin-bottom: 20px; + background: rgba(255, 255, 255, 0.85); + border-radius: 20px; + padding: 24px; + box-shadow: 0 8px 25px rgba(45, 80, 22, 0.08); + backdrop-filter: blur(10px); +} + +.header h1 { + font-size: 2rem; + color: #2d5016; + margin-bottom: 10px; + font-weight: 700; + display: flex; + align-items: center; + justify-content: center; + gap: 12px; +} + +.header p { + color: #5a7c65; + font-size: 1rem; +} + +/* 用户卡片 */ +.user-card { + display: flex; + align-items: center; + justify-content: center; + gap: 15px; + background: rgba(255, 255, 255, 0.9); + padding: 16px; + border-radius: 15px; + box-shadow: 0 4px 18px rgba(45, 80, 22, 0.08); + margin-bottom: 15px; + text-align: center; +} + +.avatar { + width: 56px; + height: 56px; + border-radius: 50%; + object-fit: cover; + border: 3px solid rgba(129, 199, 132, 0.5); +} + +.user-info { + display: flex; + flex-direction: column; +} + +.nickname { + font-weight: 700; + font-size: 1.1rem; + color: #2d5016; +} + +.meta { + color: #5a7c65; + font-size: 0.9rem; +} + +/* 歌曲信息 */ +.song-card { + background: rgba(255, 255, 255, 0.9); + padding: 16px; + border-radius: 15px; + box-shadow: 0 4px 18px rgba(45, 80, 22, 0.08); + margin-bottom: 15px; + text-align: center; +} + +.song-title { + font-size: 1.2rem; + font-weight: 700; + margin-bottom: 8px; + color: #1b5e20; +} + +.song-meta { + color: #5a7c65; + font-size: 0.95rem; + margin-bottom: 10px; +} + +/* 歌词 */ +.lyrics { + background: rgba(129, 199, 132, 0.1); + border-radius: 12px; + padding: 12px; + max-height: 220px; + overflow: auto; +} + +.lyrics p { + margin-bottom: 6px; +} + +/* 音频播放器卡片 */ +.audio-card { + background: rgba(255, 255, 255, 0.9); + padding: 16px; + border-radius: 15px; + box-shadow: 0 4px 18px rgba(45, 80, 22, 0.08); + margin-bottom: 15px; +} + +.audio-actions { + display: flex; + flex-direction: column; + gap: 12px; + align-items: center; + margin-top: 10px; +} + +.btn { + background: linear-gradient(135deg, #81c784 0%, #66bb6a 100%); + color: white; + border: none; + padding: 10px 18px; + border-radius: 10px; + font-size: 0.95rem; + font-weight: 600; + cursor: pointer; + transition: all 0.25s ease; + box-shadow: 0 4px 12px rgba(129, 199, 132, 0.35); + text-decoration: none; +} + +.btn:hover { + transform: translateY(-2px); + box-shadow: 0 6px 18px rgba(129, 199, 132, 0.45); +} + +.info { + color: #5a7c65; + font-size: 0.9rem; +} + +/* 加载与错误 */ +.loading, .error { + text-align: center; + padding: 30px; + background: rgba(255, 255, 255, 0.85); + border-radius: 15px; + box-shadow: 0 5px 20px rgba(45, 80, 22, 0.08); +} + +.spinner { + width: 36px; + height: 36px; + border: 4px solid #e8f5e8; + border-top: 4px solid #81c784; + border-radius: 50%; + animation: spin 1s linear infinite; + margin: 0 auto 18px; +} + +@keyframes spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} + +/* 动画 */ +.fade-in { + animation: fadeIn 0.5s ease-in-out; +} + +@keyframes fadeIn { + from { opacity: 0; transform: translateY(10px); } + to { opacity: 1; transform: translateY(0); } +} + +/* 平板端适配 */ +@media (max-width: 1024px) and (min-width: 768px) { + .container { padding: 16px; } + .header h1 { font-size: 1.8rem; } +} + +/* 手机端优先优化 */ +@media (max-width: 767px) { + .container { padding: 12px; } + .header { padding: 18px; } + .header h1 { font-size: 1.6rem; gap: 8px; } + + .user-card { + padding: 16px; + flex-direction: column; + text-align: center; + } + + .avatar { + width: 80px; + height: 80px; + margin-bottom: 8px; + } + + .song-card, .audio-card { + padding: 16px; + } + + .lyrics { + max-height: 180px; + text-align: left; + padding: 16px; + } + + .audio-actions { + flex-direction: column; + gap: 15px; + align-items: center; + } + + .info { + text-align: center; + line-height: 1.8; + } + + .btn { + width: 100%; + max-width: 200px; + text-align: center; + } +} \ No newline at end of file diff --git a/frontend/60sapi/娱乐消遣/随机唱歌音频/index.html b/frontend/60sapi/娱乐消遣/随机唱歌音频/index.html new file mode 100644 index 00000000..3134b76d --- /dev/null +++ b/frontend/60sapi/娱乐消遣/随机唱歌音频/index.html @@ -0,0 +1,67 @@ + + + + + + + 随机唱歌音频 - 60s API 集合 + + + + + +
+
+

+ 🎵 随机唱歌音频 +

+

数据来自官方/权威源头,以确保稳定与实时 · 支持本地数据回退

+
+ + +
+
+

正在加载中,请稍候…

+
+ + + + +
+ +
+ 用户头像 + +
+ + +
+
-
+
-
+
+
+ + +
+ +
+ +
+ ❤ 喜欢:- + · ⏱ 时长:--:-- + · 🗓 发布:- + · 🔗 查看原帖 +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/frontend/60sapi/娱乐消遣/随机唱歌音频/js/script.js b/frontend/60sapi/娱乐消遣/随机唱歌音频/js/script.js new file mode 100644 index 00000000..598eb5d6 --- /dev/null +++ b/frontend/60sapi/娱乐消遣/随机唱歌音频/js/script.js @@ -0,0 +1,252 @@ +// 随机唱歌音频 页面脚本 +(function () { + 'use strict'; + + const API = { + endpoints: [], + currentIndex: 0, + params: { + encoding: 'json' + }, + localFallback: '返回接口.json', + // 初始化API接口列表 + async init() { + try { + const res = await fetch('./接口集合.json'); + const endpoints = await res.json(); + this.endpoints = endpoints.map(endpoint => `${endpoint}/v2/changya`); + } catch (e) { + // 如果无法加载接口集合,使用默认接口 + this.endpoints = ['https://60s.viki.moe/v2/changya']; + } + }, + // 获取当前接口URL + getCurrentUrl() { + if (this.endpoints.length === 0) return null; + const url = new URL(this.endpoints[this.currentIndex]); + Object.entries(this.params).forEach(([k, v]) => url.searchParams.append(k, v)); + return url.toString(); + }, + // 切换到下一个接口 + switchToNext() { + this.currentIndex = (this.currentIndex + 1) % this.endpoints.length; + return this.currentIndex < this.endpoints.length; + }, + // 重置到第一个接口 + reset() { + this.currentIndex = 0; + } + }; + + // DOM 元素引用 + const els = { + loading: null, + error: null, + container: null, + avatar: null, + nickname: null, + gender: null, + songTitle: null, + songMeta: null, + lyrics: null, + audio: null, + likeCount: null, + publishTime: null, + link: null, + refreshBtn: null, + }; + + function initDom() { + els.loading = document.getElementById('loading'); + els.error = document.getElementById('error'); + els.container = document.getElementById('content'); + + els.avatar = document.getElementById('avatar'); + els.nickname = document.getElementById('nickname'); + els.gender = document.getElementById('gender'); + els.songTitle = document.getElementById('song-title'); + els.songMeta = document.getElementById('song-meta'); + els.lyrics = document.getElementById('lyrics'); + + els.audio = document.getElementById('audio'); + els.likeCount = document.getElementById('like-count'); + els.publishTime = document.getElementById('publish-time'); + els.link = document.getElementById('link'); + els.refreshBtn = document.getElementById('refresh-btn'); + } + + function showLoading() { + els.loading.style.display = 'block'; + els.error.style.display = 'none'; + els.container.style.display = 'none'; + } + + function showError(msg) { + els.loading.style.display = 'none'; + els.error.style.display = 'block'; + els.container.style.display = 'none'; + els.error.querySelector('p').textContent = msg || '获取数据失败,请稍后重试'; + } + + function showContent() { + els.loading.style.display = 'none'; + els.error.style.display = 'none'; + els.container.style.display = 'block'; + } + + function formatDuration(ms) { + if (!ms && ms !== 0) return ''; + const totalSeconds = Math.floor(ms / 1000); + const m = Math.floor(totalSeconds / 60).toString().padStart(2, '0'); + const s = (totalSeconds % 60).toString().padStart(2, '0'); + return `${m}:${s}`; + } + + function safeText(text) { + const div = document.createElement('div'); + div.textContent = text == null ? '' : String(text); + return div.innerHTML; + } + + async function fetchFromAPI() { + // 初始化API接口列表 + await API.init(); + + // 重置API索引到第一个接口 + API.reset(); + + // 尝试所有API接口 + for (let i = 0; i < API.endpoints.length; i++) { + try { + const url = API.getCurrentUrl(); + console.log(`尝试接口 ${i + 1}/${API.endpoints.length}: ${url}`); + + const resp = await fetch(url, { + cache: 'no-store', + timeout: 10000 // 10秒超时 + }); + + if (!resp.ok) { + throw new Error(`HTTP ${resp.status}: ${resp.statusText}`); + } + + const data = await resp.json(); + + if (data && data.code === 200) { + console.log(`接口 ${i + 1} 请求成功`); + return data; + } + + throw new Error(data && data.message ? data.message : '接口返回异常'); + + } catch (e) { + console.warn(`接口 ${i + 1} 失败:`, e.message); + + // 如果不是最后一个接口,切换到下一个 + if (i < API.endpoints.length - 1) { + API.switchToNext(); + continue; + } + + // 所有接口都失败了 + console.warn('所有远程接口都失败,尝试本地数据'); + return null; + } + } + } + + async function fetchFromLocal() { + try { + const resp = await fetch(API.localFallback + `?t=${Date.now()}`); + if (!resp.ok) throw new Error(`本地文件HTTP ${resp.status}`); + const data = await resp.json(); + return data; + } catch (e) { + console.error('读取本地返回接口.json失败:', e); + return null; + } + } + + function render(data) { + const d = data?.data || {}; + const user = d.user || {}; + const song = d.song || {}; + const audio = d.audio || {}; + + // 用户信息 + els.avatar.src = user.avatar_url || ''; + els.avatar.alt = (user.nickname || '用户') + ' 头像'; + els.nickname.textContent = user.nickname || '未知用户'; + els.gender.textContent = user.gender === 'female' ? '女' : user.gender === 'male' ? '男' : '未知'; + + // 歌曲信息 + els.songTitle.textContent = song.name || '未知歌曲'; + els.songMeta.textContent = song.singer ? `演唱:${song.singer}` : ''; + + els.lyrics.innerHTML = ''; + if (Array.isArray(song.lyrics)) { + const frag = document.createDocumentFragment(); + song.lyrics.forEach(line => { + const p = document.createElement('p'); + p.innerHTML = safeText(line); + frag.appendChild(p); + }); + els.lyrics.appendChild(frag); + } + + // 音频 + els.audio.src = audio.url || ''; + els.audio.preload = 'none'; + + // 其他信息 + els.likeCount.textContent = typeof audio.like_count === 'number' ? audio.like_count : '-'; + const publish = audio.publish || (audio.publish_at ? new Date(audio.publish_at).toLocaleString() : ''); + els.publishTime.textContent = publish; + els.link.href = audio.link || '#'; + els.link.target = '_blank'; + + // 时长信息 + const durationEl = document.getElementById('duration'); + durationEl.textContent = formatDuration(audio.duration); + + showContent(); + } + + async function load() { + showLoading(); + try { + // 先尝试远程API + const data = await fetchFromAPI(); + if (data) { + render(data); + return; + } + + // 远程API失败,尝试本地数据 + const localData = await fetchFromLocal(); + if (localData) { + render(localData); + return; + } + + // 都失败了 + showError('获取数据失败,请稍后重试'); + } catch (e) { + console.error('加载数据时发生错误:', e); + showError('获取数据失败,请稍后重试'); + } + } + + function bindEvents() { + if (els.refreshBtn) { + els.refreshBtn.addEventListener('click', load); + } + // 快捷键 Ctrl+R 刷新(不拦截浏览器默认刷新) + } + + document.addEventListener('DOMContentLoaded', () => { + initDom(); + bindEvents(); + load(); + }); +})(); \ No newline at end of file diff --git a/frontend/60sapi/娱乐消遣/随机唱歌音频/接口集合.json b/frontend/60sapi/娱乐消遣/随机唱歌音频/接口集合.json new file mode 100644 index 00000000..04e92b7f --- /dev/null +++ b/frontend/60sapi/娱乐消遣/随机唱歌音频/接口集合.json @@ -0,0 +1,7 @@ +[ + "https://60s-cf.viki.moe", + "https://60s.viki.moe", + "https://60s.b23.run", + "https://60s.114128.xyz", + "https://60s-cf.114128.xyz" +] diff --git a/frontend/60sapi/娱乐消遣/随机唱歌音频/返回接口.json b/frontend/60sapi/娱乐消遣/随机唱歌音频/返回接口.json new file mode 100644 index 00000000..d364f524 --- /dev/null +++ b/frontend/60sapi/娱乐消遣/随机唱歌音频/返回接口.json @@ -0,0 +1,32 @@ +{ + "code": 200, + "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", + "data": { + "user": { + "nickname": "𝑮𝑺_迷鹿_", + "gender": "female", + "avatar_url": "http://img-cdn.api.singduck.cn/user-img/6afbebcfae6144478c150d0c1d0d5899.jpg" + }, + "song": { + "name": "恶作剧", + "singer": "王蓝茵", + "lyrics": [ + "我想我会开始想念你", + "可是我刚刚才遇见了你", + "我怀疑这奇遇只是个恶作剧", + "我想我已慢慢喜欢你", + "因为我拥有爱情的勇气", + "我任性投入你给的恶作剧", + "你给的恶作剧" + ] + }, + "audio": { + "url": "http://audio-cdn.api.singduck.cn/ugc/220929_965696173_b822a290c553.wav?auth_key=1755845643-0-0-4029539b73e17337dcac49cc4e0ecfcc", + "duration": 35050, + "like_count": 955, + "link": "https://m.api.singduck.cn/user-piece/toGZlBfZbukck2sHb", + "publish": "2022/09/29 18:33:51", + "publish_at": 1664447631000 + } + } +} \ No newline at end of file diff --git a/frontend/60sapi/实用功能/EpicGames免费游戏/css/style.css b/frontend/60sapi/实用功能/EpicGames免费游戏/css/style.css new file mode 100644 index 00000000..30d4f120 --- /dev/null +++ b/frontend/60sapi/实用功能/EpicGames免费游戏/css/style.css @@ -0,0 +1,330 @@ +/* Epic Games 免费游戏 - 淡绿色清新风格样式 */ + +/* 重置样式 */ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; + background: linear-gradient(135deg, #a8e6cf 0%, #dcedc1 50%, #ffd3a5 100%); + min-height: 100vh; + color: #2d5016; + line-height: 1.6; + overflow-x: hidden; +} + +.container { + max-width: 1200px; + margin: 0 auto; + padding: 20px; +} + +/* 头部 */ +.header { + text-align: center; + margin-bottom: 30px; + background: rgba(255, 255, 255, 0.85); + border-radius: 20px; + padding: 24px; + box-shadow: 0 8px 25px rgba(45, 80, 22, 0.08); + backdrop-filter: blur(10px); +} + +.header h1 { + font-size: 2.2rem; + color: #2d5016; + margin-bottom: 10px; + font-weight: 700; + display: flex; + align-items: center; + justify-content: center; + gap: 12px; +} + +.header p { + color: #5a7c65; + font-size: 1rem; +} + +/* 统计信息 */ +.stats { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); + gap: 15px; + margin-bottom: 25px; +} + +.stat-card { + background: rgba(255, 255, 255, 0.9); + padding: 16px; + border-radius: 15px; + text-align: center; + box-shadow: 0 4px 18px rgba(45, 80, 22, 0.08); +} + +.stat-number { + font-size: 1.8rem; + font-weight: 700; + color: #1b5e20; + margin-bottom: 5px; +} + +.stat-label { + color: #5a7c65; + font-size: 0.9rem; +} + +/* 游戏网格 */ +.games-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); + gap: 20px; + margin-bottom: 20px; +} + +/* 游戏卡片 */ +.game-card { + background: rgba(255, 255, 255, 0.95); + border-radius: 18px; + overflow: hidden; + box-shadow: 0 6px 25px rgba(45, 80, 22, 0.1); + transition: all 0.3s ease; + position: relative; +} + +.game-card:hover { + transform: translateY(-5px); + box-shadow: 0 12px 35px rgba(45, 80, 22, 0.15); +} + +.game-cover { + width: 100%; + height: 180px; + object-fit: cover; + border-radius: 0; +} + +.game-info { + padding: 18px; +} + +.game-title { + font-size: 1.1rem; + font-weight: 700; + color: #1b5e20; + margin-bottom: 8px; + line-height: 1.3; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; +} + +.game-description { + color: #5a7c65; + font-size: 0.9rem; + margin-bottom: 12px; + display: -webkit-box; + -webkit-line-clamp: 3; + -webkit-box-orient: vertical; + overflow: hidden; + line-height: 1.4; +} + +.game-meta { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 12px; +} + +.game-price { + font-size: 1rem; + font-weight: 600; +} + +.original-price { + color: #81c784; + text-decoration: line-through; +} + +.free-price { + color: #2e7d32; + font-weight: 700; +} + +.game-seller { + color: #5a7c65; + font-size: 0.85rem; +} + +.game-dates { + background: rgba(129, 199, 132, 0.1); + padding: 10px; + border-radius: 10px; + margin-bottom: 12px; + font-size: 0.85rem; + color: #2d5016; +} + +.free-period { + display: flex; + justify-content: space-between; + margin-bottom: 4px; +} + +.game-actions { + display: flex; + gap: 10px; +} + +.btn { + flex: 1; + background: linear-gradient(135deg, #81c784 0%, #66bb6a 100%); + color: white; + border: none; + padding: 10px 16px; + border-radius: 10px; + font-size: 0.9rem; + font-weight: 600; + cursor: pointer; + transition: all 0.25s ease; + box-shadow: 0 4px 12px rgba(129, 199, 132, 0.35); + text-decoration: none; + text-align: center; + display: inline-block; +} + +.btn:hover { + transform: translateY(-2px); + box-shadow: 0 6px 18px rgba(129, 199, 132, 0.45); +} + +.btn-secondary { + background: linear-gradient(135deg, #a5d6a7 0%, #81c784 100%); +} + +/* 状态标签 */ +.status-badge { + position: absolute; + top: 12px; + right: 12px; + padding: 6px 12px; + border-radius: 20px; + font-size: 0.8rem; + font-weight: 600; + color: white; + text-shadow: 0 1px 2px rgba(0,0,0,0.2); +} + +.status-free { + background: linear-gradient(135deg, #4caf50 0%, #2e7d32 100%); +} + +.status-upcoming { + background: linear-gradient(135deg, #ff9800 0%, #f57c00 100%); +} + +/* 加载与错误 */ +.loading, .error { + text-align: center; + padding: 40px; + background: rgba(255, 255, 255, 0.85); + border-radius: 15px; + box-shadow: 0 5px 20px rgba(45, 80, 22, 0.08); +} + +.spinner { + width: 40px; + height: 40px; + border: 4px solid #e8f5e8; + border-top: 4px solid #81c784; + border-radius: 50%; + animation: spin 1s linear infinite; + margin: 0 auto 20px; +} + +@keyframes spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} + +/* 动画 */ +.fade-in { + animation: fadeIn 0.6s ease-in-out; +} + +@keyframes fadeIn { + from { opacity: 0; transform: translateY(20px); } + to { opacity: 1; transform: translateY(0); } +} + +/* 平板端适配 */ +@media (max-width: 1024px) and (min-width: 768px) { + .container { padding: 16px; } + .header h1 { font-size: 2rem; } + .games-grid { grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); } +} + +/* 手机端优化 */ +@media (max-width: 767px) { + .container { padding: 12px; } + .header { padding: 18px; } + .header h1 { font-size: 1.8rem; gap: 8px; } + + .stats { + display: flex; + flex-direction: row; + justify-content: space-between; + gap: 8px; + } + + .stat-card { + padding: 10px 8px; + flex: 1; + min-width: 0; + } + .stat-number { font-size: 1.4rem; } + .stat-label { font-size: 0.75rem; } + + .games-grid { + grid-template-columns: 1fr; + gap: 16px; + } + + .game-card { margin: 0 4px; } + .game-cover { height: 160px; } + .game-info { padding: 14px; } + + .game-actions { + flex-direction: column; + } + + .btn { + width: 100%; + padding: 12px; + } +} + +/* 小屏手机优化 */ +@media (max-width: 480px) { + .stats { + grid-template-columns: 1fr; + } + + .game-meta { + flex-direction: column; + align-items: flex-start; + gap: 6px; + } +} + +/* 高分辨率显示器优化 */ +@media (min-width: 1400px) { + .games-grid { + grid-template-columns: repeat(auto-fill, minmax(350px, 1fr)); + } +} \ No newline at end of file diff --git a/frontend/60sapi/实用功能/EpicGames免费游戏/index.html b/frontend/60sapi/实用功能/EpicGames免费游戏/index.html new file mode 100644 index 00000000..c29c106f --- /dev/null +++ b/frontend/60sapi/实用功能/EpicGames免费游戏/index.html @@ -0,0 +1,63 @@ + + + + + + + Epic Games 免费游戏 - 60s API 集合 + + + + + +
+
+

+ 🎮 Epic Games 免费游戏 +

+
+ + +
+
+

正在加载游戏数据,请稍候…

+
+ + + + +
+ +
+
+
0
+
总游戏数
+
+
+
0
+
当前免费
+
+
+
0
+
即将免费
+
+
+ + +
+ +
+ + +
+ +
+
+
+ + + + \ No newline at end of file diff --git a/frontend/60sapi/实用功能/EpicGames免费游戏/js/script.js b/frontend/60sapi/实用功能/EpicGames免费游戏/js/script.js new file mode 100644 index 00000000..c9592876 --- /dev/null +++ b/frontend/60sapi/实用功能/EpicGames免费游戏/js/script.js @@ -0,0 +1,266 @@ +// Epic Games 免费游戏 页面脚本 +(function () { + 'use strict'; + + const API = { + endpoints: [], + currentIndex: 0, + // 初始化API接口列表 + async init() { + try { + const res = await fetch('./接口集合.json'); + const endpoints = await res.json(); + this.endpoints = endpoints.map(endpoint => `${endpoint}/v2/epic`); + } catch (e) { + // 如果无法加载接口集合,使用默认接口 + this.endpoints = ['https://60s-api.viki.moe/v2/epic']; + } + }, + // 获取当前接口URL + getCurrentUrl(encoding) { + if (this.endpoints.length === 0) return null; + const url = new URL(this.endpoints[this.currentIndex]); + if (encoding) url.searchParams.set('encoding', encoding); + return url.toString(); + }, + // 切换到下一个接口 + switchToNext() { + this.currentIndex = (this.currentIndex + 1) % this.endpoints.length; + return this.currentIndex < this.endpoints.length; + }, + // 重置到第一个接口 + reset() { + this.currentIndex = 0; + } + }; + + // DOM 元素引用 + const els = { + loading: null, + error: null, + container: null, + gamesGrid: null, + totalGames: null, + freeNow: null, + upcoming: null, + refreshBtn: null, + }; + + function initDom() { + els.loading = document.getElementById('loading'); + els.error = document.getElementById('error'); + els.container = document.getElementById('content'); + els.gamesGrid = document.getElementById('games-grid'); + els.totalGames = document.getElementById('total-games'); + els.freeNow = document.getElementById('free-now'); + els.upcoming = document.getElementById('upcoming'); + els.refreshBtn = document.getElementById('refresh-btn'); + } + + function showLoading() { + els.loading.style.display = 'block'; + els.error.style.display = 'none'; + els.container.style.display = 'none'; + } + + function showError(msg) { + els.loading.style.display = 'none'; + els.error.style.display = 'block'; + els.container.style.display = 'none'; + els.error.querySelector('p').textContent = msg || '获取数据失败,请稍后重试'; + } + + function showContent() { + els.loading.style.display = 'none'; + els.error.style.display = 'none'; + els.container.style.display = 'block'; + } + + function safeText(text) { + const div = document.createElement('div'); + div.textContent = text == null ? '' : String(text); + return div.innerHTML; + } + + function formatDate(dateStr) { + if (!dateStr) return ''; + try { + const date = new Date(dateStr); + return date.toLocaleDateString('zh-CN', { + month: '2-digit', + day: '2-digit', + hour: '2-digit', + minute: '2-digit' + }); + } catch (e) { + return dateStr; + } + } + + async function fetchData(preferLocal = false) { + if (preferLocal) { + try { + const res = await fetch('./返回接口.json', { cache: 'no-store' }); + const json = await res.json(); + return json; + } catch (e) { + throw new Error('本地数据加载失败'); + } + } + + // 重置API索引到第一个接口 + API.reset(); + + // 尝试所有API接口 + for (let i = 0; i < API.endpoints.length; i++) { + try { + const url = API.getCurrentUrl(); + console.log(`尝试接口 ${i + 1}/${API.endpoints.length}: ${url}`); + + const res = await fetch(url, { + cache: 'no-store', + timeout: 10000 // 10秒超时 + }); + + if (!res.ok) { + throw new Error(`HTTP ${res.status}: ${res.statusText}`); + } + + const json = await res.json(); + + if (json && json.code === 200) { + console.log(`接口 ${i + 1} 请求成功`); + return json; + } + + throw new Error(json && json.message ? json.message : '接口返回异常'); + + } catch (e) { + console.warn(`接口 ${i + 1} 失败:`, e.message); + + // 如果不是最后一个接口,切换到下一个 + if (i < API.endpoints.length - 1) { + API.switchToNext(); + continue; + } + + // 所有接口都失败了,尝试本地数据 + console.warn('所有远程接口都失败,尝试本地数据'); + try { + const res = await fetch('./返回接口.json', { cache: 'no-store' }); + const json = await res.json(); + return json; + } catch (e2) { + throw new Error('所有接口和本地数据都无法访问'); + } + } + } + } + + function createGameCard(game) { + const isFree = game.is_free_now; + const statusClass = isFree ? 'status-free' : 'status-upcoming'; + const statusText = isFree ? '限时免费' : '即将免费'; + + return ` +
+
${statusText}
+ ${safeText(game.title)} 封面 +
+

${safeText(game.title)}

+

${safeText(game.description)}

+ +
+
+ ${safeText(game.original_price_desc)} + 免费 +
+
${safeText(game.seller)}
+
+ +
+
+ 开始:${formatDate(game.free_start)} + 结束:${formatDate(game.free_end)} +
+
+ + +
+
+ `; + } + + function updateStats(games) { + const total = games.length; + const freeNow = games.filter(game => game.is_free_now).length; + const upcoming = total - freeNow; + + els.totalGames.textContent = total; + els.freeNow.textContent = freeNow; + els.upcoming.textContent = upcoming; + } + + function renderGames(games) { + if (!Array.isArray(games) || games.length === 0) { + els.gamesGrid.innerHTML = '
暂无游戏数据
'; + return; + } + + // 按状态排序:免费的在前 + const sortedGames = [...games].sort((a, b) => { + if (a.is_free_now && !b.is_free_now) return -1; + if (!a.is_free_now && b.is_free_now) return 1; + return 0; + }); + + const html = sortedGames.map(game => createGameCard(game)).join(''); + els.gamesGrid.innerHTML = html; + + updateStats(games); + } + + function render(data) { + const games = data?.data || []; + renderGames(games); + showContent(); + } + + async function load() { + showLoading(); + + // 初始化API接口列表 + await API.init(); + + try { + const data = await fetchData(false); + render(data); + } catch (e) { + console.error('数据获取失败:', e); + showError(e.message || '获取数据失败,请稍后重试'); + } + } + + function bindEvents() { + if (els.refreshBtn) { + els.refreshBtn.addEventListener('click', load); + } + + // 快捷键 Ctrl+R 刷新(不拦截浏览器默认刷新) + document.addEventListener('keydown', (e) => { + if (e.ctrlKey && e.key === 'r' && !e.defaultPrevented) { + // 不阻止默认行为,让浏览器正常刷新 + } + }); + } + + document.addEventListener('DOMContentLoaded', () => { + initDom(); + bindEvents(); + load(); + }); +})(); \ No newline at end of file diff --git a/frontend/60sapi/实用功能/EpicGames免费游戏/接口集合.json b/frontend/60sapi/实用功能/EpicGames免费游戏/接口集合.json new file mode 100644 index 00000000..04e92b7f --- /dev/null +++ b/frontend/60sapi/实用功能/EpicGames免费游戏/接口集合.json @@ -0,0 +1,7 @@ +[ + "https://60s-cf.viki.moe", + "https://60s.viki.moe", + "https://60s.b23.run", + "https://60s.114128.xyz", + "https://60s-cf.114128.xyz" +] diff --git a/frontend/60sapi/实用功能/EpicGames免费游戏/返回接口.json b/frontend/60sapi/实用功能/EpicGames免费游戏/返回接口.json new file mode 100644 index 00000000..7804d62a --- /dev/null +++ b/frontend/60sapi/实用功能/EpicGames免费游戏/返回接口.json @@ -0,0 +1,66 @@ +{ + "code": 200, + "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", + "data": [ + { + "id": "9aa227e2ba294bb1a95c95fde892eb31", + "title": "《Totally Reliable Delivery Service》 Standard Edition", + "cover": "https://cdn1.epicgames.com/52b90f9a982a404781b189f6a7903226/offer/EGS_TotallyReliableDeliveryService_WereFiveGames_S1-2560x1440-47e6e9562d62705a75ea7b7096d0b8dc.jpg", + "original_price": 52, + "original_price_desc": "¥52.00", + "description": "穿好护腰护具,发动货车,送货的时间到啦!在一个高度互动的沙盒世界中,与最多三位好友一起随意地完成送货。货物已试投,这就是我们靠谱快递(Totally Reliable Delivery Service)的品质保证!", + "seller": "Infogrames LLC", + "is_free_now": true, + "free_start": "2025/08/14 23:00:00", + "free_start_at": 1755183600000, + "free_end": "2025/08/21 23:00:00", + "free_end_at": 1755788400000, + "link": "https://store.epicgames.com/store/zh-CN/p/totally-reliable-delivery-service/home" + }, + { + "id": "8ea3500dc38e4f429702bf889c172d3d", + "title": "Hidden Folks", + "cover": "https://cdn1.epicgames.com/spt-assets/7bfd56b0586348dcb139945d9e59f988/hidden-folks-1b7hh.png", + "original_price": 47, + "original_price_desc": "¥47.00", + "description": "Search for hidden folks in hand-drawn, interactive, miniature landscapes. Unfurl tent flaps, cut through bushes, slam doors, and poke some crocodiles! Rooooaaaarrrr!!!!!", + "seller": "Adriaan de Jongh", + "is_free_now": true, + "free_start": "2025/08/14 23:00:00", + "free_start_at": 1755183600000, + "free_end": "2025/08/21 23:00:00", + "free_end_at": 1755788400000, + "link": "https://store.epicgames.com/store/zh-CN/p/hidden-folks-239d16" + }, + { + "id": "4cbb6c3704d240f19c3dd5f5cb2b0cb4", + "title": "Kamaeru", + "cover": "https://cdn1.epicgames.com/spt-assets/44313cfbb62b4df5801d0c8d541c2624/kamaeru-40asc.png", + "original_price": 62, + "original_price_desc": "¥62.00", + "description": "Foster a sanctuary for frogs and restore the biodiversity of the wetlands in Kamaeru, a cozy frog collecting game, where you take pictures of frogs, play mini-games and decorate your habitat. Hop right to it!", + "seller": "Armor Games Studios", + "is_free_now": false, + "free_start": "2025/08/21 23:00:00", + "free_start_at": 1755788400000, + "free_end": "2025/08/28 23:00:00", + "free_end_at": 1756393200000, + "link": "https://store.epicgames.com/store/zh-CN/p/kamaeru-0c301e" + }, + { + "id": "0d9a533f0e684cc18620a8f408e8e72c", + "title": "Strange Horticulture", + "cover": "https://cdn1.epicgames.com/spt-assets/15e8e3eba65a4763a815d6eae1d763b2/strange-horticulture-offer-2wghv.png", + "original_price": 45, + "original_price_desc": "¥45.00", + "description": "款神秘学解谜游戏,你将扮演当地植物商店的店主,寻找并识别新的植物,悠闲撸猫,与女巫团体交谈,或加入异教。收集各种强大的植物,用它们来影响故事走向,揭开昂德米尔镇的黑暗谜团。", + "seller": "Iceberg Interactive", + "is_free_now": false, + "free_start": "2025/08/21 23:00:00", + "free_start_at": 1755788400000, + "free_end": "2025/08/28 23:00:00", + "free_end_at": 1756393200000, + "link": "https://store.epicgames.com/store/zh-CN/p/strange-horticulture-360e80" + } + ] +} \ No newline at end of file diff --git a/frontend/60sapi/实用功能/农历信息/css/background.css b/frontend/60sapi/实用功能/农历信息/css/background.css new file mode 100644 index 00000000..254496c1 --- /dev/null +++ b/frontend/60sapi/实用功能/农历信息/css/background.css @@ -0,0 +1,89 @@ +/* 玻璃拟态背景相关样式 */ +body { + background: linear-gradient(135deg, + #667eea 0%, + #764ba2 25%, + #f093fb 50%, + #f5576c 75%, + #4facfe 100% + ); + background-size: 400% 400%; + animation: gradientShift 20s ease infinite; + background-attachment: fixed; + min-height: 100vh; + position: relative; +} + +@keyframes gradientShift { + 0% { background-position: 0% 50%; } + 25% { background-position: 100% 50%; } + 50% { background-position: 100% 100%; } + 75% { background-position: 0% 100%; } + 100% { background-position: 0% 50%; } +} + +/* 玻璃拟态装饰层 */ +body::before { + content: ''; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: + radial-gradient(circle at 20% 20%, rgba(255, 255, 255, 0.1) 0%, transparent 40%), + radial-gradient(circle at 80% 80%, rgba(255, 255, 255, 0.08) 0%, transparent 40%), + radial-gradient(circle at 40% 60%, rgba(255, 255, 255, 0.06) 0%, transparent 30%), + radial-gradient(circle at 60% 30%, rgba(255, 255, 255, 0.05) 0%, transparent 35%); + pointer-events: none; + z-index: -1; + animation: glassFloat 25s ease-in-out infinite alternate; +} + +/* 毛玻璃气泡效果 */ +body::after { + content: ''; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-image: + radial-gradient(circle at 10% 20%, rgba(255, 255, 255, 0.3) 2px, transparent 2px), + radial-gradient(circle at 30% 40%, rgba(255, 255, 255, 0.25) 3px, transparent 3px), + radial-gradient(circle at 50% 60%, rgba(255, 255, 255, 0.2) 1.5px, transparent 1.5px), + radial-gradient(circle at 70% 80%, rgba(255, 255, 255, 0.3) 2.5px, transparent 2.5px), + radial-gradient(circle at 90% 10%, rgba(255, 255, 255, 0.25) 2px, transparent 2px), + radial-gradient(circle at 20% 90%, rgba(255, 255, 255, 0.2) 1px, transparent 1px); + background-size: 300px 300px, 250px 250px, 400px 400px, 200px 200px, 350px 350px, 150px 150px; + animation: bubbleFloat 30s linear infinite; + pointer-events: none; + z-index: -1; + opacity: 0.7; +} + +@keyframes glassFloat { + 0% { + transform: translateY(0px) rotate(0deg); + opacity: 0.7; + } + 100% { + transform: translateY(-20px) rotate(2deg); + opacity: 0.9; + } +} + +@keyframes bubbleFloat { + 0%, 100% { + transform: translateX(0) translateY(0); + } + 25% { + transform: translateX(-15px) translateY(-10px); + } + 50% { + transform: translateX(10px) translateY(-20px); + } + 75% { + transform: translateX(-5px) translateY(-15px); + } +} diff --git a/frontend/60sapi/实用功能/农历信息/css/style.css b/frontend/60sapi/实用功能/农历信息/css/style.css new file mode 100644 index 00000000..1c679c5f --- /dev/null +++ b/frontend/60sapi/实用功能/农历信息/css/style.css @@ -0,0 +1,1105 @@ +/* 重置样式 */ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Helvetica Neue', Arial, sans-serif; + line-height: 1.6; + color: #2c3e50; + overflow-x: hidden; +} + +/* 容器 */ +.container { + max-width: 1200px; + margin: 0 auto; + padding: 20px; + animation: containerFadeIn 1s ease-out; +} + +@keyframes containerFadeIn { + from { + opacity: 0; + transform: translateY(30px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +/* 玻璃拟态基础样式 */ +.glass-morphism { + background: rgba(255, 255, 255, 0.15); + backdrop-filter: blur(20px); + -webkit-backdrop-filter: blur(20px); + border: 1px solid rgba(255, 255, 255, 0.2); + box-shadow: + 0 8px 32px 0 rgba(31, 38, 135, 0.15), + inset 0 1px 0 rgba(255, 255, 255, 0.3); + border-radius: 20px; +} + +/* 头部 */ +.header { + text-align: center; + margin-bottom: 40px; + background: rgba(255, 255, 255, 0.1); + backdrop-filter: blur(25px); + -webkit-backdrop-filter: blur(25px); + padding: 40px 30px; + border-radius: 25px; + border: 1px solid rgba(255, 255, 255, 0.2); + box-shadow: + 0 8px 32px 0 rgba(31, 38, 135, 0.2), + inset 0 1px 0 rgba(255, 255, 255, 0.4); + position: relative; + overflow: hidden; +} + +.header::before { + content: ''; + position: absolute; + top: 0; + left: -100%; + width: 100%; + height: 100%; + background: linear-gradient(90deg, + transparent, + rgba(255, 255, 255, 0.1), + transparent + ); + animation: headerShimmer 6s ease-in-out infinite; +} + +@keyframes headerShimmer { + 0% { left: -100%; } + 50% { left: 100%; } + 100% { left: 100%; } +} + +.header-icon { + font-size: 4em; + margin-bottom: 15px; + animation: iconFloat 3s ease-in-out infinite; + text-shadow: 0 0 20px rgba(255, 255, 255, 0.5); +} + +@keyframes iconFloat { + 0%, 100% { + transform: translateY(0) scale(1); + filter: drop-shadow(0 0 10px rgba(255, 255, 255, 0.3)); + } + 50% { + transform: translateY(-10px) scale(1.05); + filter: drop-shadow(0 5px 15px rgba(255, 255, 255, 0.5)); + } +} + +.title { + font-size: 3.2em; + font-weight: 800; + color: rgba(255, 255, 255, 0.95); + margin-bottom: 10px; + text-shadow: 0 2px 10px rgba(0, 0, 0, 0.3); + letter-spacing: 2px; + animation: titleGlow 4s ease-in-out infinite alternate; +} + +@keyframes titleGlow { + 0% { + text-shadow: 0 2px 10px rgba(0, 0, 0, 0.3); + color: rgba(255, 255, 255, 0.95); + } + 100% { + text-shadow: 0 0 20px rgba(255, 255, 255, 0.8), 0 2px 10px rgba(0, 0, 0, 0.3); + color: rgba(255, 255, 255, 1); + } +} + +.subtitle { + font-size: 1.3em; + color: rgba(255, 255, 255, 0.8); + margin-bottom: 30px; + font-weight: 500; + text-shadow: 0 1px 5px rgba(0, 0, 0, 0.2); +} + +/* 日期选择器 */ +.date-selector { + display: flex; + align-items: flex-end; + justify-content: center; + gap: 20px; + margin-bottom: 25px; + flex-wrap: wrap; +} + +.input-group { + display: flex; + flex-direction: column; + gap: 8px; + min-width: 200px; +} + +.input-label { + display: flex; + align-items: center; + gap: 8px; + color: rgba(255, 255, 255, 0.9); + font-weight: 600; + font-size: 1em; + text-shadow: 0 1px 3px rgba(0, 0, 0, 0.3); +} + +.label-icon { + font-size: 1.2em; +} + +.date-input { + background: rgba(255, 255, 255, 0.1); + backdrop-filter: blur(10px); + -webkit-backdrop-filter: blur(10px); + border: 1px solid rgba(255, 255, 255, 0.3); + border-radius: 15px; + padding: 12px 16px; + color: rgba(255, 255, 255, 0.95); + font-size: 1em; + font-weight: 500; + transition: all 0.3s ease; + box-shadow: + 0 4px 15px rgba(31, 38, 135, 0.1), + inset 0 1px 0 rgba(255, 255, 255, 0.2); +} + +.date-input:focus { + outline: none; + border-color: rgba(255, 255, 255, 0.5); + background: rgba(255, 255, 255, 0.15); + box-shadow: + 0 6px 20px rgba(31, 38, 135, 0.2), + inset 0 1px 0 rgba(255, 255, 255, 0.3), + 0 0 0 3px rgba(255, 255, 255, 0.1); + transform: translateY(-2px); +} + +.date-input::-webkit-calendar-picker-indicator { + filter: invert(1); + opacity: 0.8; + cursor: pointer; +} + +.query-btn { + background: rgba(255, 255, 255, 0.15); + backdrop-filter: blur(15px); + -webkit-backdrop-filter: blur(15px); + color: rgba(255, 255, 255, 0.95); + border: 1px solid rgba(255, 255, 255, 0.3); + padding: 12px 28px; + border-radius: 20px; + cursor: pointer; + font-size: 1em; + font-weight: 600; + transition: all 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94); + display: flex; + align-items: center; + gap: 8px; + position: relative; + overflow: hidden; + text-shadow: 0 1px 3px rgba(0, 0, 0, 0.3); + box-shadow: + 0 4px 15px rgba(31, 38, 135, 0.2), + inset 0 1px 0 rgba(255, 255, 255, 0.3); +} + +.query-btn::before { + content: ''; + position: absolute; + top: 0; + left: -100%; + width: 100%; + height: 100%; + background: linear-gradient(90deg, + transparent, + rgba(255, 255, 255, 0.2), + transparent + ); + transition: left 0.6s ease; +} + +.query-btn:hover::before { + left: 100%; +} + +.query-btn:hover { + background: rgba(255, 255, 255, 0.2); + border-color: rgba(255, 255, 255, 0.4); + transform: translateY(-3px); + box-shadow: + 0 8px 25px rgba(31, 38, 135, 0.3), + inset 0 1px 0 rgba(255, 255, 255, 0.4); +} + +.btn-icon { + font-size: 1.2em; + transition: transform 0.3s ease; +} + +.query-btn:hover .btn-icon { + transform: scale(1.1) rotate(5deg); +} + +.update-time { + display: flex; + align-items: center; + justify-content: center; + gap: 8px; + color: rgba(255, 255, 255, 0.8); + font-size: 1em; + padding: 10px 20px; + background: rgba(255, 255, 255, 0.08); + backdrop-filter: blur(8px); + -webkit-backdrop-filter: blur(8px); + border-radius: 20px; + border: 1px solid rgba(255, 255, 255, 0.15); + display: inline-flex; + text-shadow: 0 1px 3px rgba(0, 0, 0, 0.2); +} + +.time-icon { + font-size: 1.2em; + animation: clockTick 2s infinite; +} + +@keyframes clockTick { + 0%, 50% { transform: rotate(0deg); } + 25% { transform: rotate(15deg); } + 75% { transform: rotate(-15deg); } +} + +/* 玻璃拟态加载动画 */ +.loading { + text-align: center; + padding: 60px 40px; + background: rgba(255, 255, 255, 0.1); + backdrop-filter: blur(25px); + -webkit-backdrop-filter: blur(25px); + border-radius: 25px; + margin-bottom: 25px; + border: 1px solid rgba(255, 255, 255, 0.2); + box-shadow: + 0 8px 32px 0 rgba(31, 38, 135, 0.2), + inset 0 1px 0 rgba(255, 255, 255, 0.3); +} + +.loading-content { + display: flex; + flex-direction: column; + align-items: center; + gap: 25px; +} + +.glass-spinner { + width: 60px; + height: 60px; + border: 4px solid rgba(255, 255, 255, 0.1); + border-top: 4px solid rgba(255, 255, 255, 0.8); + border-radius: 50%; + animation: glassSpinnerRotate 1.5s linear infinite; + position: relative; + backdrop-filter: blur(5px); + -webkit-backdrop-filter: blur(5px); +} + +.glass-spinner::before { + content: ''; + position: absolute; + top: -4px; + left: -4px; + right: -4px; + bottom: -4px; + border: 2px solid rgba(255, 255, 255, 0.05); + border-top: 2px solid rgba(255, 255, 255, 0.3); + border-radius: 50%; + animation: glassSpinnerRotate 2s linear infinite reverse; +} + +@keyframes glassSpinnerRotate { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} + +.loading-text { + display: flex; + flex-direction: column; + align-items: center; + gap: 15px; +} + +.loading-emoji { + font-size: 2.5em; + animation: mysticalPulse 2s ease-in-out infinite alternate; + filter: drop-shadow(0 0 10px rgba(255, 255, 255, 0.5)); +} + +@keyframes mysticalPulse { + 0% { + transform: scale(1); + filter: drop-shadow(0 0 10px rgba(255, 255, 255, 0.5)); + } + 100% { + transform: scale(1.1); + filter: drop-shadow(0 0 20px rgba(255, 255, 255, 0.8)); + } +} + +.loading-text p { + font-size: 1.2em; + color: rgba(255, 255, 255, 0.9); + font-weight: 600; + margin: 0; + text-shadow: 0 1px 3px rgba(0, 0, 0, 0.3); +} + +.loading-dots { + display: flex; + gap: 8px; +} + +.loading-dots span { + width: 10px; + height: 10px; + background: rgba(255, 255, 255, 0.7); + border-radius: 50%; + animation: glassDotsFloat 1.4s ease-in-out infinite both; + backdrop-filter: blur(2px); + -webkit-backdrop-filter: blur(2px); + box-shadow: 0 2px 8px rgba(255, 255, 255, 0.3); +} + +.loading-dots span:nth-child(1) { animation-delay: -0.32s; } +.loading-dots span:nth-child(2) { animation-delay: -0.16s; } +.loading-dots span:nth-child(3) { animation-delay: 0s; } + +@keyframes glassDotsFloat { + 0%, 80%, 100% { + transform: scale(0.8); + opacity: 0.5; + } + 40% { + transform: scale(1.2); + opacity: 1; + } +} + +/* 农历信息展示 */ +.lunar-info { + display: grid; + gap: 25px; + animation: infoFadeIn 0.8s ease-out; +} + +@keyframes infoFadeIn { + from { + opacity: 0; + transform: translateY(30px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +.info-card { + background: rgba(255, 255, 255, 0.12); + backdrop-filter: blur(20px); + -webkit-backdrop-filter: blur(20px); + border: 1px solid rgba(255, 255, 255, 0.2); + border-radius: 20px; + padding: 30px; + position: relative; + overflow: hidden; + transition: all 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94); + box-shadow: + 0 8px 32px 0 rgba(31, 38, 135, 0.15), + inset 0 1px 0 rgba(255, 255, 255, 0.3); +} + +.info-card::before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 3px; + background: linear-gradient(90deg, + rgba(255, 255, 255, 0.3), + rgba(255, 255, 255, 0.6), + rgba(255, 255, 255, 0.3) + ); + transform: scaleX(0); + transition: transform 0.4s ease; +} + +.info-card:hover::before { + transform: scaleX(1); +} + +.info-card:hover { + transform: translateY(-5px); + background: rgba(255, 255, 255, 0.15); + border-color: rgba(255, 255, 255, 0.3); + box-shadow: + 0 12px 40px 0 rgba(31, 38, 135, 0.2), + inset 0 1px 0 rgba(255, 255, 255, 0.4); +} + +.card-header { + display: flex; + align-items: center; + gap: 15px; + margin-bottom: 20px; +} + +.card-icon { + font-size: 2.5em; + animation: cardIconFloat 3s ease-in-out infinite; +} + +@keyframes cardIconFloat { + 0%, 100% { transform: translateY(0) rotate(0deg); } + 50% { transform: translateY(-5px) rotate(5deg); } +} + +.card-title { + font-size: 1.5em; + font-weight: 700; + color: rgba(255, 255, 255, 0.95); + text-shadow: 0 1px 3px rgba(0, 0, 0, 0.3); +} + +.card-content { + display: grid; + gap: 15px; +} + +.info-item { + display: flex; + align-items: center; + gap: 12px; + padding: 15px; + background: rgba(255, 255, 255, 0.08); + backdrop-filter: blur(10px); + -webkit-backdrop-filter: blur(10px); + border-radius: 15px; + border: 1px solid rgba(255, 255, 255, 0.15); + transition: all 0.3s ease; +} + +.info-item:hover { + background: rgba(255, 255, 255, 0.12); + transform: scale(1.02); +} + +.item-icon { + font-size: 1.3em; + min-width: 30px; + text-align: center; +} + +.item-label { + font-weight: 600; + color: rgba(255, 255, 255, 0.9); + min-width: 80px; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); +} + +.item-value { + font-weight: 700; + color: rgba(255, 255, 255, 0.95); + font-size: 1.1em; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); +} + +/* 错误信息 */ +.error-message { + text-align: center; + padding: 60px 40px; + background: rgba(255, 255, 255, 0.1); + backdrop-filter: blur(25px); + -webkit-backdrop-filter: blur(25px); + border-radius: 25px; + border: 1px solid rgba(255, 255, 255, 0.2); + box-shadow: + 0 8px 32px 0 rgba(31, 38, 135, 0.2), + inset 0 1px 0 rgba(255, 255, 255, 0.3); +} + +.error-content { + display: flex; + flex-direction: column; + align-items: center; + gap: 25px; +} + +.error-icon { + font-size: 4em; + animation: errorFloat 2s ease-in-out infinite alternate; + filter: drop-shadow(0 0 10px rgba(255, 255, 255, 0.3)); +} + +@keyframes errorFloat { + 0% { transform: translateY(0) rotate(-5deg); } + 100% { transform: translateY(-10px) rotate(5deg); } +} + +.error-content h3 { + font-size: 1.6em; + color: rgba(255, 255, 255, 0.95); + margin: 0; + font-weight: 700; + text-shadow: 0 1px 3px rgba(0, 0, 0, 0.3); +} + +.error-content p { + color: rgba(255, 255, 255, 0.8); + font-size: 1.1em; + margin: 0; + line-height: 1.6; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); +} + +.retry-btn { + background: rgba(255, 255, 255, 0.15); + backdrop-filter: blur(15px); + -webkit-backdrop-filter: blur(15px); + color: rgba(255, 255, 255, 0.95); + border: 1px solid rgba(255, 255, 255, 0.3); + padding: 12px 25px; + border-radius: 20px; + cursor: pointer; + font-size: 1em; + font-weight: 600; + transition: all 0.4s ease; + display: inline-flex; + align-items: center; + gap: 8px; + text-shadow: 0 1px 3px rgba(0, 0, 0, 0.3); + box-shadow: + 0 4px 15px rgba(31, 38, 135, 0.2), + inset 0 1px 0 rgba(255, 255, 255, 0.3); +} + +.retry-btn:hover { + background: rgba(255, 255, 255, 0.2); + border-color: rgba(255, 255, 255, 0.4); + transform: translateY(-2px); + box-shadow: + 0 6px 20px rgba(31, 38, 135, 0.3), + inset 0 1px 0 rgba(255, 255, 255, 0.4); +} + +.retry-btn span { + font-size: 1.1em; + transition: transform 0.3s ease; +} + +.retry-btn:hover span { + transform: rotate(180deg); +} + +/* 功能提示 */ +.feature-tips { + margin-top: 40px; +} + +.tip-card { + background: rgba(255, 255, 255, 0.1); + backdrop-filter: blur(20px); + -webkit-backdrop-filter: blur(20px); + border: 1px solid rgba(255, 255, 255, 0.2); + border-radius: 20px; + padding: 30px; + text-align: center; + box-shadow: + 0 8px 32px 0 rgba(31, 38, 135, 0.15), + inset 0 1px 0 rgba(255, 255, 255, 0.3); +} + +.tip-icon { + font-size: 3em; + margin-bottom: 15px; + animation: tipBlink 3s ease-in-out infinite; +} + +@keyframes tipBlink { + 0%, 100% { opacity: 1; transform: scale(1); } + 50% { opacity: 0.7; transform: scale(1.05); } +} + +.tip-card h3 { + font-size: 1.4em; + font-weight: 700; + color: rgba(255, 255, 255, 0.95); + margin-bottom: 20px; + text-shadow: 0 1px 3px rgba(0, 0, 0, 0.3); +} + +.tip-card ul { + list-style: none; + display: grid; + gap: 12px; + text-align: left; +} + +.tip-card li { + color: rgba(255, 255, 255, 0.9); + font-size: 1em; + padding: 10px 15px; + background: rgba(255, 255, 255, 0.08); + backdrop-filter: blur(5px); + -webkit-backdrop-filter: blur(5px); + border-radius: 10px; + border: 1px solid rgba(255, 255, 255, 0.15); + transition: all 0.3s ease; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); +} + +.tip-card li:hover { + background: rgba(255, 255, 255, 0.12); + transform: translateX(5px); +} + +/* 平板端适配 (768px - 1024px) */ +@media (min-width: 768px) and (max-width: 1024px) { + .container { + padding: 25px; + } + + .header { + padding: 35px 25px; + } + + .header-icon { + font-size: 3.5em; + } + + .title { + font-size: 2.8em; + letter-spacing: 1.5px; + } + + .subtitle { + font-size: 1.2em; + } + + .date-selector { + gap: 15px; + } + + .input-group { + min-width: 180px; + } + + .lunar-info { + grid-template-columns: repeat(auto-fit, minmax(400px, 1fr)); + gap: 20px; + } + + .info-card { + padding: 25px; + } +} + +/* 电脑端适配 (1025px+) */ +@media (min-width: 1025px) { + .container { + padding: 40px; + } + + .header { + padding: 50px 40px; + margin-bottom: 50px; + } + + .header-icon { + font-size: 4.5em; + } + + .title { + font-size: 3.8em; + letter-spacing: 3px; + } + + .subtitle { + font-size: 1.4em; + } + + .date-selector { + gap: 25px; + } + + .input-group { + min-width: 220px; + } + + .date-input { + padding: 14px 18px; + font-size: 1.05em; + } + + .query-btn { + padding: 14px 32px; + font-size: 1.05em; + } + + .lunar-info { + grid-template-columns: repeat(auto-fit, minmax(500px, 1fr)); + gap: 30px; + } + + .info-card { + padding: 35px; + } + + .card-title { + font-size: 1.6em; + } + + .item-label { + min-width: 100px; + } + + .item-value { + font-size: 1.15em; + } + + /* 电脑端特殊效果 */ + .info-card:hover { + transform: translateY(-8px) scale(1.02); + } +} + +/* 手机端适配 (767px以下) */ +@media (max-width: 767px) { + .container { + padding: 15px; + } + + .header { + padding: 25px 20px; + margin-bottom: 25px; + } + + .header-icon { + font-size: 2.8em; + } + + .title { + font-size: 2.2em; + letter-spacing: 1px; + } + + .subtitle { + font-size: 1em; + } + + .date-selector { + flex-direction: column; + gap: 15px; + align-items: center; + } + + .input-group { + width: 100%; + max-width: 300px; + min-width: auto; + } + + .date-input { + padding: 10px 14px; + font-size: 0.95em; + } + + .query-btn { + padding: 10px 24px; + font-size: 0.95em; + width: 100%; + max-width: 200px; + justify-content: center; + } + + .update-time { + font-size: 0.9em; + padding: 8px 16px; + } + + .info-card { + padding: 20px; + border-radius: 15px; + } + + .card-header { + gap: 12px; + margin-bottom: 15px; + } + + .card-icon { + font-size: 2em; + } + + .card-title { + font-size: 1.3em; + } + + .info-item { + padding: 12px; + flex-direction: column; + align-items: flex-start; + gap: 8px; + } + + .item-icon { + font-size: 1.2em; + } + + .item-label { + min-width: auto; + font-size: 0.9em; + } + + .item-value { + font-size: 1em; + } + + .tip-card { + padding: 20px; + } + + .tip-card ul { + gap: 10px; + } + + .tip-card li { + padding: 8px 12px; + font-size: 0.9em; + } +} + +/* 超小屏幕适配 (480px以下) */ +@media (max-width: 480px) { + .container { + padding: 12px; + } + + .header { + padding: 20px 15px; + margin-bottom: 20px; + } + + .header-icon { + font-size: 2.5em; + } + + .title { + font-size: 1.9em; + letter-spacing: 0.5px; + } + + .subtitle { + font-size: 0.95em; + } + + .date-selector { + gap: 12px; + } + + .input-group { + max-width: 280px; + } + + .date-input { + padding: 8px 12px; + font-size: 0.9em; + } + + .query-btn { + padding: 8px 20px; + font-size: 0.9em; + max-width: 180px; + } + + .update-time { + font-size: 0.85em; + padding: 6px 12px; + flex-direction: column; + gap: 4px; + } + + .lunar-info { + gap: 15px; + } + + .info-card { + padding: 18px 15px; + border-radius: 12px; + } + + .card-header { + gap: 10px; + margin-bottom: 12px; + } + + .card-icon { + font-size: 1.8em; + } + + .card-title { + font-size: 1.2em; + } + + .info-item { + padding: 10px; + gap: 6px; + } + + .item-icon { + font-size: 1.1em; + } + + .item-label { + font-size: 0.85em; + } + + .item-value { + font-size: 0.95em; + } + + .tip-card { + padding: 15px; + } + + .tip-icon { + font-size: 2.5em; + } + + .tip-card h3 { + font-size: 1.2em; + } + + .tip-card li { + padding: 6px 10px; + font-size: 0.85em; + } + + /* 超小屏幕性能优化 */ + .info-card { + transition: transform 0.2s ease, background 0.2s ease; + } + + .info-card::before { + display: none; + } + + .loading-content { + gap: 15px; + } + + .loading-emoji { + font-size: 2em; + } + + .error-icon { + font-size: 3em; + } +} + +/* 时辰宜忌特殊样式 */ +.hours-card { + grid-column: 1 / -1; /* 占满整行 */ +} + +.hours-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); + gap: 15px; + margin-top: 15px; +} + +.hour-item { + background: rgba(255, 255, 255, 0.1); + backdrop-filter: blur(10px); + border: 1px solid rgba(255, 255, 255, 0.2); + border-radius: 12px; + padding: 12px; + transition: all 0.3s ease; +} + +.hour-item:hover { + background: rgba(255, 255, 255, 0.15); + transform: translateY(-2px); + box-shadow: 0 8px 25px rgba(0, 0, 0, 0.1); +} + +.hour-name { + font-size: 14px; + font-weight: 600; + color: #ffffff; + text-align: center; + margin-bottom: 8px; + padding: 4px 8px; + background: rgba(255, 255, 255, 0.1); + border-radius: 6px; +} + +.hour-content { + font-size: 12px; + line-height: 1.4; +} + +.hour-recommends, +.hour-avoids { + margin: 4px 0; +} + +.hour-label { + font-weight: 600; + color: #ffffff; + margin-right: 4px; +} + +.hour-recommends .hour-label { + color: #4ade80; +} + +.hour-avoids .hour-label { + color: #f87171; +} + +.hour-text { + color: rgba(255, 255, 255, 0.9); +} + +/* 时辰宜忌响应式优化 */ +@media (max-width: 768px) { + .hours-grid { + grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); + gap: 10px; + } + + .hour-item { + padding: 8px; + } + + .hour-name { + font-size: 12px; + margin-bottom: 6px; + } + + .hour-content { + font-size: 11px; + } +} diff --git a/frontend/60sapi/实用功能/农历信息/index.html b/frontend/60sapi/实用功能/农历信息/index.html new file mode 100644 index 00000000..0e8aace3 --- /dev/null +++ b/frontend/60sapi/实用功能/农历信息/index.html @@ -0,0 +1,71 @@ + + + + + + 🌙 农历信息查询 + + + + +
+
+
🏮
+

🌙 农历信息查询 📅

+

传统文化 · 时光转换 · 节气查询

+ +
+
+ + +
+ +
+ +
+ + 等待查询... +
+
+ + + + + + + + + + + diff --git a/frontend/60sapi/实用功能/农历信息/js/script.js b/frontend/60sapi/实用功能/农历信息/js/script.js new file mode 100644 index 00000000..a2fb42cc --- /dev/null +++ b/frontend/60sapi/实用功能/农历信息/js/script.js @@ -0,0 +1,485 @@ +// API接口列表 +const API_ENDPOINTS = [ + "https://60s-cf.viki.moe", + "https://60s.viki.moe", + "https://60s.b23.run", + "https://60s.114128.xyz", + "https://60s-cf.114128.xyz" +]; + +// 当前使用的API索引 +let currentApiIndex = 0; + +// DOM元素 +const loadingElement = document.getElementById('loading'); +const lunarInfoElement = document.getElementById('lunarInfo'); +const errorMessageElement = document.getElementById('errorMessage'); +const updateTimeElement = document.getElementById('updateTime'); +const dateInput = document.getElementById('dateInput'); +const queryBtn = document.getElementById('queryBtn'); + +// 页面加载完成后初始化 +document.addEventListener('DOMContentLoaded', function() { + initializePage(); +}); + +// 初始化页面 +function initializePage() { + // 设置默认日期为今天 + const today = new Date(); + const dateString = today.toISOString().split('T')[0]; + dateInput.value = dateString; + + // 绑定事件 + queryBtn.addEventListener('click', queryLunarInfo); + dateInput.addEventListener('change', queryLunarInfo); + + // 自动查询当天信息 + queryLunarInfo(); +} + +// 查询农历信息 +async function queryLunarInfo() { + const selectedDate = dateInput.value; + if (!selectedDate) { + showError('请选择查询日期'); + return; + } + + showLoading(); + hideError(); + hideLunarInfo(); + + try { + const data = await fetchLunarData(selectedDate); + displayLunarInfo(data.data); + updateQueryTime(); + } catch (error) { + console.error('查询失败:', error); + showError('查询农历信息失败,请稍后重试'); + } + + hideLoading(); +} + +// 获取农历数据 +async function fetchLunarData(date) { + for (let i = 0; i < API_ENDPOINTS.length; i++) { + const apiUrl = API_ENDPOINTS[currentApiIndex]; + + try { + const response = await fetch(`${apiUrl}/v2/lunar?date=${date}`, { + method: 'GET', + headers: { + 'Accept': 'application/json', + }, + timeout: 10000 + }); + + if (!response.ok) { + throw new Error(`HTTP ${response.status}`); + } + + const data = await response.json(); + + if (data.code === 200 && data.data) { + return data; + } else { + throw new Error('数据格式错误'); + } + } catch (error) { + console.error(`API ${apiUrl} 请求失败:`, error); + currentApiIndex = (currentApiIndex + 1) % API_ENDPOINTS.length; + + if (i === API_ENDPOINTS.length - 1) { + throw new Error('所有API接口都无法访问'); + } + } + } +} + +// 显示农历信息 +function displayLunarInfo(lunarData) { + lunarInfoElement.innerHTML = ` +
+
+
📅
+
公历信息
+
+
+
+
🗓️
+
公历日期
+
${lunarData.solar.year}年${String(lunarData.solar.month).padStart(2, '0')}月${String(lunarData.solar.day).padStart(2, '0')}日
+
+
+
🌍
+
星期
+
${lunarData.solar.week_desc}
+
+
+
+
季节
+
${lunarData.solar.season_name_desc}
+
+
+
+
星座
+
${lunarData.constellation.name}
+
+
+
+ +
+
+
🌙
+
农历信息
+
+
+
+
🏮
+
农历日期
+
${lunarData.lunar.desc_short}
+
+
+
🐲
+
生肖年
+
${lunarData.zodiac.year}年
+
+
+
+
天干地支
+
${lunarData.sixty_cycle.year.name}
+
+
+
🌙
+
月相
+
${lunarData.phase.name}
+
+
+
+ +
+
+
🌸
+
节气节日
+
+
+
+
🍃
+
当前节气
+
${lunarData.term.stage ? lunarData.term.stage.name : '无节气'}
+
+
+
🎊
+
法定假日
+
${lunarData.legal_holiday ? lunarData.legal_holiday.name : '无假日'}
+
+
+
+
传统节日
+
${lunarData.festival.both_desc || '无特殊节日'}
+
+
+
🔢
+
一年第几天
+
第${lunarData.stats.day_of_year}天
+
+
+
+ +
+
+
+
时辰干支
+
+
+
+
🕐
+
当前时辰
+
${lunarData.lunar.hour_desc}
+
+
+
+
时辰干支
+
${lunarData.sixty_cycle.hour.name}
+
+
+
🐓
+
时辰生肖
+
${lunarData.zodiac.hour}
+
+
+
🎵
+
纳音
+
${lunarData.nayin.hour}
+
+
+
+ +
+
+
🔮
+
黄历宜忌
+
+
+
+
+
+
${formatTabooText(lunarData.taboo.day.recommends)}
+
+
+
+
+
${formatTabooText(lunarData.taboo.day.avoids)}
+
+
+
🕐
+
时辰宜
+
${formatTabooText(lunarData.taboo.hour.recommends)}
+
+
+
🚫
+
时辰忌
+
${formatTabooText(lunarData.taboo.hour.avoids)}
+
+
+
+ +
+
+
🌟
+
运势财运
+
+
+
+
🎯
+
今日运势
+
${lunarData.fortune.today_luck}
+
+
+
💼
+
事业运
+
${lunarData.fortune.career}
+
+
+
💰
+
财运
+
${lunarData.fortune.money}
+
+
+
💕
+
感情运
+
${lunarData.fortune.love}
+
+
+
+ +
+
+
📊
+
年度统计
+
+
+
+
📈
+
年度进度
+
${lunarData.stats.percents_formatted.year}
+
+
+
📅
+
本月进度
+
${lunarData.stats.percents_formatted.month}
+
+
+
🗓️
+
本周第几天
+
第${lunarData.stats.week_of_month}周
+
+
+
+
今日进度
+
${lunarData.stats.percents_formatted.day}
+
+
+
+ + ${generateHourlyTaboo(lunarData.taboo.hours)} + `; + + showLunarInfo(); +} + +// 格式化宜忌文本 +function formatTabooText(text) { + if (!text) return '无'; + return text.replace(/\./g, '、'); +} + +// 生成十二时辰宜忌 +function generateHourlyTaboo(hours) { + if (!hours || hours.length === 0) return ''; + + const hourCards = hours.map(hour => ` +
+
${hour.hour}
+
+
+ 宜: + ${formatTabooText(hour.recommends) || '无'} +
+
+ 忌: + ${formatTabooText(hour.avoids) || '无'} +
+
+
+ `).join(''); + + return ` +
+
+
+
十二时辰宜忌
+
+
+
+ ${hourCards} +
+
+
+ `; +} + +// 更新查询时间 +function updateQueryTime() { + const now = new Date(); + const timeStr = now.toLocaleString('zh-CN', { + year: 'numeric', + month: '2-digit', + day: '2-digit', + hour: '2-digit', + minute: '2-digit', + second: '2-digit' + }); + updateTimeElement.textContent = `查询时间: ${timeStr}`; + + // 添加成功提示 + showSuccessMessage('🌙 农历信息已更新'); +} + +// 显示成功消息 +function showSuccessMessage(message) { + // 移除之前的提示 + const existingToast = document.querySelector('.success-toast'); + if (existingToast) { + existingToast.remove(); + } + + const toast = document.createElement('div'); + toast.className = 'success-toast'; + toast.textContent = message; + toast.style.cssText = ` + position: fixed; + top: 20px; + right: 20px; + background: rgba(255, 255, 255, 0.2); + backdrop-filter: blur(15px); + -webkit-backdrop-filter: blur(15px); + color: rgba(255, 255, 255, 0.95); + padding: 12px 20px; + border-radius: 25px; + border: 1px solid rgba(255, 255, 255, 0.3); + box-shadow: 0 8px 32px rgba(31, 38, 135, 0.2); + z-index: 1000; + font-weight: 600; + font-size: 0.9em; + animation: glassToastSlide 0.5s ease-out; + text-shadow: 0 1px 3px rgba(0, 0, 0, 0.3); + `; + + document.body.appendChild(toast); + + // 3秒后自动移除 + setTimeout(() => { + toast.style.animation = 'glassToastSlideOut 0.5s ease-in forwards'; + setTimeout(() => toast.remove(), 500); + }, 3000); +} + +// 显示加载状态 +function showLoading() { + loadingElement.style.display = 'block'; +} + +// 隐藏加载状态 +function hideLoading() { + loadingElement.style.display = 'none'; +} + +// 显示农历信息 +function showLunarInfo() { + lunarInfoElement.style.display = 'block'; +} + +// 隐藏农历信息 +function hideLunarInfo() { + lunarInfoElement.style.display = 'none'; +} + +// 显示错误信息 +function showError(message = '查询失败,请稍后重试') { + errorMessageElement.style.display = 'block'; + const errorContent = errorMessageElement.querySelector('.error-content p'); + if (errorContent) { + errorContent.textContent = message; + } +} + +// 隐藏错误信息 +function hideError() { + errorMessageElement.style.display = 'none'; +} + +// 添加CSS动画到页面 +if (!document.querySelector('#toast-styles')) { + const style = document.createElement('style'); + style.id = 'toast-styles'; + style.textContent = ` + @keyframes glassToastSlide { + from { + opacity: 0; + transform: translateX(100px) scale(0.8); + } + to { + opacity: 1; + transform: translateX(0) scale(1); + } + } + + @keyframes glassToastSlideOut { + from { + opacity: 1; + transform: translateX(0) scale(1); + } + to { + opacity: 0; + transform: translateX(100px) scale(0.8); + } + } + `; + document.head.appendChild(style); +} + +// 键盘快捷键支持 +document.addEventListener('keydown', function(e) { + if (e.key === 'Enter') { + e.preventDefault(); + queryLunarInfo(); + } + + if (e.key === 'r' && (e.ctrlKey || e.metaKey)) { + e.preventDefault(); + queryLunarInfo(); + } +}); diff --git a/frontend/60sapi/实用功能/农历信息/接口集合.json b/frontend/60sapi/实用功能/农历信息/接口集合.json new file mode 100644 index 00000000..04e92b7f --- /dev/null +++ b/frontend/60sapi/实用功能/农历信息/接口集合.json @@ -0,0 +1,7 @@ +[ + "https://60s-cf.viki.moe", + "https://60s.viki.moe", + "https://60s.b23.run", + "https://60s.114128.xyz", + "https://60s-cf.114128.xyz" +] diff --git a/frontend/60sapi/实用功能/农历信息/返回接口.json b/frontend/60sapi/实用功能/农历信息/返回接口.json new file mode 100644 index 00000000..910981d4 --- /dev/null +++ b/frontend/60sapi/实用功能/农历信息/返回接口.json @@ -0,0 +1,647 @@ +{ + "code": 200, + "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", + "data": { + "solar": { + "year": 2025, + "month": 9, + "day": 1, + "hour": 17, + "minute": 58, + "second": 47, + "full": "2025-09-01", + "full_with_time": "2025-09-01 17:58:47", + "week": 1, + "week_desc": "星期一", + "week_desc_short": "一", + "season": 3, + "season_desc": "三季度", + "season_desc_short": "三", + "season_name": "秋", + "season_name_desc": "秋天", + "is_leap_year": false + }, + "lunar": { + "year": "乙巳", + "month": "七", + "day": "初十", + "hour": "酉", + "full_with_hour": "农历乙巳年七月初十酉时", + "desc_short": "农历乙巳年七月初十", + "year_desc": "农历乙巳年", + "month_desc": "七月", + "day_desc": "初十", + "hour_desc": "酉时", + "is_leap_month": false + }, + "stats": { + "day_of_year": 244, + "week_of_year": 36, + "week_of_month": 1, + "percents": { + "year": 0.665753424657534, + "month": 0.0333333333333333, + "week": 0.142857142857143, + "day": 0.749161909722222 + }, + "percents_formatted": { + "year": "66.58%", + "month": "3.33%", + "week": "14.29%", + "day": "74.92%" + } + }, + "term": { + "today": null, + "stage": { + "name": "处暑", + "position": 10, + "is_jie": false, + "is_qi": true + } + }, + "zodiac": { + "year": "蛇", + "month": "鸡", + "day": "鸡", + "hour": "鸡" + }, + "sixty_cycle": { + "year": { + "heaven_stem": "乙", + "earth_branch": "巳", + "name": "乙巳年", + "name_short": "乙巳" + }, + "month": { + "heaven_stem": "乙", + "earth_branch": "酉", + "name": "乙酉月", + "name_short": "乙酉" + }, + "day": { + "heaven_stem": "癸", + "earth_branch": "酉", + "name": "癸酉日", + "name_short": "癸酉" + }, + "hour": { + "heaven_stem": "辛", + "earth_branch": "酉", + "name": "辛酉时", + "name_short": "辛酉" + } + }, + "legal_holiday": null, + "festival": { + "solar": null, + "lunar": null, + "both_desc": null + }, + "phase": { + "name": "宵月", + "position": 10 + }, + "constellation": { + "name": "处女座", + "name_short": "处女" + }, + "taboo": { + "day": { + "recommends": "解除.祭祀.祈福.求嗣.修造.动土.竖柱.上梁.安床.纳畜.盖屋.合脊.起基.入殓.破土.安葬", + "avoids": "出火.嫁娶.开光.进人口.出行.词讼.开市.入宅.移徙.赴任" + }, + "hour": { + "hour": "酉时", + "hour_short": "酉", + "avoids": "乘船.造桥", + "recommends": "嫁娶.出行.移徙.入宅.开市.赴任.祈福.安床.开仓.盖屋.修造.求财" + }, + "hours": [ + { + "hour": "酉时", + "hour_short": "酉", + "recommends": "嫁娶.出行.移徙.入宅.开市.赴任.祈福.安床.开仓.盖屋.修造.求财", + "avoids": "乘船.造桥" + }, + { + "hour": "戌时", + "hour_short": "戌", + "recommends": "嫁娶.移徙.安葬.进人口.求财", + "avoids": "出行.赴任.祈福.祭祀.开光.斋醮" + }, + { + "hour": "亥时", + "hour_short": "亥", + "recommends": "嫁娶.移徙.交易.入宅.开市.安葬.求嗣.求财", + "avoids": "出行.赴任.动土.祈福.祭祀.修造.开光.斋醮" + }, + { + "hour": "子时", + "hour_short": "子", + "recommends": "嫁娶.交易.入宅.开市.祈福.安葬.求嗣.求财", + "avoids": "出行.移徙.赴任.词讼.修造" + }, + { + "hour": "丑时", + "hour_short": "丑", + "recommends": "嫁娶.祈福.安葬.祭祀.酬神.求财", + "avoids": "出行.赴任.动土.修造" + }, + { + "hour": "寅时", + "hour_short": "寅", + "recommends": "嫁娶.出行.交易.开市.赴任.祈福.安床.祭祀.求嗣.求财", + "avoids": "盖屋.入殓.上梁" + }, + { + "hour": "卯时", + "hour_short": "卯", + "recommends": "嫁娶.交易.入宅.开市.祈福.安床.安葬.求嗣.求财", + "avoids": "出行.赴任.修造" + }, + { + "hour": "辰时", + "hour_short": "辰", + "recommends": "", + "avoids": "诸事不宜" + }, + { + "hour": "巳时", + "hour_short": "巳", + "recommends": "嫁娶.出行.移徙.入宅.开市.祈福.安床.盖屋.祭祀.作灶", + "avoids": "安葬.修造.开光" + }, + { + "hour": "午时", + "hour_short": "午", + "recommends": "嫁娶.出行.交易.开市.祈福.安床.求嗣.求财", + "avoids": "赴任.动土.词讼.修造" + }, + { + "hour": "未时", + "hour_short": "未", + "recommends": "嫁娶.入宅.祈福.安葬.祭祀.修造.酬神.求财", + "avoids": "出行.赴任" + }, + { + "hour": "申时", + "hour_short": "申", + "recommends": "嫁娶.出行.开市.赴任.安葬.求财", + "avoids": "祈福.祭祀.酬神.斋醮" + } + ] + }, + "julian_day": 2460919.5, + "nayin": { + "year": "覆灯火", + "month": "泉中水", + "day": "剑锋金", + "hour": "石榴木" + }, + "baizi": { + "year_baizi": "性格温和,为人正直诚信。", + "day_baizi": "性格温和,为人正直诚信。" + }, + "fortune": { + "today_luck": "今日学习运好,适合进修", + "career": "领导能力突出,升职有望", + "money": "偏财运不错,可小试投资", + "love": "感情需要沟通,避免误会" + }, + "constants": { + "legal_holiday_list": [ + { + "name": "元旦节", + "date": "2025-01-01", + "start": "2025-01-01", + "end": "2025-01-01" + }, + { + "name": "春节", + "date": "2025-01-29", + "start": "2025-01-26", + "end": "2025-02-08" + }, + { + "name": "清明节", + "date": "2025-04-04", + "start": "2025-04-04", + "end": "2025-04-06" + }, + { + "name": "劳动节", + "date": "2025-05-01", + "start": "2025-04-27", + "end": "2025-05-05" + }, + { + "name": "端午节", + "date": "2025-05-31", + "start": "2025-05-31", + "end": "2025-06-02" + }, + { + "name": "国庆中秋", + "date": "2025-10-01", + "start": "2025-09-28", + "end": "2025-10-11" + } + ], + "phase_list": [ + { + "name": "朔月", + "lunar_day": 1 + }, + { + "name": "既朔月", + "lunar_day": 2 + }, + { + "name": "蛾眉新月", + "lunar_day": 3 + }, + { + "name": "蛾眉新月", + "lunar_day": 4 + }, + { + "name": "蛾眉月", + "lunar_day": 5 + }, + { + "name": "夕月", + "lunar_day": 6 + }, + { + "name": "上弦月", + "lunar_day": 7 + }, + { + "name": "上弦月", + "lunar_day": 8 + }, + { + "name": "九夜月", + "lunar_day": 9 + }, + { + "name": "宵月", + "lunar_day": 10 + }, + { + "name": "宵月", + "lunar_day": 11 + }, + { + "name": "宵月", + "lunar_day": 12 + }, + { + "name": "渐盈凸月", + "lunar_day": 13 + }, + { + "name": "小望月", + "lunar_day": 14 + }, + { + "name": "望月", + "lunar_day": 15 + }, + { + "name": "既望月", + "lunar_day": 16 + }, + { + "name": "立待月", + "lunar_day": 17 + }, + { + "name": "居待月", + "lunar_day": 18 + }, + { + "name": "寝待月", + "lunar_day": 19 + }, + { + "name": "更待月", + "lunar_day": 20 + }, + { + "name": "渐亏凸月", + "lunar_day": 21 + }, + { + "name": "下弦月", + "lunar_day": 22 + }, + { + "name": "下弦月", + "lunar_day": 23 + }, + { + "name": "有明月", + "lunar_day": 24 + }, + { + "name": "有明月", + "lunar_day": 25 + }, + { + "name": "蛾眉残月", + "lunar_day": 26 + }, + { + "name": "蛾眉残月", + "lunar_day": 27 + }, + { + "name": "残月", + "lunar_day": 28 + }, + { + "name": "晓月", + "lunar_day": 29 + }, + { + "name": "晦月", + "lunar_day": 30 + } + ], + "zodiac_list": [ + "鼠", + "牛", + "虎", + "兔", + "龙", + "蛇", + "马", + "羊", + "猴", + "鸡", + "狗", + "猪" + ], + "constellation_list": [ + { + "name": "白羊", + "desc": "白羊座", + "start": "3月21日", + "end": "4月19日", + "range": "3月21日~4月19日", + "start_month": 3, + "start_day": 21, + "end_month": 4, + "end_day": 19 + }, + { + "name": "金牛", + "desc": "金牛座", + "start": "4月20日", + "end": "5月20日", + "range": "4月20日~5月20日", + "start_month": 4, + "start_day": 20, + "end_month": 5, + "end_day": 20 + }, + { + "name": "双子", + "desc": "双子座", + "start": "5月21日", + "end": "6月21日", + "range": "5月21日~6月21日", + "start_month": 5, + "start_day": 21, + "end_month": 6, + "end_day": 21 + }, + { + "name": "巨蟹", + "desc": "巨蟹座", + "start": "6月22日", + "end": "7月22日", + "range": "6月22日~7月22日", + "start_month": 6, + "start_day": 22, + "end_month": 7, + "end_day": 22 + }, + { + "name": "狮子", + "desc": "狮子座", + "start": "7月23日", + "end": "8月22日", + "range": "7月23日~8月22日", + "start_month": 7, + "start_day": 23, + "end_month": 8, + "end_day": 22 + }, + { + "name": "处女", + "desc": "处女座", + "start": "8月23日", + "end": "9月22日", + "range": "8月23日~9月22日", + "start_month": 8, + "start_day": 23, + "end_month": 9, + "end_day": 22 + }, + { + "name": "天秤", + "desc": "天秤座", + "start": "9月23日", + "end": "10月23日", + "range": "9月23日~10月23日", + "start_month": 9, + "start_day": 23, + "end_month": 10, + "end_day": 23 + }, + { + "name": "天蝎", + "desc": "天蝎座", + "start": "10月24日", + "end": "11月22日", + "range": "10月24日~11月22日", + "start_month": 10, + "start_day": 24, + "end_month": 11, + "end_day": 22 + }, + { + "name": "射手", + "desc": "射手座", + "start": "11月23日", + "end": "12月21日", + "range": "11月23日~12月21日", + "start_month": 11, + "start_day": 23, + "end_month": 12, + "end_day": 21 + }, + { + "name": "摩羯", + "desc": "摩羯座", + "start": "12月22日", + "end": "1月19日", + "range": "12月22日~1月19日", + "start_month": 12, + "start_day": 22, + "end_month": 1, + "end_day": 19 + }, + { + "name": "水瓶", + "desc": "水瓶座", + "start": "1月20日", + "end": "2月18日", + "range": "1月20日~2月18日", + "start_month": 1, + "start_day": 20, + "end_month": 2, + "end_day": 18 + }, + { + "name": "双鱼", + "desc": "双鱼座", + "start": "2月19日", + "end": "3月20日", + "range": "2月19日~3月20日", + "start_month": 2, + "start_day": 19, + "end_month": 3, + "end_day": 20 + } + ], + "heaven_stems": [ + "甲", + "乙", + "丙", + "丁", + "戊", + "己", + "庚", + "辛", + "壬", + "癸" + ], + "earth_branches": [ + "子", + "丑", + "寅", + "卯", + "辰", + "巳", + "午", + "未", + "申", + "酉", + "戌", + "亥" + ], + "solar_terms": [ + { + "name": "立春", + "desc": "春季开始" + }, + { + "name": "雨水", + "desc": "降雨增多" + }, + { + "name": "惊蛰", + "desc": "春雷乍响" + }, + { + "name": "春分", + "desc": "昼夜等长" + }, + { + "name": "清明", + "desc": "天清地明" + }, + { + "name": "谷雨", + "desc": "雨生百谷" + }, + { + "name": "立夏", + "desc": "夏季开始" + }, + { + "name": "小满", + "desc": "麦粒渐满" + }, + { + "name": "芒种", + "desc": "麦类收割" + }, + { + "name": "夏至", + "desc": "白昼最长" + }, + { + "name": "小暑", + "desc": "天气渐热" + }, + { + "name": "大暑", + "desc": "一年最热" + }, + { + "name": "立秋", + "desc": "秋季开始" + }, + { + "name": "处暑", + "desc": "暑热结束" + }, + { + "name": "白露", + "desc": "露水增多" + }, + { + "name": "秋分", + "desc": "昼夜等长" + }, + { + "name": "寒露", + "desc": "露水渐凉" + }, + { + "name": "霜降", + "desc": "开始降霜" + }, + { + "name": "立冬", + "desc": "冬季开始" + }, + { + "name": "小雪", + "desc": "开始降雪" + }, + { + "name": "大雪", + "desc": "降雪增多" + }, + { + "name": "冬至", + "desc": "白昼最短" + }, + { + "name": "小寒", + "desc": "天气渐冷" + }, + { + "name": "大寒", + "desc": "一年最冷" + } + ] + } + } +} \ No newline at end of file diff --git a/frontend/60sapi/实用功能/实时天气/css/background.css b/frontend/60sapi/实用功能/实时天气/css/background.css new file mode 100644 index 00000000..a9872b38 --- /dev/null +++ b/frontend/60sapi/实用功能/实时天气/css/background.css @@ -0,0 +1,145 @@ +/* 背景样式文件 */ +body { + background: linear-gradient(135deg, #e8f5e8 0%, #d4f1d4 25%, #c8ecc8 50%, #b8e6b8 75%, #a8d5ba 100%); + background-attachment: fixed; + background-size: 400% 400%; + animation: gradientShift 15s ease infinite; + position: relative; + overflow-x: hidden; +} + +/* 背景渐变动画 */ +@keyframes gradientShift { + 0% { + background-position: 0% 50%; + } + 50% { + background-position: 100% 50%; + } + 100% { + background-position: 0% 50%; + } +} + +/* 背景装饰元素 */ +body::before { + content: ''; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-image: + radial-gradient(circle at 20% 80%, rgba(168, 213, 186, 0.1) 0%, transparent 50%), + radial-gradient(circle at 80% 20%, rgba(107, 183, 123, 0.1) 0%, transparent 50%), + radial-gradient(circle at 40% 40%, rgba(200, 236, 200, 0.1) 0%, transparent 50%); + pointer-events: none; + z-index: -1; +} + +/* 浮动装饰圆点 */ +body::after { + content: ''; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-image: + radial-gradient(2px 2px at 20px 30px, rgba(168, 213, 186, 0.3), transparent), + radial-gradient(2px 2px at 40px 70px, rgba(107, 183, 123, 0.2), transparent), + radial-gradient(1px 1px at 90px 40px, rgba(200, 236, 200, 0.4), transparent), + radial-gradient(1px 1px at 130px 80px, rgba(168, 213, 186, 0.2), transparent), + radial-gradient(2px 2px at 160px 30px, rgba(107, 183, 123, 0.3), transparent); + background-repeat: repeat; + background-size: 200px 100px; + animation: float 20s linear infinite; + pointer-events: none; + z-index: -1; +} + +@keyframes float { + 0% { + transform: translateY(0px); + } + 50% { + transform: translateY(-10px); + } + 100% { + transform: translateY(0px); + } +} + +/* 云朵装饰效果 */ +.container::before { + content: ''; + position: absolute; + top: -50px; + right: -50px; + width: 200px; + height: 100px; + background: rgba(255, 255, 255, 0.1); + border-radius: 50px; + box-shadow: + -30px 20px 0 rgba(255, 255, 255, 0.08), + 30px 40px 0 rgba(255, 255, 255, 0.06); + animation: cloudFloat 25s ease-in-out infinite; + pointer-events: none; + z-index: -1; +} + +.container::after { + content: ''; + position: absolute; + bottom: -30px; + left: -30px; + width: 150px; + height: 80px; + background: rgba(255, 255, 255, 0.08); + border-radius: 40px; + box-shadow: + 20px 15px 0 rgba(255, 255, 255, 0.06), + -20px 25px 0 rgba(255, 255, 255, 0.04); + animation: cloudFloat 30s ease-in-out infinite reverse; + pointer-events: none; + z-index: -1; +} + +@keyframes cloudFloat { + 0%, 100% { + transform: translateX(0px) translateY(0px); + } + 25% { + transform: translateX(20px) translateY(-10px); + } + 50% { + transform: translateX(-10px) translateY(-20px); + } + 75% { + transform: translateX(15px) translateY(-5px); + } +} + +/* 响应式背景调整 */ +@media (max-width: 768px) { + body::after { + background-size: 150px 75px; + } + + .container::before, + .container::after { + display: none; + } +} + +@media (max-width: 480px) { + body { + background: linear-gradient(135deg, #e8f5e8 0%, #d4f1d4 50%, #a8d5ba 100%); + animation: none; + } + + body::before, + body::after { + display: none; + } +} \ No newline at end of file diff --git a/frontend/60sapi/实用功能/实时天气/css/style.css b/frontend/60sapi/实用功能/实时天气/css/style.css new file mode 100644 index 00000000..8a1e29f0 --- /dev/null +++ b/frontend/60sapi/实用功能/实时天气/css/style.css @@ -0,0 +1,409 @@ +/* 基础样式重置 */ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: 'Microsoft YaHei', Arial, sans-serif; + line-height: 1.6; + color: #333; + min-height: 100vh; +} + +.container { + max-width: 1200px; + margin: 0 auto; + padding: 20px; +} + +/* 头部样式 */ +.header { + text-align: center; + margin-bottom: 30px; +} + +.header h1 { + color: #2d5a3d; + font-size: 2.5rem; + font-weight: 300; + margin-bottom: 10px; +} + +/* 搜索区域 */ +.search-section { + margin-bottom: 30px; +} + +.search-box { + display: flex; + justify-content: center; + gap: 10px; + max-width: 500px; + margin: 0 auto; +} + +#cityInput { + flex: 1; + padding: 12px 16px; + border: 2px solid #a8d5ba; + border-radius: 25px; + font-size: 16px; + outline: none; + transition: all 0.3s ease; + background: rgba(255, 255, 255, 0.9); +} + +#cityInput:focus { + border-color: #6bb77b; + box-shadow: 0 0 10px rgba(107, 183, 123, 0.3); +} + +#searchBtn { + padding: 12px 24px; + background: linear-gradient(135deg, #6bb77b, #5a9f6a); + color: white; + border: none; + border-radius: 25px; + font-size: 16px; + cursor: pointer; + transition: all 0.3s ease; + white-space: nowrap; +} + +#searchBtn:hover { + background: linear-gradient(135deg, #5a9f6a, #4a8759); + transform: translateY(-2px); + box-shadow: 0 4px 12px rgba(107, 183, 123, 0.4); +} + +/* 加载动画 */ +.loading { + text-align: center; + padding: 40px; +} + +.spinner { + width: 40px; + height: 40px; + border: 4px solid #e8f5e8; + border-top: 4px solid #6bb77b; + border-radius: 50%; + animation: spin 1s linear infinite; + margin: 0 auto 20px; +} + +@keyframes spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} + +/* 天气容器 */ +.weather-container { + background: rgba(255, 255, 255, 0.95); + border-radius: 20px; + padding: 30px; + box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1); + backdrop-filter: blur(10px); + border: 1px solid rgba(168, 213, 186, 0.3); +} + +/* 位置信息 */ +.location-info { + text-align: center; + margin-bottom: 30px; + padding-bottom: 20px; + border-bottom: 2px solid #e8f5e8; +} + +.location-info h2 { + color: #2d5a3d; + font-size: 2rem; + margin-bottom: 5px; +} + +.location-info p { + color: #666; + font-size: 14px; +} + +/* 当前天气 */ +.current-weather { + margin-bottom: 30px; +} + +.weather-main { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 25px; +} + +.temperature { + font-size: 4rem; + font-weight: 300; + color: #2d5a3d; +} + +.unit { + font-size: 2rem; + color: #6bb77b; +} + +.weather-desc p:first-child { + font-size: 1.5rem; + color: #2d5a3d; + margin-bottom: 5px; +} + +.weather-desc p:last-child { + color: #666; + font-size: 14px; +} + +/* 天气详情 */ +.weather-details { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); + gap: 15px; +} + +.detail-item { + background: rgba(168, 213, 186, 0.1); + padding: 15px; + border-radius: 12px; + text-align: center; + border: 1px solid rgba(168, 213, 186, 0.2); +} + +.detail-item .label { + display: block; + color: #666; + font-size: 12px; + margin-bottom: 5px; + text-transform: uppercase; + letter-spacing: 0.5px; +} + +.detail-item span:last-child { + color: #2d5a3d; + font-weight: 600; + font-size: 16px; +} + +/* 生活指数 */ +.life-index { + margin-top: 30px; +} + +.life-index h3 { + color: #2d5a3d; + font-size: 1.5rem; + margin-bottom: 20px; + text-align: center; +} + +.index-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); + gap: 20px; +} + +.index-item { + display: flex; + align-items: center; + background: rgba(168, 213, 186, 0.05); + padding: 20px; + border-radius: 15px; + border: 1px solid rgba(168, 213, 186, 0.2); + transition: all 0.3s ease; +} + +.index-item:hover { + background: rgba(168, 213, 186, 0.1); + transform: translateY(-2px); + box-shadow: 0 4px 12px rgba(168, 213, 186, 0.2); +} + +.index-icon { + font-size: 2rem; + margin-right: 15px; + width: 50px; + text-align: center; +} + +.index-content h4 { + color: #2d5a3d; + font-size: 16px; + margin-bottom: 5px; +} + +.index-content p { + color: #6bb77b; + font-weight: 600; + margin-bottom: 3px; +} + +.index-content span { + color: #666; + font-size: 13px; + line-height: 1.4; +} + +/* 更新时间 */ +.update-time { + text-align: center; + margin-top: 30px; + padding-top: 20px; + border-top: 1px solid #e8f5e8; + color: #666; + font-size: 14px; +} + +/* 错误信息 */ +.error-message { + text-align: center; + padding: 40px; + background: rgba(255, 107, 107, 0.1); + border-radius: 15px; + border: 1px solid rgba(255, 107, 107, 0.2); + color: #d63031; +} + +/* 平板端适配 (768px - 1024px) */ +@media (min-width: 768px) and (max-width: 1024px) { + .container { + padding: 25px; + } + + .header h1 { + font-size: 2.2rem; + } + + .temperature { + font-size: 3.5rem; + } + + .weather-details { + grid-template-columns: repeat(3, 1fr); + } + + .index-grid { + grid-template-columns: repeat(2, 1fr); + } +} + +/* 电脑端适配 (1024px+) */ +@media (min-width: 1024px) { + .container { + padding: 40px; + } + + .weather-container { + padding: 40px; + } + + .weather-main { + justify-content: space-around; + } + + .weather-details { + grid-template-columns: repeat(6, 1fr); + } + + .index-grid { + grid-template-columns: repeat(3, 1fr); + } + + .search-box { + max-width: 600px; + } +} + +/* 手机端适配 (768px以下) */ +@media (max-width: 767px) { + .container { + padding: 15px; + } + + .header h1 { + font-size: 2rem; + } + + .search-box { + flex-direction: column; + gap: 15px; + } + + #searchBtn { + padding: 14px 24px; + } + + .weather-container { + padding: 20px; + margin: 0 -5px; + } + + .weather-main { + flex-direction: column; + text-align: center; + gap: 20px; + } + + .temperature { + font-size: 3rem; + } + + .weather-details { + grid-template-columns: repeat(2, 1fr); + gap: 10px; + } + + .detail-item { + padding: 12px; + } + + .index-grid { + grid-template-columns: 1fr; + gap: 15px; + } + + .index-item { + padding: 15px; + } + + .index-icon { + font-size: 1.5rem; + width: 40px; + margin-right: 12px; + } +} + +/* 超小屏幕适配 (480px以下) */ +@media (max-width: 480px) { + .container { + padding: 10px; + } + + .header h1 { + font-size: 1.8rem; + } + + .weather-container { + padding: 15px; + border-radius: 15px; + } + + .temperature { + font-size: 2.5rem; + } + + .weather-details { + grid-template-columns: 1fr; + } + + .detail-item { + padding: 10px; + } +} \ No newline at end of file diff --git a/frontend/60sapi/实用功能/实时天气/index.html b/frontend/60sapi/实用功能/实时天气/index.html new file mode 100644 index 00000000..474571a4 --- /dev/null +++ b/frontend/60sapi/实用功能/实时天气/index.html @@ -0,0 +1,140 @@ + + + + + + 实时天气查询 + + + + +
+
+

实时天气查询

+
+ +
+ +
+ + + + + + +
+ + + + \ No newline at end of file diff --git a/frontend/60sapi/实用功能/实时天气/js/script.js b/frontend/60sapi/实用功能/实时天气/js/script.js new file mode 100644 index 00000000..a3aaacda --- /dev/null +++ b/frontend/60sapi/实用功能/实时天气/js/script.js @@ -0,0 +1,252 @@ +// 天气查询应用 +class WeatherApp { + constructor() { + this.apiEndpoints = [ + 'https://60s-cf.viki.moe', + 'https://60s.viki.moe', + 'https://60s.b23.run', + 'https://60s.114128.xyz', + 'https://60s-cf.114128.xyz' + ]; + this.currentEndpointIndex = 0; + this.init(); + } + + init() { + this.bindEvents(); + // 页面加载时自动查询北京天气 + this.searchWeather('北京'); + } + + bindEvents() { + const searchBtn = document.getElementById('searchBtn'); + const cityInput = document.getElementById('cityInput'); + + searchBtn.addEventListener('click', () => { + const city = cityInput.value.trim(); + if (city) { + this.searchWeather(city); + } else { + this.showError('请输入城市名称'); + } + }); + + cityInput.addEventListener('keypress', (e) => { + if (e.key === 'Enter') { + const city = cityInput.value.trim(); + if (city) { + this.searchWeather(city); + } else { + this.showError('请输入城市名称'); + } + } + }); + + // 防止输入框为空时查询 + cityInput.addEventListener('input', () => { + const searchBtn = document.getElementById('searchBtn'); + searchBtn.disabled = !cityInput.value.trim(); + }); + } + + async searchWeather(city) { + this.showLoading(); + + for (let i = 0; i < this.apiEndpoints.length; i++) { + try { + const endpoint = this.apiEndpoints[this.currentEndpointIndex]; + const response = await this.fetchWeatherData(endpoint, city); + + if (response && response.code === 200) { + this.displayWeatherData(response.data); + return; + } + } catch (error) { + console.warn(`API ${this.apiEndpoints[this.currentEndpointIndex]} 请求失败:`, error); + } + + // 切换到下一个API端点 + this.currentEndpointIndex = (this.currentEndpointIndex + 1) % this.apiEndpoints.length; + } + + // 所有API都失败了 + this.showError('获取天气信息失败,请检查网络连接或稍后重试'); + } + + async fetchWeatherData(endpoint, city) { + const url = `${endpoint}/v2/weather?query=${encodeURIComponent(city)}`; + + const response = await fetch(url, { + method: 'GET', + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/json' + }, + timeout: 10000 + }); + + if (!response.ok) { + throw new Error(`HTTP ${response.status}`); + } + + return await response.json(); + } + + displayWeatherData(data) { + const { location, realtime } = data; + + // 显示位置信息 + document.getElementById('locationName').textContent = location.formatted; + document.getElementById('locationDetail').textContent = + `${location.province} ${location.city} | 邮编: ${location.zip_code}`; + + // 显示当前天气 + document.getElementById('temperature').textContent = realtime.temperature; + document.getElementById('weatherCondition').textContent = realtime.weather; + + // 体感温度转换(API返回的是华氏度,需要转换为摄氏度) + const feelsLikeCelsius = this.fahrenheitToCelsius(realtime.temperature_feels_like); + document.getElementById('feelsLike').textContent = + `体感温度 ${feelsLikeCelsius}°C`; + + // 显示天气详情 + document.getElementById('humidity').textContent = `${realtime.humidity}%`; + document.getElementById('windDirection').textContent = realtime.wind_direction; + document.getElementById('windStrength').textContent = realtime.wind_strength; + document.getElementById('pressure').textContent = `${realtime.pressure} hPa`; + document.getElementById('visibility').textContent = realtime.visibility; + + // 空气质量显示 + const aqiElement = document.getElementById('aqi'); + aqiElement.textContent = `${realtime.aqi} (PM2.5: ${realtime.pm25})`; + aqiElement.className = this.getAQIClass(realtime.aqi); + + // 显示生活指数 + const lifeIndex = realtime.life_index; + this.displayLifeIndex('comfort', lifeIndex.comfort); + this.displayLifeIndex('clothing', lifeIndex.clothing); + this.displayLifeIndex('umbrella', lifeIndex.umbrella); + this.displayLifeIndex('uv', lifeIndex.uv); + this.displayLifeIndex('travel', lifeIndex.travel); + this.displayLifeIndex('sport', lifeIndex.sport); + + // 显示更新时间 + document.getElementById('updateTime').textContent = + `${realtime.updated} (${realtime.updated_at})`; + + this.showWeatherContainer(); + } + + displayLifeIndex(type, indexData) { + const levelElement = document.getElementById(`${type}Level`); + const descElement = document.getElementById(`${type}Desc`); + + if (levelElement && descElement && indexData) { + levelElement.textContent = indexData.level; + descElement.textContent = indexData.desc; + + // 根据指数级别设置颜色 + levelElement.className = this.getIndexLevelClass(indexData.level); + } + } + + getAQIClass(aqi) { + if (aqi <= 50) return 'aqi-good'; + if (aqi <= 100) return 'aqi-moderate'; + if (aqi <= 150) return 'aqi-unhealthy-sensitive'; + if (aqi <= 200) return 'aqi-unhealthy'; + if (aqi <= 300) return 'aqi-very-unhealthy'; + return 'aqi-hazardous'; + } + + getIndexLevelClass(level) { + const levelMap = { + '优': 'level-excellent', + '良': 'level-good', + '适宜': 'level-suitable', + '舒适': 'level-comfortable', + '较适宜': 'level-fairly-suitable', + '不宜': 'level-unsuitable', + '较不宜': 'level-fairly-unsuitable', + '带伞': 'level-bring-umbrella', + '最弱': 'level-weakest', + '弱': 'level-weak', + '中等': 'level-moderate', + '强': 'level-strong', + '很强': 'level-very-strong' + }; + + return levelMap[level] || 'level-default'; + } + + // 华氏度转摄氏度 + fahrenheitToCelsius(fahrenheit) { + const celsius = (fahrenheit - 32) * 5 / 9; + return Math.round(celsius * 10) / 10; // 保留一位小数 + } + + showLoading() { + document.getElementById('loading').style.display = 'block'; + document.getElementById('weatherContainer').style.display = 'none'; + document.getElementById('errorMessage').style.display = 'none'; + } + + showWeatherContainer() { + document.getElementById('loading').style.display = 'none'; + document.getElementById('weatherContainer').style.display = 'block'; + document.getElementById('errorMessage').style.display = 'none'; + } + + showError(message) { + document.getElementById('loading').style.display = 'none'; + document.getElementById('weatherContainer').style.display = 'none'; + const errorElement = document.getElementById('errorMessage'); + errorElement.style.display = 'block'; + errorElement.querySelector('p').textContent = message; + } +} + +// 添加生活指数级别样式 +const style = document.createElement('style'); +style.textContent = ` + .aqi-good { color: #52c41a; } + .aqi-moderate { color: #faad14; } + .aqi-unhealthy-sensitive { color: #fa8c16; } + .aqi-unhealthy { color: #f5222d; } + .aqi-very-unhealthy { color: #a0206e; } + .aqi-hazardous { color: #722ed1; } + + .level-excellent, .level-suitable, .level-comfortable { color: #52c41a; } + .level-good, .level-fairly-suitable { color: #1890ff; } + .level-bring-umbrella, .level-moderate { color: #faad14; } + .level-unsuitable, .level-fairly-unsuitable { color: #f5222d; } + .level-weakest, .level-weak { color: #52c41a; } + .level-strong, .level-very-strong { color: #fa8c16; } + .level-default { color: #666; } +`; +document.head.appendChild(style); + +// 页面加载完成后初始化应用 +document.addEventListener('DOMContentLoaded', () => { + new WeatherApp(); +}); + +// 添加页面可见性检测,当页面重新可见时刷新数据 +document.addEventListener('visibilitychange', () => { + if (!document.hidden) { + const cityInput = document.getElementById('cityInput'); + const city = cityInput.value.trim() || '北京'; + // 延迟1秒刷新,避免频繁请求 + setTimeout(() => { + if (window.weatherApp) { + window.weatherApp.searchWeather(city); + } + }, 1000); + } +}); + +// 将应用实例暴露到全局,方便调试和其他功能调用 +window.weatherApp = null; +document.addEventListener('DOMContentLoaded', () => { + window.weatherApp = new WeatherApp(); +}); \ No newline at end of file diff --git a/frontend/60sapi/实用功能/实时天气/接口集合.json b/frontend/60sapi/实用功能/实时天气/接口集合.json new file mode 100644 index 00000000..04e92b7f --- /dev/null +++ b/frontend/60sapi/实用功能/实时天气/接口集合.json @@ -0,0 +1,7 @@ +[ + "https://60s-cf.viki.moe", + "https://60s.viki.moe", + "https://60s.b23.run", + "https://60s.114128.xyz", + "https://60s-cf.114128.xyz" +] diff --git a/frontend/60sapi/实用功能/实时天气/返回接口.json b/frontend/60sapi/实用功能/实时天气/返回接口.json new file mode 100644 index 00000000..a0243aa1 --- /dev/null +++ b/frontend/60sapi/实用功能/实时天气/返回接口.json @@ -0,0 +1,68 @@ +{ + "code": 200, + "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", + "data": { + "location": { + "province": "北京", + "city": "北京", + "town": "北京", + "formatted": "北京", + "location_id": "101010100", + "detail_url": "http://www.weather.com.cn/weather/101010100.shtml", + "is_province": true, + "is_city": false, + "is_town": false, + "area_code": "10", + "zip_code": "100000" + }, + "realtime": { + "weather": "小雨转多云", + "weather_desc": "未知", + "weather_code": "d7", + "temperature": 26, + "temperature_feels_like": 81.1, + "humidity": 78, + "wind_direction": "南风转北风", + "wind_strength": "\u003C3级", + "wind_speed": "5km/h", + "pressure": 1008, + "visibility": "8km", + "aqi": 37, + "pm25": 37, + "rainfall": 0, + "rainfall_24h": 0, + "updated": "2025-08-29 08:00:00", + "updated_at": "15:10", + "life_index": { + "comfort": { + "level": "舒适", + "desc": "白天温度宜人,风力不大。" + }, + "clothing": { + "level": "舒适", + "desc": "建议穿长袖衬衫单裤等服装。" + }, + "umbrella": { + "level": "带伞", + "desc": "有降水,带雨伞,短期外出可收起雨伞。" + }, + "uv": { + "level": "最弱", + "desc": "辐射弱,涂擦SPF8-12防晒护肤品。" + }, + "car_wash": { + "level": "不宜", + "desc": "有雨,雨水和泥水会弄脏爱车。" + }, + "travel": { + "level": "适宜", + "desc": "较弱降水和微风将伴您共赴旅程。" + }, + "sport": { + "level": "较不宜", + "desc": "有降水,推荐您在室内进行休闲运动。" + } + } + } + } +} \ No newline at end of file diff --git a/frontend/60sapi/实用功能/生成二维码/css/background.css b/frontend/60sapi/实用功能/生成二维码/css/background.css new file mode 100644 index 00000000..f0cd4e04 --- /dev/null +++ b/frontend/60sapi/实用功能/生成二维码/css/background.css @@ -0,0 +1,132 @@ +/* 背景样式文件 - 独立分离便于迁移 */ + +/* 主背景渐变 */ +body { + background: linear-gradient(135deg, + #e8f5e8 0%, + #f1f8e9 25%, + #e8f5e8 50%, + #c8e6c9 75%, + #e8f5e8 100%); + background-size: 400% 400%; + animation: backgroundShift 15s ease-in-out infinite; + position: relative; +} + +/* 背景动画 */ +@keyframes backgroundShift { + 0%, 100% { + background-position: 0% 50%; + } + 25% { + background-position: 100% 50%; + } + 50% { + background-position: 50% 100%; + } + 75% { + background-position: 50% 0%; + } +} + +/* 背景装饰元素 */ +body::before { + content: ''; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-image: + radial-gradient(circle at 20% 20%, rgba(76, 175, 80, 0.1) 0%, transparent 50%), + radial-gradient(circle at 80% 80%, rgba(129, 199, 132, 0.1) 0%, transparent 50%), + radial-gradient(circle at 40% 60%, rgba(165, 214, 167, 0.08) 0%, transparent 50%); + pointer-events: none; + z-index: -1; + animation: floatingBubbles 20s ease-in-out infinite; +} + +@keyframes floatingBubbles { + 0%, 100% { + transform: translateY(0px) rotate(0deg); + opacity: 1; + } + 33% { + transform: translateY(-20px) rotate(120deg); + opacity: 0.8; + } + 66% { + transform: translateY(10px) rotate(240deg); + opacity: 0.9; + } +} + +/* 背景粒子效果 */ +body::after { + content: ''; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-image: + radial-gradient(2px 2px at 20px 30px, rgba(76, 175, 80, 0.3), transparent), + radial-gradient(2px 2px at 40px 70px, rgba(129, 199, 132, 0.2), transparent), + radial-gradient(1px 1px at 90px 40px, rgba(165, 214, 167, 0.3), transparent), + radial-gradient(1px 1px at 130px 80px, rgba(76, 175, 80, 0.2), transparent), + radial-gradient(2px 2px at 160px 30px, rgba(129, 199, 132, 0.3), transparent); + background-repeat: repeat; + background-size: 200px 100px; + pointer-events: none; + z-index: -1; + animation: particleFloat 25s linear infinite; +} + +@keyframes particleFloat { + 0% { + transform: translateY(0px); + } + 100% { + transform: translateY(-100px); + } +} + +/* 响应式背景调整 */ +@media (max-width: 768px) { + body::after { + background-size: 150px 75px; + animation-duration: 20s; + } + + body::before { + animation-duration: 15s; + } +} + +@media (max-width: 480px) { + body::after { + background-size: 100px 50px; + animation-duration: 15s; + } + + body::before { + animation-duration: 12s; + } + + body { + animation-duration: 12s; + } +} + +/* 高性能模式 - 减少动画 */ +@media (prefers-reduced-motion: reduce) { + body, + body::before, + body::after { + animation: none; + } + + body { + background: linear-gradient(135deg, #e8f5e8 0%, #f1f8e9 50%, #c8e6c9 100%); + } +} \ No newline at end of file diff --git a/frontend/60sapi/实用功能/生成二维码/css/style.css b/frontend/60sapi/实用功能/生成二维码/css/style.css new file mode 100644 index 00000000..ca4dd96c --- /dev/null +++ b/frontend/60sapi/实用功能/生成二维码/css/style.css @@ -0,0 +1,468 @@ +/* 基础样式重置 */ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; + line-height: 1.6; + color: #2d5a3d; + min-height: 100vh; + overflow-x: hidden; +} + +/* 容器样式 */ +.container { + max-width: 1200px; + margin: 0 auto; + padding: 20px; + min-height: 100vh; + display: flex; + flex-direction: column; + position: relative; + z-index: 1; +} + +/* 头部样式 */ +.header { + text-align: center; + margin-bottom: 40px; + padding: 40px 20px; + background: rgba(255, 255, 255, 0.95); + backdrop-filter: blur(20px); + border-radius: 20px; + box-shadow: 0 8px 32px rgba(76, 175, 80, 0.1); + border: 1px solid rgba(76, 175, 80, 0.2); + position: relative; + overflow: hidden; +} + +.header::before { + content: ''; + position: absolute; + top: 0; + left: -100%; + width: 100%; + height: 4px; + background: linear-gradient(90deg, transparent, #4caf50, transparent); + animation: headerGlow 3s ease-in-out infinite; +} + +@keyframes headerGlow { + 0% { left: -100%; } + 50% { left: 100%; } + 100% { left: 100%; } +} + +.header h1 { + font-size: 2.5rem; + font-weight: 700; + background: linear-gradient(135deg, #4caf50, #81c784, #4caf50); + background-size: 200% 200%; + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; + margin-bottom: 10px; + animation: titleGradient 4s ease-in-out infinite; +} + +@keyframes titleGradient { + 0%, 100% { background-position: 0% 50%; } + 50% { background-position: 100% 50%; } +} + +.header p { + font-size: 1.1rem; + color: #66bb6a; + opacity: 0.9; +} + +/* 主要内容区域 */ +.main { + flex: 1; + display: grid; + grid-template-columns: 1fr 1fr; + gap: 40px; + align-items: start; +} + +/* 表单容器 */ +.form-container { + background: rgba(255, 255, 255, 0.95); + backdrop-filter: blur(20px); + padding: 35px; + border-radius: 20px; + box-shadow: 0 8px 32px rgba(76, 175, 80, 0.1); + border: 1px solid rgba(76, 175, 80, 0.2); + transition: all 0.3s ease; +} + +.form-container:hover { + transform: translateY(-5px); + box-shadow: 0 12px 40px rgba(76, 175, 80, 0.15); +} + +/* 表单样式 */ +.qr-form { + display: flex; + flex-direction: column; + gap: 25px; +} + +.input-group { + display: flex; + flex-direction: column; + gap: 8px; +} + +.input-group label { + font-weight: 600; + color: #2d5a3d; + font-size: 0.95rem; +} + +textarea, select { + padding: 12px 16px; + border: 2px solid rgba(76, 175, 80, 0.3); + border-radius: 12px; + font-size: 1rem; + background: rgba(255, 255, 255, 0.9); + transition: all 0.3s ease; + resize: vertical; +} + +textarea { + min-height: 100px; + font-family: inherit; +} + +textarea:focus, select:focus { + outline: none; + border-color: #4caf50; + box-shadow: 0 0 0 3px rgba(76, 175, 80, 0.1); + background: rgba(255, 255, 255, 1); +} + +.options-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); + gap: 20px; +} + +/* 按钮样式 */ +.generate-btn { + padding: 15px 30px; + background: linear-gradient(135deg, #4caf50, #66bb6a); + color: white; + border: none; + border-radius: 12px; + font-size: 1.1rem; + font-weight: 600; + cursor: pointer; + transition: all 0.3s ease; + position: relative; + overflow: hidden; + letter-spacing: 0.5px; +} + +.generate-btn::before { + content: ''; + position: absolute; + top: 0; + left: -100%; + width: 100%; + height: 100%; + background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent); + transition: left 0.5s ease; +} + +.generate-btn:hover::before { + left: 100%; +} + +.generate-btn:hover { + transform: translateY(-2px); + box-shadow: 0 8px 25px rgba(76, 175, 80, 0.3); +} + +.generate-btn:active { + transform: translateY(0); +} + +.generate-btn.loading .btn-text { + display: none; +} + +.generate-btn.loading .btn-loading { + display: inline; +} + +.btn-loading { + display: none; +} + +/* 结果容器 */ +.result-container { + background: rgba(255, 255, 255, 0.95); + backdrop-filter: blur(20px); + padding: 35px; + border-radius: 20px; + box-shadow: 0 8px 32px rgba(76, 175, 80, 0.1); + border: 1px solid rgba(76, 175, 80, 0.2); + min-height: 400px; + display: flex; + align-items: center; + justify-content: center; + transition: all 0.3s ease; +} + +/* 加载动画 */ +.loading { + text-align: center; + color: #4caf50; +} + +.loading-spinner { + width: 50px; + height: 50px; + border: 4px solid rgba(76, 175, 80, 0.2); + border-top: 4px solid #4caf50; + border-radius: 50%; + animation: spin 1s linear infinite; + margin: 0 auto 20px; +} + +@keyframes spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} + +/* 错误样式 */ +.error { + text-align: center; + color: #d32f2f; +} + +.error-icon { + font-size: 3rem; + margin-bottom: 15px; +} + +.error-message { + font-size: 1.1rem; + margin-bottom: 20px; + color: #666; +} + +.retry-btn { + padding: 10px 20px; + background: #4caf50; + color: white; + border: none; + border-radius: 8px; + cursor: pointer; + transition: all 0.3s ease; +} + +.retry-btn:hover { + background: #45a049; + transform: translateY(-1px); +} + +/* 结果显示 */ +.result { + width: 100%; + text-align: center; +} + +.qr-display { + margin-bottom: 25px; +} + +.qr-display img { + max-width: 100%; + height: auto; + border-radius: 12px; + box-shadow: 0 4px 20px rgba(76, 175, 80, 0.2); + transition: all 0.3s ease; +} + +.qr-display img:hover { + transform: scale(1.05); + box-shadow: 0 8px 30px rgba(76, 175, 80, 0.3); +} + +.result-info { + display: flex; + flex-direction: column; + gap: 20px; +} + +.result-text { + font-size: 1rem; + color: #666; + word-break: break-all; + background: rgba(76, 175, 80, 0.1); + padding: 12px; + border-radius: 8px; + border-left: 4px solid #4caf50; +} + +.result-actions { + display: flex; + gap: 10px; + justify-content: center; + flex-wrap: wrap; +} + +.download-btn, .copy-btn, .new-btn { + padding: 10px 16px; + border: none; + border-radius: 8px; + cursor: pointer; + font-size: 0.9rem; + font-weight: 500; + transition: all 0.3s ease; +} + +.download-btn { + background: #4caf50; + color: white; +} + +.copy-btn { + background: #2196f3; + color: white; +} + +.new-btn { + background: #ff9800; + color: white; +} + +.download-btn:hover, .copy-btn:hover, .new-btn:hover { + transform: translateY(-1px); + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2); +} + +/* 隐藏类 */ +.hidden { + display: none !important; +} + +/* 页脚样式 */ +.footer { + text-align: center; + margin-top: 40px; + padding: 25px; + background: rgba(255, 255, 255, 0.9); + backdrop-filter: blur(15px); + border-radius: 15px; + color: #66bb6a; + font-size: 0.9rem; + border: 1px solid rgba(76, 175, 80, 0.1); +} + +/* 平板端适配 (768px - 1024px) */ +@media (max-width: 1024px) and (min-width: 768px) { + .container { + max-width: 95%; + padding: 15px; + } + + .main { + gap: 30px; + } + + .header h1 { + font-size: 2.2rem; + } + + .form-container, .result-container { + padding: 25px; + } + + .options-grid { + grid-template-columns: repeat(2, 1fr); + } +} + +/* 手机端适配 (最大768px) */ +@media (max-width: 768px) { + .container { + padding: 10px; + } + + .header { + margin-bottom: 25px; + padding: 25px 15px; + } + + .header h1 { + font-size: 1.8rem; + } + + .header p { + font-size: 1rem; + } + + .main { + grid-template-columns: 1fr; + gap: 25px; + } + + .form-container, .result-container { + padding: 20px; + } + + .options-grid { + grid-template-columns: 1fr; + gap: 15px; + } + + .result-actions { + flex-direction: column; + align-items: center; + } + + .download-btn, .copy-btn, .new-btn { + width: 100%; + max-width: 200px; + } +} + +/* 小屏手机适配 (最大480px) */ +@media (max-width: 480px) { + .container { + padding: 8px; + } + + .header { + padding: 20px 10px; + margin-bottom: 20px; + } + + .header h1 { + font-size: 1.6rem; + } + + .form-container, .result-container { + padding: 15px; + border-radius: 15px; + } + + .generate-btn { + padding: 12px 20px; + font-size: 1rem; + } + + textarea { + min-height: 80px; + } + + .qr-display img { + max-width: 90%; + } +} \ No newline at end of file diff --git a/frontend/60sapi/实用功能/生成二维码/index.html b/frontend/60sapi/实用功能/生成二维码/index.html new file mode 100644 index 00000000..f9366891 --- /dev/null +++ b/frontend/60sapi/实用功能/生成二维码/index.html @@ -0,0 +1,98 @@ + + + + + + 二维码生成器 + + + + +
+
+

🔗 二维码生成器

+

快速生成高质量二维码

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

© 2024 二维码生成器 - 简单快捷的二维码生成工具

+
+
+ + + + \ No newline at end of file diff --git a/frontend/60sapi/实用功能/生成二维码/js/script.js b/frontend/60sapi/实用功能/生成二维码/js/script.js new file mode 100644 index 00000000..f09ff5a6 --- /dev/null +++ b/frontend/60sapi/实用功能/生成二维码/js/script.js @@ -0,0 +1,417 @@ +// 二维码生成器 JavaScript +class QRCodeGenerator { + constructor() { + this.apiEndpoints = []; + this.currentApiIndex = 0; + this.init(); + } + + // 初始化 + async init() { + await this.loadApiEndpoints(); + this.bindEvents(); + this.setupFormValidation(); + } + + // 加载API接口列表 + async loadApiEndpoints() { + try { + const response = await fetch('./接口集合.json'); + this.apiEndpoints = await response.json(); + console.log('已加载API接口:', this.apiEndpoints); + } catch (error) { + console.error('加载API接口失败:', error); + this.showError('加载配置失败,请刷新页面重试'); + } + } + + // 绑定事件 + bindEvents() { + const form = document.getElementById('qrForm'); + const retryBtn = document.querySelector('.retry-btn'); + const downloadBtn = document.querySelector('.download-btn'); + const copyBtn = document.querySelector('.copy-btn'); + const newBtn = document.querySelector('.new-btn'); + + form.addEventListener('submit', (e) => this.handleSubmit(e)); + retryBtn.addEventListener('click', () => this.retryGeneration()); + downloadBtn.addEventListener('click', () => this.downloadQRCode()); + copyBtn.addEventListener('click', () => this.copyImageLink()); + newBtn.addEventListener('click', () => this.resetForm()); + + // 实时字符计数 + const textArea = document.getElementById('text'); + textArea.addEventListener('input', () => this.updateCharCount()); + } + + // 设置表单验证 + setupFormValidation() { + const textArea = document.getElementById('text'); + const form = document.getElementById('qrForm'); + + textArea.addEventListener('blur', () => { + if (textArea.value.trim() === '') { + this.showFieldError(textArea, '请输入要生成二维码的内容'); + } else { + this.clearFieldError(textArea); + } + }); + } + + // 显示字段错误 + showFieldError(field, message) { + this.clearFieldError(field); + field.style.borderColor = '#d32f2f'; + const errorDiv = document.createElement('div'); + errorDiv.className = 'field-error'; + errorDiv.style.color = '#d32f2f'; + errorDiv.style.fontSize = '0.8rem'; + errorDiv.style.marginTop = '5px'; + errorDiv.textContent = message; + field.parentNode.appendChild(errorDiv); + } + + // 清除字段错误 + clearFieldError(field) { + field.style.borderColor = ''; + const errorDiv = field.parentNode.querySelector('.field-error'); + if (errorDiv) { + errorDiv.remove(); + } + } + + // 更新字符计数 + updateCharCount() { + const textArea = document.getElementById('text'); + const text = textArea.value; + const length = text.length; + + // 移除旧的计数显示 + const oldCounter = textArea.parentNode.querySelector('.char-counter'); + if (oldCounter) oldCounter.remove(); + + // 添加新的计数显示 + if (length > 0) { + const counter = document.createElement('div'); + counter.className = 'char-counter'; + counter.style.fontSize = '0.8rem'; + counter.style.color = '#666'; + counter.style.textAlign = 'right'; + counter.style.marginTop = '5px'; + counter.textContent = `${length} 个字符`; + textArea.parentNode.appendChild(counter); + } + } + + // 处理表单提交 + async handleSubmit(e) { + e.preventDefault(); + + const formData = new FormData(e.target); + const params = { + text: formData.get('text').trim(), + size: formData.get('size'), + level: formData.get('level'), + encoding: formData.get('encoding') + }; + + // 验证输入 + if (!params.text) { + this.showFieldError(document.getElementById('text'), '请输入要生成二维码的内容'); + return; + } + + this.showLoading(); + await this.generateQRCode(params); + } + + // 生成二维码 + async generateQRCode(params) { + let success = false; + let lastError = null; + + // 尝试所有API接口 + for (let i = 0; i < this.apiEndpoints.length; i++) { + const apiIndex = (this.currentApiIndex + i) % this.apiEndpoints.length; + const apiUrl = this.apiEndpoints[apiIndex]; + + try { + console.log(`尝试API ${apiIndex + 1}:`, apiUrl); + const result = await this.callAPI(apiUrl, params); + + if (result.success) { + this.currentApiIndex = apiIndex; // 记录成功的API + this.showResult(result.data, params); + success = true; + break; + } + } catch (error) { + console.warn(`API ${apiIndex + 1} 失败:`, error); + lastError = error; + } + } + + if (!success) { + this.showError(lastError?.message || '所有API接口都无法访问,请稍后重试'); + } + } + + // 调用API + async callAPI(baseUrl, params) { + const url = new URL('/v2/qrcode', baseUrl); + + // 添加查询参数 + Object.entries(params).forEach(([key, value]) => { + if (value) { + url.searchParams.append(key, value); + } + }); + + console.log('请求URL:', url.toString()); + + const controller = new AbortController(); + const timeoutId = setTimeout(() => controller.abort(), 10000); // 10秒超时 + + try { + const response = await fetch(url.toString(), { + method: 'GET', + signal: controller.signal, + headers: { + 'Accept': 'application/json, image/*' + } + }); + + clearTimeout(timeoutId); + + if (!response.ok) { + throw new Error(`HTTP ${response.status}: ${response.statusText}`); + } + + // 根据返回格式处理 + if (params.encoding === 'image') { + const blob = await response.blob(); + const imageUrl = URL.createObjectURL(blob); + return { + success: true, + data: { + imageUrl: imageUrl, + text: params.text, + size: params.size, + level: params.level, + format: 'image' + } + }; + } else { + const jsonData = await response.json(); + if (jsonData.code === 0 && jsonData.data) { + return { + success: true, + data: { + imageUrl: jsonData.data.data_uri, + text: params.text, + size: params.size, + level: params.level, + format: 'json', + base64: jsonData.data.base64, + mimeType: jsonData.data.mime_type + } + }; + } else { + throw new Error(jsonData.message || '生成失败'); + } + } + } catch (error) { + clearTimeout(timeoutId); + if (error.name === 'AbortError') { + throw new Error('请求超时,请重试'); + } + throw error; + } + } + + // 显示加载状态 + showLoading() { + this.hideAllStates(); + document.getElementById('loading').classList.remove('hidden'); + + const btn = document.querySelector('.generate-btn'); + btn.classList.add('loading'); + btn.disabled = true; + } + + // 显示错误 + showError(message) { + this.hideAllStates(); + const errorDiv = document.getElementById('error'); + const errorMessage = errorDiv.querySelector('.error-message'); + errorMessage.textContent = message; + errorDiv.classList.remove('hidden'); + + this.resetButton(); + } + + // 显示结果 + showResult(data, params) { + this.hideAllStates(); + + const resultDiv = document.getElementById('result'); + const qrImage = document.getElementById('qrImage'); + const resultText = document.querySelector('.result-text'); + + qrImage.src = data.imageUrl; + qrImage.alt = `二维码: ${data.text}`; + + resultText.innerHTML = ` + 内容: ${this.escapeHtml(data.text)}
+ 尺寸: ${data.size}x${data.size}
+ 容错级别: ${data.level}
+ 格式: ${data.format.toUpperCase()} + `; + + resultDiv.classList.remove('hidden'); + this.resetButton(); + + // 保存数据供下载使用 + this.currentQRData = data; + } + + // 隐藏所有状态 + hideAllStates() { + document.getElementById('loading').classList.add('hidden'); + document.getElementById('error').classList.add('hidden'); + document.getElementById('result').classList.add('hidden'); + } + + // 重置按钮状态 + resetButton() { + const btn = document.querySelector('.generate-btn'); + btn.classList.remove('loading'); + btn.disabled = false; + } + + // 重试生成 + async retryGeneration() { + const form = document.getElementById('qrForm'); + const formData = new FormData(form); + const params = { + text: formData.get('text').trim(), + size: formData.get('size'), + level: formData.get('level'), + encoding: formData.get('encoding') + }; + + this.showLoading(); + await this.generateQRCode(params); + } + + // 下载二维码 + downloadQRCode() { + if (!this.currentQRData) return; + + const link = document.createElement('a'); + link.href = this.currentQRData.imageUrl; + link.download = `qrcode_${Date.now()}.png`; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + + this.showToast('二维码已下载'); + } + + // 复制图片链接 + async copyImageLink() { + if (!this.currentQRData) return; + + try { + await navigator.clipboard.writeText(this.currentQRData.imageUrl); + this.showToast('链接已复制到剪贴板'); + } catch (error) { + console.error('复制失败:', error); + this.showToast('复制失败,请手动复制'); + } + } + + // 重置表单 + resetForm() { + document.getElementById('qrForm').reset(); + this.hideAllStates(); + this.currentQRData = null; + + // 清除字符计数 + const counter = document.querySelector('.char-counter'); + if (counter) counter.remove(); + + // 清除字段错误 + document.querySelectorAll('input, textarea, select').forEach(field => { + this.clearFieldError(field); + }); + + // 聚焦到文本框 + document.getElementById('text').focus(); + } + + // 显示提示消息 + showToast(message) { + // 移除旧的toast + const oldToast = document.querySelector('.toast'); + if (oldToast) oldToast.remove(); + + const toast = document.createElement('div'); + toast.className = 'toast'; + toast.style.cssText = ` + position: fixed; + top: 20px; + right: 20px; + background: #4caf50; + color: white; + padding: 12px 20px; + border-radius: 8px; + box-shadow: 0 4px 12px rgba(0,0,0,0.2); + z-index: 1000; + animation: slideIn 0.3s ease; + `; + toast.textContent = message; + + document.body.appendChild(toast); + + setTimeout(() => { + toast.style.animation = 'slideOut 0.3s ease'; + setTimeout(() => toast.remove(), 300); + }, 3000); + } + + // HTML转义 + escapeHtml(text) { + const div = document.createElement('div'); + div.textContent = text; + return div.innerHTML; + } +} + +// 添加CSS动画 +const style = document.createElement('style'); +style.textContent = ` + @keyframes slideIn { + from { transform: translateX(100%); opacity: 0; } + to { transform: translateX(0); opacity: 1; } + } + @keyframes slideOut { + from { transform: translateX(0); opacity: 1; } + to { transform: translateX(100%); opacity: 0; } + } +`; +document.head.appendChild(style); + +// 页面加载完成后初始化 +document.addEventListener('DOMContentLoaded', () => { + new QRCodeGenerator(); +}); + +// 错误处理 +window.addEventListener('error', (e) => { + console.error('全局错误:', e.error); +}); + +window.addEventListener('unhandledrejection', (e) => { + console.error('未处理的Promise拒绝:', e.reason); +}); \ No newline at end of file diff --git a/frontend/60sapi/实用功能/生成二维码/接口集合.json b/frontend/60sapi/实用功能/生成二维码/接口集合.json new file mode 100644 index 00000000..04e92b7f --- /dev/null +++ b/frontend/60sapi/实用功能/生成二维码/接口集合.json @@ -0,0 +1,7 @@ +[ + "https://60s-cf.viki.moe", + "https://60s.viki.moe", + "https://60s.b23.run", + "https://60s.114128.xyz", + "https://60s-cf.114128.xyz" +] diff --git a/frontend/60sapi/实用功能/生成二维码/返回接口.json b/frontend/60sapi/实用功能/生成二维码/返回接口.json new file mode 100644 index 00000000..8cea87e9 --- /dev/null +++ b/frontend/60sapi/实用功能/生成二维码/返回接口.json @@ -0,0 +1,10 @@ +{ + "code": 0, + "message": "success", + "data": { + "base64": "iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAACAASURBVHic7Z15fBTV...", + "data_uri": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAACAASURBVHic7Z15fBTV...", + "mime_type": "image/png", + "text": "https://example.com" + } +} \ No newline at end of file diff --git a/frontend/60sapi/实用功能/百度百科词条/css/background.css b/frontend/60sapi/实用功能/百度百科词条/css/background.css new file mode 100644 index 00000000..04fcd858 --- /dev/null +++ b/frontend/60sapi/实用功能/百度百科词条/css/background.css @@ -0,0 +1,192 @@ +/* 彩虹渐变背景样式 */ + +/* 主背景渐变 */ +body { + background: linear-gradient( + 135deg, + rgba(255, 107, 107, 0.3) 0%, + rgba(255, 165, 0, 0.3) 14.28%, + rgba(255, 255, 0, 0.25) 28.56%, + rgba(50, 205, 50, 0.3) 42.84%, + rgba(0, 191, 255, 0.3) 57.12%, + rgba(65, 105, 225, 0.3) 71.4%, + rgba(147, 112, 219, 0.3) 85.68%, + rgba(255, 105, 180, 0.3) 100% + ); + background-size: 400% 400%; + animation: rainbowShift 20s ease infinite; + min-height: 100vh; +} + +/* 彩虹渐变动画 */ +@keyframes rainbowShift { + 0% { + background-position: 0% 50%; + } + 50% { + background-position: 100% 50%; + } + 100% { + background-position: 0% 50%; + } +} + +/* 半透明覆盖层,增强可读性 */ +body::before { + content: ''; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: rgba(255, 255, 255, 0.4); + backdrop-filter: blur(2px); + z-index: -1; + pointer-events: none; +} + +/* 搜索按钮彩虹渐变 */ +.search-btn { + background: linear-gradient( + 45deg, + rgba(255, 107, 107, 0.8), + rgba(255, 165, 0, 0.8), + rgba(255, 255, 0, 0.7), + rgba(50, 205, 50, 0.8), + rgba(0, 191, 255, 0.8), + rgba(65, 105, 225, 0.8), + rgba(147, 112, 219, 0.8) + ); + background-size: 300% 300%; + animation: buttonRainbow 12s ease infinite; +} + +@keyframes buttonRainbow { + 0%, 100% { + background-position: 0% 50%; + } + 50% { + background-position: 100% 50%; + } +} + +/* 结果卡片边框彩虹渐变 */ +.result-card { + position: relative; + overflow: hidden; +} + +.result-card::before { + content: ''; + position: absolute; + top: -2px; + left: -2px; + right: -2px; + bottom: -2px; + background: linear-gradient( + 45deg, + rgba(255, 107, 107, 0.4), + rgba(255, 165, 0, 0.4), + rgba(255, 255, 0, 0.3), + rgba(50, 205, 50, 0.4), + rgba(0, 191, 255, 0.4), + rgba(65, 105, 225, 0.4), + rgba(147, 112, 219, 0.4), + rgba(255, 107, 107, 0.4) + ); + background-size: 400% 400%; + animation: borderRainbow 15s linear infinite; + border-radius: inherit; + z-index: -1; +} + +@keyframes borderRainbow { + 0% { + background-position: 0% 50%; + } + 100% { + background-position: 400% 50%; + } +} + +/* 加载动画彩虹效果 */ +.loading-spinner { + border: 4px solid rgba(255, 255, 255, 0.3); + border-top: 4px solid transparent; + border-image: linear-gradient( + 45deg, + #ff6b6b, + #ffa500, + #ffff00, + #32cd32, + #00bfff, + #4169e1, + #9370db + ) 1; + animation: spin 1s linear infinite, colorShift 3s ease infinite; +} + +@keyframes colorShift { + 0%, 100% { + filter: hue-rotate(0deg); + } + 50% { + filter: hue-rotate(180deg); + } +} + +/* 链接悬停彩虹效果 */ +.result-link:hover { + background: linear-gradient( + 90deg, + rgba(255, 107, 107, 0.7), + rgba(255, 165, 0, 0.7), + rgba(255, 255, 0, 0.6), + rgba(50, 205, 50, 0.7), + rgba(0, 191, 255, 0.7), + rgba(65, 105, 225, 0.7), + rgba(147, 112, 219, 0.7) + ); + background-size: 200% 200%; + animation: linkRainbow 3s ease infinite; + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; +} + +@keyframes linkRainbow { + 0%, 100% { + background-position: 0% 50%; + } + 50% { + background-position: 100% 50%; + } +} + +/* 标题彩虹文字效果 */ +.title { + background: linear-gradient( + 90deg, + rgba(255, 107, 107, 0.8), + rgba(255, 165, 0, 0.8), + rgba(255, 255, 0, 0.7), + rgba(50, 205, 50, 0.8), + rgba(0, 191, 255, 0.8), + rgba(65, 105, 225, 0.8), + rgba(147, 112, 219, 0.8) + ); + background-size: 200% 200%; + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; + animation: titleRainbow 8s ease infinite; +} + +@keyframes titleRainbow { + 0%, 100% { + background-position: 0% 50%; + } + 50% { + background-position: 100% 50%; + } +} \ No newline at end of file diff --git a/frontend/60sapi/实用功能/百度百科词条/css/style.css b/frontend/60sapi/实用功能/百度百科词条/css/style.css new file mode 100644 index 00000000..8de2ae2c --- /dev/null +++ b/frontend/60sapi/实用功能/百度百科词条/css/style.css @@ -0,0 +1,530 @@ +/* 基础样式重置 */ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: 'Microsoft YaHei', 'PingFang SC', 'Helvetica Neue', Arial, sans-serif; + line-height: 1.6; + color: #333; + overflow-x: hidden; +} + +/* 容器布局 */ +.container { + max-width: 1200px; + margin: 0 auto; + padding: 20px; + min-height: 100vh; + display: flex; + flex-direction: column; +} + +/* 头部样式 */ +.header { + text-align: center; + margin-bottom: 40px; + padding: 20px 0; +} + +.title { + font-size: 2.5rem; + font-weight: 700; + margin-bottom: 10px; + text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.1); +} + +.subtitle { + font-size: 1.1rem; + color: rgba(255, 255, 255, 0.9); + font-weight: 300; + text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.2); +} + +/* 主内容区域 */ +.main { + flex: 1; + display: flex; + flex-direction: column; + gap: 30px; +} + +/* 搜索区域 */ +.search-section { + display: flex; + justify-content: center; + align-items: center; +} + +.search-container { + display: flex; + width: 100%; + max-width: 600px; + background: rgba(255, 255, 255, 0.95); + border-radius: 50px; + padding: 8px; + box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2); + backdrop-filter: blur(10px); + transition: all 0.3s ease; +} + +.search-container:focus-within { + transform: translateY(-2px); + box-shadow: 0 15px 40px rgba(0, 0, 0, 0.3); +} + +.search-input { + flex: 1; + border: none; + outline: none; + padding: 15px 25px; + font-size: 1.1rem; + background: transparent; + color: #333; + border-radius: 50px; +} + +.search-input::placeholder { + color: #999; + font-weight: 300; +} + +.search-btn { + border: none; + outline: none; + padding: 15px 25px; + border-radius: 50px; + color: white; + font-size: 1rem; + font-weight: 600; + cursor: pointer; + display: flex; + align-items: center; + gap: 8px; + transition: all 0.3s ease; + min-width: 120px; + justify-content: center; +} + +.search-btn:hover { + transform: scale(1.05); + box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3); +} + +.search-btn:active { + transform: scale(0.98); +} + +.search-icon { + font-size: 1.2rem; +} + +/* 结果区域 */ +.result-section { + flex: 1; + display: flex; + justify-content: center; + align-items: flex-start; + min-height: 400px; +} + +/* 加载动画 */ +.loading { + display: flex; + flex-direction: column; + align-items: center; + gap: 20px; + padding: 40px; + color: rgba(255, 255, 255, 0.9); +} + +.loading-spinner { + width: 50px; + height: 50px; + border-radius: 50%; + animation: spin 1s linear infinite; +} + +@keyframes spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} + +/* 结果卡片 */ +.result-card { + width: 100%; + max-width: 800px; + background: rgba(255, 255, 255, 0.95); + border-radius: 20px; + padding: 30px; + box-shadow: 0 15px 40px rgba(0, 0, 0, 0.2); + backdrop-filter: blur(10px); + animation: slideUp 0.5s ease; +} + +@keyframes slideUp { + from { + opacity: 0; + transform: translateY(30px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +.result-header { + margin-bottom: 25px; + text-align: center; +} + +.result-title { + font-size: 2rem; + font-weight: 700; + color: #333; + margin-bottom: 10px; +} + +.result-description { + font-size: 1.1rem; + color: #666; + font-weight: 400; +} + +.result-content { + display: grid; + grid-template-columns: 1fr 2fr; + gap: 30px; + align-items: start; +} + +.result-image-container { + display: flex; + justify-content: center; +} + +.result-image { + width: 100%; + max-width: 250px; + height: auto; + border-radius: 15px; + box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15); + transition: transform 0.3s ease; +} + +.result-image:hover { + transform: scale(1.05); +} + +.result-text { + display: flex; + flex-direction: column; + gap: 20px; +} + +.result-abstract h3 { + font-size: 1.3rem; + color: #333; + margin-bottom: 10px; + font-weight: 600; +} + +.result-abstract p { + font-size: 1rem; + line-height: 1.8; + color: #555; + text-align: justify; +} + +.result-actions { + display: flex; + justify-content: flex-end; +} + +.result-link { + display: inline-flex; + align-items: center; + gap: 8px; + padding: 12px 24px; + background: rgba(0, 123, 255, 0.1); + color: #007bff; + text-decoration: none; + border-radius: 25px; + font-weight: 600; + transition: all 0.3s ease; + border: 2px solid transparent; +} + +.result-link:hover { + background: rgba(0, 123, 255, 0.2); + transform: translateY(-2px); + box-shadow: 0 5px 15px rgba(0, 123, 255, 0.3); +} + +.link-icon { + font-size: 1.2rem; + transition: transform 0.3s ease; +} + +.result-link:hover .link-icon { + transform: translateX(5px); +} + +/* 错误消息 */ +.error-message { + display: flex; + flex-direction: column; + align-items: center; + gap: 20px; + padding: 40px; + background: rgba(255, 255, 255, 0.95); + border-radius: 20px; + box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2); + backdrop-filter: blur(10px); + text-align: center; + max-width: 500px; + width: 100%; +} + +.error-icon { + font-size: 3rem; +} + +.error-message h3 { + color: #e74c3c; + font-size: 1.5rem; + margin-bottom: 10px; +} + +.error-message p { + color: #666; + font-size: 1rem; + line-height: 1.6; +} + +.retry-btn { + padding: 12px 24px; + background: #e74c3c; + color: white; + border: none; + border-radius: 25px; + font-size: 1rem; + font-weight: 600; + cursor: pointer; + transition: all 0.3s ease; +} + +.retry-btn:hover { + background: #c0392b; + transform: translateY(-2px); + box-shadow: 0 5px 15px rgba(231, 76, 60, 0.3); +} + +/* 欢迎消息 */ +.welcome-message { + display: flex; + flex-direction: column; + align-items: center; + gap: 20px; + padding: 60px 40px; + background: rgba(255, 255, 255, 0.9); + border-radius: 20px; + box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1); + backdrop-filter: blur(10px); + text-align: center; + max-width: 600px; + width: 100%; +} + +.welcome-icon { + font-size: 4rem; + opacity: 0.8; +} + +.welcome-message h3 { + color: #333; + font-size: 1.8rem; + font-weight: 600; + margin-bottom: 10px; +} + +.welcome-message p { + color: #666; + font-size: 1.1rem; + line-height: 1.6; + max-width: 400px; +} + +/* 页脚 */ +.footer { + text-align: center; + padding: 20px 0; + margin-top: 40px; + color: rgba(255, 255, 255, 0.8); + font-size: 0.9rem; +} + +/* 平板端适配 (768px - 1024px) */ +@media (max-width: 1024px) and (min-width: 768px) { + .container { + padding: 15px; + } + + .title { + font-size: 2.2rem; + } + + .result-content { + grid-template-columns: 1fr 1.5fr; + gap: 25px; + } + + .result-card { + padding: 25px; + } +} + +/* 手机端适配 (最大768px) */ +@media (max-width: 768px) { + .container { + padding: 10px; + } + + .header { + margin-bottom: 30px; + padding: 15px 0; + } + + .title { + font-size: 1.8rem; + } + + .subtitle { + font-size: 1rem; + } + + .search-container { + max-width: 100%; + padding: 6px; + } + + .search-input { + padding: 12px 20px; + font-size: 1rem; + } + + .search-btn { + padding: 12px 20px; + min-width: 100px; + font-size: 0.9rem; + } + + .search-text { + display: none; + } + + .result-card { + padding: 20px; + border-radius: 15px; + } + + .result-title { + font-size: 1.5rem; + } + + .result-description { + font-size: 1rem; + } + + .result-content { + grid-template-columns: 1fr; + gap: 20px; + } + + .result-image { + max-width: 200px; + } + + .result-abstract h3 { + font-size: 1.2rem; + } + + .result-abstract p { + font-size: 0.95rem; + line-height: 1.7; + } + + .result-actions { + justify-content: center; + } + + .welcome-message { + padding: 40px 20px; + } + + .welcome-icon { + font-size: 3rem; + } + + .welcome-message h3 { + font-size: 1.5rem; + } + + .welcome-message p { + font-size: 1rem; + } + + .error-message { + padding: 30px 20px; + } + + .error-icon { + font-size: 2.5rem; + } + + .error-message h3 { + font-size: 1.3rem; + } +} + +/* 小屏手机适配 (最大480px) */ +@media (max-width: 480px) { + .title { + font-size: 1.6rem; + } + + .search-container { + flex-direction: column; + gap: 10px; + padding: 15px; + border-radius: 20px; + } + + .search-input { + border-radius: 15px; + text-align: center; + } + + .search-btn { + border-radius: 15px; + justify-content: center; + } + + .search-text { + display: inline; + } + + .result-card { + padding: 15px; + } + + .result-title { + font-size: 1.3rem; + } + + .result-image { + max-width: 150px; + } +} \ No newline at end of file diff --git a/frontend/60sapi/实用功能/百度百科词条/index.html b/frontend/60sapi/实用功能/百度百科词条/index.html new file mode 100644 index 00000000..6b52b446 --- /dev/null +++ b/frontend/60sapi/实用功能/百度百科词条/index.html @@ -0,0 +1,83 @@ + + + + + + 百度百科词条查询 + + + + +
+
+

百度百科词条查询

+

探索知识的彩虹世界

+
+ +
+
+
+ + +
+
+ +
+ + + + + + +
+
📚
+

欢迎使用百度百科词条查询

+

在上方搜索框中输入您想了解的词条,开始探索知识的海洋

+
+
+
+ +
+

数据来源:百度百科

+
+
+ + + + \ No newline at end of file diff --git a/frontend/60sapi/实用功能/百度百科词条/js/script.js b/frontend/60sapi/实用功能/百度百科词条/js/script.js new file mode 100644 index 00000000..6dbc4939 --- /dev/null +++ b/frontend/60sapi/实用功能/百度百科词条/js/script.js @@ -0,0 +1,324 @@ +// 百度百科词条查询应用 +class BaikeApp { + constructor() { + // API接口列表 + this.apiEndpoints = [ + 'https://60s-cf.viki.moe', + 'https://60s.viki.moe', + 'https://60s.b23.run', + 'https://60s.114128.xyz', + 'https://60s-cf.114128.xyz' + ]; + + this.currentApiIndex = 0; + this.isLoading = false; + + this.initElements(); + this.bindEvents(); + } + + // 初始化DOM元素 + initElements() { + this.searchInput = document.getElementById('searchInput'); + this.searchBtn = document.getElementById('searchBtn'); + this.resultSection = document.getElementById('resultSection'); + this.loading = document.getElementById('loading'); + this.resultCard = document.getElementById('resultCard'); + this.errorMessage = document.getElementById('errorMessage'); + this.welcomeMessage = document.getElementById('welcomeMessage'); + this.retryBtn = document.getElementById('retryBtn'); + + // 结果显示元素 + this.resultTitle = document.getElementById('resultTitle'); + this.resultDescription = document.getElementById('resultDescription'); + this.resultImage = document.getElementById('resultImage'); + this.resultAbstract = document.getElementById('resultAbstract'); + this.resultLink = document.getElementById('resultLink'); + this.errorText = document.getElementById('errorText'); + } + + // 绑定事件 + bindEvents() { + // 搜索按钮点击事件 + this.searchBtn.addEventListener('click', () => { + this.handleSearch(); + }); + + // 输入框回车事件 + this.searchInput.addEventListener('keypress', (e) => { + if (e.key === 'Enter') { + this.handleSearch(); + } + }); + + // 重试按钮事件 + this.retryBtn.addEventListener('click', () => { + this.handleSearch(); + }); + + // 输入框焦点事件 + this.searchInput.addEventListener('focus', () => { + this.searchInput.select(); + }); + } + + // 处理搜索 + async handleSearch() { + const query = this.searchInput.value.trim(); + + if (!query) { + this.showError('请输入要查询的词条'); + this.searchInput.focus(); + return; + } + + if (this.isLoading) { + return; + } + + await this.searchBaike(query); + } + + // 搜索百科词条 + async searchBaike(query) { + this.showLoading(); + this.isLoading = true; + + // 重置API索引 + this.currentApiIndex = 0; + + const success = await this.tryApiCall(query); + + if (!success) { + this.showError('所有API接口都无法访问,请稍后重试'); + } + + this.isLoading = false; + } + + // 尝试API调用 + async tryApiCall(query) { + for (let i = 0; i < this.apiEndpoints.length; i++) { + const endpoint = this.apiEndpoints[this.currentApiIndex]; + + try { + const result = await this.callApi(endpoint, query); + if (result) { + this.showResult(result); + return true; + } + } catch (error) { + console.warn(`API ${endpoint} 调用失败:`, error.message); + } + + // 切换到下一个API + this.currentApiIndex = (this.currentApiIndex + 1) % this.apiEndpoints.length; + } + + return false; + } + + // 调用API + async callApi(endpoint, query) { + const url = `${endpoint}/v2/baike?word=${encodeURIComponent(query)}`; + + const controller = new AbortController(); + const timeoutId = setTimeout(() => controller.abort(), 10000); // 10秒超时 + + try { + const response = await fetch(url, { + method: 'GET', + signal: controller.signal, + headers: { + 'Accept': 'application/json', + } + }); + + clearTimeout(timeoutId); + + if (!response.ok) { + throw new Error(`HTTP ${response.status}: ${response.statusText}`); + } + + const data = await response.json(); + + if (data.code === 200 && data.data) { + return data.data; + } else { + throw new Error(data.message || '未找到相关词条'); + } + + } catch (error) { + clearTimeout(timeoutId); + + if (error.name === 'AbortError') { + throw new Error('请求超时'); + } + + throw error; + } + } + + // 显示加载状态 + showLoading() { + this.hideAllSections(); + this.loading.style.display = 'flex'; + } + + // 显示搜索结果 + showResult(data) { + this.hideAllSections(); + + // 填充数据 + this.resultTitle.textContent = data.title || '未知标题'; + this.resultDescription.textContent = data.description || '暂无描述'; + this.resultAbstract.textContent = data.abstract || '暂无摘要信息'; + + // 处理图片 + if (data.cover) { + this.resultImage.src = data.cover; + this.resultImage.style.display = 'block'; + this.resultImage.onerror = () => { + this.resultImage.style.display = 'none'; + }; + } else { + this.resultImage.style.display = 'none'; + } + + // 处理链接 + if (data.link) { + this.resultLink.href = data.link; + this.resultLink.style.display = 'inline-flex'; + } else { + this.resultLink.style.display = 'none'; + } + + this.resultCard.style.display = 'block'; + + // 滚动到结果区域 + this.resultCard.scrollIntoView({ + behavior: 'smooth', + block: 'start' + }); + } + + // 显示错误信息 + showError(message) { + this.hideAllSections(); + this.errorText.textContent = message; + this.errorMessage.style.display = 'flex'; + } + + // 隐藏所有区域 + hideAllSections() { + this.loading.style.display = 'none'; + this.resultCard.style.display = 'none'; + this.errorMessage.style.display = 'none'; + this.welcomeMessage.style.display = 'none'; + } + + // 显示欢迎信息 + showWelcome() { + this.hideAllSections(); + this.welcomeMessage.style.display = 'flex'; + } +} + +// 工具函数 +class Utils { + // 防抖函数 + static debounce(func, wait) { + let timeout; + return function executedFunction(...args) { + const later = () => { + clearTimeout(timeout); + func(...args); + }; + clearTimeout(timeout); + timeout = setTimeout(later, wait); + }; + } + + // 节流函数 + static throttle(func, limit) { + let inThrottle; + return function() { + const args = arguments; + const context = this; + if (!inThrottle) { + func.apply(context, args); + inThrottle = true; + setTimeout(() => inThrottle = false, limit); + } + }; + } + + // 格式化文本长度 + static truncateText(text, maxLength) { + if (text.length <= maxLength) { + return text; + } + return text.substring(0, maxLength) + '...'; + } + + // 检查是否为移动设备 + static isMobile() { + return window.innerWidth <= 768; + } +} + +// 页面加载完成后初始化应用 +document.addEventListener('DOMContentLoaded', () => { + // 初始化应用 + const app = new BaikeApp(); + + // 添加页面可见性变化监听 + document.addEventListener('visibilitychange', () => { + if (document.visibilityState === 'visible') { + // 页面重新可见时,聚焦搜索框 + if (!app.isLoading) { + app.searchInput.focus(); + } + } + }); + + // 添加窗口大小变化监听 + window.addEventListener('resize', Utils.throttle(() => { + // 响应式调整 + if (Utils.isMobile()) { + // 移动端特殊处理 + document.body.classList.add('mobile'); + } else { + document.body.classList.remove('mobile'); + } + }, 250)); + + // 初始检查设备类型 + if (Utils.isMobile()) { + document.body.classList.add('mobile'); + } + + // 页面加载完成后聚焦搜索框 + setTimeout(() => { + app.searchInput.focus(); + }, 500); + + // 添加键盘快捷键支持 + document.addEventListener('keydown', (e) => { + // Ctrl/Cmd + K 聚焦搜索框 + if ((e.ctrlKey || e.metaKey) && e.key === 'k') { + e.preventDefault(); + app.searchInput.focus(); + app.searchInput.select(); + } + + // ESC 清空搜索框 + if (e.key === 'Escape') { + app.searchInput.value = ''; + app.showWelcome(); + app.searchInput.focus(); + } + }); + + console.log('百度百科词条查询应用已初始化'); +}); \ No newline at end of file diff --git a/frontend/60sapi/实用功能/百度百科词条/接口集合.json b/frontend/60sapi/实用功能/百度百科词条/接口集合.json new file mode 100644 index 00000000..04e92b7f --- /dev/null +++ b/frontend/60sapi/实用功能/百度百科词条/接口集合.json @@ -0,0 +1,7 @@ +[ + "https://60s-cf.viki.moe", + "https://60s.viki.moe", + "https://60s.b23.run", + "https://60s.114128.xyz", + "https://60s-cf.114128.xyz" +] diff --git a/frontend/60sapi/实用功能/百度百科词条/返回接口.json b/frontend/60sapi/实用功能/百度百科词条/返回接口.json new file mode 100644 index 00000000..55ec21dc --- /dev/null +++ b/frontend/60sapi/实用功能/百度百科词条/返回接口.json @@ -0,0 +1,12 @@ +{ + "code": 200, + "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", + "data": { + "title": "西游记", + "description": "明代吴承恩创作的章回体长篇神魔小说", + "abstract": "《西游记》又名《西游释厄传》,是中国古代第一部浪漫主义章回体长篇神魔小说。最早的《西游记》版本是明代万历二十年金陵世德堂《新刻出像官板大字西游记》,未署作者姓名。鲁迅、董作宾等人根据《淮安府志》“吴承恩《西游记》”的记载予以最终论定“吴承恩原著”。该小说主要讲述了孙悟空出世,并寻菩提祖师学艺及大闹天宫后,与猪八戒、沙僧和白龙马一同护送唐僧西天取经,于路上历经险阻,降妖除魔,渡过了九九八十一难,成功...", + "cover": "https://bkimg.cdn.bcebos.com/pic/b7fd5266d01609248d763e43db0735fae6cd3412?x-bce-process=image/format,f_auto", + "has_other": true, + "link": "http://baike.baidu.com/subview/2583/5315045.htm" + } +} \ No newline at end of file diff --git a/frontend/60sapi/日更资讯/历史上的今天/css/style.css b/frontend/60sapi/日更资讯/历史上的今天/css/style.css new file mode 100644 index 00000000..93fb1485 --- /dev/null +++ b/frontend/60sapi/日更资讯/历史上的今天/css/style.css @@ -0,0 +1,388 @@ +/* 历史上的今天 - 手机端优先的响应式设计 */ + +/* 重置样式 */ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; + background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + min-height: 100vh; + color: #2c3e50; + line-height: 1.6; + overflow-x: hidden; +} + +.container { + max-width: 100%; + margin: 0 auto; + padding: 10px; +} + +/* 头部样式 - 手机端优先 */ +.header { + text-align: center; + margin-bottom: 20px; + background: rgba(255, 255, 255, 0.95); + border-radius: 15px; + padding: 20px 15px; + box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1); + backdrop-filter: blur(10px); +} + +.header h1 { + font-size: 1.8rem; + color: #2c3e50; + margin-bottom: 8px; + font-weight: 700; + display: flex; + align-items: center; + justify-content: center; + gap: 10px; + flex-wrap: wrap; +} + +.header p { + color: #7f8c8d; + font-size: 0.9rem; + line-height: 1.4; +} + +/* 日期显示 */ +.date-info { + background: rgba(255, 255, 255, 0.95); + border-radius: 12px; + padding: 15px; + margin-bottom: 15px; + text-align: center; + box-shadow: 0 3px 15px rgba(0, 0, 0, 0.08); +} + +.date-info h2 { + font-size: 1.3rem; + color: #2c3e50; + margin-bottom: 5px; +} + +.date-info .date-text { + color: #7f8c8d; + font-size: 0.9rem; +} + +/* 加载状态 */ +.loading { + text-align: center; + padding: 30px 15px; + background: rgba(255, 255, 255, 0.95); + border-radius: 12px; + box-shadow: 0 3px 15px rgba(0, 0, 0, 0.08); +} + +.spinner { + width: 35px; + height: 35px; + border: 3px solid #ecf0f1; + border-top: 3px solid #667eea; + border-radius: 50%; + animation: spin 1s linear infinite; + margin: 0 auto 15px; +} + +@keyframes spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} + +/* 历史事件容器 */ +.events-container { + background: rgba(255, 255, 255, 0.95); + border-radius: 15px; + padding: 15px; + margin-bottom: 15px; + box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08); + backdrop-filter: blur(10px); +} + +/* 统计信息 */ +.stats { + display: grid; + grid-template-columns: repeat(4, 1fr); + gap: 8px; + margin-bottom: 20px; +} + +.stat-item { + background: rgba(102, 126, 234, 0.1); + border-radius: 10px; + padding: 12px; + text-align: center; +} + +.stat-number { + font-size: 1.4rem; + font-weight: 700; + color: #667eea; + display: block; +} + +.stat-label { + color: #7f8c8d; + font-size: 0.8rem; + margin-top: 3px; +} + +/* 事件列表 */ +.events-list { + display: flex; + flex-direction: column; + gap: 12px; +} + +.event-card { + background: rgba(255, 255, 255, 0.9); + border-radius: 12px; + padding: 15px; + box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05); + transition: all 0.3s ease; + border-left: 4px solid #667eea; + position: relative; +} + +.event-card:hover { + transform: translateY(-2px); + box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1); +} + +/* 事件类型标签 */ +.event-type { + position: absolute; + top: 10px; + right: 10px; + padding: 4px 8px; + border-radius: 12px; + font-size: 0.7rem; + font-weight: 600; + text-transform: uppercase; +} + +.event-type.birth { + background: #e8f5e8; + color: #27ae60; +} + +.event-type.death { + background: #fdf2e9; + color: #e67e22; +} + +.event-type.event { + background: #ebf3fd; + color: #3498db; +} + +/* 事件年份 */ +.event-year { + font-size: 1.1rem; + font-weight: 700; + color: #667eea; + margin-bottom: 8px; + display: flex; + align-items: center; + gap: 8px; +} + +.event-year::before { + content: "📅"; + font-size: 1rem; +} + +/* 事件标题 */ +.event-title { + font-size: 1rem; + font-weight: 600; + color: #2c3e50; + margin-bottom: 8px; + line-height: 1.4; +} + +/* 事件描述 */ +.event-description { + color: #7f8c8d; + font-size: 0.85rem; + line-height: 1.5; + margin-bottom: 10px; +} + +/* 链接按钮 */ +.event-link { + display: inline-flex; + align-items: center; + gap: 5px; + color: #667eea; + text-decoration: none; + font-size: 0.8rem; + font-weight: 500; + padding: 6px 12px; + background: rgba(102, 126, 234, 0.1); + border-radius: 15px; + transition: all 0.3s ease; +} + +.event-link:hover { + background: rgba(102, 126, 234, 0.2); + transform: translateX(2px); +} + +.event-link::after { + content: "🔗"; + font-size: 0.7rem; +} + +/* 错误提示 */ +.error { + background: #fed7d7; + color: #c53030; + padding: 15px; + border-radius: 12px; + text-align: center; + border: 1px solid #feb2b2; + margin: 15px 0; + font-size: 0.9rem; +} + +/* 隐藏类 */ +.hidden { + display: none; +} + +/* 淡入动画 */ +.fade-in { + animation: fadeIn 0.6s ease-in; +} + +@keyframes fadeIn { + from { + opacity: 0; + transform: translateY(20px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +/* 平板端适配 (768px+) */ +@media (min-width: 768px) { + .container { + max-width: 750px; + padding: 20px; + } + + .header { + padding: 30px 25px; + } + + .header h1 { + font-size: 2.2rem; + } + + .header p { + font-size: 1rem; + } + + .date-info { + padding: 20px; + } + + .date-info h2 { + font-size: 1.5rem; + } + + .events-container { + padding: 25px; + } + + .stats { + gap: 15px; + } + + .event-card { + padding: 20px; + } + + .event-title { + font-size: 1.1rem; + } + + .event-description { + font-size: 0.9rem; + } +} + +/* 电脑端适配 (1024px+) */ +@media (min-width: 1024px) { + .container { + max-width: 1000px; + padding: 30px; + } + + .header { + padding: 40px 35px; + } + + .header h1 { + font-size: 2.5rem; + } + + .events-list { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 20px; + } + + .event-card { + padding: 25px; + } + + .event-title { + font-size: 1.2rem; + } + + .event-description { + font-size: 0.95rem; + } +} + +/* 大屏幕优化 (1200px+) */ +@media (min-width: 1200px) { + .container { + max-width: 1200px; + padding: 40px; + } + + .events-list { + grid-template-columns: repeat(3, 1fr); + gap: 25px; + } +} + +/* 滚动条样式 */ +::-webkit-scrollbar { + width: 6px; +} + +::-webkit-scrollbar-track { + background: rgba(255, 255, 255, 0.1); +} + +::-webkit-scrollbar-thumb { + background: rgba(102, 126, 234, 0.5); + border-radius: 3px; +} + +::-webkit-scrollbar-thumb:hover { + background: rgba(102, 126, 234, 0.7); +} \ No newline at end of file diff --git a/frontend/60sapi/日更资讯/历史上的今天/index.html b/frontend/60sapi/日更资讯/历史上的今天/index.html new file mode 100644 index 00000000..2f941a44 --- /dev/null +++ b/frontend/60sapi/日更资讯/历史上的今天/index.html @@ -0,0 +1,83 @@ + + + + + + + + 历史上的今天 - 60s API集合 + + + + + + + + + + + + + +
+ +
+

📚 历史上的今天

+

探索历史,了解今天在历史上发生的重要事件

+
+ + +
+
+ 加载中... +
+
+ + +
+
+

正在加载历史数据...

+
+ + +
+ + + +
+

历史事件

+
+
+ +
+
+
+
+ +
+ + + + + + + + \ No newline at end of file diff --git a/frontend/60sapi/日更资讯/历史上的今天/js/script.js b/frontend/60sapi/日更资讯/历史上的今天/js/script.js new file mode 100644 index 00000000..986eac74 --- /dev/null +++ b/frontend/60sapi/日更资讯/历史上的今天/js/script.js @@ -0,0 +1,295 @@ +// 历史上的今天 - JavaScript 功能实现 + +// API 配置 +const API = { + endpoints: [], + currentIndex: 0, + encoding: 'utf-8', + // 初始化API接口列表 + async init() { + try { + const res = await fetch('./接口集合.json'); + const endpoints = await res.json(); + this.endpoints = endpoints.map(endpoint => `${endpoint}/v2/today_in_history`); + } catch (e) { + // 如果无法加载接口集合,使用默认接口 + this.endpoints = ['https://60s.viki.moe/v2/today_in_history']; + } + }, + // 获取当前接口URL + getCurrentUrl() { + if (this.endpoints.length === 0) return null; + const url = new URL(this.endpoints[this.currentIndex]); + url.searchParams.append('encoding', this.encoding); + return url.toString(); + }, + // 切换到下一个接口 + switchToNext() { + this.currentIndex = (this.currentIndex + 1) % this.endpoints.length; + return this.currentIndex < this.endpoints.length; + }, + // 重置到第一个接口 + reset() { + this.currentIndex = 0; + } +}; + +// 事件类型映射 +const EVENT_TYPE_MAP = { + 'birth': { name: '诞生', icon: '🎂', color: '#27ae60' }, + 'death': { name: '逝世', icon: '🕊️', color: '#e67e22' }, + 'event': { name: '事件', icon: '📰', color: '#3498db' } +}; + +// DOM 元素 +let elements = {}; +let currentData = null; + +// 页面加载完成后初始化 +document.addEventListener('DOMContentLoaded', function() { + initElements(); + loadTodayInHistory(); +}); + +// 初始化 DOM 元素 +function initElements() { + elements = { + loading: document.getElementById('loading'), + content: document.getElementById('history-content'), + dateInfo: document.getElementById('date-info'), + dateText: document.getElementById('date-text'), + totalEvents: document.getElementById('total-events'), + birthEvents: document.getElementById('birth-events'), + deathEvents: document.getElementById('death-events'), + otherEvents: document.getElementById('other-events'), + eventsList: document.getElementById('events-list') + }; +} + +// 加载历史上的今天数据 +async function loadTodayInHistory() { + try { + showLoading(true); + + // 初始化API接口列表 + await API.init(); + + // 重置API索引到第一个接口 + API.reset(); + + // 尝试所有API接口 + for (let i = 0; i < API.endpoints.length; i++) { + try { + const url = API.getCurrentUrl(); + console.log(`尝试接口 ${i + 1}/${API.endpoints.length}: ${url}`); + + const response = await fetch(url, { + cache: 'no-store', + timeout: 10000 // 10秒超时 + }); + + if (!response.ok) { + throw new Error(`HTTP ${response.status}: ${response.statusText}`); + } + + const data = await response.json(); + console.log('API响应数据:', data); + + if (data.code === 200 && data.data) { + console.log(`接口 ${i + 1} 请求成功`); + currentData = data.data; + displayHistoryData(data.data); + return; + } else { + throw new Error(data.message || '获取数据失败'); + } + + } catch (error) { + console.warn(`接口 ${i + 1} 失败:`, error.message); + + // 如果不是最后一个接口,切换到下一个 + if (i < API.endpoints.length - 1) { + API.switchToNext(); + continue; + } + + // 所有接口都失败了,抛出错误 + throw new Error('所有接口都无法访问'); + } + } + + } catch (error) { + console.error('加载历史数据失败:', error); + showError(`加载失败: ${error.message}`); + } finally { + showLoading(false); + } +} + +// 显示历史数据 +function displayHistoryData(data) { + if (!data || !data.items) { + showError('没有获取到历史数据'); + return; + } + + // 更新日期信息 + updateDateInfo(data); + + // 更新统计信息 + updateStats(data.items); + + // 显示事件列表 + renderEventsList(data.items); + + // 显示内容区域 + if (elements.content) { + elements.content.classList.add('fade-in'); + elements.content.style.display = 'block'; + } +} + +// 更新日期信息 +function updateDateInfo(data) { + if (elements.dateText && data.date) { + const today = new Date(); + const year = today.getFullYear(); + elements.dateText.textContent = `${year}年${data.month}月${data.day}日`; + } +} + +// 更新统计信息 +function updateStats(items) { + const stats = { + total: items.length, + birth: items.filter(item => item.event_type === 'birth').length, + death: items.filter(item => item.event_type === 'death').length, + event: items.filter(item => item.event_type === 'event').length + }; + + if (elements.totalEvents) { + elements.totalEvents.textContent = stats.total; + } + + if (elements.birthEvents) { + elements.birthEvents.textContent = stats.birth; + } + + if (elements.deathEvents) { + elements.deathEvents.textContent = stats.death; + } + + if (elements.otherEvents) { + elements.otherEvents.textContent = stats.event; + } +} + +// 渲染事件列表 +function renderEventsList(items) { + if (!elements.eventsList || !items) return; + + // 按年份排序(从今到古) + const sortedItems = [...items].sort((a, b) => { + return parseInt(b.year) - parseInt(a.year); + }); + + elements.eventsList.innerHTML = ''; + + sortedItems.forEach(item => { + const eventCard = createEventCard(item); + elements.eventsList.appendChild(eventCard); + }); +} + +// 创建事件卡片 +function createEventCard(item) { + const card = document.createElement('div'); + card.className = 'event-card'; + + const eventType = EVENT_TYPE_MAP[item.event_type] || EVENT_TYPE_MAP['event']; + + card.innerHTML = ` +
${eventType.name}
+
${formatYear(item.year)}
+
${escapeHtml(item.title)}
+
${escapeHtml(item.description)}
+ ${item.link ? `了解更多` : ''} + `; + + return card; +} + +// 格式化年份显示 +function formatYear(year) { + const yearNum = parseInt(year); + if (yearNum < 0) { + return `公元前${Math.abs(yearNum)}年`; + } else if (yearNum < 1000) { + return `公元${yearNum}年`; + } else { + return `${yearNum}年`; + } +} + +// 显示加载状态 +function showLoading(show) { + if (elements.loading) { + elements.loading.style.display = show ? 'block' : 'none'; + } + + if (elements.content) { + elements.content.style.display = show ? 'none' : 'block'; + } +} + +// 显示错误信息 +function showError(message) { + if (elements.content) { + elements.content.innerHTML = ` +
+

😔 加载失败

+

${escapeHtml(message)}

+ +
+ `; + elements.content.style.display = 'block'; + } +} + +// HTML 转义 +function escapeHtml(text) { + const div = document.createElement('div'); + div.textContent = text; + return div.innerHTML; +} + +// 错误处理 +window.addEventListener('error', function(event) { + console.error('页面错误:', event.error); +}); + +// 网络状态监听 +window.addEventListener('online', function() { + console.log('网络已连接'); +}); + +window.addEventListener('offline', function() { + console.log('网络已断开'); + showError('网络连接已断开,请检查网络设置'); +}); + +// 导出全局方法 +window.TodayInHistory = { + loadTodayInHistory, + showError, + showLoading +}; \ No newline at end of file diff --git a/frontend/60sapi/日更资讯/历史上的今天/接口集合.json b/frontend/60sapi/日更资讯/历史上的今天/接口集合.json new file mode 100644 index 00000000..04e92b7f --- /dev/null +++ b/frontend/60sapi/日更资讯/历史上的今天/接口集合.json @@ -0,0 +1,7 @@ +[ + "https://60s-cf.viki.moe", + "https://60s.viki.moe", + "https://60s.b23.run", + "https://60s.114128.xyz", + "https://60s-cf.114128.xyz" +] diff --git a/frontend/60sapi/日更资讯/历史上的今天/返回接口.json b/frontend/60sapi/日更资讯/历史上的今天/返回接口.json new file mode 100644 index 00000000..8531e735 --- /dev/null +++ b/frontend/60sapi/日更资讯/历史上的今天/返回接口.json @@ -0,0 +1,102 @@ +{ + "code": 200, + "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", + "data": { + "date": "8-19", + "month": 8, + "day": 19, + "items": [ + { + "title": "罗马帝国开国皇帝奥古斯都逝世", + "year": "14", + "description": "奥古斯都(拉丁文 Augustus的中译,复数型 Augusti)的原意为“神圣的”、“高贵的”,带有宗教与神学式的意味。", + "event_type": "death", + "link": "https://baike.baidu.com/item/%E5%A5%A5%E5%8F%A4%E6%96%AF%E9%83%BD/14291" + }, + { + "title": "近代概率论的奠基者帕斯卡逝世", + "year": "1662", + "description": "布莱士·帕斯卡(Blaise Pascal ,1623-1662)是法国数学家、物理学家、哲学家、散文家。", + "event_type": "death", + "link": "https://baike.baidu.com/item/%E5%B8%83%E8%8E%B1%E5%A3%AB%C2%B7%E5%B8%95%E6%96%AF%E5%8D%A1" + }, + { + "title": "瑞典国王古斯塔夫三世发动政变夺取权力", + "year": "1772", + "description": "古斯塔夫三世(Gustavus III,1746-1792)是瑞典历史上褒贬最多的国王(1771-1792)。阿道夫·弗里德里克国王的儿子和继承者。", + "event_type": "event", + "link": "https://baike.baidu.com/item/%E5%8F%A4%E6%96%AF%E5%A1%94%E5%A4%AB%E4%B8%89%E4%B8%96" + }, + { + "title": "美国飞机设计师奥维尔·莱特诞生", + "year": "1871", + "description": "奥威尔莱特(公元1871~公元1948)。 奥维尔·莱特1871年生于美国俄亥俄州代顿市。上过中学,但实际上未获得毕业文凭。", + "event_type": "birth", + "link": "https://baike.baidu.com/item/%E5%A5%A5%E7%BB%B4%E5%B0%94%C2%B7%E8%8E%B1%E7%89%B9" + }, + { + "title": "法国著名时装设计师、香奈儿品牌创始人加布里埃·香奈儿出生", + "year": "1883", + "description": "香奈儿儿时入读修女院学校学得一手针线活。后来她与许多上流社会男士有过交往。1910年,毅然放弃嫁入豪门做阔太太的她在巴黎开设了一家女装帽子店,从此开创了香奈儿时尚帝国。", + "event_type": "birth", + "link": "https://baike.baidu.com/item/%E5%8A%A0%E5%B8%83%E9%87%8C%E5%9F%83%C2%B7%E9%A6%99%E5%A5%88%E5%84%BF/9480318" + }, + { + "title": "美国宇航员斯托里·马斯格雷夫出生", + "year": "1935", + "description": "斯托里·马斯格雷夫(Franklin Story Musgrave,1935年8月19日-),美国宇航员,拥有医学、数学、文学等六个学位,入选美国国家航空航天局(NASA)科学家宇航员。", + "event_type": "birth", + "link": "https://baike.baidu.com/item/%E6%96%AF%E6%89%98%E9%87%8C%C2%B7%E9%A9%AC%E6%96%AF%E6%A0%BC%E9%9B%B7%E5%A4%AB" + }, + { + "title": "纳粹德国陆军元帅京特·冯·克鲁格畏罪自杀", + "year": "1944", + "description": "汉斯·京特·冯·克卢格(Günther·von·Kluge, 1882年10月30日-1944年8月19日),纳粹德国陆军元帅(1940.7.19),著名军事家、统帅。", + "event_type": "death", + "link": "https://baike.baidu.com/item/%E4%BA%AC%E7%89%B9%C2%B7%E5%86%AF%C2%B7%E5%85%8B%E9%B2%81%E6%A0%BC" + }, + { + "title": "美国第42任总统克林顿出生", + "year": "1946", + "description": "威廉·杰斐逊·克林顿,美国律师、政治家,美国民主党成员,曾任阿肯色州州长和第42任美国总统。克林顿基金会主席 。", + "event_type": "birth", + "link": "https://baike.baidu.com/item/%E5%A8%81%E5%BB%89%C2%B7%E6%9D%B0%E6%96%90%E9%80%8A%C2%B7%E5%85%8B%E6%9E%97%E9%A1%BF" + }, + { + "title": "美国演员马修·派瑞出生", + "year": "1969", + "description": "马修·派瑞(Matthew Perry,1969年8月19日—2023年10月28日),出生于美国马萨诸塞州普利茅斯,美国、加拿大籍男演员、编剧。", + "event_type": "birth", + "link": "https://baike.baidu.com/item/%E9%A9%AC%E4%BF%AE%C2%B7%E6%B4%BE%E7%91%9E" + }, + { + "title": "北回归线标志塔在广州落成", + "year": "1985", + "description": "北回归线标志塔,是标志地理学上北回归线经过地方的建筑物。", + "event_type": "event", + "link": "https://baike.baidu.com/item/%E5%8C%97%E5%9B%9E%E5%BD%92%E7%BA%BF%E6%A0%87%E5%BF%97%E5%A1%94" + }, + { + "title": "“八一九事件”,苏联八月政变", + "year": "1991", + "description": "八一九事件,又称“苏联政变”、“八月政变”,指1991年8月19日-8月21日在苏联发生的一次政变。", + "event_type": "event", + "link": "https://baike.baidu.com/item/%E5%85%AB%E4%B8%80%E4%B9%9D%E4%BA%8B%E4%BB%B6" + }, + { + "title": "量子化学家莱纳斯·卡尔·鲍林逝世", + "year": "1994", + "description": "莱纳斯·卡尔·鲍林(Linus Carl Pauling,1901年2月28日—1994年8月19日),出生于美国俄勒冈州波特兰,化学家、美国国家科学院院士、美国艺术与科学院院士,1954年诺贝尔化学奖获得者。", + "event_type": "death", + "link": "https://baike.baidu.com/item/%E8%8E%B1%E7%BA%B3%E6%96%AF%C2%B7%E5%8D%A1%E5%B0%94%C2%B7%E9%B2%8D%E6%9E%97" + }, + { + "title": "中国三江源自然保护区成立", + "year": "2000", + "description": "青海三江源国家级自然保护区位于青藏高原腹地,青海省南部,地理位置介于东经89°24′~102°23′,北纬31°39′~36°16′之间,青海三江源国家级自然保护区属湿地类型的自然保护区。", + "event_type": "event", + "link": "https://baike.baidu.com/item/%E4%B8%89%E6%B1%9F%E6%BA%90%E8%87%AA%E7%84%B6%E4%BF%9D%E6%8A%A4%E5%8C%BA" + } + ] + } +} \ No newline at end of file diff --git a/frontend/60sapi/日更资讯/必应每日壁纸/css/style.css b/frontend/60sapi/日更资讯/必应每日壁纸/css/style.css new file mode 100644 index 00000000..ac8ca0e5 --- /dev/null +++ b/frontend/60sapi/日更资讯/必应每日壁纸/css/style.css @@ -0,0 +1,326 @@ +/* 必应每日壁纸 - 淡绿色清新风格样式 */ + +/* 重置样式 */ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; + background: linear-gradient(135deg, #a8e6cf 0%, #dcedc1 50%, #ffd3a5 100%); + min-height: 100vh; + color: #2d5016; + line-height: 1.6; + overflow-x: hidden; +} + +.container { + max-width: 1200px; + margin: 0 auto; + padding: 20px; +} + +/* 头部样式 */ +.header { + text-align: center; + margin-bottom: 30px; + background: rgba(255, 255, 255, 0.85); + border-radius: 20px; + padding: 30px; + box-shadow: 0 8px 25px rgba(45, 80, 22, 0.08); + backdrop-filter: blur(10px); +} + +.header h1 { + font-size: 2.5rem; + color: #2d5016; + margin-bottom: 10px; + font-weight: 700; + display: flex; + align-items: center; + justify-content: center; + gap: 15px; +} + +.header p { + color: #5a7c65; + font-size: 1.1rem; +} + +/* 加载状态 */ +.loading { + text-align: center; + padding: 40px; + background: rgba(255, 255, 255, 0.85); + border-radius: 15px; + box-shadow: 0 5px 20px rgba(45, 80, 22, 0.08); +} + +.spinner { + width: 40px; + height: 40px; + border: 4px solid #e8f5e8; + border-top: 4px solid #81c784; + border-radius: 50%; + animation: spin 1s linear infinite; + margin: 0 auto 20px; +} + +@keyframes spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} + +/* 壁纸容器 */ +.wallpaper-container { + background: rgba(255, 255, 255, 0.85); + border-radius: 20px; + padding: 30px; + box-shadow: 0 8px 25px rgba(45, 80, 22, 0.08); + backdrop-filter: blur(10px); + margin-bottom: 20px; +} + +/* 壁纸信息 */ +.wallpaper-info { + text-align: center; + margin-bottom: 25px; +} + +.wallpaper-title { + font-size: 1.8rem; + font-weight: 700; + color: #2d5016; + margin-bottom: 10px; +} + +.wallpaper-date { + color: #5a7c65; + font-size: 1rem; + margin-bottom: 15px; +} + +.wallpaper-description { + color: #2d5016; + font-size: 1.1rem; + line-height: 1.6; + max-width: 800px; + margin: 0 auto; +} + +/* 壁纸图片 */ +.wallpaper-image { + position: relative; + border-radius: 15px; + overflow: hidden; + box-shadow: 0 10px 30px rgba(45, 80, 22, 0.15); + margin: 20px 0; +} + +.wallpaper-image img { + width: 100%; + height: auto; + display: block; + transition: transform 0.3s ease; +} + +.wallpaper-image:hover img { + transform: scale(1.02); +} + +/* 下载按钮 */ +.download-section { + text-align: center; + margin-top: 25px; +} + +.download-btn { + background: linear-gradient(135deg, #81c784 0%, #66bb6a 100%); + color: white; + border: none; + padding: 15px 30px; + border-radius: 25px; + font-size: 1.1rem; + font-weight: 600; + cursor: pointer; + transition: all 0.3s ease; + box-shadow: 0 4px 15px rgba(129, 199, 132, 0.3); + text-decoration: none; + display: inline-flex; + align-items: center; + gap: 10px; +} + +.download-btn:hover { + transform: translateY(-2px); + box-shadow: 0 6px 20px rgba(129, 199, 132, 0.4); +} + +.download-btn:active { + transform: translateY(0); +} + +/* 错误提示 */ +.error { + background: #fed7d7; + color: #c53030; + padding: 20px; + border-radius: 15px; + text-align: center; + border: 1px solid #feb2b2; + margin: 20px 0; +} + +/* 版权信息 */ +.copyright { + background: rgba(255, 255, 255, 0.7); + border-radius: 15px; + padding: 20px; + text-align: center; + color: #5a7c65; + font-size: 0.9rem; + margin-top: 20px; +} + +/* 响应式设计 */ + +/* 平板端 */ +@media (max-width: 768px) { + .container { + padding: 15px; + } + + .header h1 { + font-size: 2rem; + flex-direction: column; + gap: 10px; + } + + .header { + padding: 20px; + } + + .wallpaper-container { + padding: 20px; + } + + .wallpaper-title { + font-size: 1.5rem; + } + + .wallpaper-description { + font-size: 1rem; + } +} + +/* 手机端 */ +@media (max-width: 480px) { + .container { + padding: 10px; + } + + .header { + padding: 15px; + margin-bottom: 20px; + } + + .header h1 { + font-size: 1.8rem; + } + + .wallpaper-container { + padding: 15px; + } + + .wallpaper-title { + font-size: 1.3rem; + } + + .wallpaper-description { + font-size: 0.95rem; + } + + .download-btn { + padding: 12px 25px; + font-size: 1rem; + width: 100%; + justify-content: center; + } + + .copyright { + padding: 15px; + font-size: 0.8rem; + } +} + +/* 大屏幕优化 */ +@media (min-width: 1200px) { + .container { + padding: 40px; + } + + .header { + padding: 40px; + } + + .wallpaper-container { + padding: 40px; + } + + .wallpaper-image { + max-height: 70vh; + overflow: hidden; + } + + .wallpaper-image img { + width: 100%; + height: 100%; + object-fit: cover; + } +} + +/* 特殊效果 */ +.fade-in { + animation: fadeIn 0.6s ease-in; +} + +@keyframes fadeIn { + from { + opacity: 0; + transform: translateY(20px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +/* 图片加载效果 */ +.wallpaper-image img { + opacity: 0; + transition: opacity 0.3s ease; +} + +.wallpaper-image img.loaded { + opacity: 1; +} + +/* 滚动条样式 */ +::-webkit-scrollbar { + width: 8px; +} + +::-webkit-scrollbar-track { + background: rgba(255, 255, 255, 0.1); +} + +::-webkit-scrollbar-thumb { + background: rgba(129, 199, 132, 0.5); + border-radius: 4px; +} + +::-webkit-scrollbar-thumb:hover { + background: rgba(129, 199, 132, 0.7); +} \ No newline at end of file diff --git a/frontend/60sapi/日更资讯/必应每日壁纸/index.html b/frontend/60sapi/日更资讯/必应每日壁纸/index.html new file mode 100644 index 00000000..ac3ecb85 --- /dev/null +++ b/frontend/60sapi/日更资讯/必应每日壁纸/index.html @@ -0,0 +1,42 @@ + + + + + + + + 必应每日壁纸 + + + + + + + + +
+ +
+

+ 🖼️ + 必应每日壁纸 +

+

每天为您呈现精美的必应壁纸,发现世界之美

+
+ + +
+
+

正在加载今日壁纸...

+
+ + +
+ +
+
+ + + + + \ No newline at end of file diff --git a/frontend/60sapi/日更资讯/必应每日壁纸/js/script.js b/frontend/60sapi/日更资讯/必应每日壁纸/js/script.js new file mode 100644 index 00000000..9e231288 --- /dev/null +++ b/frontend/60sapi/日更资讯/必应每日壁纸/js/script.js @@ -0,0 +1,315 @@ +// 必应每日壁纸 JavaScript 功能 + +// API配置 +const API = { + endpoints: [], + currentIndex: 0, + params: { + encoding: 'json' + }, + // 初始化API接口列表 + async init() { + try { + const res = await fetch('./接口集合.json'); + const endpoints = await res.json(); + this.endpoints = endpoints.map(endpoint => `${endpoint}/v2/bing`); + } catch (e) { + // 如果无法加载接口集合,使用默认接口 + this.endpoints = ['https://60s.viki.moe/v2/bing']; + } + }, + // 获取当前接口URL + getCurrentUrl() { + if (this.endpoints.length === 0) return null; + const url = new URL(this.endpoints[this.currentIndex]); + Object.keys(this.params).forEach(key => { + url.searchParams.append(key, this.params[key]); + }); + return url.toString(); + }, + // 切换到下一个接口 + switchToNext() { + this.currentIndex = (this.currentIndex + 1) % this.endpoints.length; + return this.currentIndex < this.endpoints.length; + }, + // 重置到第一个接口 + reset() { + this.currentIndex = 0; + } +}; + +// DOM元素 +let elements = {}; + +// 初始化 +document.addEventListener('DOMContentLoaded', function() { + initElements(); + loadWallpaper(); +}); + +// 初始化DOM元素 +function initElements() { + elements = { + container: document.getElementById('wallpaper-content'), + loading: document.getElementById('loading') + }; +} + +// 加载壁纸数据 +async function loadWallpaper() { + try { + showLoading(true); + + // 初始化API接口列表 + await API.init(); + + // 重置API索引到第一个接口 + API.reset(); + + // 尝试所有API接口 + for (let i = 0; i < API.endpoints.length; i++) { + try { + const url = API.getCurrentUrl(); + console.log(`尝试接口 ${i + 1}/${API.endpoints.length}: ${url}`); + + const response = await fetch(url, { + cache: 'no-store', + timeout: 10000 // 10秒超时 + }); + + if (!response.ok) { + throw new Error(`HTTP ${response.status}: ${response.statusText}`); + } + + const data = await response.json(); + console.log('API响应数据:', data); + + // 检查数据有效性 + if (data && (data.code === 200 || data.data)) { + console.log(`接口 ${i + 1} 请求成功`); + displayWallpaper(data); + return; + } + + throw new Error(data && data.message ? data.message : '接口返回异常'); + + } catch (error) { + console.warn(`接口 ${i + 1} 失败:`, error.message); + + // 如果不是最后一个接口,切换到下一个 + if (i < API.endpoints.length - 1) { + API.switchToNext(); + continue; + } + + // 所有接口都失败了,抛出错误 + throw new Error('所有接口都无法访问'); + } + } + + } catch (error) { + console.error('加载壁纸失败:', error); + showError('加载壁纸失败,请稍后重试'); + } finally { + showLoading(false); + } +} + +// 显示壁纸 +function displayWallpaper(data) { + if (!data) { + showError('没有获取到壁纸数据'); + return; + } + + // 提取壁纸信息 + const wallpaperInfo = extractWallpaperInfo(data); + + if (!wallpaperInfo || !wallpaperInfo.imageUrl) { + showError('壁纸图片链接无效'); + return; + } + + // 生成HTML内容 + const html = generateWallpaperHTML(wallpaperInfo); + + // 显示内容 + elements.container.innerHTML = html; + elements.container.classList.add('fade-in'); + + // 绑定图片加载事件 + bindImageEvents(); +} + +// 提取壁纸信息 +function extractWallpaperInfo(data) { + // 根据API响应结构提取信息 + let imageUrl = ''; + let title = '必应每日壁纸'; + let description = ''; + let date = new Date().toLocaleDateString('zh-CN'); + let copyright = ''; + + // 处理新的API响应格式 + if (data.data) { + const wallpaperData = data.data; + title = wallpaperData.title || title; + description = wallpaperData.description || wallpaperData.main_text || ''; + copyright = wallpaperData.copyright || ''; + date = wallpaperData.update_date || date; + + // 提取图片URL,去除反引号 + if (wallpaperData.cover) { + imageUrl = wallpaperData.cover.replace(/`/g, '').trim(); + } + } + // 处理其他可能的API响应格式 + else if (data.url) { + imageUrl = data.url; + } else if (data.image_url) { + imageUrl = data.image_url; + } else if (data.images && data.images.length > 0) { + imageUrl = data.images[0].url || data.images[0].image_url; + title = data.images[0].title || title; + description = data.images[0].description || data.images[0].copyright || ''; + copyright = data.images[0].copyright || ''; + } + + // 如果是相对路径,转换为完整URL + if (imageUrl && imageUrl.startsWith('/')) { + imageUrl = 'https://www.bing.com' + imageUrl; + } + + // 确保图片URL有效 + if (!imageUrl || imageUrl === '') { + console.error('无法提取图片URL,原始数据:', data); + return null; + } + + return { + imageUrl, + title, + description: description || copyright, + date, + copyright + }; +} + +// 生成壁纸HTML +function generateWallpaperHTML(info) { + return ` +
+
+

${escapeHtml(info.title)}

+
${info.date}
+ ${info.description ? `
${escapeHtml(info.description)}
` : ''} +
+ +
+ ${escapeHtml(info.title)} +
+ + +
+ + ${info.copyright ? ` + + ` : ''} + `; +} + +// 绑定图片事件 +function bindImageEvents() { + const images = elements.container.querySelectorAll('img'); + + images.forEach(img => { + img.addEventListener('load', function() { + this.classList.add('loaded'); + }); + + img.addEventListener('error', function() { + console.error('图片加载失败:', this.src); + this.parentElement.innerHTML = ` +
+

🖼️ 图片加载失败

+

请检查网络连接或稍后重试

+
+ `; + }); + }); +} + +// 显示/隐藏加载状态 +function showLoading(show) { + if (elements.loading) { + elements.loading.style.display = show ? 'block' : 'none'; + } + if (elements.container) { + elements.container.style.display = show ? 'none' : 'block'; + } +} + +// 显示错误信息 +function showError(message) { + if (elements.container) { + elements.container.innerHTML = ` +
+

⚠️ 加载失败

+

${escapeHtml(message)}

+

请检查网络连接或稍后重试

+
+ `; + elements.container.style.display = 'block'; + } +} + +// HTML转义 +function escapeHtml(text) { + if (!text) return ''; + const div = document.createElement('div'); + div.textContent = text; + return div.innerHTML; +} + +// 格式化日期 +function formatDate(dateString) { + try { + const date = new Date(dateString); + return date.toLocaleDateString('zh-CN', { + year: 'numeric', + month: 'long', + day: 'numeric' + }); + } catch (error) { + return dateString; + } +} + +// 错误处理 +window.addEventListener('error', function(event) { + console.error('页面错误:', event.error); +}); + +// 网络状态监听 +window.addEventListener('online', function() { + console.log('网络已连接'); +}); + +window.addEventListener('offline', function() { + console.log('网络已断开'); + showError('网络连接已断开,请检查网络设置'); +}); + +// 导出函数供外部调用 +window.BingWallpaper = { + loadWallpaper, + showError, + showLoading +}; \ No newline at end of file diff --git a/frontend/60sapi/日更资讯/必应每日壁纸/接口集合.json b/frontend/60sapi/日更资讯/必应每日壁纸/接口集合.json new file mode 100644 index 00000000..04e92b7f --- /dev/null +++ b/frontend/60sapi/日更资讯/必应每日壁纸/接口集合.json @@ -0,0 +1,7 @@ +[ + "https://60s-cf.viki.moe", + "https://60s.viki.moe", + "https://60s.b23.run", + "https://60s.114128.xyz", + "https://60s-cf.114128.xyz" +] diff --git a/frontend/60sapi/日更资讯/必应每日壁纸/返回接口.json b/frontend/60sapi/日更资讯/必应每日壁纸/返回接口.json new file mode 100644 index 00000000..2c6a72a4 --- /dev/null +++ b/frontend/60sapi/日更资讯/必应每日壁纸/返回接口.json @@ -0,0 +1,15 @@ +{ + "code": 200, + "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", + "data": { + "title": "瑟沃格湖,瓦加尔岛,法罗群岛", + "headline": "海洋上方的湖泊", + "description": "大自然自有其奇妙之处,瑟沃格湖(Sørvágsvatn)便是其中最精彩的之一。世界湖泊日是探索法罗群岛(丹麦王国的一个自治行政区)这片视错觉的绝佳时机。这座位于沃格岛上的湖泊也被称为莱蒂斯湖(Leitisvatn),看似漂浮在海平面之上。实际上,它的海拔不到100英尺。索尔瓦格斯湖是法罗群岛最大的湖泊,面积约1.3平方英里,为Bøsdalafossur瀑布Bøsdalafossur提供水源,瀑布的湖水在那里奔腾而下,最终倾泻而入大海。", + "main_text": "该湖位于瓦加尔岛南部,通过Bøsdalafossur瀑布与大西洋相连,形成了壮丽的“悬湖”景观。", + "cover": "https://bing.com/th?id=OHR.FaroeLake_ZH-CN3977660997_1920x1080.jpg", + "cover_4k": "https://bing.com/th?id=OHR.FaroeLake_ZH-CN3977660997_UHD.jpg", + "copyright": "© Anton Petrus/Getty Images", + "update_date": "2025-08-27 13:24:37", + "update_date_at": 1756301077809 + } +} \ No newline at end of file diff --git a/frontend/60sapi/日更资讯/每天60s读懂世界/css/style.css b/frontend/60sapi/日更资讯/每天60s读懂世界/css/style.css new file mode 100644 index 00000000..9bd66ac6 --- /dev/null +++ b/frontend/60sapi/日更资讯/每天60s读懂世界/css/style.css @@ -0,0 +1,327 @@ +/* 每天60s读懂世界 - 清新风格样式 */ + +/* 重置样式 */ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; + background: linear-gradient(135deg, #a8e6cf 0%, #dcedc1 50%, #ffd3a5 100%); + min-height: 100vh; + color: #2d5016; + line-height: 1.6; +} + +.container { + max-width: 1200px; + margin: 0 auto; + padding: 20px; +} + +/* 头部样式 */ +.header { + text-align: center; + margin-bottom: 30px; + background: rgba(255, 255, 255, 0.85); + border-radius: 20px; + padding: 30px; + box-shadow: 0 8px 25px rgba(45, 80, 22, 0.08); + backdrop-filter: blur(10px); +} + +.header h1 { + font-size: 2.5rem; + color: #2d5016; + margin-bottom: 10px; + font-weight: 700; +} + +.header p { + color: #5a7c65; + font-size: 1.1rem; +} + +/* 控制面板 */ +.controls { + background: rgba(255, 255, 255, 0.85); + border-radius: 15px; + padding: 20px; + margin-bottom: 30px; + box-shadow: 0 5px 20px rgba(45, 80, 22, 0.08); + backdrop-filter: blur(10px); +} + +.date-selector { + display: flex; + align-items: center; + gap: 15px; + margin-bottom: 20px; + flex-wrap: wrap; +} + +.date-selector label { + font-weight: 600; + color: #4a5568; +} + +.date-selector input { + padding: 10px 15px; + border: 2px solid #e2e8f0; + border-radius: 10px; + font-size: 1rem; + transition: all 0.3s ease; +} + +.date-selector input:focus { + outline: none; + border-color: #81c784; + box-shadow: 0 0 0 3px rgba(129, 199, 132, 0.1); +} + +.btn { + background: linear-gradient(135deg, #81c784 0%, #66bb6a 100%); + color: white; + border: none; + padding: 12px 25px; + border-radius: 10px; + font-size: 1rem; + font-weight: 600; + cursor: pointer; + transition: all 0.3s ease; + box-shadow: 0 4px 15px rgba(129, 199, 132, 0.3); +} + +.btn:hover { + transform: translateY(-2px); + box-shadow: 0 6px 20px rgba(129, 199, 132, 0.4); +} + +.btn:active { + transform: translateY(0); +} + +/* 加载状态 */ +.loading { + text-align: center; + padding: 40px; + background: rgba(255, 255, 255, 0.85); + border-radius: 15px; + box-shadow: 0 5px 20px rgba(45, 80, 22, 0.08); +} + +.spinner { + width: 40px; + height: 40px; + border: 4px solid #e8f5e8; + border-top: 4px solid #81c784; + border-radius: 50%; + animation: spin 1s linear infinite; + margin: 0 auto 20px; +} + +@keyframes spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} + +/* 内容区域 */ +.content { + background: rgba(255, 255, 255, 0.85); + border-radius: 20px; + padding: 30px; + box-shadow: 0 8px 25px rgba(45, 80, 22, 0.08); + backdrop-filter: blur(10px); +} + +.news-header { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 25px; + flex-wrap: wrap; + gap: 15px; +} + +.news-date { + font-size: 1.5rem; + font-weight: 700; + color: #2d5016; +} + +.lunar-date { + color: #5a7c65; + font-size: 1rem; +} + +/* 新闻图片 */ +.news-image { + width: 100%; + max-width: 600px; + height: auto; + border-radius: 15px; + margin: 20px auto; + display: block; + box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15); +} + +/* 新闻列表 */ +.news-list { + margin: 25px 0; +} + +.news-item { + background: #f1f8e9; + border-left: 4px solid #81c784; + padding: 15px 20px; + margin-bottom: 15px; + border-radius: 0 10px 10px 0; + transition: all 0.3s ease; + position: relative; +} + +.news-item:hover { + background: #e8f5e8; + transform: translateX(5px); + box-shadow: 0 4px 15px rgba(45, 80, 22, 0.1); +} + +.news-item::before { + content: counter(news-counter); + counter-increment: news-counter; + position: absolute; + left: -15px; + top: 50%; + transform: translateY(-50%); + background: #81c784; + color: white; + width: 25px; + height: 25px; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + font-size: 0.8rem; + font-weight: bold; +} + +.news-list { + counter-reset: news-counter; +} + +/* 每日一句 */ +.daily-tip { + background: linear-gradient(135deg, #ffecd2 0%, #fcb69f 100%); + padding: 20px; + border-radius: 15px; + margin: 25px 0; + text-align: center; + font-style: italic; + font-size: 1.1rem; + color: #744210; + box-shadow: 0 5px 20px rgba(252, 182, 159, 0.3); +} + +/* 错误提示 */ +.error { + background: #fed7d7; + color: #c53030; + padding: 20px; + border-radius: 10px; + text-align: center; + border: 1px solid #feb2b2; +} + +/* 响应式设计 */ + +/* 平板端 */ +@media (max-width: 768px) { + .container { + padding: 15px; + } + + .header h1 { + font-size: 2rem; + } + + .header { + padding: 20px; + } + + .content { + padding: 20px; + } + + .date-selector { + flex-direction: column; + align-items: stretch; + } + + .news-header { + flex-direction: column; + align-items: flex-start; + } +} + +/* 手机端 */ +@media (max-width: 480px) { + .container { + padding: 10px; + } + + .header { + padding: 15px; + margin-bottom: 20px; + } + + .header h1 { + font-size: 1.8rem; + } + + .controls { + padding: 15px; + } + + .content { + padding: 15px; + } + + .news-item { + padding: 12px 15px; + margin-left: 10px; + } + + .news-item::before { + left: -10px; + width: 20px; + height: 20px; + font-size: 0.7rem; + } + + .daily-tip { + padding: 15px; + font-size: 1rem; + } + + .btn { + width: 100%; + padding: 15px; + } +} + +/* 大屏幕优化 */ +@media (min-width: 1200px) { + .container { + padding: 40px; + } + + .header { + padding: 40px; + } + + .content { + padding: 40px; + } +} \ No newline at end of file diff --git a/frontend/60sapi/日更资讯/每天60s读懂世界/index.html b/frontend/60sapi/日更资讯/每天60s读懂世界/index.html new file mode 100644 index 00000000..3240ff17 --- /dev/null +++ b/frontend/60sapi/日更资讯/每天60s读懂世界/index.html @@ -0,0 +1,49 @@ + + + + + + + + 每天60秒读懂世界 | 最新资讯 + + + + + + + + + + + + + +
+ +
+

📰 每天60秒读懂世界

+

获取最新资讯,了解天下大事

+
+ + + + +
+ +
+
+

正在加载今日资讯...

+
+
+
+ + +
+

Made with ❤️ | 数据来源:每天60秒读懂世界API

+
+ + + + + \ No newline at end of file diff --git a/frontend/60sapi/日更资讯/每天60s读懂世界/js/script.js b/frontend/60sapi/日更资讯/每天60s读懂世界/js/script.js new file mode 100644 index 00000000..63c2d19f --- /dev/null +++ b/frontend/60sapi/日更资讯/每天60s读懂世界/js/script.js @@ -0,0 +1,305 @@ +// 每天60s读懂世界 - JavaScript功能实现 + +const API = { + endpoints: [], + currentIndex: 0, + params: { + encoding: 'json' + }, + localFallback: '返回接口.json', + // 初始化API接口列表 + async init() { + try { + const res = await fetch('./接口集合.json'); + const endpoints = await res.json(); + this.endpoints = endpoints.map(endpoint => `${endpoint}/v2/60s`); + } catch (e) { + // 如果无法加载接口集合,使用默认接口 + this.endpoints = ['https://60s.viki.moe/v2/60s']; + } + }, + // 获取当前接口URL + getCurrentUrl() { + if (this.endpoints.length === 0) return null; + const url = new URL(this.endpoints[this.currentIndex]); + Object.entries(this.params).forEach(([k, v]) => url.searchParams.append(k, v)); + return url.toString(); + }, + // 切换到下一个接口 + switchToNext() { + this.currentIndex = (this.currentIndex + 1) % this.endpoints.length; + return this.currentIndex < this.endpoints.length; + }, + // 重置到第一个接口 + reset() { + this.currentIndex = 0; + } +}; + +class NewsApp { + constructor() { + this.apiUrl = 'https://60s.viki.moe/v2/60s'; + this.init(); + } + + init() { + this.bindEvents(); + this.loadTodayNews(); + } + + bindEvents() { + // 移除了刷新按钮,不需要绑定事件 + } + + formatDate(date) { + const year = date.getFullYear(); + const month = String(date.getMonth() + 1).padStart(2, '0'); + const day = String(date.getDate()).padStart(2, '0'); + return `${year}-${month}-${day}`; + } + + showLoading() { + const contentDiv = document.getElementById('content'); + if (contentDiv) { + contentDiv.innerHTML = ` +
+
+

正在获取最新资讯...

+
+ `; + } + } + + showError(message) { + const contentDiv = document.getElementById('content'); + if (contentDiv) { + contentDiv.innerHTML = ` +
+

😔 获取失败

+

${message}

+
+ `; + } + } + + async loadNews() { + try { + this.showLoading(); + + // 尝试从API获取数据 + let data = await this.fetchFromAPI(); + + // 如果API失败,尝试本地数据 + if (!data) { + data = await this.fetchFromLocal(); + } + + if (!data) { + throw new Error('无法获取数据,请检查网络连接或稍后重试'); + } + + if (data.code !== 200) { + throw new Error(data.message || '获取数据失败'); + } + + this.renderNews(data.data); + + } catch (error) { + console.error('获取新闻失败:', error); + this.showError(error.message || '网络连接失败,请检查网络后重试'); + } + } + + async fetchFromAPI() { + // 初始化API接口列表 + await API.init(); + + // 重置API索引到第一个接口 + API.reset(); + + // 尝试所有API接口 + for (let i = 0; i < API.endpoints.length; i++) { + try { + const url = API.getCurrentUrl(); + console.log(`尝试接口 ${i + 1}/${API.endpoints.length}: ${url}`); + + const resp = await fetch(url, { + cache: 'no-store' + }); + + if (!resp.ok) { + throw new Error(`HTTP ${resp.status}: ${resp.statusText}`); + } + + const data = await resp.json(); + + if (data && data.code === 200) { + console.log(`接口 ${i + 1} 请求成功`); + return data; + } + + throw new Error(data && data.message ? data.message : '接口返回异常'); + + } catch (e) { + console.warn(`接口 ${i + 1} 失败:`, e.message); + + // 如果不是最后一个接口,切换到下一个 + if (i < API.endpoints.length - 1) { + API.switchToNext(); + continue; + } + + // 所有接口都失败了 + console.warn('所有远程接口都失败,尝试本地数据'); + return null; + } + } + } + + async fetchFromLocal() { + try { + const resp = await fetch(API.localFallback + `?t=${Date.now()}`); + if (!resp.ok) throw new Error(`本地文件HTTP ${resp.status}`); + const data = await resp.json(); + return data; + } catch (e) { + console.error('读取本地返回接口.json失败:', e); + return null; + } + } + + loadTodayNews() { + this.loadNews(); + } + + renderNews(newsData) { + const contentDiv = document.getElementById('content'); + if (!contentDiv || !newsData) return; + + const { + date, + day_of_week, + lunar_date, + news, + tip, + link + } = newsData; + + let newsListHtml = ''; + if (news && news.length > 0) { + newsListHtml = news.map(item => ` +
+ ${this.escapeHtml(item)} +
+ `).join(''); + } + + // 移除图片显示功能 + + const tipHtml = tip ? ` +
+ 💡 ${this.escapeHtml(tip)} +
+ ` : ''; + + const linkHtml = link ? ` +
+ + 📖 查看原文 + +
+ ` : ''; + + contentDiv.innerHTML = ` +
+
+
${this.escapeHtml(date)} ${this.escapeHtml(day_of_week || '')}
+ ${lunar_date ? `
${this.escapeHtml(lunar_date)}
` : ''} +
+
+ + ${tipHtml} + +
+

📰 今日要闻

+ ${newsListHtml} +
+ + ${linkHtml} + +
+

数据来源:每天60秒读懂世界

+

更新时间:${newsData.api_updated || '未知'}

+
+ `; + } + + escapeHtml(text) { + if (typeof text !== 'string') return text; + const div = document.createElement('div'); + div.textContent = text; + return div.innerHTML; + } +} + +// 页面加载完成后初始化应用 +document.addEventListener('DOMContentLoaded', function() { + window.newsApp = new NewsApp(); +}); + +// 添加一些实用功能 +function copyToClipboard(text) { + navigator.clipboard.writeText(text).then(() => { + showToast('已复制到剪贴板'); + }).catch(() => { + showToast('复制失败,请手动复制'); + }); +} + +function showToast(message) { + // 创建提示框 + const toast = document.createElement('div'); + toast.style.cssText = ` + position: fixed; + top: 20px; + right: 20px; + background: #4a5568; + color: white; + padding: 12px 20px; + border-radius: 8px; + z-index: 1000; + font-size: 14px; + box-shadow: 0 4px 12px rgba(0,0,0,0.3); + animation: slideIn 0.3s ease; + `; + toast.textContent = message; + + // 添加动画样式 + const style = document.createElement('style'); + style.textContent = ` + @keyframes slideIn { + from { transform: translateX(100%); opacity: 0; } + to { transform: translateX(0); opacity: 1; } + } + `; + document.head.appendChild(style); + + document.body.appendChild(toast); + + // 3秒后自动移除 + setTimeout(() => { + toast.remove(); + style.remove(); + }, 3000); +} + +// 添加键盘快捷键支持 +document.addEventListener('keydown', function(e) { + // Ctrl/Cmd + R 刷新数据 + if ((e.ctrlKey || e.metaKey) && e.key === 'r') { + e.preventDefault(); + if (window.newsApp) { + window.newsApp.loadNews(); + } + } +}); \ No newline at end of file diff --git a/frontend/60sapi/日更资讯/每天60s读懂世界/接口集合.json b/frontend/60sapi/日更资讯/每天60s读懂世界/接口集合.json new file mode 100644 index 00000000..04e92b7f --- /dev/null +++ b/frontend/60sapi/日更资讯/每天60s读懂世界/接口集合.json @@ -0,0 +1,7 @@ +[ + "https://60s-cf.viki.moe", + "https://60s.viki.moe", + "https://60s.b23.run", + "https://60s.114128.xyz", + "https://60s-cf.114128.xyz" +] diff --git a/frontend/60sapi/日更资讯/每天60s读懂世界/返回接口.json b/frontend/60sapi/日更资讯/每天60s读懂世界/返回接口.json new file mode 100644 index 00000000..7804d62a --- /dev/null +++ b/frontend/60sapi/日更资讯/每天60s读懂世界/返回接口.json @@ -0,0 +1,66 @@ +{ + "code": 200, + "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", + "data": [ + { + "id": "9aa227e2ba294bb1a95c95fde892eb31", + "title": "《Totally Reliable Delivery Service》 Standard Edition", + "cover": "https://cdn1.epicgames.com/52b90f9a982a404781b189f6a7903226/offer/EGS_TotallyReliableDeliveryService_WereFiveGames_S1-2560x1440-47e6e9562d62705a75ea7b7096d0b8dc.jpg", + "original_price": 52, + "original_price_desc": "¥52.00", + "description": "穿好护腰护具,发动货车,送货的时间到啦!在一个高度互动的沙盒世界中,与最多三位好友一起随意地完成送货。货物已试投,这就是我们靠谱快递(Totally Reliable Delivery Service)的品质保证!", + "seller": "Infogrames LLC", + "is_free_now": true, + "free_start": "2025/08/14 23:00:00", + "free_start_at": 1755183600000, + "free_end": "2025/08/21 23:00:00", + "free_end_at": 1755788400000, + "link": "https://store.epicgames.com/store/zh-CN/p/totally-reliable-delivery-service/home" + }, + { + "id": "8ea3500dc38e4f429702bf889c172d3d", + "title": "Hidden Folks", + "cover": "https://cdn1.epicgames.com/spt-assets/7bfd56b0586348dcb139945d9e59f988/hidden-folks-1b7hh.png", + "original_price": 47, + "original_price_desc": "¥47.00", + "description": "Search for hidden folks in hand-drawn, interactive, miniature landscapes. Unfurl tent flaps, cut through bushes, slam doors, and poke some crocodiles! Rooooaaaarrrr!!!!!", + "seller": "Adriaan de Jongh", + "is_free_now": true, + "free_start": "2025/08/14 23:00:00", + "free_start_at": 1755183600000, + "free_end": "2025/08/21 23:00:00", + "free_end_at": 1755788400000, + "link": "https://store.epicgames.com/store/zh-CN/p/hidden-folks-239d16" + }, + { + "id": "4cbb6c3704d240f19c3dd5f5cb2b0cb4", + "title": "Kamaeru", + "cover": "https://cdn1.epicgames.com/spt-assets/44313cfbb62b4df5801d0c8d541c2624/kamaeru-40asc.png", + "original_price": 62, + "original_price_desc": "¥62.00", + "description": "Foster a sanctuary for frogs and restore the biodiversity of the wetlands in Kamaeru, a cozy frog collecting game, where you take pictures of frogs, play mini-games and decorate your habitat. Hop right to it!", + "seller": "Armor Games Studios", + "is_free_now": false, + "free_start": "2025/08/21 23:00:00", + "free_start_at": 1755788400000, + "free_end": "2025/08/28 23:00:00", + "free_end_at": 1756393200000, + "link": "https://store.epicgames.com/store/zh-CN/p/kamaeru-0c301e" + }, + { + "id": "0d9a533f0e684cc18620a8f408e8e72c", + "title": "Strange Horticulture", + "cover": "https://cdn1.epicgames.com/spt-assets/15e8e3eba65a4763a815d6eae1d763b2/strange-horticulture-offer-2wghv.png", + "original_price": 45, + "original_price_desc": "¥45.00", + "description": "款神秘学解谜游戏,你将扮演当地植物商店的店主,寻找并识别新的植物,悠闲撸猫,与女巫团体交谈,或加入异教。收集各种强大的植物,用它们来影响故事走向,揭开昂德米尔镇的黑暗谜团。", + "seller": "Iceberg Interactive", + "is_free_now": false, + "free_start": "2025/08/21 23:00:00", + "free_start_at": 1755788400000, + "free_end": "2025/08/28 23:00:00", + "free_end_at": 1756393200000, + "link": "https://store.epicgames.com/store/zh-CN/p/strange-horticulture-360e80" + } + ] +} \ No newline at end of file diff --git a/frontend/60sapi/日更资讯/每日国际汇率/css/style.css b/frontend/60sapi/日更资讯/每日国际汇率/css/style.css new file mode 100644 index 00000000..5bb68371 --- /dev/null +++ b/frontend/60sapi/日更资讯/每日国际汇率/css/style.css @@ -0,0 +1,409 @@ +/* 每日国际汇率 - 淡绿色清新风格样式 */ + +/* 重置样式 */ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; + background: linear-gradient(135deg, #a8e6cf 0%, #dcedc1 50%, #ffd3a5 100%); + min-height: 100vh; + color: #2d5016; + line-height: 1.6; + overflow-x: hidden; +} + +.container { + max-width: 1200px; + margin: 0 auto; + padding: 20px; +} + +/* 头部样式 */ +.header { + text-align: center; + margin-bottom: 30px; + background: rgba(255, 255, 255, 0.85); + border-radius: 20px; + padding: 30px; + box-shadow: 0 8px 25px rgba(45, 80, 22, 0.08); + backdrop-filter: blur(10px); +} + +.header h1 { + font-size: 2.5rem; + color: #2d5016; + margin-bottom: 10px; + font-weight: 700; + display: flex; + align-items: center; + justify-content: center; + gap: 15px; +} + +.header p { + color: #5a7c65; + font-size: 1.1rem; +} + +/* 货币选择器 */ +.currency-selector { + background: rgba(255, 255, 255, 0.85); + border-radius: 15px; + padding: 20px; + margin-bottom: 20px; + box-shadow: 0 5px 20px rgba(45, 80, 22, 0.08); + text-align: center; +} + +.currency-selector label { + display: block; + margin-bottom: 10px; + font-weight: 600; + color: #2d5016; +} + +.currency-selector select { + padding: 12px 20px; + border: 2px solid #c8e6c9; + border-radius: 25px; + background: white; + color: #2d5016; + font-size: 1rem; + min-width: 200px; + cursor: pointer; + transition: all 0.3s ease; +} + +.currency-selector select:focus { + outline: none; + border-color: #81c784; + box-shadow: 0 0 0 3px rgba(129, 199, 132, 0.2); +} + +/* 加载状态 */ +.loading { + text-align: center; + padding: 40px; + background: rgba(255, 255, 255, 0.85); + border-radius: 15px; + box-shadow: 0 5px 20px rgba(45, 80, 22, 0.08); +} + +.spinner { + width: 40px; + height: 40px; + border: 4px solid #e8f5e8; + border-top: 4px solid #81c784; + border-radius: 50%; + animation: spin 1s linear infinite; + margin: 0 auto 20px; +} + +@keyframes spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} + +/* 汇率信息容器 */ +.exchange-info { + background: rgba(255, 255, 255, 0.85); + border-radius: 20px; + padding: 25px; + margin-bottom: 20px; + box-shadow: 0 8px 25px rgba(45, 80, 22, 0.08); + backdrop-filter: blur(10px); +} + +.base-currency { + text-align: center; + margin-bottom: 20px; +} + +.base-currency h2 { + font-size: 1.8rem; + color: #2d5016; + margin-bottom: 10px; +} + +.update-time { + color: #5a7c65; + font-size: 0.9rem; +} + +/* 汇率网格 */ +.rates-grid { + display: grid; + grid-template-columns: repeat(8, 1fr); + gap: 10px; + margin-top: 20px; +} + +.rate-card { + background: rgba(255, 255, 255, 0.9); + border-radius: 10px; + padding: 12px; + box-shadow: 0 3px 10px rgba(45, 80, 22, 0.06); + transition: all 0.3s ease; + border: 1px solid rgba(200, 230, 201, 0.5); + text-align: center; +} + +.rate-card:hover { + transform: translateY(-1px); + box-shadow: 0 4px 15px rgba(45, 80, 22, 0.1); + border-color: #81c784; +} + +.currency-code { + font-size: 1rem; + font-weight: 700; + color: #2d5016; + margin-bottom: 6px; + display: flex; + align-items: center; + justify-content: center; + gap: 6px; +} + +.currency-flag { + font-size: 1.2rem; +} + +.exchange-rate { + font-size: 1.1rem; + font-weight: 600; + color: #388e3c; + margin-bottom: 4px; +} + +.currency-name { + color: #5a7c65; + font-size: 0.8rem; + line-height: 1.2; +} + +/* 搜索框 */ +.search-container { + background: rgba(255, 255, 255, 0.85); + border-radius: 15px; + padding: 20px; + margin-bottom: 20px; + box-shadow: 0 5px 20px rgba(45, 80, 22, 0.08); +} + +.search-input { + width: 100%; + padding: 12px 20px; + border: 2px solid #c8e6c9; + border-radius: 25px; + background: white; + color: #2d5016; + font-size: 1rem; + transition: all 0.3s ease; +} + +.search-input:focus { + outline: none; + border-color: #81c784; + box-shadow: 0 0 0 3px rgba(129, 199, 132, 0.2); +} + +.search-input::placeholder { + color: #81c784; +} + +/* 错误提示 */ +.error { + background: #fed7d7; + color: #c53030; + padding: 20px; + border-radius: 15px; + text-align: center; + border: 1px solid #feb2b2; + margin: 20px 0; +} + +/* 统计信息 */ +.stats { + background: rgba(255, 255, 255, 0.85); + border-radius: 15px; + padding: 20px; + margin-bottom: 20px; + box-shadow: 0 5px 20px rgba(45, 80, 22, 0.08); + text-align: center; +} + +.stats-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); + gap: 20px; + margin-top: 15px; +} + +.stat-item { + padding: 15px; + background: rgba(129, 199, 132, 0.1); + border-radius: 10px; +} + +.stat-number { + font-size: 1.5rem; + font-weight: 700; + color: #2d5016; +} + +.stat-label { + color: #5a7c65; + font-size: 0.9rem; + margin-top: 5px; +} + +/* 响应式设计 */ + +/* 平板端 */ +@media (max-width: 768px) and (min-width: 481px) { + .container { + padding: 15px; + } + + .header h1 { + font-size: 2rem; + flex-direction: column; + gap: 10px; + } + + .header { + padding: 20px; + } + + .rates-grid { + grid-template-columns: repeat(6, 1fr); + gap: 8px; + } + + .rate-card { + padding: 10px; + } + + .currency-selector select { + min-width: 180px; + } +} + +/* 手机端 */ +@media (max-width: 480px) { + .container { + padding: 10px; + } + + .header { + padding: 15px; + margin-bottom: 20px; + } + + .header h1 { + font-size: 1.8rem; + } + + .rates-grid { + grid-template-columns: repeat(4, 1fr); + gap: 6px; + } + + .rate-card { + padding: 8px; + border-radius: 8px; + } + + .currency-code { + font-size: 0.85rem; + margin-bottom: 4px; + gap: 4px; + } + + .currency-flag { + font-size: 1rem; + } + + .exchange-rate { + font-size: 0.9rem; + margin-bottom: 3px; + } + + .currency-name { + font-size: 0.7rem; + line-height: 1.1; + } + + .currency-selector { + padding: 15px; + } + + .currency-selector select { + min-width: 100%; + padding: 10px 15px; + } + + .search-input { + padding: 10px 15px; + } + + .stats-grid { + grid-template-columns: repeat(2, 1fr); + gap: 10px; + } +} + +/* 大屏幕优化 */ +@media (min-width: 1200px) { + .container { + padding: 40px; + } + + .header { + padding: 40px; + } +} + +/* 特殊效果 */ +.fade-in { + animation: fadeIn 0.6s ease-in; +} + +@keyframes fadeIn { + from { + opacity: 0; + transform: translateY(20px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +/* 滚动条样式 */ +::-webkit-scrollbar { + width: 8px; +} + +::-webkit-scrollbar-track { + background: rgba(255, 255, 255, 0.1); +} + +::-webkit-scrollbar-thumb { + background: rgba(129, 199, 132, 0.5); + border-radius: 4px; +} + +::-webkit-scrollbar-thumb:hover { + background: rgba(129, 199, 132, 0.7); +} + +/* 隐藏类 */ +.hidden { + display: none; +} \ No newline at end of file diff --git a/frontend/60sapi/日更资讯/每日国际汇率/index.html b/frontend/60sapi/日更资讯/每日国际汇率/index.html new file mode 100644 index 00000000..644740d2 --- /dev/null +++ b/frontend/60sapi/日更资讯/每日国际汇率/index.html @@ -0,0 +1,86 @@ + + + + + + + + 每日国际汇率 + + + + + + + + +
+ +
+

+ 💱 + 每日国际汇率 +

+

实时获取全球货币汇率信息,助您掌握汇率动态

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

正在加载汇率数据...

+
+ + +
+ +
+
+

基础货币

+
更新时间: --
+
+ + +
+

汇率统计

+
+
+
--
+
货币总数
+
+
+
--
+
最后更新
+
+
+
+ + +
+ +
+
+
+
+ + + + + \ No newline at end of file diff --git a/frontend/60sapi/日更资讯/每日国际汇率/js/script.js b/frontend/60sapi/日更资讯/每日国际汇率/js/script.js new file mode 100644 index 00000000..d7d217b3 --- /dev/null +++ b/frontend/60sapi/日更资讯/每日国际汇率/js/script.js @@ -0,0 +1,520 @@ +// 每日国际汇率 JavaScript 功能 + +// API配置 +const API = { + endpoints: [], + currentIndex: 0, + defaultCurrency: 'CNY', + localFallback: '返回接口.json', + // 初始化API接口列表 + async init() { + try { + const res = await fetch('./接口集合.json'); + const endpoints = await res.json(); + this.endpoints = endpoints.map(endpoint => `${endpoint}/v2/exchange_rate`); + } catch (e) { + // 如果无法加载接口集合,使用默认接口 + this.endpoints = ['https://60s.viki.moe/v2/exchange_rate']; + } + }, + // 获取当前接口URL + getCurrentUrl(currency) { + if (this.endpoints.length === 0) return null; + const url = new URL(this.endpoints[this.currentIndex]); + url.searchParams.append('currency', currency); + return url.toString(); + }, + // 切换到下一个接口 + switchToNext() { + this.currentIndex = (this.currentIndex + 1) % this.endpoints.length; + return this.currentIndex < this.endpoints.length; + }, + // 重置到第一个接口 + reset() { + this.currentIndex = 0; + } +}; + +// 常用货币列表 +const POPULAR_CURRENCIES = [ + { code: 'CNY', name: '人民币', flag: '🇨🇳' }, + { code: 'USD', name: '美元', flag: '🇺🇸' }, + { code: 'EUR', name: '欧元', flag: '🇪🇺' }, + { code: 'JPY', name: '日元', flag: '🇯🇵' }, + { code: 'GBP', name: '英镑', flag: '🇬🇧' }, + { code: 'AUD', name: '澳元', flag: '🇦🇺' }, + { code: 'CAD', name: '加元', flag: '🇨🇦' }, + { code: 'CHF', name: '瑞士法郎', flag: '🇨🇭' }, + { code: 'HKD', name: '港币', flag: '🇭🇰' }, + { code: 'SGD', name: '新加坡元', flag: '🇸🇬' }, + { code: 'KRW', name: '韩元', flag: '🇰🇷' }, + { code: 'THB', name: '泰铢', flag: '🇹🇭' } +]; + +// 货币优先级排序 - 经济发达、交易频繁的国家货币优先 +const CURRENCY_PRIORITY = { + // 第一梯队:全球主要储备货币和交易货币 + 'USD': 1, // 美元 - 全球储备货币 + 'EUR': 2, // 欧元 - 欧盟统一货币 + 'JPY': 3, // 日元 - 亚洲主要货币 + 'GBP': 4, // 英镑 - 传统储备货币 + 'CNY': 5, // 人民币 - 中国货币 + + // 第二梯队:发达国家货币 + 'CHF': 10, // 瑞士法郎 - 避险货币 + 'CAD': 11, // 加拿大元 + 'AUD': 12, // 澳大利亚元 + 'NZD': 13, // 新西兰元 + 'SEK': 14, // 瑞典克朗 + 'NOK': 15, // 挪威克朗 + 'DKK': 16, // 丹麦克朗 + + // 第三梯队:亚洲发达经济体 + 'HKD': 20, // 港币 + 'SGD': 21, // 新加坡元 + 'KRW': 22, // 韩元 + 'TWD': 23, // 新台币 + + // 第四梯队:重要新兴市场货币 + 'RUB': 30, // 俄罗斯卢布 + 'INR': 31, // 印度卢比 + 'BRL': 32, // 巴西雷亚尔 + 'MXN': 33, // 墨西哥比索 + 'ZAR': 34, // 南非兰特 + 'TRY': 35, // 土耳其里拉 + + // 第五梯队:亚洲重要货币 + 'THB': 40, // 泰铢 + 'MYR': 41, // 马来西亚林吉特 + 'IDR': 42, // 印尼盾 + 'PHP': 43, // 菲律宾比索 + 'VND': 44, // 越南盾 + + // 第六梯队:中东石油国家货币 + 'SAR': 50, // 沙特里亚尔 + 'AED': 51, // 阿联酋迪拉姆 + 'QAR': 52, // 卡塔尔里亚尔 + 'KWD': 53, // 科威特第纳尔 + + // 第七梯队:欧洲其他货币 + 'PLN': 60, // 波兰兹罗提 + 'CZK': 61, // 捷克克朗 + 'HUF': 62, // 匈牙利福林 + 'RON': 63, // 罗马尼亚列伊 + 'BGN': 64, // 保加利亚列弗 + 'HRK': 65, // 克罗地亚库纳 + + // 第八梯队:拉美货币 + 'ARS': 70, // 阿根廷比索 + 'CLP': 71, // 智利比索 + 'COP': 72, // 哥伦比亚比索 + 'PEN': 73, // 秘鲁索尔 + 'UYU': 74, // 乌拉圭比索 + + // 其他货币默认优先级为 999 +}; + +// 货币名称映射 +const CURRENCY_NAMES = { + 'CNY': '人民币', 'USD': '美元', 'EUR': '欧元', 'JPY': '日元', 'GBP': '英镑', + 'AUD': '澳元', 'CAD': '加元', 'CHF': '瑞士法郎', 'HKD': '港币', 'SGD': '新加坡元', + 'KRW': '韩元', 'THB': '泰铢', 'AED': '阿联酋迪拉姆', 'AFN': '阿富汗尼', + 'ALL': '阿尔巴尼亚列克', 'AMD': '亚美尼亚德拉姆', 'ANG': '荷属安的列斯盾', + 'AOA': '安哥拉宽扎', 'ARS': '阿根廷比索', 'AWG': '阿鲁巴弗罗林', + 'AZN': '阿塞拜疆马纳特', 'BAM': '波黑马克', 'BBD': '巴巴多斯元', + 'BDT': '孟加拉塔卡', 'BGN': '保加利亚列弗', 'BHD': '巴林第纳尔', + 'BIF': '布隆迪法郎', 'BMD': '百慕大元', 'BND': '文莱元', 'BOB': '玻利维亚诺', + 'BRL': '巴西雷亚尔', 'BSD': '巴哈马元', 'BTN': '不丹努尔特鲁姆', + 'BWP': '博茨瓦纳普拉', 'BYN': '白俄罗斯卢布', 'BZD': '伯利兹元', + 'CDF': '刚果法郎', 'CLP': '智利比索', 'COP': '哥伦比亚比索', 'CRC': '哥斯达黎加科朗', + 'CUP': '古巴比索', 'CVE': '佛得角埃斯库多', 'CZK': '捷克克朗', 'DJF': '吉布提法郎', + 'DKK': '丹麦克朗', 'DOP': '多米尼加比索', 'DZD': '阿尔及利亚第纳尔', 'EGP': '埃及镑', + 'ERN': '厄立特里亚纳克法', 'ETB': '埃塞俄比亚比尔', 'FJD': '斐济元', 'FKP': '福克兰群岛镑', + 'FOK': '法罗群岛克朗', 'GEL': '格鲁吉亚拉里', 'GGP': '根西岛镑', 'GHS': '加纳塞地', + 'GIP': '直布罗陀镑', 'GMD': '冈比亚达拉西', 'GNF': '几内亚法郎', 'GTQ': '危地马拉格查尔', + 'GYD': '圭亚那元', 'HNL': '洪都拉斯伦皮拉', 'HRK': '克罗地亚库纳', 'HTG': '海地古德', + 'HUF': '匈牙利福林', 'IDR': '印尼盾', 'ILS': '以色列新谢克尔', 'IMP': '马恩岛镑', + 'INR': '印度卢比', 'IQD': '伊拉克第纳尔', 'IRR': '伊朗里亚尔', 'ISK': '冰岛克朗', + 'JEP': '泽西岛镑', 'JMD': '牙买加元', 'JOD': '约旦第纳尔', 'KES': '肯尼亚先令', + 'KGS': '吉尔吉斯斯坦索姆', 'KHR': '柬埔寨瑞尔', 'KID': '基里巴斯元', 'KMF': '科摩罗法郎', + 'KWD': '科威特第纳尔', 'KYD': '开曼群岛元', 'KZT': '哈萨克斯坦坚戈', 'LAK': '老挝基普', + 'LBP': '黎巴嫩镑', 'LKR': '斯里兰卡卢比', 'LRD': '利比里亚元', 'LSL': '莱索托洛蒂', + 'LYD': '利比亚第纳尔', 'MAD': '摩洛哥迪拉姆', 'MDL': '摩尔多瓦列伊', 'MGA': '马达加斯加阿里亚里', + 'MKD': '北马其顿第纳尔', 'MMK': '缅甸缅元', 'MNT': '蒙古图格里克', 'MOP': '澳门帕塔卡', + 'MRU': '毛里塔尼亚乌吉亚', 'MUR': '毛里求斯卢比', 'MVR': '马尔代夫拉菲亚', 'MWK': '马拉维克瓦查', + 'MXN': '墨西哥比索', 'MYR': '马来西亚林吉特', 'MZN': '莫桑比克梅蒂卡尔', 'NAD': '纳米比亚元', + 'NGN': '尼日利亚奈拉', 'NIO': '尼加拉瓜科多巴', 'NOK': '挪威克朗', 'NPR': '尼泊尔卢比', + 'NZD': '新西兰元', 'OMR': '阿曼里亚尔', 'PAB': '巴拿马巴波亚', 'PEN': '秘鲁索尔', + 'PGK': '巴布亚新几内亚基那', 'PHP': '菲律宾比索', 'PKR': '巴基斯坦卢比', 'PLN': '波兰兹罗提', + 'PYG': '巴拉圭瓜拉尼', 'QAR': '卡塔尔里亚尔', 'RON': '罗马尼亚列伊', 'RSD': '塞尔维亚第纳尔', + 'RUB': '俄罗斯卢布', 'RWF': '卢旺达法郎', 'SAR': '沙特里亚尔', 'SBD': '所罗门群岛元', + 'SCR': '塞舌尔卢比', 'SDG': '苏丹镑', 'SEK': '瑞典克朗', 'SHP': '圣赫勒拿镑', + 'SLE': '塞拉利昂利昂', 'SLL': '塞拉利昂利昂(旧)', 'SOS': '索马里先令', 'SRD': '苏里南元', + 'SSP': '南苏丹镑', 'STN': '圣多美和普林西比多布拉', 'SYP': '叙利亚镑', 'SZL': '斯威士兰里兰吉尼', + 'TJS': '塔吉克斯坦索莫尼', 'TMT': '土库曼斯坦马纳特', 'TND': '突尼斯第纳尔', 'TOP': '汤加潘加', + 'TRY': '土耳其里拉', 'TTD': '特立尼达和多巴哥元', 'TVD': '图瓦卢元', 'TWD': '新台币', + 'TZS': '坦桑尼亚先令', 'UAH': '乌克兰格里夫纳', 'UGX': '乌干达先令', 'UYU': '乌拉圭比索', + 'UZS': '乌兹别克斯坦苏姆', 'VES': '委内瑞拉玻利瓦尔', 'VND': '越南盾', 'VUV': '瓦努阿图瓦图', + 'WST': '萨摩亚塔拉', 'XAF': '中非法郎', 'XCD': '东加勒比元', 'XCG': '加勒比盾', + 'XDR': '特别提款权', 'XOF': '西非法郎', 'XPF': '太平洋法郎', 'YER': '也门里亚尔', + 'ZAR': '南非兰特', 'ZMW': '赞比亚克瓦查', 'ZWL': '津巴布韦元' +}; + +// 货币旗帜映射 +const CURRENCY_FLAGS = { + 'CNY': '🇨🇳', 'USD': '🇺🇸', 'EUR': '🇪🇺', 'JPY': '🇯🇵', 'GBP': '🇬🇧', + 'AUD': '🇦🇺', 'CAD': '🇨🇦', 'CHF': '🇨🇭', 'HKD': '🇭🇰', 'SGD': '🇸🇬', + 'KRW': '🇰🇷', 'THB': '🇹🇭', 'AED': '🇦🇪', 'AFN': '🇦🇫', 'ALL': '🇦🇱', + 'AMD': '🇦🇲', 'ANG': '🇳🇱', 'AOA': '🇦🇴', 'ARS': '🇦🇷', 'AWG': '🇦🇼', + 'AZN': '🇦🇿', 'BAM': '🇧🇦', 'BBD': '🇧🇧', 'BDT': '🇧🇩', 'BGN': '🇧🇬', + 'BHD': '🇧🇭', 'BIF': '🇧🇮', 'BMD': '🇧🇲', 'BND': '🇧🇳', 'BOB': '🇧🇴', + 'BRL': '🇧🇷', 'BSD': '🇧🇸', 'BTN': '🇧🇹', 'BWP': '🇧🇼', 'BYN': '🇧🇾', + 'BZD': '🇧🇿', 'CDF': '🇨🇩', 'CLP': '🇨🇱', 'COP': '🇨🇴', 'CRC': '🇨🇷', + 'CUP': '🇨🇺', 'CVE': '🇨🇻', 'CZK': '🇨🇿', 'DJF': '🇩🇯', 'DKK': '🇩🇰', + 'DOP': '🇩🇴', 'DZD': '🇩🇿', 'EGP': '🇪🇬', 'ERN': '🇪🇷', 'ETB': '🇪🇹', + 'FJD': '🇫🇯', 'FKP': '🇫🇰', 'FOK': '🇫🇴', 'GEL': '🇬🇪', 'GGP': '🇬🇬', + 'GHS': '🇬🇭', 'GIP': '🇬🇮', 'GMD': '🇬🇲', 'GNF': '🇬🇳', 'GTQ': '🇬🇹', + 'GYD': '🇬🇾', 'HNL': '🇭🇳', 'HRK': '🇭🇷', 'HTG': '🇭🇹', 'HUF': '🇭🇺', + 'IDR': '🇮🇩', 'ILS': '🇮🇱', 'IMP': '🇮🇲', 'INR': '🇮🇳', 'IQD': '🇮🇶', + 'IRR': '🇮🇷', 'ISK': '🇮🇸', 'JEP': '🇯🇪', 'JMD': '🇯🇲', 'JOD': '🇯🇴', + 'KES': '🇰🇪', 'KGS': '🇰🇬', 'KHR': '🇰🇭', 'KID': '🇰🇮', 'KMF': '🇰🇲', + 'KWD': '🇰🇼', 'KYD': '🇰🇾', 'KZT': '🇰🇿', 'LAK': '🇱🇦', 'LBP': '🇱🇧', + 'LKR': '🇱🇰', 'LRD': '🇱🇷', 'LSL': '🇱🇸', 'LYD': '🇱🇾', 'MAD': '🇲🇦', + 'MDL': '🇲🇩', 'MGA': '🇲🇬', 'MKD': '🇲🇰', 'MMK': '🇲🇲', 'MNT': '🇲🇳', + 'MOP': '🇲🇴', 'MRU': '🇲🇷', 'MUR': '🇲🇺', 'MVR': '🇲🇻', 'MWK': '🇲🇼', + 'MXN': '🇲🇽', 'MYR': '🇲🇾', 'MZN': '🇲🇿', 'NAD': '🇳🇦', 'NGN': '🇳🇬', + 'NIO': '🇳🇮', 'NOK': '🇳🇴', 'NPR': '🇳🇵', 'NZD': '🇳🇿', 'OMR': '🇴🇲', + 'PAB': '🇵🇦', 'PEN': '🇵🇪', 'PGK': '🇵🇬', 'PHP': '🇵🇭', 'PKR': '🇵🇰', + 'PLN': '🇵🇱', 'PYG': '🇵🇾', 'QAR': '🇶🇦', 'RON': '🇷🇴', 'RSD': '🇷🇸', + 'RUB': '🇷🇺', 'RWF': '🇷🇼', 'SAR': '🇸🇦', 'SBD': '🇸🇧', 'SCR': '🇸🇨', + 'SDG': '🇸🇩', 'SEK': '🇸🇪', 'SHP': '🇸🇭', 'SLE': '🇸🇱', 'SLL': '🇸🇱', + 'SOS': '🇸🇴', 'SRD': '🇸🇷', 'SSP': '🇸🇸', 'STN': '🇸🇹', 'SYP': '🇸🇾', + 'SZL': '🇸🇿', 'TJS': '🇹🇯', 'TMT': '🇹🇲', 'TND': '🇹🇳', 'TOP': '🇹🇴', + 'TRY': '🇹🇷', 'TTD': '🇹🇹', 'TVD': '🇹🇻', 'TWD': '🇹🇼', 'TZS': '🇹🇿', + 'UAH': '🇺🇦', 'UGX': '🇺🇬', 'UYU': '🇺🇾', 'UZS': '🇺🇿', 'VES': '🇻🇪', + 'VND': '🇻🇳', 'VUV': '🇻🇺', 'WST': '🇼🇸', 'XAF': '🌍', 'XCD': '🏝️', + 'XCG': '🏝️', 'XDR': '🌐', 'XOF': '🌍', 'XPF': '🌊', 'YER': '🇾🇪', + 'ZAR': '🇿🇦', 'ZMW': '🇿🇲', 'ZWL': '🇿🇼' +}; + +// DOM元素 +let elements = {}; +let currentRates = []; +let filteredRates = []; + +// 初始化 +document.addEventListener('DOMContentLoaded', function() { + initElements(); + initCurrencySelector(); + bindEvents(); + loadExchangeRates(); +}); + +// 初始化DOM元素 +function initElements() { + elements = { + currencySelect: document.getElementById('currency-select'), + searchInput: document.getElementById('search-input'), + loading: document.getElementById('loading'), + content: document.getElementById('exchange-content'), + baseCurrency: document.getElementById('base-currency'), + updateTime: document.getElementById('update-time'), + ratesGrid: document.getElementById('rates-grid'), + totalCurrencies: document.getElementById('total-currencies'), + lastUpdate: document.getElementById('last-update') + }; +} + +// 初始化货币选择器 +function initCurrencySelector() { + if (!elements.currencySelect) return; + + // 添加常用货币选项 + POPULAR_CURRENCIES.forEach(currency => { + const option = document.createElement('option'); + option.value = currency.code; + option.textContent = `${currency.flag} ${currency.code} - ${currency.name}`; + if (currency.code === API.defaultCurrency) { + option.selected = true; + } + elements.currencySelect.appendChild(option); + }); +} + +// 绑定事件 +function bindEvents() { + // 货币选择变化 + if (elements.currencySelect) { + elements.currencySelect.addEventListener('change', function() { + loadExchangeRates(this.value); + }); + } + + // 搜索功能 + if (elements.searchInput) { + elements.searchInput.addEventListener('input', function() { + filterRates(this.value); + }); + } +} + +// 加载汇率数据 +async function loadExchangeRates(currency = API.defaultCurrency) { + try { + showLoading(true); + + // 尝试从API获取数据 + const data = await fetchFromAPI(currency); + + if (data && data.code === 200 && data.data) { + currentRates = data.data.rates || []; + displayExchangeRates(data.data); + } else { + // 尝试从本地获取数据 + const localData = await fetchFromLocal(); + if (localData && localData.code === 200 && localData.data) { + currentRates = localData.data.rates || []; + displayExchangeRates(localData.data); + showError('使用本地数据,可能不是最新汇率'); + } else { + throw new Error('无法获取汇率数据'); + } + } + + } catch (error) { + console.error('加载汇率失败:', error); + showError('加载汇率数据失败,请稍后重试'); + } finally { + showLoading(false); + } +} + +// 从API获取数据 +async function fetchFromAPI(currency) { + // 初始化API接口列表 + await API.init(); + + // 重置API索引到第一个接口 + API.reset(); + + // 尝试所有API接口 + for (let i = 0; i < API.endpoints.length; i++) { + try { + const url = API.getCurrentUrl(currency); + console.log(`尝试接口 ${i + 1}/${API.endpoints.length}: ${url}`); + + const response = await fetch(url, { + cache: 'no-store' + }); + + if (!response.ok) { + throw new Error(`HTTP ${response.status}: ${response.statusText}`); + } + + const data = await response.json(); + + if (data && data.code === 200) { + console.log(`接口 ${i + 1} 请求成功`); + return data; + } + + throw new Error(data && data.message ? data.message : '接口返回异常'); + + } catch (e) { + console.warn(`接口 ${i + 1} 失败:`, e.message); + + // 如果不是最后一个接口,切换到下一个 + if (i < API.endpoints.length - 1) { + API.switchToNext(); + continue; + } + + // 所有接口都失败了 + console.warn('所有远程接口都失败,尝试本地数据'); + return null; + } + } +} + +// 从本地获取数据 +async function fetchFromLocal() { + try { + const response = await fetch(API.localFallback + `?t=${Date.now()}`); + if (!response.ok) throw new Error(`本地文件HTTP ${response.status}`); + const data = await response.json(); + return data; + } catch (e) { + console.error('读取本地返回接口.json失败:', e); + return null; + } +} + +// 显示汇率数据 +function displayExchangeRates(data) { + if (!data || !data.rates) { + showError('没有获取到汇率数据'); + return; + } + + // 更新基础货币信息 + if (elements.baseCurrency) { + const baseCurrencyName = CURRENCY_NAMES[data.base_code] || data.base_code; + const baseCurrencyFlag = CURRENCY_FLAGS[data.base_code] || '💱'; + elements.baseCurrency.textContent = `${baseCurrencyFlag} ${data.base_code} - ${baseCurrencyName}`; + } + + // 更新时间信息 + if (elements.updateTime && data.updated) { + elements.updateTime.textContent = `更新时间: ${data.updated}`; + } + + // 更新统计信息 + updateStats(data); + + // 显示汇率列表 + filteredRates = data.rates; + renderRates(filteredRates); + + // 显示内容区域 + if (elements.content) { + elements.content.classList.add('fade-in'); + elements.content.style.display = 'block'; + } +} + +// 更新统计信息 +function updateStats(data) { + if (elements.totalCurrencies) { + elements.totalCurrencies.textContent = data.rates ? data.rates.length : 0; + } + + if (elements.lastUpdate && data.updated) { + elements.lastUpdate.textContent = data.updated; + } +} + +// 渲染汇率列表 +function renderRates(rates) { + if (!elements.ratesGrid || !rates) return; + + // 按优先级排序货币 + const sortedRates = [...rates].sort((a, b) => { + const priorityA = CURRENCY_PRIORITY[a.currency] || 999; + const priorityB = CURRENCY_PRIORITY[b.currency] || 999; + + // 优先级相同时按货币代码字母顺序排序 + if (priorityA === priorityB) { + return a.currency.localeCompare(b.currency); + } + + return priorityA - priorityB; + }); + + elements.ratesGrid.innerHTML = ''; + + sortedRates.forEach(rate => { + const rateCard = createRateCard(rate); + elements.ratesGrid.appendChild(rateCard); + }); +} + +// 创建汇率卡片 +function createRateCard(rate) { + const card = document.createElement('div'); + card.className = 'rate-card'; + + const currencyName = CURRENCY_NAMES[rate.currency] || rate.currency; + const currencyFlag = CURRENCY_FLAGS[rate.currency] || '💱'; + + card.innerHTML = ` +
+ ${currencyFlag} + ${rate.currency} +
+
${formatRate(rate.rate)}
+
${currencyName}
+ `; + + return card; +} + +// 格式化汇率 +function formatRate(rate) { + if (rate >= 1) { + return rate.toFixed(4); + } else if (rate >= 0.01) { + return rate.toFixed(6); + } else { + return rate.toFixed(8); + } +} + +// 过滤汇率数据 +function filterRates(searchTerm) { + if (!searchTerm.trim()) { + renderRates(currentRates); + return; + } + + const filtered = currentRates.filter(rate => { + const currencyName = CURRENCY_NAMES[rate.currency] || rate.currency; + return rate.currency.toLowerCase().includes(searchTerm.toLowerCase()) || + currencyName.toLowerCase().includes(searchTerm.toLowerCase()); + }); + + renderRates(filtered); +} + +// 显示/隐藏加载状态 +function showLoading(show) { + if (elements.loading) { + elements.loading.style.display = show ? 'block' : 'none'; + } + if (elements.content) { + elements.content.style.display = show ? 'none' : 'block'; + } +} + +// 显示错误信息 +function showError(message) { + if (elements.content) { + elements.content.innerHTML = ` +
+

⚠️ 加载失败

+

${escapeHtml(message)}

+

请检查网络连接或稍后重试

+
+ `; + elements.content.style.display = 'block'; + } +} + +// HTML转义 +function escapeHtml(text) { + if (!text) return ''; + const div = document.createElement('div'); + div.textContent = text; + return div.innerHTML; +} + +// 错误处理 +window.addEventListener('error', function(event) { + console.error('页面错误:', event.error); +}); + +// 网络状态监听 +window.addEventListener('online', function() { + console.log('网络已连接'); +}); + +window.addEventListener('offline', function() { + console.log('网络已断开'); + showError('网络连接已断开,请检查网络设置'); +}); + +// 导出函数供外部调用 +window.ExchangeRate = { + loadExchangeRates, + showError, + showLoading +}; \ No newline at end of file diff --git a/frontend/60sapi/日更资讯/每日国际汇率/接口集合.json b/frontend/60sapi/日更资讯/每日国际汇率/接口集合.json new file mode 100644 index 00000000..04e92b7f --- /dev/null +++ b/frontend/60sapi/日更资讯/每日国际汇率/接口集合.json @@ -0,0 +1,7 @@ +[ + "https://60s-cf.viki.moe", + "https://60s.viki.moe", + "https://60s.b23.run", + "https://60s.114128.xyz", + "https://60s-cf.114128.xyz" +] diff --git a/frontend/60sapi/日更资讯/每日国际汇率/返回接口.json b/frontend/60sapi/日更资讯/每日国际汇率/返回接口.json new file mode 100644 index 00000000..b376d9c2 --- /dev/null +++ b/frontend/60sapi/日更资讯/每日国际汇率/返回接口.json @@ -0,0 +1 @@ +{"code":200,"message":"获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841","data":{"base_code":"CNY","updated":"2025/08/19 08:02:31","updated_at":1755561751000,"next_updated":"2025/08/20 08:11:41","next_updated_at":1755648701000,"rates":[{"currency":"CNY","rate":1},{"currency":"AED","rate":0.511124},{"currency":"AFN","rate":9.517171},{"currency":"ALL","rate":11.591448},{"currency":"AMD","rate":53.380737},{"currency":"ANG","rate":0.249125},{"currency":"AOA","rate":130.082117},{"currency":"ARS","rate":180.766035},{"currency":"AUD","rate":0.214039},{"currency":"AWG","rate":0.249125},{"currency":"AZN","rate":0.236907},{"currency":"BAM","rate":0.233194},{"currency":"BBD","rate":0.278352},{"currency":"BDT","rate":16.911823},{"currency":"BGN","rate":0.233216},{"currency":"BHD","rate":0.05233},{"currency":"BIF","rate":416.872549},{"currency":"BMD","rate":0.139176},{"currency":"BND","rate":0.178681},{"currency":"BOB","rate":0.962893},{"currency":"BRL","rate":0.752907},{"currency":"BSD","rate":0.139176},{"currency":"BTN","rate":12.167157},{"currency":"BWP","rate":1.952087},{"currency":"BYN","rate":0.44452},{"currency":"BZD","rate":0.278352},{"currency":"CAD","rate":0.19212},{"currency":"CDF","rate":404.961905},{"currency":"CHF","rate":0.112314},{"currency":"CLP","rate":134.245001},{"currency":"COP","rate":560.180139},{"currency":"CRC","rate":70.415535},{"currency":"CUP","rate":3.340225},{"currency":"CVE","rate":13.146924},{"currency":"CZK","rate":2.918414},{"currency":"DJF","rate":24.734508},{"currency":"DKK","rate":0.889716},{"currency":"DOP","rate":8.582359},{"currency":"DZD","rate":18.079862},{"currency":"EGP","rate":6.734271},{"currency":"ERN","rate":2.087641},{"currency":"ETB","rate":19.722171},{"currency":"EUR","rate":0.119223},{"currency":"FJD","rate":0.314391},{"currency":"FKP","rate":0.102914},{"currency":"FOK","rate":0.889734},{"currency":"GBP","rate":0.102909},{"currency":"GEL","rate":0.375537},{"currency":"GGP","rate":0.102914},{"currency":"GHS","rate":1.578239},{"currency":"GIP","rate":0.102914},{"currency":"GMD","rate":10.138575},{"currency":"GNF","rate":1210.235138},{"currency":"GTQ","rate":1.068254},{"currency":"GYD","rate":29.143934},{"currency":"HKD","rate":1.088795},{"currency":"HNL","rate":3.652528},{"currency":"HRK","rate":0.89834},{"currency":"HTG","rate":18.225889},{"currency":"HUF","rate":47.111579},{"currency":"IDR","rate":2251.38752},{"currency":"ILS","rate":0.471627},{"currency":"IMP","rate":0.102914},{"currency":"INR","rate":12.167163},{"currency":"IQD","rate":182.493562},{"currency":"IRR","rate":5947.331641},{"currency":"ISK","rate":17.059481},{"currency":"JEP","rate":0.102914},{"currency":"JMD","rate":22.284011},{"currency":"JOD","rate":0.098676},{"currency":"JPY","rate":20.560161},{"currency":"KES","rate":18.001838},{"currency":"KGS","rate":12.154697},{"currency":"KHR","rate":559.486842},{"currency":"KID","rate":0.213953},{"currency":"KMF","rate":58.657438},{"currency":"KRW","rate":193.082196},{"currency":"KWD","rate":0.042467},{"currency":"KYD","rate":0.11598},{"currency":"KZT","rate":75.044843},{"currency":"LAK","rate":3020.068103},{"currency":"LBP","rate":12456.256905},{"currency":"LKR","rate":41.92144},{"currency":"LRD","rate":27.931467},{"currency":"LSL","rate":2.453056},{"currency":"LYD","rate":0.753251},{"currency":"MAD","rate":1.256183},{"currency":"MDL","rate":2.318865},{"currency":"MGA","rate":616.246377},{"currency":"MKD","rate":7.330199},{"currency":"MMK","rate":292.821503},{"currency":"MNT","rate":496.284455},{"currency":"MOP","rate":1.121431},{"currency":"MRU","rate":5.575062},{"currency":"MUR","rate":6.322278},{"currency":"MVR","rate":2.152859},{"currency":"MWK","rate":242.759976},{"currency":"MXN","rate":2.615768},{"currency":"MYR","rate":0.587931},{"currency":"MZN","rate":8.897355},{"currency":"NAD","rate":2.453056},{"currency":"NGN","rate":213.548738},{"currency":"NIO","rate":5.126446},{"currency":"NOK","rate":1.418768},{"currency":"NPR","rate":19.467451},{"currency":"NZD","rate":0.234779},{"currency":"OMR","rate":0.053513},{"currency":"PAB","rate":0.139176},{"currency":"PEN","rate":0.494927},{"currency":"PGK","rate":0.582729},{"currency":"PHP","rate":7.93572},{"currency":"PKR","rate":39.46328},{"currency":"PLN","rate":0.506978},{"currency":"PYG","rate":1027.399127},{"currency":"QAR","rate":0.506601},{"currency":"RON","rate":0.603459},{"currency":"RSD","rate":13.970729},{"currency":"RUB","rate":11.172399},{"currency":"RWF","rate":202.11696},{"currency":"SAR","rate":0.52191},{"currency":"SBD","rate":1.166597},{"currency":"SCR","rate":2.048212},{"currency":"SDG","rate":62.256223},{"currency":"SEK","rate":1.330729},{"currency":"SGD","rate":0.178681},{"currency":"SHP","rate":0.102914},{"currency":"SLE","rate":3.233657},{"currency":"SLL","rate":3233.656465},{"currency":"SOS","rate":79.627341},{"currency":"SRD","rate":5.237221},{"currency":"SSP","rate":656.433807},{"currency":"STN","rate":2.921141},{"currency":"SYP","rate":1797.905083},{"currency":"SZL","rate":2.453056},{"currency":"THB","rate":4.522448},{"currency":"TJS","rate":1.304898},{"currency":"TMT","rate":0.487573},{"currency":"TND","rate":0.400111},{"currency":"TOP","rate":0.334775},{"currency":"TRY","rate":5.692494},{"currency":"TTD","rate":0.944407},{"currency":"TVD","rate":0.213953},{"currency":"TWD","rate":4.180337},{"currency":"TZS","rate":362.491953},{"currency":"UAH","rate":5.749996},{"currency":"UGX","rate":495.482314},{"currency":"USD","rate":0.139189},{"currency":"UYU","rate":5.574},{"currency":"UZS","rate":1755.559577},{"currency":"VES","rate":19.06244},{"currency":"VND","rate":3651.953637},{"currency":"VUV","rate":16.614981},{"currency":"WST","rate":0.37355},{"currency":"XAF","rate":78.209917},{"currency":"XCD","rate":0.375775},{"currency":"XCG","rate":0.249125},{"currency":"XDR","rate":0.101791},{"currency":"XOF","rate":78.209917},{"currency":"XPF","rate":14.227984},{"currency":"YER","rate":33.479791},{"currency":"ZAR","rate":2.453082},{"currency":"ZMW","rate":3.244378},{"currency":"ZWL","rate":3.727233}]}} \ No newline at end of file diff --git a/frontend/60sapi/热搜榜单/HackerNews榜单/css/background.css b/frontend/60sapi/热搜榜单/HackerNews榜单/css/background.css new file mode 100644 index 00000000..b889760c --- /dev/null +++ b/frontend/60sapi/热搜榜单/HackerNews榜单/css/background.css @@ -0,0 +1,106 @@ +/* 彩虹背景相关样式 */ +body { + background: linear-gradient( + 135deg, + #ff6b6b 0%, + #4ecdc4 12.5%, + #45b7d1 25%, + #96ceb4 37.5%, + #feca57 50%, + #ff9ff3 62.5%, + #54a0ff 75%, + #5f27cd 87.5%, + #00d2d3 100% + ); + background-size: 400% 400%; + animation: rainbowGradient 15s ease infinite; + background-attachment: fixed; + min-height: 100vh; + position: relative; +} + +@keyframes rainbowGradient { + 0% { + background-position: 0% 50%; + } + 25% { + background-position: 100% 50%; + } + 50% { + background-position: 100% 100%; + } + 75% { + background-position: 0% 100%; + } + 100% { + background-position: 0% 50%; + } +} + +/* 彩虹装饰层 */ +body::before { + content: ''; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: + radial-gradient(circle at 20% 20%, rgba(255, 107, 107, 0.15) 0%, transparent 50%), + radial-gradient(circle at 80% 80%, rgba(78, 205, 196, 0.15) 0%, transparent 50%), + radial-gradient(circle at 40% 80%, rgba(69, 183, 209, 0.12) 0%, transparent 40%), + radial-gradient(circle at 60% 20%, rgba(150, 206, 180, 0.12) 0%, transparent 40%), + radial-gradient(circle at 80% 40%, rgba(254, 202, 87, 0.1) 0%, transparent 35%); + pointer-events: none; + z-index: -1; + animation: float 20s ease-in-out infinite alternate; +} + +/* 彩虹粒子效果 */ +body::after { + content: ''; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-image: + radial-gradient(circle at 10% 10%, rgba(255, 107, 107, 0.8) 2px, transparent 2px), + radial-gradient(circle at 30% 20%, rgba(78, 205, 196, 0.8) 1.5px, transparent 1.5px), + radial-gradient(circle at 50% 30%, rgba(69, 183, 209, 0.8) 1px, transparent 1px), + radial-gradient(circle at 70% 40%, rgba(150, 206, 180, 0.8) 2px, transparent 2px), + radial-gradient(circle at 90% 50%, rgba(254, 202, 87, 0.8) 1.5px, transparent 1.5px), + radial-gradient(circle at 20% 60%, rgba(255, 159, 243, 0.8) 1px, transparent 1px), + radial-gradient(circle at 40% 70%, rgba(84, 160, 255, 0.8) 2px, transparent 2px), + radial-gradient(circle at 60% 80%, rgba(95, 39, 205, 0.8) 1.5px, transparent 1.5px), + radial-gradient(circle at 80% 90%, rgba(0, 210, 211, 0.8) 1px, transparent 1px); + background-size: 200px 200px, 250px 250px, 180px 180px, 300px 300px, 220px 220px, 160px 160px, 280px 280px, 240px 240px, 200px 200px; + animation: sparkle 25s linear infinite; + pointer-events: none; + z-index: -1; + opacity: 0.6; +} + +@keyframes float { + 0% { + transform: translateY(0px) rotate(0deg); + } + 100% { + transform: translateY(-15px) rotate(2deg); + } +} + +@keyframes sparkle { + 0%, 100% { + transform: translateX(0) translateY(0) scale(1); + } + 25% { + transform: translateX(-10px) translateY(-5px) scale(1.1); + } + 50% { + transform: translateX(10px) translateY(-10px) scale(0.9); + } + 75% { + transform: translateX(-5px) translateY(-15px) scale(1.05); + } +} diff --git a/frontend/60sapi/热搜榜单/HackerNews榜单/css/style.css b/frontend/60sapi/热搜榜单/HackerNews榜单/css/style.css new file mode 100644 index 00000000..caf27e8e --- /dev/null +++ b/frontend/60sapi/热搜榜单/HackerNews榜单/css/style.css @@ -0,0 +1,1037 @@ +/* 重置样式 */ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Helvetica Neue', Arial, sans-serif; + line-height: 1.6; + color: #2c3e50; + overflow-x: hidden; +} + +/* 容器 */ +.container { + max-width: 1200px; + margin: 0 auto; + padding: 20px; + animation: containerFadeIn 1s ease-out; +} + +@keyframes containerFadeIn { + from { + opacity: 0; + transform: translateY(30px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +/* 头部 */ +.header { + text-align: center; + margin-bottom: 40px; + background: rgba(255, 255, 255, 0.95); + padding: 40px 30px; + border-radius: 25px; + box-shadow: + 0 10px 40px rgba(0, 0, 0, 0.1), + 0 0 0 1px rgba(255, 255, 255, 0.5); + backdrop-filter: blur(20px); + border: 2px solid transparent; + background-clip: padding-box; + position: relative; + overflow: hidden; +} + +.header::before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: linear-gradient(45deg, + rgba(255, 107, 107, 0.1), + rgba(78, 205, 196, 0.1), + rgba(69, 183, 209, 0.1), + rgba(150, 206, 180, 0.1) + ); + animation: headerShimmer 4s ease-in-out infinite; + z-index: -1; +} + +@keyframes headerShimmer { + 0%, 100% { opacity: 0.3; } + 50% { opacity: 0.7; } +} + +.header-icon { + font-size: 4em; + margin-bottom: 15px; + animation: rainbowBounce 3s ease-in-out infinite; + text-shadow: 0 0 20px rgba(255, 255, 255, 0.8); +} + +@keyframes rainbowBounce { + 0%, 100% { + transform: translateY(0) scale(1); + filter: hue-rotate(0deg); + } + 25% { + transform: translateY(-10px) scale(1.05); + filter: hue-rotate(90deg); + } + 50% { + transform: translateY(-15px) scale(1.1); + filter: hue-rotate(180deg); + } + 75% { + transform: translateY(-5px) scale(1.05); + filter: hue-rotate(270deg); + } +} + +.title { + font-size: 3.2em; + font-weight: 800; + background: linear-gradient(45deg, #ff6b6b, #4ecdc4, #45b7d1, #96ceb4, #feca57, #ff9ff3); + background-size: 400% 400%; + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; + animation: rainbowText 3s ease-in-out infinite; + margin-bottom: 10px; + text-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); + letter-spacing: 2px; +} + +@keyframes rainbowText { + 0%, 100% { background-position: 0% 50%; } + 50% { background-position: 100% 50%; } +} + +.subtitle { + font-size: 1.3em; + color: #34495e; + margin-bottom: 25px; + font-weight: 600; + opacity: 0.9; +} + +/* 标签切换 */ +.tab-container { + display: flex; + justify-content: center; + gap: 15px; + margin-bottom: 25px; + flex-wrap: wrap; +} + +.tab-btn { + background: linear-gradient(135deg, rgba(255, 255, 255, 0.9), rgba(255, 255, 255, 0.7)); + border: 2px solid transparent; + padding: 12px 24px; + border-radius: 25px; + cursor: pointer; + font-size: 1em; + font-weight: 600; + transition: all 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94); + position: relative; + overflow: hidden; + display: flex; + align-items: center; + gap: 8px; + color: #2c3e50; + backdrop-filter: blur(10px); + box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1); +} + +.tab-btn::before { + content: ''; + position: absolute; + top: 0; + left: -100%; + width: 100%; + height: 100%; + background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.4), transparent); + transition: left 0.5s ease; +} + +.tab-btn:hover::before { + left: 100%; +} + +.tab-btn.active { + background: linear-gradient(135deg, #ff6b6b, #4ecdc4); + color: white; + transform: translateY(-3px) scale(1.05); + box-shadow: 0 8px 25px rgba(255, 107, 107, 0.4); +} + +.tab-btn:hover { + transform: translateY(-2px); + box-shadow: 0 6px 20px rgba(0, 0, 0, 0.15); +} + +.tab-icon { + font-size: 1.2em; + transition: transform 0.3s ease; +} + +.tab-btn:hover .tab-icon { + transform: scale(1.2) rotate(10deg); +} + +.update-time { + display: flex; + align-items: center; + justify-content: center; + gap: 8px; + color: #34495e; + font-size: 1em; + margin-bottom: 20px; + padding: 10px 20px; + background: rgba(52, 73, 94, 0.1); + border-radius: 25px; + display: inline-flex; + backdrop-filter: blur(5px); +} + +.time-icon { + font-size: 1.2em; + animation: tick 2s infinite; +} + +@keyframes tick { + 0%, 50% { transform: rotate(0deg); } + 25% { transform: rotate(20deg); } + 75% { transform: rotate(-20deg); } +} + +.refresh-btn { + background: linear-gradient(135deg, #ff6b6b, #4ecdc4, #45b7d1); + background-size: 200% 200%; + color: white; + border: none; + padding: 15px 35px; + border-radius: 30px; + cursor: pointer; + font-size: 1.1em; + font-weight: 700; + transition: all 0.4s ease; + box-shadow: 0 6px 20px rgba(255, 107, 107, 0.3); + display: inline-flex; + align-items: center; + gap: 10px; + position: relative; + overflow: hidden; + animation: buttonRainbow 3s ease-in-out infinite; +} + +@keyframes buttonRainbow { + 0%, 100% { background-position: 0% 50%; } + 50% { background-position: 100% 50%; } +} + +.refresh-btn::before { + content: ''; + position: absolute; + top: 50%; + left: 50%; + width: 0; + height: 0; + background: rgba(255, 255, 255, 0.3); + border-radius: 50%; + transform: translate(-50%, -50%); + transition: all 0.6s ease; +} + +.refresh-btn:hover::before { + width: 300px; + height: 300px; +} + +.refresh-btn:hover { + transform: translateY(-4px) scale(1.05); + box-shadow: 0 10px 30px rgba(255, 107, 107, 0.5); +} + +.btn-icon { + font-size: 1.3em; + transition: transform 0.4s ease; +} + +.refresh-btn:hover .btn-icon { + transform: rotate(360deg); +} + +/* 彩虹加载动画 */ +.loading { + text-align: center; + padding: 70px 40px; + background: rgba(255, 255, 255, 0.95); + border-radius: 25px; + margin-bottom: 25px; + box-shadow: 0 10px 40px rgba(0, 0, 0, 0.1); + backdrop-filter: blur(20px); +} + +.loading-content { + display: flex; + flex-direction: column; + align-items: center; + gap: 25px; +} + +.rainbow-spinner { + width: 60px; + height: 60px; + border: 6px solid transparent; + border-radius: 50%; + background: linear-gradient(45deg, #ff6b6b, #4ecdc4, #45b7d1, #96ceb4, #feca57, #ff9ff3) border-box; + background-clip: padding-box; + position: relative; + animation: rainbowSpin 2s linear infinite; +} + +.rainbow-spinner::before { + content: ''; + position: absolute; + top: -6px; + left: -6px; + right: -6px; + bottom: -6px; + background: linear-gradient(45deg, #ff6b6b, #4ecdc4, #45b7d1, #96ceb4, #feca57, #ff9ff3); + border-radius: 50%; + z-index: -1; + animation: rainbowSpin 2s linear infinite reverse; +} + +@keyframes rainbowSpin { + 0% { transform: rotate(0deg); filter: hue-rotate(0deg); } + 100% { transform: rotate(360deg); filter: hue-rotate(360deg); } +} + +.loading-text { + display: flex; + flex-direction: column; + align-items: center; + gap: 15px; +} + +.loading-emoji { + font-size: 3em; + animation: rocketPulse 1.5s ease-in-out infinite alternate; +} + +@keyframes rocketPulse { + 0% { transform: scale(1) rotate(-10deg); } + 100% { transform: scale(1.2) rotate(10deg); } +} + +.loading-text p { + font-size: 1.2em; + color: #34495e; + font-weight: 600; + margin: 0; +} + +.loading-dots { + display: flex; + gap: 8px; +} + +.loading-dots span { + width: 10px; + height: 10px; + border-radius: 50%; + animation: dotRainbow 1.4s ease-in-out infinite both; +} + +.loading-dots span:nth-child(1) { + background: #ff6b6b; + animation-delay: -0.32s; +} +.loading-dots span:nth-child(2) { + background: #4ecdc4; + animation-delay: -0.16s; +} +.loading-dots span:nth-child(3) { + background: #45b7d1; + animation-delay: 0s; +} + +@keyframes dotRainbow { + 0%, 80%, 100% { transform: scale(0.8); opacity: 0.5; } + 40% { transform: scale(1.3); opacity: 1; } +} + +/* 新闻列表 */ +.news-list { + display: grid; + gap: 25px; + animation: listFadeIn 0.8s ease-out; +} + +@keyframes listFadeIn { + from { + opacity: 0; + transform: translateY(40px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +.news-item { + background: rgba(255, 255, 255, 0.98); + border-radius: 20px; + padding: 30px; + box-shadow: 0 5px 25px rgba(0, 0, 0, 0.08); + transition: all 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94); + border: 2px solid transparent; + backdrop-filter: blur(15px); + position: relative; + overflow: hidden; + animation: itemSlideIn 0.6s ease-out; + animation-fill-mode: both; +} + +.news-item:nth-child(odd) { + animation-delay: 0.1s; +} + +.news-item:nth-child(even) { + animation-delay: 0.2s; +} + +@keyframes itemSlideIn { + from { + opacity: 0; + transform: translateX(-60px); + } + to { + opacity: 1; + transform: translateX(0); + } +} + +.news-item::before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 6px; + height: 100%; + background: linear-gradient(to bottom, #ff6b6b, #4ecdc4, #45b7d1); + transform: scaleY(0); + transition: transform 0.4s ease; +} + +.news-item:hover::before { + transform: scaleY(1); +} + +.news-item:hover { + box-shadow: 0 10px 50px rgba(0, 0, 0, 0.12); + transform: translateY(-8px) scale(1.02); + border-color: rgba(255, 107, 107, 0.3); +} + +.news-header { + display: flex; + align-items: center; + margin-bottom: 20px; + gap: 15px; +} + +.news-rank { + background: linear-gradient(135deg, #ff6b6b, #4ecdc4); + color: white; + min-width: 45px; + height: 45px; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + font-weight: bold; + font-size: 1.1em; + flex-shrink: 0; + position: relative; + box-shadow: 0 4px 15px rgba(255, 107, 107, 0.3); + animation: rankGlow 3s ease-in-out infinite; +} + +@keyframes rankGlow { + 0%, 100% { + box-shadow: 0 4px 15px rgba(255, 107, 107, 0.3); + background: linear-gradient(135deg, #ff6b6b, #4ecdc4); + } + 33% { + box-shadow: 0 4px 20px rgba(78, 205, 196, 0.4); + background: linear-gradient(135deg, #4ecdc4, #45b7d1); + } + 66% { + box-shadow: 0 4px 20px rgba(69, 183, 209, 0.4); + background: linear-gradient(135deg, #45b7d1, #96ceb4); + } +} + +.news-rank.top-5 { + background: linear-gradient(135deg, #feca57, #ff9ff3, #54a0ff); + animation: topRankGlow 2s ease-in-out infinite alternate; +} + +@keyframes topRankGlow { + 0% { + box-shadow: 0 4px 20px rgba(254, 202, 87, 0.5); + transform: scale(1); + } + 100% { + box-shadow: 0 6px 30px rgba(255, 159, 243, 0.6), 0 0 40px rgba(84, 160, 255, 0.3); + transform: scale(1.05); + } +} + +.news-rank.top-5::before { + content: '⭐'; + position: absolute; + top: -10px; + right: -8px; + font-size: 0.8em; + animation: starTwinkle 1s ease-in-out infinite alternate; +} + +@keyframes starTwinkle { + 0% { transform: translateY(0) rotate(-10deg) scale(1); } + 100% { transform: translateY(-3px) rotate(10deg) scale(1.1); } +} + +.news-score { + background: linear-gradient(135deg, #ff6b6b, #feca57); + color: white; + padding: 8px 16px; + border-radius: 20px; + font-weight: 700; + font-size: 1em; + box-shadow: 0 3px 10px rgba(255, 107, 107, 0.3); + animation: scoreFloat 2s ease-in-out infinite alternate; +} + +@keyframes scoreFloat { + 0% { transform: translateY(0); } + 100% { transform: translateY(-2px); } +} + +.news-title { + font-size: 1.3em; + font-weight: 700; + color: #2c3e50; + line-height: 1.4; + margin-bottom: 15px; + position: relative; +} + +.news-meta { + display: flex; + align-items: center; + gap: 20px; + margin-bottom: 15px; + flex-wrap: wrap; +} + +.news-author { + color: #7f8c8d; + font-size: 1em; + font-weight: 600; + display: flex; + align-items: center; + gap: 6px; +} + +.news-author::before { + content: '👤'; + font-size: 1.1em; +} + +.news-time { + color: #95a5a6; + font-size: 0.95em; + display: flex; + align-items: center; + gap: 6px; +} + +.news-time::before { + content: '🕒'; + font-size: 1em; +} + +.news-link { + display: inline-flex; + align-items: center; + gap: 8px; + color: white; + text-decoration: none; + font-size: 1em; + font-weight: 600; + padding: 12px 24px; + background: linear-gradient(135deg, #ff6b6b, #4ecdc4); + background-size: 200% 200%; + border-radius: 30px; + transition: all 0.4s ease; + position: relative; + overflow: hidden; + animation: linkRainbow 4s ease-in-out infinite; + box-shadow: 0 4px 15px rgba(255, 107, 107, 0.3); +} + +@keyframes linkRainbow { + 0%, 100% { background-position: 0% 50%; } + 50% { background-position: 100% 50%; } +} + +.news-link::before { + content: '🚀'; + font-size: 1.1em; +} + +.news-link::after { + content: ''; + position: absolute; + top: 0; + left: -100%; + width: 100%; + height: 100%; + background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.3), transparent); + transition: left 0.6s ease; +} + +.news-link:hover::after { + left: 100%; +} + +.news-link:hover { + transform: scale(1.05) translateY(-2px); + box-shadow: 0 8px 25px rgba(255, 107, 107, 0.5); +} + +/* 错误信息 */ +.error-message { + text-align: center; + padding: 70px 40px; + background: rgba(255, 255, 255, 0.95); + border-radius: 25px; + box-shadow: 0 10px 40px rgba(231, 76, 60, 0.1); + backdrop-filter: blur(20px); +} + +.error-content { + display: flex; + flex-direction: column; + align-items: center; + gap: 25px; +} + +.error-icon { + font-size: 5em; + animation: errorShake 1.5s ease-in-out infinite alternate; +} + +@keyframes errorShake { + 0% { transform: translateX(0) rotate(0deg); } + 25% { transform: translateX(-8px) rotate(-8deg); } + 50% { transform: translateX(8px) rotate(8deg); } + 75% { transform: translateX(-5px) rotate(-5deg); } + 100% { transform: translateX(0) rotate(0deg); } +} + +.error-content h3 { + font-size: 1.8em; + color: #e74c3c; + margin: 0; + font-weight: 700; +} + +.error-content p { + color: #7f8c8d; + font-size: 1.1em; + margin: 0; + line-height: 1.6; +} + +.retry-btn { + background: linear-gradient(135deg, #ff6b6b, #4ecdc4); + color: white; + border: none; + padding: 15px 30px; + border-radius: 30px; + cursor: pointer; + font-size: 1.1em; + font-weight: 700; + transition: all 0.4s ease; + box-shadow: 0 6px 20px rgba(255, 107, 107, 0.3); + display: inline-flex; + align-items: center; + gap: 10px; +} + +.retry-btn:hover { + background: linear-gradient(135deg, #e74c3c, #3498db); + box-shadow: 0 8px 25px rgba(255, 107, 107, 0.5); + transform: translateY(-3px); +} + +.retry-btn span { + font-size: 1.2em; + transition: transform 0.4s ease; +} + +.retry-btn:hover span { + transform: rotate(360deg); +} + +/* 平板端适配 (768px - 1024px) */ +@media (min-width: 768px) and (max-width: 1024px) { + .container { + padding: 25px; + } + + .header { + padding: 35px 25px; + } + + .header-icon { + font-size: 3.5em; + } + + .title { + font-size: 2.8em; + letter-spacing: 1.5px; + } + + .subtitle { + font-size: 1.2em; + } + + .news-list { + grid-template-columns: repeat(auto-fit, minmax(450px, 1fr)); + gap: 30px; + } + + .news-item { + padding: 25px; + } + + .news-rank { + min-width: 42px; + height: 42px; + font-size: 1.05em; + } + + .news-title { + font-size: 1.25em; + } + + .tab-container { + gap: 12px; + } + + .tab-btn { + padding: 10px 20px; + font-size: 0.95em; + } +} + +/* 电脑端适配 (1025px+) */ +@media (min-width: 1025px) { + .container { + padding: 40px; + } + + .header { + padding: 50px 40px; + margin-bottom: 50px; + } + + .header-icon { + font-size: 4.5em; + } + + .title { + font-size: 3.8em; + letter-spacing: 3px; + } + + .subtitle { + font-size: 1.4em; + } + + .news-list { + grid-template-columns: repeat(auto-fit, minmax(550px, 1fr)); + gap: 35px; + } + + .news-item { + padding: 35px; + } + + .news-rank { + min-width: 50px; + height: 50px; + font-size: 1.2em; + } + + .news-title { + font-size: 1.4em; + } + + .news-meta { + gap: 25px; + } + + .news-author { + font-size: 1.05em; + } + + .news-time { + font-size: 1em; + } + + .news-link { + font-size: 1.05em; + padding: 14px 28px; + } + + /* 电脑端特殊效果 */ + .news-item:hover { + transform: translateY(-10px) scale(1.03); + } + + .tab-btn { + padding: 14px 28px; + font-size: 1.05em; + } +} + +/* 手机端适配 (767px以下) */ +@media (max-width: 767px) { + .container { + padding: 15px; + } + + .header { + padding: 25px 20px; + margin-bottom: 25px; + } + + .header-icon { + font-size: 2.8em; + } + + .title { + font-size: 2.2em; + letter-spacing: 1px; + } + + .subtitle { + font-size: 1em; + } + + .tab-container { + gap: 8px; + justify-content: center; + } + + .tab-btn { + padding: 8px 16px; + font-size: 0.85em; + flex-direction: column; + gap: 4px; + } + + .update-time { + font-size: 0.9em; + padding: 8px 16px; + } + + .refresh-btn { + padding: 12px 24px; + font-size: 0.95em; + } + + .news-item { + padding: 20px; + border-radius: 15px; + } + + .news-rank { + min-width: 38px; + height: 38px; + font-size: 0.95em; + } + + .news-title { + font-size: 1.15em; + line-height: 1.3; + } + + .news-meta { + flex-direction: column; + align-items: flex-start; + gap: 10px; + } + + .news-author { + font-size: 0.9em; + } + + .news-time { + font-size: 0.85em; + } + + .news-link { + font-size: 0.9em; + padding: 10px 20px; + align-self: flex-start; + } + + /* 手机端动画优化 */ + .news-item { + animation-duration: 0.4s; + } + + .news-item:hover { + transform: translateY(-3px) scale(1.01); + } +} + +/* 超小屏幕适配 (480px以下) */ +@media (max-width: 480px) { + .container { + padding: 12px; + } + + .header { + padding: 20px 15px; + margin-bottom: 20px; + } + + .header-icon { + font-size: 2.5em; + } + + .title { + font-size: 1.9em; + letter-spacing: 0.5px; + } + + .subtitle { + font-size: 0.95em; + } + + .tab-container { + gap: 6px; + } + + .tab-btn { + padding: 6px 12px; + font-size: 0.8em; + min-width: auto; + } + + .tab-icon { + font-size: 1em; + } + + .update-time { + font-size: 0.85em; + padding: 6px 12px; + flex-direction: column; + gap: 4px; + } + + .refresh-btn { + padding: 10px 20px; + font-size: 0.9em; + } + + .news-list { + gap: 15px; + } + + .news-item { + padding: 18px 15px; + border-radius: 12px; + } + + .news-header { + gap: 12px; + margin-bottom: 15px; + } + + .news-rank { + min-width: 35px; + height: 35px; + font-size: 0.9em; + } + + .news-title { + font-size: 1.05em; + line-height: 1.25; + } + + .news-meta { + gap: 8px; + } + + .news-author { + font-size: 0.85em; + } + + .news-time { + font-size: 0.8em; + } + + .news-link { + font-size: 0.85em; + padding: 8px 16px; + } + + /* 超小屏幕性能优化 */ + .news-item { + transition: transform 0.2s ease, box-shadow 0.2s ease; + } + + .news-item::before, + .news-item::after, + .news-link::after { + display: none; + } + + .loading-content { + gap: 15px; + } + + .loading-emoji { + font-size: 2.5em; + } + + .error-icon { + font-size: 3.5em; + } + + .error-content h3 { + font-size: 1.4em; + } + + .error-content p { + font-size: 0.95em; + } +} diff --git a/frontend/60sapi/热搜榜单/HackerNews榜单/index.html b/frontend/60sapi/热搜榜单/HackerNews榜单/index.html new file mode 100644 index 00000000..765583af --- /dev/null +++ b/frontend/60sapi/热搜榜单/HackerNews榜单/index.html @@ -0,0 +1,77 @@ + + + + + + 🔥 HackerNews 热门榜单 + + + + +
+
+
🌈
+

🔥 HackerNews 热门榜单 💻

+

全球技术社区 · 实时热门话题

+ +
+ + + +
+ +
+ + 加载中... +
+ + +
+ +
+
+
+
+ 🚀 +

正在获取最新榜单...

+
+ + + +
+
+
+
+ +
+ +
+ + +
+ + + + diff --git a/frontend/60sapi/热搜榜单/HackerNews榜单/js/script.js b/frontend/60sapi/热搜榜单/HackerNews榜单/js/script.js new file mode 100644 index 00000000..33d90bed --- /dev/null +++ b/frontend/60sapi/热搜榜单/HackerNews榜单/js/script.js @@ -0,0 +1,338 @@ +// API接口列表 +const API_ENDPOINTS = [ + "https://60s-cf.viki.moe", + "https://60s.viki.moe", + "https://60s.b23.run", + "https://60s.114128.xyz", + "https://60s-cf.114128.xyz" +]; + +// 当前使用的API索引 +let currentApiIndex = 0; +let currentType = 'top'; + +// DOM元素 +const loadingElement = document.getElementById('loading'); +const newsListElement = document.getElementById('newsList'); +const errorMessageElement = document.getElementById('errorMessage'); +const updateTimeElement = document.getElementById('updateTime'); +const refreshBtn = document.getElementById('refreshBtn'); +const tabBtns = document.querySelectorAll('.tab-btn'); + +// 页面加载完成后自动加载数据 +document.addEventListener('DOMContentLoaded', function() { + loadNewsList(); + initTabEvents(); +}); + +// 初始化标签事件 +function initTabEvents() { + tabBtns.forEach(btn => { + btn.addEventListener('click', function() { + const type = this.getAttribute('data-type'); + if (type !== currentType) { + currentType = type; + updateActiveTab(this); + loadNewsList(); + } + }); + }); +} + +// 更新活跃标签 +function updateActiveTab(activeBtn) { + tabBtns.forEach(btn => btn.classList.remove('active')); + activeBtn.classList.add('active'); +} + +// 刷新按钮点击事件 +refreshBtn.addEventListener('click', function() { + loadNewsList(); +}); + +// 加载新闻列表 +async function loadNewsList() { + showLoading(); + hideError(); + + try { + const data = await fetchData(); + displayNewsList(data.data); + updateRefreshTime(); + } catch (error) { + console.error('加载失败:', error); + showError(); + } + + hideLoading(); +} + +// 获取数据 +async function fetchData() { + for (let i = 0; i < API_ENDPOINTS.length; i++) { + const apiUrl = API_ENDPOINTS[currentApiIndex]; + + try { + const response = await fetch(`${apiUrl}/v2/hacker-news/${currentType}`, { + method: 'GET', + headers: { + 'Accept': 'application/json', + }, + timeout: 10000 + }); + + if (!response.ok) { + throw new Error(`HTTP ${response.status}`); + } + + const data = await response.json(); + + if (data.code === 200 && data.data) { + return data; + } else { + throw new Error('数据格式错误'); + } + } catch (error) { + console.error(`API ${apiUrl} 请求失败:`, error); + currentApiIndex = (currentApiIndex + 1) % API_ENDPOINTS.length; + + if (i === API_ENDPOINTS.length - 1) { + throw new Error('所有API接口都无法访问'); + } + } + } +} + +// 显示新闻列表 +function displayNewsList(newsData) { + newsListElement.innerHTML = ''; + + newsData.forEach((item, index) => { + const newsItem = createNewsItem(item, index + 1); + newsListElement.appendChild(newsItem); + }); +} + +// 创建新闻项目 +function createNewsItem(item, rank) { + const newsItem = document.createElement('div'); + newsItem.className = 'news-item'; + + const rankClass = rank <= 5 ? 'news-rank top-5' : 'news-rank'; + const formattedScore = formatScore(item.score); + const formattedTime = formatTime(item.created); + + // 根据排名添加特殊标识 + let rankEmoji = ''; + if (rank === 1) rankEmoji = '🏆'; + else if (rank === 2) rankEmoji = '🥈'; + else if (rank === 3) rankEmoji = '🥉'; + else if (rank <= 10) rankEmoji = '💎'; + else rankEmoji = '⭐'; + + // 根据评分添加热度指示 + let heatLevel = ''; + if (item.score >= 1000) heatLevel = '🔥🔥🔥'; + else if (item.score >= 500) heatLevel = '🔥🔥'; + else if (item.score >= 100) heatLevel = '🔥'; + else heatLevel = '💫'; + + newsItem.innerHTML = ` +
+
${rank}
+
${heatLevel} ${formattedScore}
+
+
${rankEmoji} ${escapeHtml(item.title)}
+
+
👤 ${escapeHtml(item.author)}
+
🕒 ${formattedTime}
+
+ + 🚀 阅读全文 + + `; + + return newsItem; +} + +// 格式化评分 +function formatScore(score) { + if (score >= 1000) { + return (score / 1000).toFixed(1) + 'K'; + } else { + return score.toString(); + } +} + +// 格式化时间 +function formatTime(timeStr) { + try { + const date = new Date(timeStr); + const now = new Date(); + const diff = now - date; + const minutes = Math.floor(diff / (1000 * 60)); + const hours = Math.floor(minutes / 60); + const days = Math.floor(hours / 24); + + if (days > 0) { + return `${days}天前`; + } else if (hours > 0) { + return `${hours}小时前`; + } else if (minutes > 0) { + return `${minutes}分钟前`; + } else { + return '刚刚'; + } + } catch (error) { + return timeStr; + } +} + +// HTML转义 +function escapeHtml(text) { + const div = document.createElement('div'); + div.textContent = text; + return div.innerHTML; +} + +// 更新刷新时间 +function updateRefreshTime() { + const now = new Date(); + const timeStr = now.toLocaleString('zh-CN', { + year: 'numeric', + month: '2-digit', + day: '2-digit', + hour: '2-digit', + minute: '2-digit', + second: '2-digit' + }); + updateTimeElement.textContent = `最后更新: ${timeStr}`; + + // 添加成功提示 + showSuccessMessage('🌈 数据已更新'); +} + +// 显示成功消息 +function showSuccessMessage(message) { + // 移除之前的提示 + const existingToast = document.querySelector('.success-toast'); + if (existingToast) { + existingToast.remove(); + } + + const toast = document.createElement('div'); + toast.className = 'success-toast'; + toast.textContent = message; + toast.style.cssText = ` + position: fixed; + top: 20px; + right: 20px; + background: linear-gradient(135deg, #ff6b6b, #4ecdc4, #45b7d1); + color: white; + padding: 12px 20px; + border-radius: 25px; + box-shadow: 0 4px 20px rgba(255, 107, 107, 0.3); + z-index: 1000; + font-weight: 600; + font-size: 0.9em; + animation: rainbowToastSlide 0.5s ease-out; + backdrop-filter: blur(10px); + `; + + document.body.appendChild(toast); + + // 3秒后自动移除 + setTimeout(() => { + toast.style.animation = 'rainbowToastSlideOut 0.5s ease-in forwards'; + setTimeout(() => toast.remove(), 500); + }, 3000); +} + +// 显示加载状态 +function showLoading() { + loadingElement.style.display = 'block'; + newsListElement.style.display = 'none'; +} + +// 隐藏加载状态 +function hideLoading() { + loadingElement.style.display = 'none'; + newsListElement.style.display = 'block'; +} + +// 显示错误信息 +function showError() { + errorMessageElement.style.display = 'block'; + newsListElement.style.display = 'none'; +} + +// 隐藏错误信息 +function hideError() { + errorMessageElement.style.display = 'none'; +} + +// 添加CSS动画到页面 +if (!document.querySelector('#toast-styles')) { + const style = document.createElement('style'); + style.id = 'toast-styles'; + style.textContent = ` + @keyframes rainbowToastSlide { + from { + opacity: 0; + transform: translateX(100px) scale(0.8); + } + to { + opacity: 1; + transform: translateX(0) scale(1); + } + } + + @keyframes rainbowToastSlideOut { + from { + opacity: 1; + transform: translateX(0) scale(1); + } + to { + opacity: 0; + transform: translateX(100px) scale(0.8); + } + } + + .success-toast { + background-size: 200% 200%; + animation: rainbowToastSlide 0.5s ease-out, toastRainbow 2s ease-in-out infinite !important; + } + + @keyframes toastRainbow { + 0%, 100% { background-position: 0% 50%; } + 50% { background-position: 100% 50%; } + } + `; + document.head.appendChild(style); +} + +// 自动刷新 (每5分钟) +setInterval(function() { + loadNewsList(); +}, 5 * 60 * 1000); + +// 键盘快捷键支持 +document.addEventListener('keydown', function(e) { + if (e.key === 'r' && (e.ctrlKey || e.metaKey)) { + e.preventDefault(); + loadNewsList(); + } + + // 数字键切换标签 + if (e.key >= '1' && e.key <= '3') { + e.preventDefault(); + const typeMap = { '1': 'top', '2': 'new', '3': 'best' }; + const targetType = typeMap[e.key]; + const targetBtn = document.querySelector(`[data-type="${targetType}"]`); + if (targetBtn && targetType !== currentType) { + currentType = targetType; + updateActiveTab(targetBtn); + loadNewsList(); + } + } +}); diff --git a/frontend/60sapi/热搜榜单/HackerNews榜单/接口集合.json b/frontend/60sapi/热搜榜单/HackerNews榜单/接口集合.json new file mode 100644 index 00000000..04e92b7f --- /dev/null +++ b/frontend/60sapi/热搜榜单/HackerNews榜单/接口集合.json @@ -0,0 +1,7 @@ +[ + "https://60s-cf.viki.moe", + "https://60s.viki.moe", + "https://60s.b23.run", + "https://60s.114128.xyz", + "https://60s-cf.114128.xyz" +] diff --git a/frontend/60sapi/热搜榜单/HackerNews榜单/返回接口.json b/frontend/60sapi/热搜榜单/HackerNews榜单/返回接口.json new file mode 100644 index 00000000..0008f691 --- /dev/null +++ b/frontend/60sapi/热搜榜单/HackerNews榜单/返回接口.json @@ -0,0 +1,87 @@ +{ + "code": 200, + "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", + "data": [ + { + "id": 45087396, + "title": "We should have the ability to run any code we want on hardware we own", + "link": "https://hugotunius.se/2025/08/31/what-every-argument-about-sideloading-gets-wrong.html", + "score": 995, + "author": "K0nserv", + "created": "2025-08-31 21:46:26", + "created_at": 1756676786000 + }, + { + "id": 45053029, + "title": "Why countries trade with each other while fighting", + "link": "https://news.mit.edu/2025/why-countries-trade-each-other-while-fighting-mariya-grinberg-book-0828", + "score": 32, + "author": "LorenDB", + "created": "2025-08-28 14:58:28", + "created_at": 1756393108000 + }, + { + "id": 45086020, + "title": "Eternal Struggle", + "link": "https://yoavg.github.io/eternal/", + "score": 481, + "author": "yurivish", + "created": "2025-08-31 19:04:03", + "created_at": 1756667043000 + }, + { + "id": 45052960, + "title": "C++: Strongly Happens Before?", + "link": "https://nekrozqliphort.github.io/posts/happens-b4/", + "score": 16, + "author": "signa11", + "created": "2025-08-28 14:54:37", + "created_at": 1756392877000 + }, + { + "id": 45087971, + "title": "Nintendo Switch 2 Dock USB-C Compatibility", + "link": "https://www.lttlabs.com/blog/2025/08/30/nintendo-switch-2-dock", + "score": 192, + "author": "croes", + "created": "2025-08-31 23:21:46", + "created_at": 1756682506000 + }, + { + "id": 45082731, + "title": "“This telegram must be closely paraphrased before being communicated to anyone”", + "link": "https://history.stackexchange.com/questions/79371/this-telegram-must-be-closely-paraphrased-before-being-communicated-to-anyone", + "score": 645, + "author": "azeemba", + "created": "2025-08-31 12:39:47", + "created_at": 1756643987000 + }, + { + "id": 45089256, + "title": "What Is Complexity in Chess?", + "link": "https://lichess.org/@/Toadofsky/blog/what-is-complexity/pKo1swFh", + "score": 41, + "author": "fzliu", + "created": "2025-09-01 03:45:33", + "created_at": 1756698333000 + }, + { + "id": 45087815, + "title": "Lewis and Clark marked their trail with laxatives", + "link": "https://offbeatoregon.com/2501d1006d_biliousPills-686.077.html", + "score": 141, + "author": "toomuchtodo", + "created": "2025-08-31 22:54:26", + "created_at": 1756680866000 + }, + { + "id": 45083952, + "title": "Jujutsu for everyone", + "link": "https://jj-for-everyone.github.io/", + "score": 363, + "author": "Bogdanp", + "created": "2025-08-31 15:31:04", + "created_at": 1756654264000 + } + ] +} \ No newline at end of file diff --git a/frontend/60sapi/热搜榜单/微博热搜榜/css/background.css b/frontend/60sapi/热搜榜单/微博热搜榜/css/background.css new file mode 100644 index 00000000..91b3ee72 --- /dev/null +++ b/frontend/60sapi/热搜榜单/微博热搜榜/css/background.css @@ -0,0 +1,40 @@ +.background-container { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: -1; + overflow: hidden; +} + +.rainbow-gradient { + position: absolute; + top: -50%; + left: -50%; + width: 200%; + height: 200%; + background: linear-gradient( + 217deg, + rgba(255, 0, 0, 0.6), + rgba(255, 0, 0, 0) 70.71% + ), linear-gradient( + 127deg, + rgba(0, 255, 0, 0.6), + rgba(0, 255, 0, 0) 70.71% + ), linear-gradient( + 336deg, + rgba(0, 0, 255, 0.6), + rgba(0, 0, 255, 0) 70.71% + ); + animation: rainbow-rotate 15s linear infinite; +} + +@keyframes rainbow-rotate { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(360deg); + } +} \ No newline at end of file diff --git a/frontend/60sapi/热搜榜单/微博热搜榜/css/style.css b/frontend/60sapi/热搜榜单/微博热搜榜/css/style.css new file mode 100644 index 00000000..b7d33692 --- /dev/null +++ b/frontend/60sapi/热搜榜单/微博热搜榜/css/style.css @@ -0,0 +1,155 @@ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: 'PingFang SC', 'Microsoft YaHei', sans-serif; + color: #333; + background-color: #f5f5f5; + position: relative; + min-height: 100vh; +} + +.container { + max-width: 800px; + margin: 0 auto; + padding: 20px; + position: relative; + z-index: 1; + background-color: rgba(255, 255, 255, 0.85); + border-radius: 10px; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); +} + +header { + text-align: center; + margin-bottom: 20px; + padding-bottom: 15px; + border-bottom: 1px solid #eaeaea; +} + +header h1 { + color: #07a35a; + margin-bottom: 10px; + font-size: 2rem; +} + +.update-time { + color: #888; + font-size: 0.9rem; +} + +.hot-list { + list-style: none; +} + +.hot-item { + padding: 15px; + margin-bottom: 10px; + border-radius: 8px; + background-color: white; + box-shadow: 0 2px 6px rgba(0, 0, 0, 0.05); + transition: transform 0.2s, box-shadow 0.2s; + display: flex; + align-items: center; +} + +.hot-item:hover { + transform: translateY(-2px); + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); +} + +.hot-rank { + font-size: 1.2rem; + font-weight: bold; + color: #ff8200; + margin-right: 15px; + min-width: 30px; + text-align: center; +} + +.hot-rank.top-1 { + color: #ff4500; +} + +.hot-rank.top-2, .hot-rank.top-3 { + color: #ff6600; +} + +.hot-content { + flex: 1; +} + +.hot-title { + font-size: 1.1rem; + margin-bottom: 5px; + color: #333; + text-decoration: none; + display: block; +} + +.hot-title:hover { + color: #07a35a; +} + +.hot-value { + font-size: 0.85rem; + color: #888; +} + +.loading { + text-align: center; + padding: 20px; + color: #888; +} + +footer { + text-align: center; + margin-top: 30px; + padding-top: 15px; + border-top: 1px solid #eaeaea; + color: #888; + font-size: 0.9rem; +} + +/* 响应式设计 */ +/* 手机端 */ +@media (max-width: 576px) { + .container { + padding: 15px; + margin: 10px; + } + + header h1 { + font-size: 1.5rem; + } + + .hot-item { + padding: 12px; + } + + .hot-rank { + font-size: 1rem; + min-width: 25px; + margin-right: 10px; + } + + .hot-title { + font-size: 1rem; + } +} + +/* 平板端 */ +@media (min-width: 577px) and (max-width: 992px) { + .container { + max-width: 90%; + } + + header h1 { + font-size: 1.8rem; + } +} + +/* 电脑端 - 默认样式已经设置 */ \ No newline at end of file diff --git a/frontend/60sapi/热搜榜单/微博热搜榜/index.html b/frontend/60sapi/热搜榜单/微博热搜榜/index.html new file mode 100644 index 00000000..0cb32410 --- /dev/null +++ b/frontend/60sapi/热搜榜单/微博热搜榜/index.html @@ -0,0 +1,34 @@ + + + + + + 微博热搜榜 + + + + +
+
+
+ +
+
+

微博热搜榜

+
+
+ +
+
+
加载中...
+
+
+ +
+

数据来源于微博热搜榜

+
+
+ + + + \ No newline at end of file diff --git a/frontend/60sapi/热搜榜单/微博热搜榜/js/main.js b/frontend/60sapi/热搜榜单/微博热搜榜/js/main.js new file mode 100644 index 00000000..8a5e3bd4 --- /dev/null +++ b/frontend/60sapi/热搜榜单/微博热搜榜/js/main.js @@ -0,0 +1,94 @@ +// API接口列表 +const API_ENDPOINTS = [ + "https://60s-cf.viki.moe/v2/weibo", + "https://60s.viki.moe/v2/weibo", + "https://60s.b23.run/v2/weibo", + "https://60s.114128.xyz/v2/weibo", + "https://60s-cf.114128.xyz/v2/weibo" +]; + +// 当前使用的API索引 +let currentApiIndex = 0; + +// DOM元素 +const hotListElement = document.getElementById('hotList'); +const updateTimeElement = document.getElementById('updateTime'); + +// 格式化时间 +function formatDate(date) { + const year = date.getFullYear(); + const month = String(date.getMonth() + 1).padStart(2, '0'); + const day = String(date.getDate()).padStart(2, '0'); + const hours = String(date.getHours()).padStart(2, '0'); + const minutes = String(date.getMinutes()).padStart(2, '0'); + const seconds = String(date.getSeconds()).padStart(2, '0'); + + return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`; +} + +// 渲染热搜列表 +function renderHotList(data) { + hotListElement.innerHTML = ''; + + data.forEach((item, index) => { + const hotItem = document.createElement('div'); + hotItem.className = 'hot-item'; + + const rankClass = index < 3 ? `top-${index + 1}` : ''; + + hotItem.innerHTML = ` +
${index + 1}
+
+ ${item.title} + ${item.hot_value ? `
${item.hot_value}
` : ''} +
+ `; + + hotListElement.appendChild(hotItem); + }); + + // 更新时间 + updateTimeElement.textContent = `更新时间:${formatDate(new Date())}`; +} + +// 获取微博热搜数据 +async function fetchWeiboHotList() { + try { + const response = await fetch(API_ENDPOINTS[currentApiIndex]); + + if (!response.ok) { + throw new Error('网络响应不正常'); + } + + const result = await response.json(); + + if (result.code === 200 && result.data) { + renderHotList(result.data); + } else { + throw new Error('数据格式错误'); + } + } catch (error) { + console.error('获取数据失败:', error); + + // 尝试切换到下一个API + currentApiIndex = (currentApiIndex + 1) % API_ENDPOINTS.length; + + // 显示错误信息 + hotListElement.innerHTML = ` +
+ 获取数据失败,正在尝试其他接口... +
+ `; + + // 延迟后重试 + setTimeout(fetchWeiboHotList, 2000); + } +} + +// 页面加载完成后获取数据 +document.addEventListener('DOMContentLoaded', () => { + fetchWeiboHotList(); + + // 每隔5分钟刷新一次数据 + setInterval(fetchWeiboHotList, 5 * 60 * 1000); +}); \ No newline at end of file diff --git a/frontend/60sapi/热搜榜单/微博热搜榜/接口集合.json b/frontend/60sapi/热搜榜单/微博热搜榜/接口集合.json new file mode 100644 index 00000000..04e92b7f --- /dev/null +++ b/frontend/60sapi/热搜榜单/微博热搜榜/接口集合.json @@ -0,0 +1,7 @@ +[ + "https://60s-cf.viki.moe", + "https://60s.viki.moe", + "https://60s.b23.run", + "https://60s.114128.xyz", + "https://60s-cf.114128.xyz" +] diff --git a/frontend/60sapi/热搜榜单/微博热搜榜/返回接口.json b/frontend/60sapi/热搜榜单/微博热搜榜/返回接口.json new file mode 100644 index 00000000..0779a075 --- /dev/null +++ b/frontend/60sapi/热搜榜单/微博热搜榜/返回接口.json @@ -0,0 +1,261 @@ +{ + "code": 200, + "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", + "data": [ + { + "title": "00后男生0.6秒飞针采血惊呆患者", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=00%E5%90%8E%E7%94%B7%E7%94%9F0.6%E7%A7%92%E9%A3%9E%E9%92%88%E9%87%87%E8%A1%80%E6%83%8A%E5%91%86%E6%82%A3%E8%80%85" + }, + { + "title": "普京带3位副总理10多位部长到中国", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E6%99%AE%E4%BA%AC%E5%B8%A63%E4%BD%8D%E5%89%AF%E6%80%BB%E7%90%8610%E5%A4%9A%E4%BD%8D%E9%83%A8%E9%95%BF%E5%88%B0%E4%B8%AD%E5%9B%BD" + }, + { + "title": "始终高举上海精神旗帜", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E5%A7%8B%E7%BB%88%E9%AB%98%E4%B8%BE%E4%B8%8A%E6%B5%B7%E7%B2%BE%E7%A5%9E%E6%97%97%E5%B8%9C" + }, + { + "title": "女生苦练化妆1年的变化", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E5%A5%B3%E7%94%9F%E8%8B%A6%E7%BB%83%E5%8C%96%E5%A6%861%E5%B9%B4%E7%9A%84%E5%8F%98%E5%8C%96" + }, + { + "title": "香港1200架无人机重现日本投降矣", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E9%A6%99%E6%B8%AF1200%E6%9E%B6%E6%97%A0%E4%BA%BA%E6%9C%BA%E9%87%8D%E7%8E%B0%E6%97%A5%E6%9C%AC%E6%8A%95%E9%99%8D%E7%9F%A3" + }, + { + "title": "尚公主全阵容官宣", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E5%B0%9A%E5%85%AC%E4%B8%BB%E5%85%A8%E9%98%B5%E5%AE%B9%E5%AE%98%E5%AE%A3" + }, + { + "title": "真的可以永远相信刘宇舞台", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E7%9C%9F%E7%9A%84%E5%8F%AF%E4%BB%A5%E6%B0%B8%E8%BF%9C%E7%9B%B8%E4%BF%A1%E5%88%98%E5%AE%87%E8%88%9E%E5%8F%B0" + }, + { + "title": "九三阅兵徒步方队铿锵步伐", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E4%B9%9D%E4%B8%89%E9%98%85%E5%85%B5%E5%BE%92%E6%AD%A5%E6%96%B9%E9%98%9F%E9%93%BF%E9%94%B5%E6%AD%A5%E4%BC%90" + }, + { + "title": "唐朝诡事录", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E5%94%90%E6%9C%9D%E8%AF%A1%E4%BA%8B%E5%BD%95" + }, + { + "title": "抗战胜利80周年第3场记者招待会", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E6%8A%97%E6%88%98%E8%83%9C%E5%88%A980%E5%91%A8%E5%B9%B4%E7%AC%AC3%E5%9C%BA%E8%AE%B0%E8%80%85%E6%8B%9B%E5%BE%85%E4%BC%9A" + }, + { + "title": "王曼昱钱天一3比2蒯曼孙颖莎", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E7%8E%8B%E6%9B%BC%E6%98%B1%E9%92%B1%E5%A4%A9%E4%B8%803%E6%AF%942%E8%92%AF%E6%9B%BC%E5%AD%99%E9%A2%96%E8%8E%8E" + }, + { + "title": "张维伊对96岁的姥姥说长命百岁", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E5%BC%A0%E7%BB%B4%E4%BC%8A%E5%AF%B996%E5%B2%81%E7%9A%84%E5%A7%A5%E5%A7%A5%E8%AF%B4%E9%95%BF%E5%91%BD%E7%99%BE%E5%B2%81" + }, + { + "title": "孟子义李昀锐定妆照", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E5%AD%9F%E5%AD%90%E4%B9%89%E6%9D%8E%E6%98%80%E9%94%90%E5%AE%9A%E5%A6%86%E7%85%A7" + }, + { + "title": "以为张艺兴穿的蓝色抹胸", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E4%BB%A5%E4%B8%BA%E5%BC%A0%E8%89%BA%E5%85%B4%E7%A9%BF%E7%9A%84%E8%93%9D%E8%89%B2%E6%8A%B9%E8%83%B8" + }, + { + "title": "尚公主开机", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E5%B0%9A%E5%85%AC%E4%B8%BB%E5%BC%80%E6%9C%BA" + }, + { + "title": "心动的信号8", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E5%BF%83%E5%8A%A8%E7%9A%84%E4%BF%A1%E5%8F%B78" + }, + { + "title": "霍建华病娇疯批演爽了", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E9%9C%8D%E5%BB%BA%E5%8D%8E%E7%97%85%E5%A8%87%E7%96%AF%E6%89%B9%E6%BC%94%E7%88%BD%E4%BA%86" + }, + { + "title": "普京抵达天津", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E6%99%AE%E4%BA%AC%E6%8A%B5%E8%BE%BE%E5%A4%A9%E6%B4%A5" + }, + { + "title": "龚俊的体面只给旅游前几天", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E9%BE%9A%E4%BF%8A%E7%9A%84%E4%BD%93%E9%9D%A2%E5%8F%AA%E7%BB%99%E6%97%85%E6%B8%B8%E5%89%8D%E5%87%A0%E5%A4%A9" + }, + { + "title": "开学焦虑更严重的另有其人", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E5%BC%80%E5%AD%A6%E7%84%A6%E8%99%91%E6%9B%B4%E4%B8%A5%E9%87%8D%E7%9A%84%E5%8F%A6%E6%9C%89%E5%85%B6%E4%BA%BA" + }, + { + "title": "那英小发雷霆", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E9%82%A3%E8%8B%B1%E5%B0%8F%E5%8F%91%E9%9B%B7%E9%9C%86" + }, + { + "title": "居然有演员一句台词背1小时", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E5%B1%85%E7%84%B6%E6%9C%89%E6%BC%94%E5%91%98%E4%B8%80%E5%8F%A5%E5%8F%B0%E8%AF%8D%E8%83%8C1%E5%B0%8F%E6%97%B6" + }, + { + "title": "谁教魏哲鸣冷脸跳这些的", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E8%B0%81%E6%95%99%E9%AD%8F%E5%93%B2%E9%B8%A3%E5%86%B7%E8%84%B8%E8%B7%B3%E8%BF%99%E4%BA%9B%E7%9A%84" + }, + { + "title": "朱孝天爆冷出局", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E6%9C%B1%E5%AD%9D%E5%A4%A9%E7%88%86%E5%86%B7%E5%87%BA%E5%B1%80" + }, + { + "title": "俄军称掌握战略主动权", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E4%BF%84%E5%86%9B%E7%A7%B0%E6%8E%8C%E6%8F%A1%E6%88%98%E7%95%A5%E4%B8%BB%E5%8A%A8%E6%9D%83" + }, + { + "title": "谈恋爱3个月定律", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E8%B0%88%E6%81%8B%E7%88%B13%E4%B8%AA%E6%9C%88%E5%AE%9A%E5%BE%8B" + }, + { + "title": "沈腾说错了最怕人笨还不勤快", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E6%B2%88%E8%85%BE%E8%AF%B4%E9%94%99%E4%BA%86%E6%9C%80%E6%80%95%E4%BA%BA%E7%AC%A8%E8%BF%98%E4%B8%8D%E5%8B%A4%E5%BF%AB" + }, + { + "title": "王菲最新状态", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E7%8E%8B%E8%8F%B2%E6%9C%80%E6%96%B0%E7%8A%B6%E6%80%81" + }, + { + "title": "张紫宁转行当拉拉队经理人了", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E5%BC%A0%E7%B4%AB%E5%AE%81%E8%BD%AC%E8%A1%8C%E5%BD%93%E6%8B%89%E6%8B%89%E9%98%9F%E7%BB%8F%E7%90%86%E4%BA%BA%E4%BA%86" + }, + { + "title": "金价大涨两大原因", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E9%87%91%E4%BB%B7%E5%A4%A7%E6%B6%A8%E4%B8%A4%E5%A4%A7%E5%8E%9F%E5%9B%A0" + }, + { + "title": "陕西Shaanxi官方标准拼音", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E9%99%95%E8%A5%BFShaanxi%E5%AE%98%E6%96%B9%E6%A0%87%E5%87%86%E6%8B%BC%E9%9F%B3" + }, + { + "title": "边伯贤跳刀马刀马", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E8%BE%B9%E4%BC%AF%E8%B4%A4%E8%B7%B3%E5%88%80%E9%A9%AC%E5%88%80%E9%A9%AC" + }, + { + "title": "冷冻太久的肉就不要再吃了", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E5%86%B7%E5%86%BB%E5%A4%AA%E4%B9%85%E7%9A%84%E8%82%89%E5%B0%B1%E4%B8%8D%E8%A6%81%E5%86%8D%E5%90%83%E4%BA%86" + }, + { + "title": "95后00后恋爱有代沟", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=95%E5%90%8E00%E5%90%8E%E6%81%8B%E7%88%B1%E6%9C%89%E4%BB%A3%E6%B2%9F" + }, + { + "title": "易烊千玺抢票", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E6%98%93%E7%83%8A%E5%8D%83%E7%8E%BA%E6%8A%A2%E7%A5%A8" + }, + { + "title": "孙闻被乒协处罚", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E5%AD%99%E9%97%BB%E8%A2%AB%E4%B9%92%E5%8D%8F%E5%A4%84%E7%BD%9A" + }, + { + "title": "这居然是白举纲", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E8%BF%99%E5%B1%85%E7%84%B6%E6%98%AF%E7%99%BD%E4%B8%BE%E7%BA%B2" + }, + { + "title": "纪凌尘出演孟子义新剧", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E7%BA%AA%E5%87%8C%E5%B0%98%E5%87%BA%E6%BC%94%E5%AD%9F%E5%AD%90%E4%B9%89%E6%96%B0%E5%89%A7" + }, + { + "title": "外卖员妈妈暴雨中将孩子托付派出所", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E5%A4%96%E5%8D%96%E5%91%98%E5%A6%88%E5%A6%88%E6%9A%B4%E9%9B%A8%E4%B8%AD%E5%B0%86%E5%AD%A9%E5%AD%90%E6%89%98%E4%BB%98%E6%B4%BE%E5%87%BA%E6%89%80" + }, + { + "title": "我点外卖没用上券就这样", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E6%88%91%E7%82%B9%E5%A4%96%E5%8D%96%E6%B2%A1%E7%94%A8%E4%B8%8A%E5%88%B8%E5%B0%B1%E8%BF%99%E6%A0%B7" + }, + { + "title": "孙颖莎小时候真来过新疆", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E5%AD%99%E9%A2%96%E8%8E%8E%E5%B0%8F%E6%97%B6%E5%80%99%E7%9C%9F%E6%9D%A5%E8%BF%87%E6%96%B0%E7%96%86" + }, + { + "title": "印尼首都交通瘫痪", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E5%8D%B0%E5%B0%BC%E9%A6%96%E9%83%BD%E4%BA%A4%E9%80%9A%E7%98%AB%E7%97%AA" + }, + { + "title": "停狗位停满了小狗", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E5%81%9C%E7%8B%97%E4%BD%8D%E5%81%9C%E6%BB%A1%E4%BA%86%E5%B0%8F%E7%8B%97" + }, + { + "title": "怪不得校服裤子屁股锃亮", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E6%80%AA%E4%B8%8D%E5%BE%97%E6%A0%A1%E6%9C%8D%E8%A3%A4%E5%AD%90%E5%B1%81%E8%82%A1%E9%94%83%E4%BA%AE" + }, + { + "title": "这一幕幕中国浪漫看得心暖暖", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E8%BF%99%E4%B8%80%E5%B9%95%E5%B9%95%E4%B8%AD%E5%9B%BD%E6%B5%AA%E6%BC%AB%E7%9C%8B%E5%BE%97%E5%BF%83%E6%9A%96%E6%9A%96" + }, + { + "title": "林书豪退役", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E6%9E%97%E4%B9%A6%E8%B1%AA%E9%80%80%E5%BD%B9" + }, + { + "title": "小猫咪舔毛把自己累睡着", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E5%B0%8F%E7%8C%AB%E5%92%AA%E8%88%94%E6%AF%9B%E6%8A%8A%E8%87%AA%E5%B7%B1%E7%B4%AF%E7%9D%A1%E7%9D%80" + }, + { + "title": "iPhone17国行预计涨价500元", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=iPhone17%E5%9B%BD%E8%A1%8C%E9%A2%84%E8%AE%A1%E6%B6%A8%E4%BB%B7500%E5%85%83" + }, + { + "title": "土耳其总统埃尔多安抵达天津", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E5%9C%9F%E8%80%B3%E5%85%B6%E6%80%BB%E7%BB%9F%E5%9F%83%E5%B0%94%E5%A4%9A%E5%AE%89%E6%8A%B5%E8%BE%BE%E5%A4%A9%E6%B4%A5" + }, + { + "title": "脱口秀和Ta的朋友们", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E8%84%B1%E5%8F%A3%E7%A7%80%E5%92%8CTa%E7%9A%84%E6%9C%8B%E5%8F%8B%E4%BB%AC" + }, + { + "title": "孟子义暮晚摇", + "hot_value": 0, + "link": "https://s.weibo.com/weibo?q=%E5%AD%9F%E5%AD%90%E4%B9%89%E6%9A%AE%E6%99%9A%E6%91%87" + } + ] +} \ No newline at end of file diff --git a/frontend/60sapi/热搜榜单/抖音热搜榜/css/background.css b/frontend/60sapi/热搜榜单/抖音热搜榜/css/background.css new file mode 100644 index 00000000..fbf1fd3f --- /dev/null +++ b/frontend/60sapi/热搜榜单/抖音热搜榜/css/background.css @@ -0,0 +1,52 @@ +/* 背景相关样式 */ +body { + background: linear-gradient(135deg, #e8f5e8 0%, #c8e6c9 25%, #a5d6a7 50%, #81c784 75%, #66bb6a 100%); + background-attachment: fixed; + min-height: 100vh; + position: relative; +} + +/* 背景装饰元素 */ +body::before { + content: ''; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-image: + radial-gradient(circle at 20% 80%, rgba(120, 200, 120, 0.15) 0%, transparent 50%), + radial-gradient(circle at 80% 20%, rgba(100, 180, 100, 0.15) 0%, transparent 50%), + radial-gradient(circle at 40% 40%, rgba(140, 220, 140, 0.1) 0%, transparent 50%), + radial-gradient(circle at 60% 70%, rgba(160, 240, 160, 0.08) 0%, transparent 40%); + pointer-events: none; + z-index: -1; +} + +/* 浮动装饰圆点 */ +body::after { + content: ''; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-image: + radial-gradient(circle at 10% 10%, rgba(76, 175, 80, 0.1) 2px, transparent 2px), + radial-gradient(circle at 90% 90%, rgba(76, 175, 80, 0.08) 1px, transparent 1px), + radial-gradient(circle at 30% 80%, rgba(76, 175, 80, 0.06) 1.5px, transparent 1.5px), + radial-gradient(circle at 70% 20%, rgba(76, 175, 80, 0.05) 1px, transparent 1px); + background-size: 100px 100px, 150px 150px, 80px 80px, 120px 120px; + animation: float 20s ease-in-out infinite alternate; + pointer-events: none; + z-index: -1; +} + +@keyframes float { + 0% { + transform: translateY(0px) rotate(0deg); + } + 100% { + transform: translateY(-10px) rotate(1deg); + } +} diff --git a/frontend/60sapi/热搜榜单/抖音热搜榜/css/style.css b/frontend/60sapi/热搜榜单/抖音热搜榜/css/style.css new file mode 100644 index 00000000..2d1682db --- /dev/null +++ b/frontend/60sapi/热搜榜单/抖音热搜榜/css/style.css @@ -0,0 +1,956 @@ +/* 重置样式 */ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Helvetica Neue', Arial, sans-serif; + line-height: 1.6; + color: #2e7d32; + overflow-x: hidden; +} + +/* 容器 */ +.container { + max-width: 1200px; + margin: 0 auto; + padding: 20px; + animation: containerFadeIn 0.8s ease-out; +} + +@keyframes containerFadeIn { + from { + opacity: 0; + transform: translateY(20px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +/* 头部 */ +.header { + text-align: center; + margin-bottom: 40px; + background: rgba(255, 255, 255, 0.95); + padding: 35px 25px; + border-radius: 20px; + box-shadow: 0 8px 32px rgba(46, 125, 50, 0.12); + backdrop-filter: blur(15px); + border: 1px solid rgba(255, 255, 255, 0.3); + position: relative; + overflow: hidden; +} + +.header::before { + content: ''; + position: absolute; + top: 0; + left: -100%; + width: 100%; + height: 100%; + background: linear-gradient(90deg, transparent, rgba(76, 175, 80, 0.1), transparent); + animation: shimmer 3s infinite; +} + +@keyframes shimmer { + 0% { left: -100%; } + 100% { left: 100%; } +} + +.header-icon { + font-size: 3em; + margin-bottom: 10px; + animation: bounce 2s infinite; +} + +@keyframes bounce { + 0%, 20%, 50%, 80%, 100% { transform: translateY(0); } + 40% { transform: translateY(-10px); } + 60% { transform: translateY(-5px); } +} + +.title { + font-size: 2.8em; + font-weight: 700; + color: #1b5e20; + margin-bottom: 8px; + text-shadow: 0 2px 4px rgba(46, 125, 50, 0.1); + letter-spacing: 1px; +} + +.subtitle { + font-size: 1.1em; + color: #4caf50; + margin-bottom: 20px; + font-weight: 500; + opacity: 0.9; +} + +.update-time { + display: flex; + align-items: center; + justify-content: center; + gap: 8px; + color: #4caf50; + font-size: 0.95em; + margin-bottom: 20px; + padding: 8px 16px; + background: rgba(76, 175, 80, 0.1); + border-radius: 20px; + display: inline-flex; +} + +.time-icon { + font-size: 1.1em; + animation: tick 1s infinite; +} + +@keyframes tick { + 0%, 50% { transform: rotate(0deg); } + 25% { transform: rotate(15deg); } + 75% { transform: rotate(-15deg); } +} + +.refresh-btn { + background: linear-gradient(135deg, #4caf50, #66bb6a, #81c784); + color: white; + border: none; + padding: 12px 30px; + border-radius: 30px; + cursor: pointer; + font-size: 1em; + font-weight: 600; + transition: all 0.3s ease; + box-shadow: 0 4px 15px rgba(76, 175, 80, 0.3); + display: inline-flex; + align-items: center; + gap: 8px; + position: relative; + overflow: hidden; +} + +.refresh-btn::before { + content: ''; + position: absolute; + top: 50%; + left: 50%; + width: 0; + height: 0; + background: rgba(255, 255, 255, 0.2); + border-radius: 50%; + transform: translate(-50%, -50%); + transition: all 0.5s ease; +} + +.refresh-btn:hover::before { + width: 300px; + height: 300px; +} + +.refresh-btn:hover { + background: linear-gradient(135deg, #388e3c, #4caf50, #66bb6a); + box-shadow: 0 6px 20px rgba(76, 175, 80, 0.4); + transform: translateY(-3px); +} + +.refresh-btn:active { + transform: translateY(-1px); +} + +.btn-icon { + font-size: 1.1em; + transition: transform 0.3s ease; +} + +.refresh-btn:hover .btn-icon { + transform: rotate(180deg); +} + +/* 加载动画 */ +.loading { + text-align: center; + padding: 60px 30px; + background: rgba(255, 255, 255, 0.95); + border-radius: 20px; + margin-bottom: 20px; + box-shadow: 0 8px 32px rgba(46, 125, 50, 0.1); + backdrop-filter: blur(15px); +} + +.loading-content { + display: flex; + flex-direction: column; + align-items: center; + gap: 20px; +} + +.spinner { + width: 50px; + height: 50px; + border: 5px solid #e8f5e8; + border-top: 5px solid #4caf50; + border-radius: 50%; + animation: spin 1s linear infinite; + position: relative; +} + +.spinner::after { + content: ''; + position: absolute; + top: -5px; + left: -5px; + right: -5px; + bottom: -5px; + border: 2px solid transparent; + border-top: 2px solid #81c784; + border-radius: 50%; + animation: spin 2s linear infinite reverse; +} + +@keyframes spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} + +.loading-text { + display: flex; + flex-direction: column; + align-items: center; + gap: 15px; +} + +.loading-emoji { + font-size: 2.5em; + animation: pulse 1.5s ease-in-out infinite alternate; +} + +@keyframes pulse { + 0% { transform: scale(1); opacity: 0.8; } + 100% { transform: scale(1.1); opacity: 1; } +} + +.loading-text p { + font-size: 1.1em; + color: #4caf50; + font-weight: 500; + margin: 0; +} + +.loading-dots { + display: flex; + gap: 5px; +} + +.loading-dots span { + width: 8px; + height: 8px; + background: #4caf50; + border-radius: 50%; + animation: dot-bounce 1.4s ease-in-out infinite both; +} + +.loading-dots span:nth-child(1) { animation-delay: -0.32s; } +.loading-dots span:nth-child(2) { animation-delay: -0.16s; } + +@keyframes dot-bounce { + 0%, 80%, 100% { transform: scale(0.8); opacity: 0.5; } + 40% { transform: scale(1.2); opacity: 1; } +} + +/* 热搜列表 */ +.hot-list { + display: grid; + gap: 20px; + animation: fadeInUp 0.6s ease-out; +} + +@keyframes fadeInUp { + from { + opacity: 0; + transform: translateY(30px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +.hot-item { + background: rgba(255, 255, 255, 0.98); + border-radius: 16px; + padding: 25px; + box-shadow: 0 4px 20px rgba(46, 125, 50, 0.08); + transition: all 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94); + border: 1px solid rgba(76, 175, 80, 0.15); + backdrop-filter: blur(10px); + position: relative; + overflow: hidden; + animation: slideInLeft 0.6s ease-out; + animation-fill-mode: both; +} + +.hot-item:nth-child(odd) { + animation-delay: 0.1s; +} + +.hot-item:nth-child(even) { + animation-delay: 0.2s; +} + +@keyframes slideInLeft { + from { + opacity: 0; + transform: translateX(-50px); + } + to { + opacity: 1; + transform: translateX(0); + } +} + +.hot-item::before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 4px; + height: 100%; + background: linear-gradient(to bottom, #4caf50, #81c784); + transform: scaleY(0); + transition: transform 0.3s ease; +} + +.hot-item:hover::before { + transform: scaleY(1); +} + +.hot-item:hover { + box-shadow: 0 8px 40px rgba(46, 125, 50, 0.15); + transform: translateY(-5px) scale(1.02); + border-color: rgba(76, 175, 80, 0.3); +} + +.hot-item-header { + display: flex; + align-items: center; + margin-bottom: 18px; + gap: 15px; +} + +.hot-rank { + background: linear-gradient(135deg, #4caf50, #66bb6a); + color: white; + min-width: 40px; + height: 40px; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + font-weight: bold; + font-size: 1em; + flex-shrink: 0; + position: relative; + box-shadow: 0 3px 10px rgba(76, 175, 80, 0.3); +} + +.hot-rank::after { + content: ''; + position: absolute; + top: -2px; + left: -2px; + right: -2px; + bottom: -2px; + background: linear-gradient(45deg, #4caf50, #81c784, #4caf50); + border-radius: 50%; + z-index: -1; + opacity: 0; + transition: opacity 0.3s ease; +} + +.hot-item:hover .hot-rank::after { + opacity: 0.7; +} + +.hot-rank.top-3 { + background: linear-gradient(135deg, #ff6b35, #f7931e, #ffa726); + box-shadow: 0 3px 15px rgba(255, 107, 53, 0.4); + animation: glow 2s ease-in-out infinite alternate; +} + +@keyframes glow { + 0% { box-shadow: 0 3px 15px rgba(255, 107, 53, 0.4); } + 100% { box-shadow: 0 3px 20px rgba(255, 107, 53, 0.6), 0 0 25px rgba(255, 107, 53, 0.3); } +} + +.hot-rank.top-3::before { + content: '👑'; + position: absolute; + top: -8px; + right: -5px; + font-size: 0.7em; + animation: crown-bounce 1s ease-in-out infinite alternate; +} + +@keyframes crown-bounce { + 0% { transform: translateY(0) rotate(-5deg); } + 100% { transform: translateY(-2px) rotate(5deg); } +} + +.hot-title { + font-size: 1.15em; + font-weight: 600; + color: #1b5e20; + flex: 1; + line-height: 1.4; + position: relative; +} + +.hot-content { + display: flex; + gap: 18px; + align-items: flex-start; +} + +.hot-cover { + width: 90px; + height: 90px; + border-radius: 12px; + object-fit: cover; + flex-shrink: 0; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); + transition: all 0.3s ease; + position: relative; + overflow: hidden; +} + +.hot-cover::after { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: linear-gradient(45deg, transparent 30%, rgba(255, 255, 255, 0.1) 50%, transparent 70%); + transform: translateX(-100%); + transition: transform 0.6s ease; +} + +.hot-item:hover .hot-cover::after { + transform: translateX(100%); +} + +.hot-item:hover .hot-cover { + box-shadow: 0 6px 20px rgba(0, 0, 0, 0.15); + transform: scale(1.05); +} + +.hot-info { + flex: 1; + display: flex; + flex-direction: column; + gap: 8px; +} + +.hot-value { + color: #e91e63; + font-weight: 700; + font-size: 1.1em; + display: flex; + align-items: center; + gap: 6px; +} + +.hot-value::before { + content: '热度'; + font-size: 1.2em; + animation: fire 1.5s ease-in-out infinite alternate; +} + +@keyframes fire { + 0% { transform: scale(1); } + 100% { transform: scale(1.1); } +} + +.hot-time { + color: #757575; + font-size: 0.9em; + display: flex; + align-items: center; + gap: 6px; +} + +.hot-time::before { + content: '📅日期'; + font-size: 1em; +} + +.hot-link { + display: inline-flex; + align-items: center; + gap: 6px; + color: #4caf50; + text-decoration: none; + font-size: 0.95em; + font-weight: 600; + padding: 8px 18px; + border: 2px solid #4caf50; + border-radius: 25px; + transition: all 0.3s ease; + position: relative; + overflow: hidden; + max-width: fit-content; +} + +.hot-link::before { + content: '👀'; + font-size: 1em; +} + +.hot-link::after { + content: ''; + position: absolute; + top: 0; + left: -100%; + width: 100%; + height: 100%; + background: linear-gradient(90deg, transparent, rgba(76, 175, 80, 0.2), transparent); + transition: left 0.5s ease; +} + +.hot-link:hover::after { + left: 100%; +} + +.hot-link:hover { + background: #4caf50; + color: white; + transform: scale(1.05); + box-shadow: 0 4px 15px rgba(76, 175, 80, 0.3); +} + +/* 错误信息 */ +.error-message { + text-align: center; + padding: 60px 30px; + background: rgba(255, 255, 255, 0.95); + border-radius: 20px; + box-shadow: 0 8px 32px rgba(211, 47, 47, 0.1); + backdrop-filter: blur(15px); + border: 1px solid rgba(255, 255, 255, 0.3); +} + +.error-content { + display: flex; + flex-direction: column; + align-items: center; + gap: 20px; +} + +.error-icon { + font-size: 4em; + animation: shake 1s ease-in-out infinite alternate; +} + +@keyframes shake { + 0% { transform: translateX(0); } + 25% { transform: translateX(-5px) rotate(-5deg); } + 50% { transform: translateX(5px) rotate(5deg); } + 75% { transform: translateX(-3px) rotate(-3deg); } + 100% { transform: translateX(0) rotate(0deg); } +} + +.error-content h3 { + font-size: 1.5em; + color: #d32f2f; + margin: 0; + font-weight: 600; +} + +.error-content p { + color: #757575; + font-size: 1em; + margin: 0; + line-height: 1.5; +} + +.retry-btn { + background: linear-gradient(135deg, #4caf50, #66bb6a); + color: white; + border: none; + padding: 12px 25px; + border-radius: 25px; + cursor: pointer; + font-size: 1em; + font-weight: 600; + transition: all 0.3s ease; + box-shadow: 0 4px 15px rgba(76, 175, 80, 0.3); + display: inline-flex; + align-items: center; + gap: 8px; +} + +.retry-btn:hover { + background: linear-gradient(135deg, #388e3c, #4caf50); + box-shadow: 0 6px 20px rgba(76, 175, 80, 0.4); + transform: translateY(-2px); +} + +.retry-btn span { + font-size: 1.1em; + transition: transform 0.3s ease; +} + +.retry-btn:hover span { + transform: rotate(180deg); +} + +/* 平板端适配 (768px - 1024px) */ +@media (min-width: 768px) and (max-width: 1024px) { + .container { + padding: 30px; + } + + .header { + padding: 40px 30px; + } + + .header-icon { + font-size: 3.5em; + } + + .title { + font-size: 2.5em; + } + + .subtitle { + font-size: 1.2em; + } + + .hot-list { + grid-template-columns: repeat(auto-fit, minmax(450px, 1fr)); + gap: 25px; + } + + .hot-item { + padding: 30px; + } + + .hot-cover { + width: 85px; + height: 85px; + } + + .hot-rank { + min-width: 42px; + height: 42px; + font-size: 1.05em; + } + + .hot-title { + font-size: 1.2em; + } + + .hot-value { + font-size: 1.15em; + } +} + +/* 电脑端适配 (1025px+) */ +@media (min-width: 1025px) { + .container { + padding: 40px; + } + + .header { + padding: 50px 40px; + margin-bottom: 50px; + } + + .header-icon { + font-size: 4em; + } + + .title { + font-size: 3.5em; + letter-spacing: 2px; + } + + .subtitle { + font-size: 1.3em; + } + + .hot-list { + grid-template-columns: repeat(auto-fit, minmax(550px, 1fr)); + gap: 30px; + } + + .hot-item { + padding: 35px; + } + + .hot-rank { + min-width: 45px; + height: 45px; + font-size: 1.1em; + } + + .hot-cover { + width: 110px; + height: 110px; + } + + .hot-title { + font-size: 1.3em; + } + + .hot-value { + font-size: 1.2em; + } + + .hot-time { + font-size: 1em; + } + + .hot-link { + font-size: 1em; + padding: 10px 20px; + } + + /* 电脑端特殊效果 */ + .hot-item:hover { + transform: translateY(-8px) scale(1.03); + } + + .hot-item::after { + content: ''; + position: absolute; + top: 50%; + right: 20px; + transform: translateY(-50%); + font-size: 1.5em; + opacity: 0; + transition: opacity 0.3s ease; + } + + .hot-item:hover::after { + opacity: 0.3; + } +} + +/* 手机端适配 (默认, 767px以下) */ +@media (max-width: 767px) { + .container { + padding: 15px; + } + + .header { + padding: 25px 20px; + margin-bottom: 25px; + } + + .header-icon { + font-size: 2.5em; + } + + .title { + font-size: 2.2em; + letter-spacing: 0.5px; + } + + .subtitle { + font-size: 1em; + } + + .update-time { + font-size: 0.9em; + padding: 6px 12px; + } + + .refresh-btn { + padding: 10px 20px; + font-size: 0.9em; + } + + .hot-item { + padding: 20px; + border-radius: 12px; + } + + .hot-rank { + min-width: 35px; + height: 35px; + font-size: 0.9em; + } + + .hot-title { + font-size: 1.05em; + line-height: 1.3; + } + + .hot-content { + flex-direction: column; + gap: 15px; + } + + .hot-cover { + width: 100%; + height: 180px; + align-self: center; + max-width: 280px; + border-radius: 10px; + } + + .hot-info { + gap: 10px; + } + + .hot-value { + font-size: 1.05em; + } + + .hot-time { + font-size: 0.85em; + } + + .hot-link { + font-size: 0.9em; + padding: 8px 16px; + align-self: flex-start; + } + + /* 手机端动画优化 */ + .hot-item { + animation-duration: 0.4s; + } + + .hot-item:hover { + transform: translateY(-2px) scale(1.01); + } +} + +/* 超小屏幕适配 (480px以下) */ +@media (max-width: 480px) { + .container { + padding: 12px; + } + + .header { + padding: 20px 15px; + margin-bottom: 20px; + } + + .header-icon { + font-size: 2.2em; + } + + .title { + font-size: 1.9em; + letter-spacing: 0.3px; + } + + .subtitle { + font-size: 0.95em; + } + + .update-time { + font-size: 0.85em; + padding: 5px 10px; + } + + .refresh-btn { + padding: 8px 16px; + font-size: 0.85em; + } + + .hot-list { + gap: 15px; + } + + .hot-item { + padding: 18px 15px; + border-radius: 10px; + } + + .hot-item-header { + margin-bottom: 15px; + gap: 12px; + } + + .hot-rank { + min-width: 32px; + height: 32px; + font-size: 0.85em; + } + + .hot-title { + font-size: 1em; + line-height: 1.25; + } + + .hot-content { + gap: 12px; + } + + .hot-cover { + height: 160px; + max-width: 260px; + border-radius: 8px; + } + + .hot-info { + gap: 8px; + } + + .hot-value { + font-size: 1em; + } + + .hot-time { + font-size: 0.8em; + } + + .hot-link { + font-size: 0.85em; + padding: 6px 14px; + } + + /* 超小屏幕性能优化 */ + .hot-item { + transition: transform 0.2s ease, box-shadow 0.2s ease; + } + + .hot-item::before, + .hot-item::after, + .hot-cover::after, + .hot-link::after { + display: none; + } + + .loading-content { + gap: 15px; + } + + .loading-emoji { + font-size: 2em; + } + + .loading-text p { + font-size: 1em; + } + + .error-icon { + font-size: 3em; + } + + .error-content h3 { + font-size: 1.3em; + } + + .error-content p { + font-size: 0.9em; + } +} diff --git a/frontend/60sapi/热搜榜单/抖音热搜榜/index.html b/frontend/60sapi/热搜榜单/抖音热搜榜/index.html new file mode 100644 index 00000000..9892695a --- /dev/null +++ b/frontend/60sapi/热搜榜单/抖音热搜榜/index.html @@ -0,0 +1,60 @@ + + + + + + 抖音热搜榜 + + + + +
+
+
🔥
+

📱 抖音热搜榜 🎵

+

实时热门话题 · 紧跟潮流趋势

+
+ + 加载中... +
+ +
+ +
+
+
+
+ 🎭 +

正在获取最新热搜...

+
+ + + +
+
+
+
+ +
+ +
+ + +
+ + + + diff --git a/frontend/60sapi/热搜榜单/抖音热搜榜/js/script.js b/frontend/60sapi/热搜榜单/抖音热搜榜/js/script.js new file mode 100644 index 00000000..5e57415c --- /dev/null +++ b/frontend/60sapi/热搜榜单/抖音热搜榜/js/script.js @@ -0,0 +1,300 @@ +// API接口列表 +const API_ENDPOINTS = [ + "https://60s-cf.viki.moe", + "https://60s.viki.moe", + "https://60s.b23.run", + "https://60s.114128.xyz", + "https://60s-cf.114128.xyz" +]; + +// 当前使用的API索引 +let currentApiIndex = 0; + +// DOM元素 +const loadingElement = document.getElementById('loading'); +const hotListElement = document.getElementById('hotList'); +const errorMessageElement = document.getElementById('errorMessage'); +const updateTimeElement = document.getElementById('updateTime'); +const refreshBtn = document.getElementById('refreshBtn'); + +// 页面加载完成后自动加载数据 +document.addEventListener('DOMContentLoaded', function() { + loadHotList(); +}); + +// 刷新按钮点击事件 +refreshBtn.addEventListener('click', function() { + loadHotList(); +}); + +// 加载热搜列表 +async function loadHotList() { + showLoading(); + hideError(); + + try { + const data = await fetchData(); + displayHotList(data.data); + updateRefreshTime(); + } catch (error) { + console.error('加载失败:', error); + showError(); + } + + hideLoading(); +} + +// 获取数据 +async function fetchData() { + for (let i = 0; i < API_ENDPOINTS.length; i++) { + const apiUrl = API_ENDPOINTS[currentApiIndex]; + + try { + const response = await fetch(`${apiUrl}/v2/douyin`, { + method: 'GET', + headers: { + 'Accept': 'application/json', + }, + timeout: 10000 + }); + + if (!response.ok) { + throw new Error(`HTTP ${response.status}`); + } + + const data = await response.json(); + + if (data.code === 200 && data.data) { + return data; + } else { + throw new Error('数据格式错误'); + } + } catch (error) { + console.error(`API ${apiUrl} 请求失败:`, error); + currentApiIndex = (currentApiIndex + 1) % API_ENDPOINTS.length; + + if (i === API_ENDPOINTS.length - 1) { + throw new Error('所有API接口都无法访问'); + } + } + } +} + +// 显示热搜列表 +function displayHotList(hotData) { + hotListElement.innerHTML = ''; + + hotData.forEach((item, index) => { + const hotItem = createHotItem(item, index + 1); + hotListElement.appendChild(hotItem); + }); +} + +// 创建热搜项目 +function createHotItem(item, rank) { + const hotItem = document.createElement('div'); + hotItem.className = 'hot-item'; + + const rankClass = rank <= 3 ? 'hot-rank top-3' : 'hot-rank'; + const formattedHotValue = formatHotValue(item.hot_value); + const formattedTime = formatTime(item.event_time); + + // 根据排名添加特殊标识 + let rankEmoji = ''; + if (rank === 1) rankEmoji = '🥇'; + else if (rank === 2) rankEmoji = '🥈'; + else if (rank === 3) rankEmoji = '🥉'; + else if (rank <= 10) rankEmoji = '🔥'; + else rankEmoji = '📈'; + + // 根据热度值添加火焰等级 + let fireLevel = ''; + if (item.hot_value >= 11000000) fireLevel = '🔥🔥🔥🔥🔥🔥🔥🔥🔥'; + else if (item.hot_value >= 1000000) fireLevel = '🔥🔥🔥🔥🔥🔥🔥🔥'; + else if (item.hot_value >= 9500000) fireLevel = '🔥🔥🔥🔥🔥🔥🔥'; + else if (item.hot_value >= 9000000) fireLevel = '🔥🔥🔥🔥🔥🔥'; + else if (item.hot_value >= 8000000) fireLevel = '🔥🔥🔥🔥🔥'; + else if (item.hot_value >= 7000000) fireLevel = '🔥🔥🔥🔥'; + else if (item.hot_value >= 6000000) fireLevel = '🔥🔥🔥'; + else if (item.hot_value >= 5000000) fireLevel = '🔥🔥'; + else fireLevel = '🔥'; + + hotItem.innerHTML = ` +
+
${rank}
+
${rankEmoji} ${escapeHtml(item.title)}
+
+
+ ${escapeHtml(item.title)} +
+
${fireLevel} ${formattedHotValue}
+
${formattedTime}
+ + 查看详情 + +
+
+ `; + + return hotItem; +} + +// 格式化热度值 +function formatHotValue(value) { + if (value >= 100000000) { + return (value / 100000000).toFixed(1) + '亿'; + } else if (value >= 10000) { + return (value / 10000).toFixed(1) + '万'; + } else { + return value.toLocaleString(); + } +} + +// 格式化时间 +function formatTime(timeStr) { + try { + const formattedTime = timeStr.replace(/\//g, '-'); + const date = new Date(formattedTime); + const now = new Date(); + const diff = now - date; + const minutes = Math.floor(diff / (1000 * 60)); + const hours = Math.floor(minutes / 60); + const days = Math.floor(hours / 24); + + if (days > 0) { + return `${days}天前`; + } else if (hours > 0) { + return `${hours}小时前`; + } else if (minutes > 0) { + return `${minutes}分钟前`; + } else { + return '刚刚'; + } + } catch (error) { + return timeStr; + } +} + +// HTML转义 +function escapeHtml(text) { + const div = document.createElement('div'); + div.textContent = text; + return div.innerHTML; +} + +// 图片加载错误处理 +function handleImageError(img) { + img.src = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODAiIGhlaWdodD0iODAiIHZpZXdCb3g9IjAgMCA4MCA4MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3Qgd2lkdGg9IjgwIiBoZWlnaHQ9IjgwIiBmaWxsPSIjZjVmNWY1Ii8+CjxwYXRoIGQ9Ik00MCAyMEM0NCAyMCA0NyAyMyA0NyAyN1Y1M0M0NyA1NyA0NCA2MCA0MCA2MEgxNkMxMiA2MCA5IDU3IDkgNTNWMjdDOSAyMyAxMiAyMCAxNiAyMEg0MFoiIHN0cm9rZT0iI2NjY2NjYyIgc3Ryb2tlLXdpZHRoPSIyIi8+CjxjaXJjbGUgY3g9IjMzIiBjeT0iMzIiIHI9IjMiIGZpbGw9IiNjY2NjY2MiLz4KPHBhdGggZD0iTTEzIDQ4TDIzIDM4TDMzIDQ4TDQzIDM4TDUzIDQ4IiBzdHJva2U9IiNjY2NjY2MiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+Cjwvc3ZnPgo='; + img.alt = '图片加载失败'; +} + +// 更新刷新时间 +function updateRefreshTime() { + const now = new Date(); + const timeStr = now.toLocaleString('zh-CN', { + year: 'numeric', + month: '2-digit', + day: '2-digit', + hour: '2-digit', + minute: '2-digit', + second: '2-digit' + }); + updateTimeElement.textContent = `最后更新: ${timeStr}`; + + // 添加成功提示 + showSuccessMessage('🎉 数据已更新'); +} + +// 显示成功消息 +function showSuccessMessage(message) { + // 移除之前的提示 + const existingToast = document.querySelector('.success-toast'); + if (existingToast) { + existingToast.remove(); + } + + const toast = document.createElement('div'); + toast.className = 'success-toast'; + toast.textContent = message; + toast.style.cssText = ` + position: fixed; + top: 20px; + right: 20px; + background: linear-gradient(135deg, #4caf50, #66bb6a); + color: white; + padding: 12px 20px; + border-radius: 25px; + box-shadow: 0 4px 20px rgba(76, 175, 80, 0.3); + z-index: 1000; + font-weight: 600; + font-size: 0.9em; + animation: slideIn 0.3s ease-out; + backdrop-filter: blur(10px); + `; + + document.body.appendChild(toast); + + // 3秒后自动移除 + setTimeout(() => { + toast.style.animation = 'slideOut 0.3s ease-in forwards'; + setTimeout(() => toast.remove(), 300); + }, 3000); +} + +// 添加CSS动画到页面 +if (!document.querySelector('#toast-styles')) { + const style = document.createElement('style'); + style.id = 'toast-styles'; + style.textContent = ` + @keyframes slideIn { + from { + opacity: 0; + transform: translateX(100px); + } + to { + opacity: 1; + transform: translateX(0); + } + } + + @keyframes slideOut { + from { + opacity: 1; + transform: translateX(0); + } + to { + opacity: 0; + transform: translateX(100px); + } + } + `; + document.head.appendChild(style); +} + +// 显示加载状态 +function showLoading() { + loadingElement.style.display = 'block'; + hotListElement.style.display = 'none'; +} + +// 隐藏加载状态 +function hideLoading() { + loadingElement.style.display = 'none'; + hotListElement.style.display = 'block'; +} + +// 显示错误信息 +function showError() { + errorMessageElement.style.display = 'block'; + hotListElement.style.display = 'none'; +} + +// 隐藏错误信息 +function hideError() { + errorMessageElement.style.display = 'none'; +} + +// 自动刷新 (每5分钟) +setInterval(function() { + loadHotList(); +}, 5 * 60 * 1000); diff --git a/frontend/60sapi/热搜榜单/抖音热搜榜/接口集合.json b/frontend/60sapi/热搜榜单/抖音热搜榜/接口集合.json new file mode 100644 index 00000000..04e92b7f --- /dev/null +++ b/frontend/60sapi/热搜榜单/抖音热搜榜/接口集合.json @@ -0,0 +1,7 @@ +[ + "https://60s-cf.viki.moe", + "https://60s.viki.moe", + "https://60s.b23.run", + "https://60s.114128.xyz", + "https://60s-cf.114128.xyz" +] diff --git a/frontend/60sapi/热搜榜单/抖音热搜榜/返回接口.json b/frontend/60sapi/热搜榜单/抖音热搜榜/返回接口.json new file mode 100644 index 00000000..5094d4ec --- /dev/null +++ b/frontend/60sapi/热搜榜单/抖音热搜榜/返回接口.json @@ -0,0 +1,496 @@ +{ + "code": 200, + "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", + "data": [ + { + "title": "九三阅兵具体安排公布", + "hot_value": 11821633, + "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/oY1c972B7QzApGweaeQD3fGRo5aLIBrpCAuUSa~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=q01Se46GlLKYNv2klGKP1aM1cT0%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E4%B9%9D%E4%B8%89%E9%98%85%E5%85%B5%E5%85%B7%E4%BD%93%E5%AE%89%E6%8E%92%E5%85%AC%E5%B8%83", + "event_time": "2025/09/01 15:20:34", + "event_time_at": 1756711234, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "九月第一天", + "hot_value": 11327170, + "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/oofTvDaDRCSs4hBFEFVJlAI9BBs0faZAc7IpGf~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=otkowVCSglk%2BS3tPrmBQFq6rIDw%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E4%B9%9D%E6%9C%88%E7%AC%AC%E4%B8%80%E5%A4%A9", + "event_time": "2025/09/01 07:28:57", + "event_time_at": 1756682937, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "遇见上合共享津彩", + "hot_value": 11222444, + "cover": "https://p11-sign.douyinpic.com/tos-cn-p-0015/oIJeINhBDBAiHADD4gi9Ae0CGALg1BqWI7vg0i~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=K%2BaEx5p%2BDv%2B1h3RgNnH0Yb9WT%2B8%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E9%81%87%E8%A7%81%E4%B8%8A%E5%90%88%E5%85%B1%E4%BA%AB%E6%B4%A5%E5%BD%A9", + "event_time": "2025/09/01 11:46:59", + "event_time_at": 1756698419, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "2025年开学第一课铭记与奋斗", + "hot_value": 11078403, + "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/oA9NgVCRBABg7r70pQue8IzAUlfMaXf3hawOIB~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=3xYeXsD6JpXLDOVp6gYRxrvKFaM%3D&from=3218412987", + "link": "https://www.douyin.com/search/2025%E5%B9%B4%E5%BC%80%E5%AD%A6%E7%AC%AC%E4%B8%80%E8%AF%BE%E9%93%AD%E8%AE%B0%E4%B8%8E%E5%A5%8B%E6%96%97", + "event_time": "2025/09/01 11:21:13", + "event_time_at": 1756696873, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "石宇奇首夺世锦赛男单冠军", + "hot_value": 10395092, + "cover": "https://p11-sign.douyinpic.com/tos-cn-p-0015/oAf9IAlEuyE3lFiogfBuQFl8gDFqAoAHtFDNkE~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=tamoorhMGYhajvpmVNdX0TuUuZM%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E7%9F%B3%E5%AE%87%E5%A5%87%E9%A6%96%E5%A4%BA%E4%B8%96%E9%94%A6%E8%B5%9B%E7%94%B7%E5%8D%95%E5%86%A0%E5%86%9B", + "event_time": "2025/09/01 07:47:03", + "event_time_at": 1756684023, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "告别信息裸奔 国家网络身份认证来了", + "hot_value": 10255200, + "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/oskNjrEUQIN9BBRCfeiDTGPE0geX0q6eAAyLr2~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=FrZQSxERPOBd6ktV8K%2Bt%2F3LgJ4A%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E5%91%8A%E5%88%AB%E4%BF%A1%E6%81%AF%E8%A3%B8%E5%A5%94%20%E5%9B%BD%E5%AE%B6%E7%BD%91%E7%BB%9C%E8%BA%AB%E4%BB%BD%E8%AE%A4%E8%AF%81%E6%9D%A5%E4%BA%86", + "event_time": "2025/09/01 10:28:41", + "event_time_at": 1756693721, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "记录我的开学第一天", + "hot_value": 9133236, + "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015c000-ce/owTXhhk40MlJDQHi8P2B07AviaBqAL0VI9EQi~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=pTEfiV%2FfsmGuQxNllsV8PqT0RYc%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E8%AE%B0%E5%BD%95%E6%88%91%E7%9A%84%E5%BC%80%E5%AD%A6%E7%AC%AC%E4%B8%80%E5%A4%A9", + "event_time": "2025/09/01 12:43:33", + "event_time_at": 1756701813, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "9月起这些新规开始施行", + "hot_value": 9105252, + "cover": "https://p26-sign.douyinpic.com/tos-cn-p-0015/oEE9BseGagtA7JRBmzYA1aRMoCMAeIxfLFY5gA~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=YgH%2BJdVPmi76okIWTRoyEEZ3iDg%3D&from=3218412987", + "link": "https://www.douyin.com/search/9%E6%9C%88%E8%B5%B7%E8%BF%99%E4%BA%9B%E6%96%B0%E8%A7%84%E5%BC%80%E5%A7%8B%E6%96%BD%E8%A1%8C", + "event_time": "2025/09/01 11:48:01", + "event_time_at": 1756698481, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "李幼斌与李云龙跨时空对话", + "hot_value": 8998174, + "cover": "https://p26-sign.douyinpic.com/tos-cn-p-0015/oAarINBoAgRIPi9VTEMIfHeA11nDtF7hRDuGcA~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=3x7yTXHYKiIcnNJjznvZjCw%2FW94%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E6%9D%8E%E5%B9%BC%E6%96%8C%E4%B8%8E%E6%9D%8E%E4%BA%91%E9%BE%99%E8%B7%A8%E6%97%B6%E7%A9%BA%E5%AF%B9%E8%AF%9D", + "event_time": "2025/09/01 12:01:05", + "event_time_at": 1756699265, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "幼儿园第一天开学哀嚎一片", + "hot_value": 8962824, + "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/osbXMAQYgIwwpkDCfeiDpGaE0gb9MXfeAAuLV2~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=w1l8V4VvjuO%2BvOvuQkXiEuXYko0%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E5%B9%BC%E5%84%BF%E5%9B%AD%E7%AC%AC%E4%B8%80%E5%A4%A9%E5%BC%80%E5%AD%A6%E5%93%80%E5%9A%8E%E4%B8%80%E7%89%87", + "event_time": "2025/09/01 11:05:01", + "event_time_at": 1756695901, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "田汉把国歌歌词写烟盒上系谣传", + "hot_value": 8930615, + "cover": "https://p3-sign.douyinpic.com/tos-cn-i-0813c001/ogA2AoCCXZMEAGF9f9QAlSACKRgfsC2oAFtIgD~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=7%2F8qsoQJd6TgpAEylOW1VyQrqeY%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E7%94%B0%E6%B1%89%E6%8A%8A%E5%9B%BD%E6%AD%8C%E6%AD%8C%E8%AF%8D%E5%86%99%E7%83%9F%E7%9B%92%E4%B8%8A%E7%B3%BB%E8%B0%A3%E4%BC%A0", + "event_time": "2025/09/01 13:51:28", + "event_time_at": 1756705888, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "苏超联赛积分榜", + "hot_value": 8838219, + "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/o4vPLtWIQAaiggBRkQq5kw9ZlIVA0v1iDAILU~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=JJlPUPmWRzT3UPMenizW639pqVg%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E8%8B%8F%E8%B6%85%E8%81%94%E8%B5%9B%E7%A7%AF%E5%88%86%E6%A6%9C", + "event_time": "2025/08/31 22:01:53", + "event_time_at": 1756648913, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "一切正开始", + "hot_value": 8609507, + "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015c000-ce/o8wN0EuXoETsyMz0ADCFFaAsFFTQeQf9fAublW~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=5I8uLkfpNYrGArQm%2BXLBa81NhYY%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E4%B8%80%E5%88%87%E6%AD%A3%E5%BC%80%E5%A7%8B", + "event_time": "2025/09/01 11:56:50", + "event_time_at": 1756699010, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "张玉宁为与球迷起冲突致歉", + "hot_value": 8511631, + "cover": "https://p11-sign.douyinpic.com/tos-cn-p-0015/oMfoIAFMN5GEWOzpBCDAQfaj7yRArCdByaEUfE~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=59ipMtNxZ8W3R5NNAJamlSOEbPo%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E5%BC%A0%E7%8E%89%E5%AE%81%E4%B8%BA%E4%B8%8E%E7%90%83%E8%BF%B7%E8%B5%B7%E5%86%B2%E7%AA%81%E8%87%B4%E6%AD%89", + "event_time": "2025/09/01 07:53:39", + "event_time_at": 1756684419, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "这一口会很疯狂", + "hot_value": 8454971, + "cover": "https://p26-sign.douyinpic.com/tos-cn-p-0015/oUIozRIBqC0ahA7FimIAmFEBeqDFfZK3Qfo8PE~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=ZBSuTMuu4678gSfReaVIfdK22J8%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E8%BF%99%E4%B8%80%E5%8F%A3%E4%BC%9A%E5%BE%88%E7%96%AF%E7%8B%82", + "event_time": "2025/09/01 10:36:16", + "event_time_at": 1756694176, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "邓超鹿晗合唱超级英雄", + "hot_value": 8357197, + "cover": "https://p11-sign.douyinpic.com/tos-cn-p-0015/oUBPIdtyQx0j8THRZAmZbyATihavQHI0niLIP~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=%2F66dsj8evHN94wNNFCn%2Bfhagee0%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E9%82%93%E8%B6%85%E9%B9%BF%E6%99%97%E5%90%88%E5%94%B1%E8%B6%85%E7%BA%A7%E8%8B%B1%E9%9B%84", + "event_time": "2025/09/01 07:45:11", + "event_time_at": 1756683911, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "伊萨克加盟利物浦", + "hot_value": 7963081, + "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/ocAw2yaT4I99iDIPh9I3LaIiLBTnBASvH0Q1a~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=v4Gq0Iz87wyZ6lEYYOnKmaeur%2FM%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E4%BC%8A%E8%90%A8%E5%85%8B%E5%8A%A0%E7%9B%9F%E5%88%A9%E7%89%A9%E6%B5%A6", + "event_time": "2025/09/01 09:12:12", + "event_time_at": 1756689132, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "山东泰山6:0北京国安", + "hot_value": 7830358, + "cover": "https://p9-sign.douyinpic.com/tos-cn-p-0015/ogtA9BEEJZDJ9SgzBBLfFN0AflNDGoIAQ2I8A8~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=gu6O%2BhGDarr%2BHQe1P%2BHo9pUmBGU%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E5%B1%B1%E4%B8%9C%E6%B3%B0%E5%B1%B16%3A0%E5%8C%97%E4%BA%AC%E5%9B%BD%E5%AE%89", + "event_time": "2025/08/31 20:32:53", + "event_time_at": 1756643573, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "又到开学你包书皮了吗", + "hot_value": 7828995, + "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/oUAwaPjCIiLAQI6ADQMAm06TBJxPJFAkCpIIi~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=aUkYTtkfaUKbK2DhznXU69sg8SU%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E5%8F%88%E5%88%B0%E5%BC%80%E5%AD%A6%E4%BD%A0%E5%8C%85%E4%B9%A6%E7%9A%AE%E4%BA%86%E5%90%97", + "event_time": "2025/08/31 17:04:09", + "event_time_at": 1756631049, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "樊振东德甲首秀两连败", + "hot_value": 7754365, + "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/osOdEdibznClYwP0AABAIZW1eg0gbBmAzjiJfl~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=AyWBGXt%2FFFSp0QBM%2Bd5%2F9B4GPvo%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E6%A8%8A%E6%8C%AF%E4%B8%9C%E5%BE%B7%E7%94%B2%E9%A6%96%E7%A7%80%E4%B8%A4%E8%BF%9E%E8%B4%A5", + "event_time": "2025/09/01 07:16:58", + "event_time_at": 1756682218, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "为什么说00后的童年含金量高", + "hot_value": 7735122, + "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/ogOQEQsnAACDBICh7LeFWRGCjeZneIB9I3oVFy~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=Htnqu7SupC%2FmvQpF2DDsLDh5FYA%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E4%B8%BA%E4%BB%80%E4%B9%88%E8%AF%B400%E5%90%8E%E7%9A%84%E7%AB%A5%E5%B9%B4%E5%90%AB%E9%87%91%E9%87%8F%E9%AB%98", + "event_time": "2025/08/31 16:38:30", + "event_time_at": 1756629510, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "刘宇千年直拍", + "hot_value": 7734149, + "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015c000-ce/ostjBSmQ78E8estIXgFlHQxZQALRFfMepbTJWC~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=CPNw9h%2BpBB82qBykpuT11uMVFjo%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E5%88%98%E5%AE%87%E5%8D%83%E5%B9%B4%E7%9B%B4%E6%8B%8D", + "event_time": "2025/08/31 21:39:38", + "event_time_at": 1756647578, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "胡塞武装称将对以军袭击发起报复", + "hot_value": 7728698, + "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/oseWgjCRBAfgft7c3QUm8JGApnYMaWdJdGj0SB~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=fX6AvTWQvNrihcvEraPHjJIS9iY%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E8%83%A1%E5%A1%9E%E6%AD%A6%E8%A3%85%E7%A7%B0%E5%B0%86%E5%AF%B9%E4%BB%A5%E5%86%9B%E8%A2%AD%E5%87%BB%E5%8F%91%E8%B5%B7%E6%8A%A5%E5%A4%8D", + "event_time": "2025/09/01 09:40:13", + "event_time_at": 1756690813, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "手把手教你手机变车机", + "hot_value": 7725104, + "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/o47qAXUjDQN6KLr9AjFSCq92ZBf4okAQEfgSAp~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=OoNNciUVTOwZbl17IUYBOjFyBJ4%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E6%89%8B%E6%8A%8A%E6%89%8B%E6%95%99%E4%BD%A0%E6%89%8B%E6%9C%BA%E5%8F%98%E8%BD%A6%E6%9C%BA", + "event_time": "2025/09/01 11:15:15", + "event_time_at": 1756696515, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "莫迪与普京拥抱手拉手热聊", + "hot_value": 7723445, + "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/oIaWAojVPLRUILGIyvvg1Sd1ZiLAKiCB6zQIX~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=u1IGnKz%2FAckLe%2BYFCQulFw0ioB8%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E8%8E%AB%E8%BF%AA%E4%B8%8E%E6%99%AE%E4%BA%AC%E6%8B%A5%E6%8A%B1%E6%89%8B%E6%8B%89%E6%89%8B%E7%83%AD%E8%81%8A", + "event_time": "2025/09/01 15:38:27", + "event_time_at": 1756712307, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "原来猪猪侠搞抽象领先我20年", + "hot_value": 7706786, + "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/oINGyAfS2oFpfAgF2kYxEJAqTbSeEcgotfxeHv~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=S1Ve0ORP5%2BrHumx%2FK7uJbfm8PbM%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E5%8E%9F%E6%9D%A5%E7%8C%AA%E7%8C%AA%E4%BE%A0%E6%90%9E%E6%8A%BD%E8%B1%A1%E9%A2%86%E5%85%88%E6%88%9120%E5%B9%B4", + "event_time": "2025/09/01 10:52:59", + "event_time_at": 1756695179, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "北京国安就惨败道歉", + "hot_value": 7702358, + "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/oYiXICjfn7uEi3AeK6W04BiXu3iBjigAAs9W0B~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=hgh%2Bfy4Ul82LWgXAL2hkIBMEpJM%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E5%8C%97%E4%BA%AC%E5%9B%BD%E5%AE%89%E5%B0%B1%E6%83%A8%E8%B4%A5%E9%81%93%E6%AD%89", + "event_time": "2025/09/01 09:21:10", + "event_time_at": 1756689670, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "港姐冠军陈咏诗是博士生", + "hot_value": 7702059, + "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/okoRaMGvQBCI6KmVeBAAQ1eLEg1HK2foQuM7aB~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=5Lattu1v38oeQ8xGdXiDLcK4fwM%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E6%B8%AF%E5%A7%90%E5%86%A0%E5%86%9B%E9%99%88%E5%92%8F%E8%AF%97%E6%98%AF%E5%8D%9A%E5%A3%AB%E7%94%9F", + "event_time": "2025/09/01 10:47:23", + "event_time_at": 1756694843, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "王楚钦2:3徐瑛彬", + "hot_value": 7699514, + "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/o00BTIi1ogMR8LBAiQdLmSaIPAuEyIQv1IP48~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=2%2BI5KkQpEugBkQcVCrSLgOtC088%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E7%8E%8B%E6%A5%9A%E9%92%A62%3A3%E5%BE%90%E7%91%9B%E5%BD%AC", + "event_time": "2025/08/31 21:21:08", + "event_time_at": 1756646468, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "王源 高音", + "hot_value": 7693290, + "cover": "https://p26-sign.douyinpic.com/tos-cn-p-0015/oYzDIaQiavwPRBUpanIkjAIWzwLCIgPkAyiOj~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=uXVN6xfkB3tz3iVo0DQuxqeaGk0%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E7%8E%8B%E6%BA%90%20%E9%AB%98%E9%9F%B3", + "event_time": "2025/08/31 20:30:04", + "event_time_at": 1756643404, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "俄乌在苏贾前线展开阵地争夺", + "hot_value": 7691808, + "cover": "https://p9-sign.douyinpic.com/tos-cn-p-0015/oo7iATIG8vA5hIIQBILB4oCgvygsUNzBS1aPi~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=SNzQbbxAJqqtdIkck9kvtRUJnZg%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E4%BF%84%E4%B9%8C%E5%9C%A8%E8%8B%8F%E8%B4%BE%E5%89%8D%E7%BA%BF%E5%B1%95%E5%BC%80%E9%98%B5%E5%9C%B0%E4%BA%89%E5%A4%BA", + "event_time": "2025/09/01 12:56:05", + "event_time_at": 1756702565, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "范丞丞温柔版一个人的夜变装", + "hot_value": 7689433, + "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/oAPLWIAoR3CsXgVBuIQIRiTDyS14gaLPwELAi~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=yp9l95J9xlKf55IEP14P7sD7J%2F4%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E8%8C%83%E4%B8%9E%E4%B8%9E%E6%B8%A9%E6%9F%94%E7%89%88%E4%B8%80%E4%B8%AA%E4%BA%BA%E7%9A%84%E5%A4%9C%E5%8F%98%E8%A3%85", + "event_time": "2025/09/01 15:32:00", + "event_time_at": 1756711920, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "用美食致敬这场胜利", + "hot_value": 7681826, + "cover": "https://p11-sign.douyinpic.com/tos-cn-p-0015/oIFcUfHotAXxALhJEj2EK9SBNp0fQwKhAbCgQD~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=Dkuyg5REqCAMEIsp0Dr%2B%2BkAO%2BmQ%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E7%94%A8%E7%BE%8E%E9%A3%9F%E8%87%B4%E6%95%AC%E8%BF%99%E5%9C%BA%E8%83%9C%E5%88%A9", + "event_time": "2025/09/01 12:08:24", + "event_time_at": 1756699704, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "田曦薇猫猫本体藏不住了", + "hot_value": 7674729, + "cover": "https://p11-sign.douyinpic.com/tos-cn-p-0015c000-ce/oceyeLnbxAXFERxnPfLR2egAkYaXeRpHfhAQME~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=omEVZta%2FQeV%2FSBRNZ3%2BJF0iMXPQ%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E7%94%B0%E6%9B%A6%E8%96%87%E7%8C%AB%E7%8C%AB%E6%9C%AC%E4%BD%93%E8%97%8F%E4%B8%8D%E4%BD%8F%E4%BA%86", + "event_time": "2025/09/01 14:33:25", + "event_time_at": 1756708405, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "少年心气是不可再生之物", + "hot_value": 7673518, + "cover": "https://p3-sign.douyinpic.com/tos-cn-i-0813c001/oAUJIWFyAFCmtGpmAADAQis69JogkCFAA0Eqff~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=YHeldSJZXPEBMLF2i%2Bj%2Fc60oKsQ%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E5%B0%91%E5%B9%B4%E5%BF%83%E6%B0%94%E6%98%AF%E4%B8%8D%E5%8F%AF%E5%86%8D%E7%94%9F%E4%B9%8B%E7%89%A9", + "event_time": "2025/09/01 07:54:31", + "event_time_at": 1756684471, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "南通2:1战胜苏州", + "hot_value": 7670255, + "cover": "https://p11-sign.douyinpic.com/tos-cn-p-0015/o4WAaBigTGBaeBgrqm5Kir0Af6DGO0IAF6IQPA~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=uV2f%2FvbzU4Y9DfhXxnPBc3hOAxY%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E5%8D%97%E9%80%9A2%3A1%E6%88%98%E8%83%9C%E8%8B%8F%E5%B7%9E", + "event_time": "2025/08/31 18:02:42", + "event_time_at": 1756634562, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "起猛了差点以为入冬了", + "hot_value": 7669368, + "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015c000-ce/ogA5HPw1xiIwS2szhaBPMZvC1P0LAPPQAigEZ~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=UQNTgz2vyL2UMvzVj2gzBmPbM2A%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E8%B5%B7%E7%8C%9B%E4%BA%86%E5%B7%AE%E7%82%B9%E4%BB%A5%E4%B8%BA%E5%85%A5%E5%86%AC%E4%BA%86", + "event_time": "2025/09/01 14:23:50", + "event_time_at": 1756707830, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "终于轮到我围观军训了", + "hot_value": 7655201, + "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015c000-ce/oobwIeLUf4O7iiazJOGAQLZO7DRgCDCBLhI2ez~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=WQn5PvdzvIerbF%2B1iNjF3b6itqQ%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E7%BB%88%E4%BA%8E%E8%BD%AE%E5%88%B0%E6%88%91%E5%9B%B4%E8%A7%82%E5%86%9B%E8%AE%AD%E4%BA%86", + "event_time": "2025/08/31 13:09:34", + "event_time_at": 1756616974, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "金铲铲陪伴是李现最长情的告白", + "hot_value": 7653496, + "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015c000-ce/oYPAKIM2vpBnPULXOmBbAEac6KzbOhSiILiLP~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=rsA7DcONzMySFGRNa4PMk6ftyBk%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E9%87%91%E9%93%B2%E9%93%B2%E9%99%AA%E4%BC%B4%E6%98%AF%E6%9D%8E%E7%8E%B0%E6%9C%80%E9%95%BF%E6%83%85%E7%9A%84%E5%91%8A%E7%99%BD", + "event_time": "2025/08/31 22:58:48", + "event_time_at": 1756652328, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "张予曦妈妈不介意女儿谈姐弟恋", + "hot_value": 7650811, + "cover": "https://p11-sign.douyinpic.com/tos-cn-p-0015/oEB5A1NsLFeadA9HQoED9TfmQ8jHgUPxACzjw9~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=KF3nedfpt5iPcUZ%2Fv9SyYI0ZSWg%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E5%BC%A0%E4%BA%88%E6%9B%A6%E5%A6%88%E5%A6%88%E4%B8%8D%E4%BB%8B%E6%84%8F%E5%A5%B3%E5%84%BF%E8%B0%88%E5%A7%90%E5%BC%9F%E6%81%8B", + "event_time": "2025/08/31 17:44:23", + "event_time_at": 1756633463, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "边伯贤也来刀马刀马了", + "hot_value": 7650164, + "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/ogfBltLZDIGmRGCAseKAeaIBRnQH79gBGOb4kC~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=nLrGTCoyqEGU882IYRhJOStMdpg%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E8%BE%B9%E4%BC%AF%E8%B4%A4%E4%B9%9F%E6%9D%A5%E5%88%80%E9%A9%AC%E5%88%80%E9%A9%AC%E4%BA%86", + "event_time": "2025/08/31 13:44:44", + "event_time_at": 1756619084, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "金靖演绎甜美女孩", + "hot_value": 7649913, + "cover": "https://p11-sign.douyinpic.com/tos-cn-p-0015/o0cBcsRQjiGGFCOOArGzzeIfLBA7FEYojeKwGQ~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=9BY7gGsW39uBcs06t%2BrXTCQ5J5k%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E9%87%91%E9%9D%96%E6%BC%94%E7%BB%8E%E7%94%9C%E7%BE%8E%E5%A5%B3%E5%AD%A9", + "event_time": "2025/08/31 19:00:32", + "event_time_at": 1756638032, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "一口气看日本如何造出反华体制", + "hot_value": 7648850, + "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/oUoyIxcAADE55goYWdhBfFF4HACpRIpy9Xse6K~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=xjjRJGl0AzxkaEnOiVrzRx1hoZ8%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E4%B8%80%E5%8F%A3%E6%B0%94%E7%9C%8B%E6%97%A5%E6%9C%AC%E5%A6%82%E4%BD%95%E9%80%A0%E5%87%BA%E5%8F%8D%E5%8D%8E%E4%BD%93%E5%88%B6", + "event_time": "2025/08/30 21:50:31", + "event_time_at": 1756561831, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "张艺兴真空西装跳狼与美女", + "hot_value": 7646868, + "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015c000-ce/o4YKfLEIEEwo5stfDSFe0s2TFRjxXAAZDCE9Bl~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=gqBuLvszd8eew81uXP8rf7idtog%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E5%BC%A0%E8%89%BA%E5%85%B4%E7%9C%9F%E7%A9%BA%E8%A5%BF%E8%A3%85%E8%B7%B3%E7%8B%BC%E4%B8%8E%E7%BE%8E%E5%A5%B3", + "event_time": "2025/08/31 22:12:44", + "event_time_at": 1756649564, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "罗永浩对谈脱口秀新王何广智", + "hot_value": 7644688, + "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/okQ0qo1AKBQP3g981qQA1FEAzGDYjtFFdfYVeD~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=Mg24ss6tlv%2FY%2B%2B9PS5UdijEG1Dw%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E7%BD%97%E6%B0%B8%E6%B5%A9%E5%AF%B9%E8%B0%88%E8%84%B1%E5%8F%A3%E7%A7%80%E6%96%B0%E7%8E%8B%E4%BD%95%E5%B9%BF%E6%99%BA", + "event_time": "2025/09/01 13:56:14", + "event_time_at": 1756706174, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "周深的刀马刀马好可爱", + "hot_value": 7644052, + "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/osAPL0laAbWHtEmVBUIKMQDypItTiF3HI0PQi~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=qcK3K8uko38iBuRXDg4uCTaqEPc%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E5%91%A8%E6%B7%B1%E7%9A%84%E5%88%80%E9%A9%AC%E5%88%80%E9%A9%AC%E5%A5%BD%E5%8F%AF%E7%88%B1", + "event_time": "2025/08/31 18:31:56", + "event_time_at": 1756636316, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "杜克一哥的对话太好哭了", + "hot_value": 7639907, + "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/oofoeQ9VAPDsphKEAiFQbQwCAEwoQgBpLtBC0A~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=wulyNlwPrSoIJu1JKBdKpE142mA%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E6%9D%9C%E5%85%8B%E4%B8%80%E5%93%A5%E7%9A%84%E5%AF%B9%E8%AF%9D%E5%A4%AA%E5%A5%BD%E5%93%AD%E4%BA%86", + "event_time": "2025/08/30 21:17:58", + "event_time_at": 1756559878, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "外媒全景记录普京抵华现场", + "hot_value": 7637541, + "cover": "https://p3-sign.douyinpic.com/tos-cn-p-0015/oIGC9LxDIQ6QAI1fG1eEipfA2eZjiGInCHFFEJ~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=HiKj%2FiLGiaN2D5GdS5OlAISbGHo%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E5%A4%96%E5%AA%92%E5%85%A8%E6%99%AF%E8%AE%B0%E5%BD%95%E6%99%AE%E4%BA%AC%E6%8A%B5%E5%8D%8E%E7%8E%B0%E5%9C%BA", + "event_time": "2025/09/01 11:59:34", + "event_time_at": 1756699174, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + }, + { + "title": "赵丽颖工作室明兰代班营业", + "hot_value": 7635755, + "cover": "https://p26-sign.douyinpic.com/tos-cn-p-0015c000-ce/oIhHELPBeI6Ieb0A9OpCuWXh0CAAgiuniEweIw~noop.jpeg?lk3s=bfd515bb&x-expires=1756735200&x-signature=xmQOeLdWN4FaeZjFBqtMQuctYv8%3D&from=3218412987", + "link": "https://www.douyin.com/search/%E8%B5%B5%E4%B8%BD%E9%A2%96%E5%B7%A5%E4%BD%9C%E5%AE%A4%E6%98%8E%E5%85%B0%E4%BB%A3%E7%8F%AD%E8%90%A5%E4%B8%9A", + "event_time": "2025/08/31 20:52:34", + "event_time_at": 1756644754, + "active_time": "2025-09-01 16:46:46", + "active_time_at": 1756745206000 + } + ] +} \ No newline at end of file diff --git a/frontend/60sapi/热搜榜单/猫眼票房排行榜/css/style.css b/frontend/60sapi/热搜榜单/猫眼票房排行榜/css/style.css new file mode 100644 index 00000000..e76f60c9 --- /dev/null +++ b/frontend/60sapi/热搜榜单/猫眼票房排行榜/css/style.css @@ -0,0 +1,495 @@ +/* 猫眼票房排行榜 - 淡绿色清新风格样式 */ + +/* 重置样式 */ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; + background: linear-gradient(135deg, #a8e6cf 0%, #dcedc1 50%, #ffd3a5 100%); + min-height: 100vh; + color: #2d5016; + line-height: 1.6; + overflow-x: hidden; +} + +.container { + max-width: 1200px; + margin: 0 auto; + padding: 20px; +} + +/* 头部样式 */ +.header { + text-align: center; + margin-bottom: 30px; + background: rgba(255, 255, 255, 0.85); + border-radius: 20px; + padding: 30px; + box-shadow: 0 8px 25px rgba(45, 80, 22, 0.08); + backdrop-filter: blur(10px); +} + +.header h1 { + font-size: 2.5rem; + color: #2d5016; + margin-bottom: 10px; + font-weight: 700; + display: flex; + align-items: center; + justify-content: center; + gap: 15px; +} + +.header p { + color: #5a7c65; + font-size: 1.1rem; +} + +/* 加载状态 */ +.loading { + text-align: center; + padding: 40px; + background: rgba(255, 255, 255, 0.85); + border-radius: 15px; + box-shadow: 0 5px 20px rgba(45, 80, 22, 0.08); +} + +.spinner { + width: 40px; + height: 40px; + border: 4px solid #e8f5e8; + border-top: 4px solid #81c784; + border-radius: 50%; + animation: spin 1s linear infinite; + margin: 0 auto 20px; +} + +@keyframes spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} + +/* 票房排行榜容器 */ +.ranking-container { + background: rgba(255, 255, 255, 0.85); + border-radius: 20px; + padding: 30px; + box-shadow: 0 8px 25px rgba(45, 80, 22, 0.08); + backdrop-filter: blur(10px); + margin-bottom: 20px; +} + +/* 排行榜标题 */ +.ranking-title { + text-align: center; + font-size: 1.8rem; + font-weight: 700; + color: #2d5016; + margin-bottom: 25px; +} + +/* 票房排行榜列表 */ +.movie-list { + display: grid; + gap: 15px; +} + +/* 电影项目 */ +.movie-item { + background: rgba(255, 255, 255, 0.9); + border-radius: 15px; + padding: 20px; + box-shadow: 0 4px 15px rgba(45, 80, 22, 0.05); + transition: all 0.3s ease; + border-left: 5px solid transparent; + position: relative; + overflow: hidden; +} + +.movie-item:hover { + transform: translateY(-2px); + box-shadow: 0 8px 25px rgba(45, 80, 22, 0.12); +} + +/* 前三名特殊样式 */ +.movie-item.top-1 { + border-left-color: #ffd700; + background: linear-gradient(135deg, rgba(255, 215, 0, 0.1) 0%, rgba(255, 255, 255, 0.9) 100%); +} + +.movie-item.top-2 { + border-left-color: #c0c0c0; + background: linear-gradient(135deg, rgba(192, 192, 192, 0.1) 0%, rgba(255, 255, 255, 0.9) 100%); +} + +.movie-item.top-3 { + border-left-color: #cd7f32; + background: linear-gradient(135deg, rgba(205, 127, 50, 0.1) 0%, rgba(255, 255, 255, 0.9) 100%); +} + +/* 排名徽章 */ +.rank-badge { + position: absolute; + top: -10px; + right: -10px; + width: 50px; + height: 50px; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + font-weight: bold; + font-size: 1.2rem; + color: white; + box-shadow: 0 4px 10px rgba(0, 0, 0, 0.2); +} + +.rank-badge.gold { + background: linear-gradient(135deg, #ffd700, #ffed4a); +} + +.rank-badge.silver { + background: linear-gradient(135deg, #c0c0c0, #e2e8f0); +} + +.rank-badge.bronze { + background: linear-gradient(135deg, #cd7f32, #d69e2e); +} + +.rank-badge.regular { + background: linear-gradient(135deg, #81c784, #66bb6a); +} + +/* 电影信息布局 */ +.movie-info { + display: grid; + grid-template-columns: auto 1fr auto; + align-items: center; + gap: 20px; +} + +.rank-number { + font-size: 2rem; + font-weight: bold; + color: #2d5016; + min-width: 60px; +} + +.movie-details { + flex: 1; +} + +.movie-name { + font-size: 1.3rem; + font-weight: 700; + color: #2d5016; + margin-bottom: 5px; +} + +.movie-year { + color: #5a7c65; + font-size: 0.95rem; + margin-bottom: 8px; +} + +.box-office { + text-align: right; +} + +.box-office-amount { + font-size: 1.4rem; + font-weight: bold; + color: #1b5e20; + margin-bottom: 3px; +} + +.box-office-desc { + color: #5a7c65; + font-size: 0.9rem; +} + +/* 统计信息 */ +.stats-container { + background: rgba(255, 255, 255, 0.85); + border-radius: 15px; + padding: 20px; + margin-bottom: 20px; + box-shadow: 0 5px 20px rgba(45, 80, 22, 0.08); + backdrop-filter: blur(10px); +} + +.stats-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); + gap: 20px; + text-align: center; +} + +.stat-item { + background: rgba(129, 199, 132, 0.1); + border-radius: 10px; + padding: 15px; +} + +.stat-value { + font-size: 1.5rem; + font-weight: bold; + color: #2d5016; +} + +.stat-label { + color: #5a7c65; + font-size: 0.9rem; + margin-top: 5px; +} + +/* 更新时间 */ +.update-time { + text-align: center; + color: #5a7c65; + font-size: 0.9rem; + margin-top: 20px; + padding: 15px; + background: rgba(255, 255, 255, 0.7); + border-radius: 10px; +} + +/* 错误提示 */ +.error { + text-align: center; + padding: 40px; + background: rgba(255, 255, 255, 0.85); + border-radius: 15px; + box-shadow: 0 5px 20px rgba(45, 80, 22, 0.08); +} + +.error h3 { + color: #d32f2f; + margin-bottom: 15px; + font-size: 1.5rem; +} + +.error p { + color: #5a7c65; + margin-bottom: 10px; +} + +/* 动画效果 */ +.fade-in { + animation: fadeIn 0.6s ease-in-out; +} + +@keyframes fadeIn { + from { + opacity: 0; + transform: translateY(20px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +/* 平板端适配 (768px - 1024px) */ +@media screen and (max-width: 1024px) and (min-width: 768px) { + .container { + padding: 15px; + } + + .header h1 { + font-size: 2.2rem; + } + + .ranking-container { + padding: 25px; + } + + .movie-info { + gap: 15px; + } + + .rank-number { + font-size: 1.8rem; + min-width: 50px; + } + + .movie-name { + font-size: 1.2rem; + } + + .box-office-amount { + font-size: 1.3rem; + } +} + +/* 手机端适配 (最大767px) - 优先优化 */ +@media screen and (max-width: 767px) { + .container { + padding: 10px; + } + + .header { + padding: 20px; + margin-bottom: 20px; + } + + .header h1 { + font-size: 1.8rem; + flex-direction: column; + gap: 10px; + } + + .header p { + font-size: 1rem; + } + + .ranking-container { + padding: 20px 15px; + margin-bottom: 15px; + } + + .ranking-title { + font-size: 1.5rem; + margin-bottom: 20px; + } + + .movie-item { + padding: 15px; + margin-bottom: 10px; + } + + .movie-info { + grid-template-columns: 50px 1fr; + grid-template-rows: auto auto; + gap: 10px; + } + + .rank-number { + font-size: 1.5rem; + min-width: 40px; + grid-row: 1 / 3; + } + + .movie-details { + grid-column: 2; + grid-row: 1; + } + + .box-office { + grid-column: 2; + grid-row: 2; + text-align: left; + margin-top: 8px; + } + + .movie-name { + font-size: 1.1rem; + margin-bottom: 3px; + } + + .movie-year { + font-size: 0.85rem; + margin-bottom: 5px; + } + + .box-office-amount { + font-size: 1.2rem; + } + + .box-office-desc { + font-size: 0.85rem; + } + + .rank-badge { + width: 40px; + height: 40px; + font-size: 1rem; + top: -8px; + right: -8px; + } + + .stats-grid { + grid-template-columns: 1fr; + gap: 15px; + } + + .stat-item { + padding: 12px; + } + + .stat-value { + font-size: 1.3rem; + } + + .update-time { + padding: 12px; + font-size: 0.85rem; + } +} + +/* 小屏手机适配 (最大480px) */ +@media screen and (max-width: 480px) { + .container { + padding: 8px; + } + + .header { + padding: 15px; + } + + .header h1 { + font-size: 1.6rem; + } + + .ranking-container { + padding: 15px 10px; + } + + .movie-item { + padding: 12px; + } + + .movie-name { + font-size: 1rem; + } + + .box-office-amount { + font-size: 1.1rem; + } + + .rank-number { + font-size: 1.3rem; + min-width: 35px; + } +} + +/* 高分辨率显示器优化 */ +@media screen and (min-width: 1440px) { + .container { + max-width: 1400px; + } + + .header h1 { + font-size: 3rem; + } + + .movie-list { + gap: 20px; + } + + .movie-item { + padding: 25px; + } + + .movie-name { + font-size: 1.4rem; + } + + .box-office-amount { + font-size: 1.5rem; + } +} \ No newline at end of file diff --git a/frontend/60sapi/热搜榜单/猫眼票房排行榜/index.html b/frontend/60sapi/热搜榜单/猫眼票房排行榜/index.html new file mode 100644 index 00000000..21b84c4b --- /dev/null +++ b/frontend/60sapi/热搜榜单/猫眼票房排行榜/index.html @@ -0,0 +1,40 @@ + + + + + + + + 猫眼票房排行榜 | 全球电影总票房 + + + + + + + + +
+ +
+

+ 🎬 + 猫眼票房排行榜(时更) +

+

展示全球电影总票房排行榜,数据来自权威源头,稳定实时

+
+ + +
+
+

正在加载票房数据...

+
+ + +
+
+ + + + + \ No newline at end of file diff --git a/frontend/60sapi/热搜榜单/猫眼票房排行榜/js/script.js b/frontend/60sapi/热搜榜单/猫眼票房排行榜/js/script.js new file mode 100644 index 00000000..39119c89 --- /dev/null +++ b/frontend/60sapi/热搜榜单/猫眼票房排行榜/js/script.js @@ -0,0 +1,249 @@ +// 猫眼票房排行榜 - JavaScript 实现 + +const API = { + endpoints: [], + currentIndex: 0, + params: { + encoding: 'json' + }, + localFallback: '返回接口.json', + // 初始化API接口列表 + async init() { + try { + const res = await fetch('./接口集合.json'); + const endpoints = await res.json(); + this.endpoints = endpoints.map(endpoint => `${endpoint}/v2/maoyan`); + } catch (e) { + // 如果无法加载接口集合,使用默认接口 + this.endpoints = ['https://60s.viki.moe/v2/maoyan']; + } + }, + // 获取当前接口URL + getCurrentUrl() { + if (this.endpoints.length === 0) return null; + const url = new URL(this.endpoints[this.currentIndex]); + Object.entries(this.params).forEach(([k, v]) => url.searchParams.append(k, v)); + return url.toString(); + }, + // 切换到下一个接口 + switchToNext() { + this.currentIndex = (this.currentIndex + 1) % this.endpoints.length; + return this.currentIndex < this.endpoints.length; + }, + // 重置到第一个接口 + reset() { + this.currentIndex = 0; + } +}; + +let elements = {}; + +// 初始化 +window.addEventListener('DOMContentLoaded', () => { + initElements(); + loadMaoyanList(); +}); + +function initElements() { + elements = { + container: document.getElementById('ranking-content'), + loading: document.getElementById('loading'), + updateTime: document.getElementById('api-update-time'), + statsTotal: document.getElementById('stats-total'), + statsTop10: document.getElementById('stats-top10') + }; +} + +async function loadMaoyanList() { + try { + showLoading(true); + + // 优先从线上API请求 + let data = await fetchFromAPI(); + + // 如果线上失败,尝试从本地返回接口.json加载 + if (!data) { + data = await fetchFromLocal(); + } + + if (!data || data.code !== 200 || !data.data) { + throw new Error(data && data.message ? data.message : '未能获取到有效数据'); + } + + renderRanking(data.data); + } catch (error) { + console.error('加载排行榜失败:', error); + showError(error.message || '加载失败,请稍后重试'); + } finally { + showLoading(false); + } +} + +async function fetchFromAPI() { + // 初始化API接口列表 + await API.init(); + + // 重置API索引到第一个接口 + API.reset(); + + // 尝试所有API接口 + for (let i = 0; i < API.endpoints.length; i++) { + try { + const url = API.getCurrentUrl(); + console.log(`尝试接口 ${i + 1}/${API.endpoints.length}: ${url}`); + + const resp = await fetch(url, { + cache: 'no-store', + timeout: 10000 // 10秒超时 + }); + + if (!resp.ok) { + throw new Error(`HTTP ${resp.status}: ${resp.statusText}`); + } + + const data = await resp.json(); + + if (data && data.code === 200) { + console.log(`接口 ${i + 1} 请求成功`); + return data; + } + + throw new Error(data && data.message ? data.message : '接口返回异常'); + + } catch (e) { + console.warn(`接口 ${i + 1} 失败:`, e.message); + + // 如果不是最后一个接口,切换到下一个 + if (i < API.endpoints.length - 1) { + API.switchToNext(); + continue; + } + + // 所有接口都失败了 + console.warn('所有远程接口都失败,尝试本地数据'); + return null; + } + } +} + +async function fetchFromLocal() { + try { + const resp = await fetch(API.localFallback + `?t=${Date.now()}`); + if (!resp.ok) throw new Error(`本地文件HTTP ${resp.status}`); + const data = await resp.json(); + return data; + } catch (e) { + console.error('读取本地返回接口.json失败:', e); + return null; + } +} + +function renderRanking(payload) { + const { list = [], tip = '', update_time = '', update_time_at } = payload || {}; + + // 更新时间 + if (elements.updateTime) { + elements.updateTime.textContent = update_time ? `更新时间:${update_time}` : ''; + } + + // 统计信息 + if (elements.statsTotal) { + elements.statsTotal.textContent = list.length; + } + if (elements.statsTop10) { + elements.statsTop10.textContent = Math.min(10, list.length); + } + + // 渲染列表 + const html = ` +
+
+
+
${list.length}
+
入榜影片数量
+
+
+
${Math.min(10, list.length)}
+
TOP10 数量
+
+
+
+
+

全球电影总票房排行榜

+
+ ${list.map(item => renderMovieItem(item)).join('')} +
+
+ ${tip ? `
${escapeHtml(tip)}
` : ''} + ${update_time ? `
更新时间:${escapeHtml(update_time)}
` : ''} + `; + + elements.container.innerHTML = html; + elements.container.classList.add('fade-in'); +} + +function renderMovieItem(item) { + const rank = item.rank; + const cls = rank === 1 ? 'top-1' : rank === 2 ? 'top-2' : rank === 3 ? 'top-3' : ''; + const badgeCls = rank === 1 ? 'gold' : rank === 2 ? 'silver' : rank === 3 ? 'bronze' : 'regular'; + + return ` +
+
${rank}
+
+
#${rank}
+
+
${escapeHtml(item.movie_name)}
+
上映年份:${escapeHtml(item.release_year || '')}
+
+
+
${formatCurrencyDesc(item.box_office_desc, item.box_office)}
+
总票房
+
+
+
+ `; +} + +function formatCurrencyDesc(desc, num) { + if (desc && typeof desc === 'string' && desc.trim()) return desc; + if (typeof num === 'number') { + // 人民币按亿元显示 + if (num >= 1e8) return (num / 1e8).toFixed(2) + '亿元'; + if (num >= 1e4) return (num / 1e4).toFixed(2) + '万元'; + return num.toLocaleString('zh-CN') + '元'; + } + return '—'; +} + +function showLoading(show) { + if (elements.loading) elements.loading.style.display = show ? 'block' : 'none'; + if (elements.container) elements.container.style.display = show ? 'none' : 'block'; +} + +function showError(message) { + if (!elements.container) return; + elements.container.innerHTML = ` +
+

⚠️ 加载失败

+

${escapeHtml(message)}

+

请稍后重试

+
+ `; + elements.container.style.display = 'block'; +} + +function escapeHtml(text) { + if (text == null) return ''; + const div = document.createElement('div'); + div.textContent = String(text); + return div.innerHTML; +} + +// 键盘刷新快捷键 Ctrl/Cmd + R 刷新数据区域(不刷新整页) +window.addEventListener('keydown', (e) => { + if ((e.ctrlKey || e.metaKey) && e.key.toLowerCase() === 'r') { + e.preventDefault(); + loadMaoyanList(); + } +}); \ No newline at end of file diff --git a/frontend/60sapi/热搜榜单/猫眼票房排行榜/接口集合.json b/frontend/60sapi/热搜榜单/猫眼票房排行榜/接口集合.json new file mode 100644 index 00000000..04e92b7f --- /dev/null +++ b/frontend/60sapi/热搜榜单/猫眼票房排行榜/接口集合.json @@ -0,0 +1,7 @@ +[ + "https://60s-cf.viki.moe", + "https://60s.viki.moe", + "https://60s.b23.run", + "https://60s.114128.xyz", + "https://60s-cf.114128.xyz" +] diff --git a/frontend/60sapi/热搜榜单/猫眼票房排行榜/返回接口.json b/frontend/60sapi/热搜榜单/猫眼票房排行榜/返回接口.json new file mode 100644 index 00000000..945e5cfe --- /dev/null +++ b/frontend/60sapi/热搜榜单/猫眼票房排行榜/返回接口.json @@ -0,0 +1,171 @@ +{ + "code": 200, + "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", + "data": { + "list": [ + { + "rank": 1, + "maoyan_id": 243, + "movie_name": "阿凡达", + "release_year": "2009", + "box_office": 21200972239, + "box_office_desc": "212.01亿元" + }, + { + "rank": 2, + "maoyan_id": 248172, + "movie_name": "复仇者联盟 4:终局之战", + "release_year": "2019", + "box_office": 20299852689, + "box_office_desc": "203亿元" + }, + { + "rank": 3, + "maoyan_id": 78461, + "movie_name": "阿凡达:水之道", + "release_year": "2022", + "box_office": 16825062887, + "box_office_desc": "168.25亿元" + }, + { + "rank": 4, + "maoyan_id": 267, + "movie_name": "泰坦尼克号", + "release_year": "1997", + "box_office": 16423064756, + "box_office_desc": "164.23亿元" + }, + { + "rank": 5, + "maoyan_id": 1294273, + "movie_name": "哪吒之魔童闹海", + "release_year": "2025", + "box_office": 15908714214, + "box_office_desc": "159.09亿元" + }, + { + "rank": 6, + "maoyan_id": 78536, + "movie_name": "星球大战:原力觉醒", + "release_year": "2015", + "box_office": 15019898914, + "box_office_desc": "150.2亿元" + }, + { + "rank": 7, + "maoyan_id": 248170, + "movie_name": "复仇者联盟 3:无限战争", + "release_year": "2018", + "box_office": 14882882413, + "box_office_desc": "148.83亿元" + }, + { + "rank": 8, + "maoyan_id": 1254435, + "movie_name": "蜘蛛侠:英雄无归", + "release_year": "2021", + "box_office": 14160042137, + "box_office_desc": "141.6亿元" + }, + { + "rank": 9, + "maoyan_id": 1479534, + "movie_name": "头脑特工队 2", + "release_year": "2024", + "box_office": 12319141075, + "box_office_desc": "123.19亿元" + }, + { + "rank": 10, + "maoyan_id": 78602, + "movie_name": "侏罗纪世界", + "release_year": "2015", + "box_office": 12120986621, + "box_office_desc": "121.21亿元" + }, + { + "rank": 11, + "maoyan_id": 1189879, + "movie_name": "狮子王", + "release_year": "2019", + "box_office": 12051977766, + "box_office_desc": "120.52亿元" + }, + { + "rank": 12, + "maoyan_id": 262, + "movie_name": "复仇者联盟", + "release_year": "2012", + "box_office": 11026033139, + "box_office_desc": "110.26亿元" + }, + { + "rank": 13, + "maoyan_id": 78405, + "movie_name": "速度与激情 7", + "release_year": "2015", + "box_office": 10988354292, + "box_office_desc": "109.88亿元" + }, + { + "rank": 14, + "maoyan_id": 341152, + "movie_name": "壮志凌云 2:独行侠", + "release_year": "2022", + "box_office": 10845892091, + "box_office_desc": "108.46亿元" + }, + { + "rank": 15, + "maoyan_id": 247949, + "movie_name": "冰雪奇缘 2", + "release_year": "2019", + "box_office": 10541240357, + "box_office_desc": "105.41亿元" + }, + { + "rank": 16, + "maoyan_id": 344942, + "movie_name": "芭比", + "release_year": "2023", + "box_office": 10493054406, + "box_office_desc": "104.93亿元" + }, + { + "rank": 17, + "maoyan_id": 78429, + "movie_name": "复仇者联盟 2:奥创纪元", + "release_year": "2015", + "box_office": 10188347873, + "box_office_desc": "101.88亿元" + }, + { + "rank": 18, + "maoyan_id": 1250896, + "movie_name": "超级马里奥兄弟大电影", + "release_year": "2023", + "box_office": 9868050757, + "box_office_desc": "98.68亿元" + }, + { + "rank": 19, + "maoyan_id": 341138, + "movie_name": "黑豹", + "release_year": "2018", + "box_office": 9788853998, + "box_office_desc": "97.89亿元" + }, + { + "rank": 20, + "maoyan_id": 916, + "movie_name": "哈利・波特与死亡圣器(下)", + "release_year": "2011", + "box_office": 9735002643, + "box_office_desc": "97.35亿元" + } + ], + "tip": "注:内地票房数据实时更新,包括点映及预售票房。港澳台及海外票房为统计数据,每小时更新。汇率采用 2025年1月31日市场汇率,1美元≈7.2514人民币", + "update_time": "2025/08/19 14:41:34", + "update_time_at": 1755585694385 + } +} \ No newline at end of file diff --git a/frontend/60sapi/热搜榜单/网易云榜单列表/接口集合.json b/frontend/60sapi/热搜榜单/网易云榜单列表/接口集合.json new file mode 100644 index 00000000..04e92b7f --- /dev/null +++ b/frontend/60sapi/热搜榜单/网易云榜单列表/接口集合.json @@ -0,0 +1,7 @@ +[ + "https://60s-cf.viki.moe", + "https://60s.viki.moe", + "https://60s.b23.run", + "https://60s.114128.xyz", + "https://60s-cf.114128.xyz" +] diff --git a/frontend/60sapi/热搜榜单/网易云榜单列表/返回接口.json b/frontend/60sapi/热搜榜单/网易云榜单列表/返回接口.json new file mode 100644 index 00000000..f0b8c79f --- /dev/null +++ b/frontend/60sapi/热搜榜单/网易云榜单列表/返回接口.json @@ -0,0 +1,750 @@ +{ + "code": 200, + "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", + "data": [ + { + "id": 19723756, + "name": "飙升榜", + "description": "云音乐中每天热度上升最快的100首单曲,每日更新。", + "cover": "https://p1.music.126.net/rIi7Qzy2i2Y_1QD7cd0MYA==/109951170048506929.jpg", + "update_frequency": "每天更新", + "updated": "2025-08-27 01:24:43", + "updated_at": 1756257883349, + "created": "2014-06-30 07:58:56", + "created_at": 1404115136883, + "link": "https://music.163.com/#/discover/toplist?id=19723756" + }, + { + "id": 3779629, + "name": "新歌榜", + "description": "云音乐新歌榜:云音乐用户一周内收听所有新歌(一月内最新发行) 官方TOP排行榜,每天更新。", + "cover": "https://p1.music.126.net/5guhqPBTcIrrhLBotgaT6w==/109951170048511751.jpg", + "update_frequency": "每天更新", + "updated": "2025-08-27 00:56:52", + "updated_at": 1756256212440, + "created": "2013-09-09 10:09:58", + "created_at": 1378721398225, + "link": "https://music.163.com/#/discover/toplist?id=3779629" + }, + { + "id": 2884035, + "name": "原创榜", + "description": "云音乐独立原创音乐人作品官方榜单,以推荐优秀原创作品为目的。每周四网易云音乐首发。申请网易音乐人:http://music.163.com/nmusician/", + "cover": "https://p1.music.126.net/BaP9nrocNTL3gGThysv4eQ==/109951170091896587.jpg", + "update_frequency": "每周四更新", + "updated": "2025-08-21 02:53:19", + "updated_at": 1755744799157, + "created": "2013-07-25 06:05:25", + "created_at": 1374732325894, + "link": "https://music.163.com/#/discover/toplist?id=2884035" + }, + { + "id": 3778678, + "name": "热歌榜", + "description": "云音乐热歌榜:云音乐用户一周内收听所有线上歌曲官方TOP排行榜,每日更新。", + "cover": "https://p1.music.126.net/0SUEG8yDACfx0Bw2MYFv4Q==/109951170048519512.jpg", + "update_frequency": "每天更新", + "updated": "2025-08-27 00:57:07", + "updated_at": 1756256227510, + "created": "2013-09-09 10:10:06", + "created_at": 1378721406014, + "link": "https://music.163.com/#/discover/toplist?id=3778678" + }, + { + "id": 991319590, + "name": "网易云中文说唱榜", + "description": "网易云原创说唱音乐人作品官方榜单,每周五更新。以网易云用户一周播放热度为主,收录2个月内发行的原创说唱作品,按照综合数据排名取前50名。申请网易音乐人:http://music.163.com/nmusician", + "cover": "https://p1.music.126.net/GgHbgDfGXHpE2YTchU7IvA==/109951171510498108.jpg", + "update_frequency": "每周五更新", + "updated": "2025-08-22 02:45:48", + "updated_at": 1755830748504, + "created": "2017-11-10 05:06:29", + "created_at": 1510290389440, + "link": "https://music.163.com/#/discover/toplist?id=991319590" + }, + { + "id": 71384707, + "name": "网易云古典榜", + "description": "网易云用户一周内收听所有古典音乐官方TOP排行榜,每周四更新。", + "cover": "https://p1.music.126.net/urByD_AmfBDBrs7fA9-O8A==/109951167976973225.jpg", + "update_frequency": "每周四更新", + "updated": "2025-08-21 02:59:09", + "updated_at": 1755745149157, + "created": "2015-05-07 03:22:00", + "created_at": 1430968920537, + "link": "https://music.163.com/#/discover/toplist?id=71384707" + }, + { + "id": 1978921795, + "name": "网易云电音榜", + "description": "网易云用户一周内收听电子音乐官方TOP排行榜,每周五更新。喜力星电音,用先锋电音带你解锁全新维度和体验!", + "cover": "https://p1.music.126.net/hXGObvXfsGtFjFvRhOYAkA==/109951170091888741.jpg", + "update_frequency": "每周五更新", + "updated": "2025-08-22 09:07:49", + "updated_at": 1755853669156, + "created": "2017-11-16 09:47:12", + "created_at": 1510825632233, + "link": "https://music.163.com/#/discover/toplist?id=1978921795" + }, + { + "id": 14028249541, + "name": "网易云全球说唱榜", + "description": "想聆听世界的说唱节奏?全球说唱榜每周五更新,聚焦华语地区以外的优秀说唱作品。根据云音乐用户每周播放热度数据,按照综合数据排名取前 50 名。", + "cover": "https://p1.music.126.net/0hhFjP6WyIjHYDXKW5E7BA==/109951171535150782.jpg", + "update_frequency": "每周五更新", + "updated": "2025-08-22 01:58:14", + "updated_at": 1755827894399, + "created": "2025-07-24 06:09:26", + "created_at": 1753337366883, + "link": "https://music.163.com/#/discover/toplist?id=14028249541" + }, + { + "id": 13372522766, + "name": "潮流风向榜", + "description": "精心挑选云音乐极具声量的音乐作品,呈现歌曲真实热度趋势,榜单每日更新。", + "cover": "https://p1.music.126.net/dIKA5e7jCncz2Br1Toxgaw==/109951170621574552.jpg", + "update_frequency": "更新74首", + "updated": "2025-08-27 04:05:55", + "updated_at": 1756267555368, + "created": "2025-02-26 06:01:33", + "created_at": 1740549693794, + "link": "https://music.163.com/#/discover/toplist?id=13372522766" + }, + { + "id": 12911403728, + "name": "音乐合伙人推荐榜", + "description": "音乐合伙人近一个月内推荐过的歌曲官方TOP排行榜,每周一更新。 跟随音乐合伙人的步伐,一起发现那些隐藏的音乐瑰宝。", + "cover": "https://p1.music.126.net/s6ITpmGjKbyDpi7DPkqd2w==/109951170187827373.jpg", + "update_frequency": "每周一更新", + "updated": "2025-08-25 04:06:02", + "updated_at": 1756094762192, + "created": "2024-11-25 07:14:30", + "created_at": 1732518870190, + "link": "https://music.163.com/#/discover/toplist?id=12911403728" + }, + { + "id": 12911589513, + "name": "音乐合伙人热歌榜", + "description": "音乐合伙人近一周评定过的高分热歌官方TOP排行榜,每周一更新。 跟随音乐合伙人的步伐,一起发现那些隐藏的音乐瑰宝。", + "cover": "https://p1.music.126.net/RgYxQmB-ZUjkMRo2N1jWnQ==/109951170187823494.jpg", + "update_frequency": "每周一更新", + "updated": "2025-08-25 04:05:58", + "updated_at": 1756094758751, + "created": "2024-11-25 07:13:46", + "created_at": 1732518826543, + "link": "https://music.163.com/#/discover/toplist?id=12911589513" + }, + { + "id": 12911619970, + "name": "音乐合伙人留名榜", + "description": "音乐合伙人近一个月内留名过的所有歌曲官方TOP排行榜,每周一更新。 跟随音乐合伙人的步伐,一起发现那些隐藏的音乐瑰宝。", + "cover": "https://p1.music.126.net/aJJzGIxhkVaD7dX0XBNUnw==/109951170187831145.jpg", + "update_frequency": "每周一更新", + "updated": "2025-08-25 04:05:45", + "updated_at": 1756094745722, + "created": "2024-11-25 07:12:50", + "created_at": 1732518770868, + "link": "https://music.163.com/#/discover/toplist?id=12911619970" + }, + { + "id": 12911379734, + "name": "音乐合伙人高分新歌榜", + "description": "音乐合伙人近期评定过的所有新歌(一个月内最新发行)官方TOP排行榜,每周一更新。 跟随音乐合伙人的步伐,一起发现那些隐藏的音乐瑰宝。", + "cover": "https://p1.music.126.net/bfk15bvanhdPFU7yjPFgWA==/109951170187832038.jpg", + "update_frequency": "每周一更新", + "updated": "2025-08-25 04:05:50", + "updated_at": 1756094750117, + "created": "2024-11-25 07:11:53", + "created_at": 1732518713161, + "link": "https://music.163.com/#/discover/toplist?id=12911379734" + }, + { + "id": 12768855486, + "name": "音乐合伙人高分榜", + "description": "音乐合伙人的高分歌曲官方榜单,收录近半年来获得音乐合伙人高分推荐的TOP100首歌曲,每日更新。跟随音乐合伙人的步伐,一起发现那些隐藏的音乐瑰宝。", + "cover": "https://p1.music.126.net/fPP5T0Z8Ac15qNvRTcHa6g==/109951170074028970.jpg", + "update_frequency": "更新27首", + "updated": "2025-08-27 04:05:47", + "updated_at": 1756267547739, + "created": "2024-10-25 03:51:10", + "created_at": 1729828270342, + "link": "https://music.163.com/#/discover/toplist?id=12768855486" + }, + { + "id": 5453912201, + "name": "黑胶VIP爱听榜", + "description": "云音乐站内会员播放热度TOP100的歌曲,每周四更新。\n黑胶们都爱听什么歌曲?\n热门好歌一站式收听,让你念念不忘~\n做尊贵黑胶,畅听品味好歌~", + "cover": "https://p1.music.126.net/qo6-o9n5AhMjNyejev38-A==/109951169743111905.jpg", + "update_frequency": "每周四更新", + "updated": "2025-08-21 10:05:01", + "updated_at": 1755770701110, + "created": "2021-01-08 06:30:24", + "created_at": 1610087424470, + "link": "https://music.163.com/#/discover/toplist?id=5453912201" + }, + { + "id": 71385702, + "name": "网易云ACG榜", + "description": "网易云用户一周内收听所有ACG音乐官方TOP排行榜,每周四更新。", + "cover": "https://p1.music.126.net/na1kEeCS1iZEkzOrs9r_9g==/109951167976973667.jpg", + "update_frequency": "每周四更新", + "updated": "2025-08-21 04:05:02", + "updated_at": 1755749102516, + "created": "2015-05-07 03:22:15", + "created_at": 1430968935040, + "link": "https://music.163.com/#/discover/toplist?id=71385702" + }, + { + "id": 745956260, + "name": "网易云韩语榜", + "description": "网易云用户一周内收听所有韩语歌曲官方TOP排行榜,每周四更新。", + "cover": "https://p1.music.126.net/5oN9YaFznwNGXkmi8i2Ytw==/109951167430864741.jpg", + "update_frequency": "每周四更新", + "updated": "2025-08-21 04:05:01", + "updated_at": 1755749101352, + "created": "2017-05-31 03:34:51", + "created_at": 1496201691281, + "link": "https://music.163.com/#/discover/toplist?id=745956260" + }, + { + "id": 180106, + "name": "UK排行榜周榜", + "description": "UK排行榜", + "cover": "https://p1.music.126.net/fhAqiflLy3eU-ldmBQByrg==/109951165613082765.jpg", + "update_frequency": "每天更新", + "updated": "2025-08-25 03:59:06", + "updated_at": 1756094346206, + "created": "2013-02-19 02:09:26", + "created_at": 1361239766844, + "link": "https://music.163.com/#/discover/toplist?id=180106" + }, + { + "id": 60198, + "name": "美国Billboard榜", + "description": "美国Billboard排行榜", + "cover": "https://p1.music.126.net/rwRsVIJHQ68gglhA6TNEYA==/109951165611413732.jpg", + "update_frequency": "刚刚更新", + "updated": "2025-08-27 03:38:38", + "updated_at": 1756265918370, + "created": "2013-01-22 02:51:16", + "created_at": 1358823076818, + "link": "https://music.163.com/#/discover/toplist?id=60198" + }, + { + "id": 3812895, + "name": "Beatport全球电子舞曲榜", + "description": "Beatport全球电子舞曲排行榜TOP100(本榜每周三更新)", + "cover": "https://p1.music.126.net/oT-RHuPBJiD7WMoU7WG5Rw==/109951166093489621.jpg", + "update_frequency": "更新20首", + "updated": "2025-08-27 02:29:37", + "updated_at": 1756261777726, + "created": "2013-09-11 08:03:09", + "created_at": 1378886589466, + "link": "https://music.163.com/#/discover/toplist?id=3812895" + }, + { + "id": 21845217, + "name": "KTV唛榜", + "description": "KTV唛榜是目前国内首个以全国超过200家KTV点歌平台真实数据的当红歌曲榜单。所涉及的KTV店铺覆盖全国近100多个城市,囊括一、二、三线各级城市及地区。在综合全国各地KTV点唱数据的前提下进行汇总与统计。为了保证信息的及时性,唛榜每周五更新。提供给K迷们最新和最准确的数据。", + "cover": "https://p1.music.126.net/5wDP78s43ydVTKt62C8OjQ==/109951165613100063.jpg", + "update_frequency": "每周五更新", + "updated": "2021-11-26 09:56:43", + "updated_at": 1637920603975, + "created": "2014-07-18 03:11:33", + "created_at": 1405653093230, + "link": "https://music.163.com/#/discover/toplist?id=21845217" + }, + { + "id": 60131, + "name": "日本Oricon榜", + "description": "日本Oricon数字单曲周榜,每周三更新,欢迎关注。", + "cover": "https://p1.music.126.net/aXUPgImt8hhf4cMUZEjP4g==/109951165611417794.jpg", + "update_frequency": "每天更新", + "updated": "2025-08-22 02:15:24", + "updated_at": 1755828924438, + "created": "2013-01-08 08:51:24", + "created_at": 1357635084874, + "link": "https://music.163.com/#/discover/toplist?id=60131" + }, + { + "id": 2809513713, + "name": "网易云欧美热歌榜", + "description": "网易云用户一周内收听所有欧美歌曲官方TOP排行榜,每周四更新。\nWestern Hit Chart (updated every Thursday)", + "cover": "https://p1.music.126.net/70_EO_Dc7NT_hhfvsapzcQ==/109951167430862162.jpg", + "update_frequency": "每周四更新", + "updated": "2025-08-21 15:44:14", + "updated_at": 1755791054932, + "created": "2019-05-22 02:49:33", + "created_at": 1558493373769, + "link": "https://music.163.com/#/discover/toplist?id=2809513713" + }, + { + "id": 2809577409, + "name": "网易云欧美新歌榜", + "description": "网易云用户一周内收听所有欧美新歌(一月内最新发行)官方TOP排行榜,每天更新。\nWestern New Release Chart (new songs released in last 30 days, updated daily)\n", + "cover": "https://p1.music.126.net/0lPWpI9Ejn1OiW2LSbg-qw==/109951167430863224.jpg", + "update_frequency": "更新17首", + "updated": "2025-08-27 07:16:02", + "updated_at": 1756278962152, + "created": "2019-05-22 02:46:54", + "created_at": 1558493214795, + "link": "https://music.163.com/#/discover/toplist?id=2809577409" + }, + { + "id": 27135204, + "name": "法国 NRJ Vos Hits 周榜", + "description": "法国NRJ电台(national Radio de Jeunes)成立于1981年,总部位于法国巴黎。是法国最受欢迎的音乐电台和听众最多的广播电台之一。NRJ音乐奖素有法国的“格莱美”之称。此榜单针对NRJ电台法国本土热门歌曲排行。【每周五更新】", + "cover": "https://p1.music.126.net/-fyzrPWd06FfWl_0JDAxMQ==/109951165613108584.jpg", + "update_frequency": "每周五更新", + "updated": "2025-08-22 02:15:42", + "updated_at": 1755828942531, + "created": "2014-09-04 10:03:33", + "created_at": 1409825013948, + "link": "https://music.163.com/#/discover/toplist?id=27135204" + }, + { + "id": 3001835560, + "name": "网易云ACG动画榜", + "description": "网易云中每天热度上升最快的100首ACG动画单曲,每日更新。", + "cover": "https://p1.music.126.net/SkGlKQ6acixthb77VlD9eQ==/109951164432300406.jpg", + "update_frequency": "更新84首", + "updated": "2025-08-27 04:05:09", + "updated_at": 1756267509031, + "created": "2019-09-27 02:03:58", + "created_at": 1569549838610, + "link": "https://music.163.com/#/discover/toplist?id=3001835560" + }, + { + "id": 3001795926, + "name": "网易云ACG游戏榜", + "description": "网易云中每天热度上升最快的100首ACG游戏单曲,每日更新。", + "cover": "https://p1.music.126.net/hivOOHMwEmnn9s_6rgZwEQ==/109951164432303700.jpg", + "update_frequency": "更新87首", + "updated": "2025-08-27 04:05:18", + "updated_at": 1756267518248, + "created": "2019-09-27 02:04:56", + "created_at": 1569549896656, + "link": "https://music.163.com/#/discover/toplist?id=3001795926" + }, + { + "id": 3001890046, + "name": "网易云ACG VOCALOID榜", + "description": "", + "cover": "https://p1.music.126.net/Ag7RyRCYiINcd9EtRXf6xA==/109951164432303690.jpg", + "update_frequency": "更新87首", + "updated": "2025-08-27 04:05:27", + "updated_at": 1756267527413, + "created": "2019-09-27 02:05:25", + "created_at": 1569549925472, + "link": "https://music.163.com/#/discover/toplist?id=3001890046" + }, + { + "id": 5059644681, + "name": "网易云日语榜", + "description": "网易云用户一周内收听所有日语歌曲官方TOP排行榜,每周二更新。", + "cover": "https://p1.music.126.net/YFBFNI2F-4BveUpv6FKFuw==/109951167430864069.jpg", + "update_frequency": "每周二更新", + "updated": "2025-08-26 06:05:02", + "updated_at": 1756188302867, + "created": "2020-06-11 08:10:00", + "created_at": 1591863000459, + "link": "https://music.163.com/#/discover/toplist?id=5059644681" + }, + { + "id": 5059633707, + "name": "网易云摇滚榜", + "description": "网易云用户一周内收听所有摇滚歌曲官方TOP排行榜,每周五更新。", + "cover": "https://p1.music.126.net/LjkX2hktgFD1NXc3W6w0sA==/109951170048522513.jpg", + "update_frequency": "每周五更新", + "updated": "2025-08-22 09:12:43", + "updated_at": 1755853963904, + "created": "2020-06-11 08:13:33", + "created_at": 1591863213389, + "link": "https://music.163.com/#/discover/toplist?id=5059633707" + }, + { + "id": 5059642708, + "name": "网易云国风榜", + "description": "网易云用户一周内收听所有国风歌曲官方TOP排行榜,每周五更新。", + "cover": "https://p1.music.126.net/kTJC5OBhg8I477X_ZmXyDQ==/109951168539740982.jpg", + "update_frequency": "每周五更新", + "updated": "2025-08-22 03:10:57", + "updated_at": 1755832257607, + "created": "2020-06-11 08:14:18", + "created_at": 1591863258438, + "link": "https://music.163.com/#/discover/toplist?id=5059642708" + }, + { + "id": 5338990334, + "name": "潜力爆款榜", + "description": "全民一起PICK潜力好歌,每周二更新", + "cover": "https://p1.music.126.net/Mi4QPklg1mtbWAfq74tEqQ==/109951165498334721.jpg", + "update_frequency": "每周二更新", + "updated": "2025-08-26 04:05:32", + "updated_at": 1756181132964, + "created": "2020-11-17 06:24:34", + "created_at": 1605594274077, + "link": "https://music.163.com/#/discover/toplist?id=5338990334" + }, + { + "id": 5059661515, + "name": "网易云民谣榜", + "description": "网易云用户一周内收听所有民谣歌曲官方TOP排行榜,每周五更新。", + "cover": "https://p1.music.126.net/Xe9qLTAqtBAWX_hPgFHMyw==/109951170048510929.jpg", + "update_frequency": "每周五更新", + "updated": "2025-08-22 08:39:36", + "updated_at": 1755851976839, + "created": "2020-06-11 08:10:52", + "created_at": 1591863052757, + "link": "https://music.163.com/#/discover/toplist?id=5059661515" + }, + { + "id": 6688069460, + "name": "听歌识曲榜", + "description": "网易云音乐站内歌曲按用户“听歌识曲”次数排列,每周四更新", + "cover": "https://p1.music.126.net/wJVUAiUuykKk7yGbQxDBug==/109951167430857712.jpg", + "update_frequency": "每周四更新", + "updated": "2025-08-21 15:35:02", + "updated_at": 1755790502462, + "created": "2021-03-31 08:45:54", + "created_at": 1617180354803, + "link": "https://music.163.com/#/discover/toplist?id=6688069460" + }, + { + "id": 6723173524, + "name": "网络热歌榜", + "description": "网罗一周热门网络歌曲,反映云音乐用户近一周网络热歌收听趋势。每周五更新。", + "cover": "https://p1.music.126.net/_kSxOPqQ5J5etC5DKTFwNA==/109951170048519530.jpg", + "update_frequency": "每周五更新", + "updated": "2025-08-22 01:59:18", + "updated_at": 1755827958008, + "created": "2021-04-22 02:41:46", + "created_at": 1619059306654, + "link": "https://music.163.com/#/discover/toplist?id=6723173524" + }, + { + "id": 6732051320, + "name": "俄语榜", + "description": "网易云音乐用户一周内收听所有俄罗斯语歌曲官方TOP排行榜,每周四更新。", + "cover": "https://p1.music.126.net/HbJ0BK5doY4I4pEMY6-FQw==/109951167430852698.jpg", + "update_frequency": "每周四更新", + "updated": "2025-08-21 04:05:27", + "updated_at": 1755749127585, + "created": "2021-04-28 04:05:12", + "created_at": 1619582712108, + "link": "https://music.163.com/#/discover/toplist?id=6732051320" + }, + { + "id": 6732014811, + "name": "越南语榜", + "description": "网易云音乐用户一周内收听所有越南语歌曲官方TOP排行榜,每周四更新。", + "cover": "https://p1.music.126.net/N-Y5maLGWgrowt3TE6RtSg==/109951167430857045.jpg", + "update_frequency": "每周四更新", + "updated": "2025-08-21 04:05:28", + "updated_at": 1755749128002, + "created": "2021-04-28 04:05:49", + "created_at": 1619582749349, + "link": "https://music.163.com/#/discover/toplist?id=6732014811" + }, + { + "id": 6886768100, + "name": "中文慢摇DJ榜", + "description": "搜索“DJ”,进入慢摇DJ专区,探索更多网络热歌!", + "cover": "https://p1.music.126.net/w_01BfDU012ojxnzLO6tYw==/109951167977358686.jpg", + "update_frequency": "刚刚更新", + "updated": "2025-08-27 04:00:00", + "updated_at": 1756267200565, + "created": "2021-07-28 10:09:59", + "created_at": 1627466999260, + "link": "https://music.163.com/#/discover/toplist?id=6886768100" + }, + { + "id": 6939992364, + "name": "俄罗斯top hit流行音乐榜", + "description": "top hit榜根据俄罗斯及全球400多个无线广播的音乐播放量和YouTube播放量计算得来,每周一更新。", + "cover": "https://p1.music.126.net/KLVO8PxVZzOoLdWQQNyprA==/109951166327316568.jpg", + "update_frequency": "每周五更新", + "updated": "2025-08-22 06:10:23", + "updated_at": 1755843023964, + "created": "2021-08-27 03:30:02", + "created_at": 1630035002268, + "link": "https://music.163.com/#/discover/toplist?id=6939992364" + }, + { + "id": 7095271308, + "name": "泰语榜", + "description": "网易云音乐用户一周内收听所有泰语歌曲官方TOP排行榜,每周四更新。", + "cover": "https://p1.music.126.net/4W0WBHBgwYlYfRniuyL47A==/109951167430843284.jpg", + "update_frequency": "每周四更新", + "updated": "2025-08-21 02:26:07", + "updated_at": 1755743167588, + "created": "2021-11-29 06:22:17", + "created_at": 1638166937809, + "link": "https://music.163.com/#/discover/toplist?id=7095271308" + }, + { + "id": 7356827205, + "name": "BEAT排行榜", + "description": "嘿~朋友,欢迎来到本周的Beat排行榜\n我们挑选了近一周内热门的Beat作品,一起来感受下大家近期的“口味”吧!\n每周都会更新哦,记得按下收藏,我每天都会在这里等你来与我交流!~\n\n关于Beat的必备小知识\nQ1.什么是Beat?\nBeat即节拍,特指嘻哈音乐中的伴奏,现在也可指所有流行音乐的伴奏\nQ2.Beat有什么用?\n在Beat的帮助下,你只需要填词演唱即可完成一首歌曲的创作,而且Beat也可以作为各种流媒体的背景音乐或是多场景现场演出的得力助手,不同风格的Beat还能为你的音乐创作提供灵感哦~\n搜索关注“BEATSOUL激灵”网易云官号,探索更多炸裂音乐内容~", + "cover": "https://p1.music.126.net/yhzlQJCJ9NcT4MvJBG_HgQ==/109951167977014958.jpg", + "update_frequency": "每周四更新", + "updated": "2025-08-21 12:05:01", + "updated_at": 1755777901037, + "created": "2022-03-29 11:39:58", + "created_at": 1648553998273, + "link": "https://music.163.com/#/discover/toplist?id=7356827205" + }, + { + "id": 7325478166, + "name": "星云榜VOL.29 Addison Rae新专来袭,寻找最真实的自己", + "description": "精心评审,专业推荐。每周五更新,为你呈现宝藏新歌。\n1、《Aquamarinee》歌手:Addison Rae\n2、《羽毛剑》歌手:秦凡淇\n3、《Take me back》歌手:HAIM\n4、《妈妈的眼睛》歌手:张震岳\n5、《25岁永不停下》歌手:张醒婵\n6、《雨季症候》歌手:SHARK卫彬月\n7、《山东王FREESTYLE》歌手:华云龙KLE\n8、《LOVE I NEED》歌手:陈瑜Estelle\n9、《FFFFF》歌手:刘柏辛Lexie\n10、《Vipaśyanā》歌手:Namunong\n本期封面:Addison Rae,Aquamarine", + "cover": "https://p2.music.126.net/u440jFG0N5i06C9ejOeMCQ==/109951171381091309.jpg", + "update_frequency": "每周五更新", + "updated": "2025-06-30 08:17:26", + "updated_at": 1751271446032, + "created": "2022-03-09 03:24:46", + "created_at": 1646796286440, + "link": "https://music.163.com/#/discover/toplist?id=7325478166" + }, + { + "id": 7603212484, + "name": "LOOK直播歌曲榜", + "description": "LOOK直播好歌共赏,专属你的声音聊愈场。榜单选取符合条件且近7日热度最高的前50首歌曲,每周二更新。", + "cover": "https://p2.music.126.net/u-RQC-LyY0aoeseRumJ14A==/109951167977730469.jpg", + "update_frequency": "每周二更新", + "updated": "2024-05-07 13:23:03", + "updated_at": 1715088183913, + "created": "2022-08-23 01:54:56", + "created_at": 1661219696017, + "link": "https://music.163.com/#/discover/toplist?id=7603212484" + }, + { + "id": 7775163417, + "name": "赏音榜", + "description": "云音乐歌曲赏音榜,以让用户鉴赏到更多潜力好歌为目的,以用户对歌曲互动热度为核心,按照综合数据排名取前100名,每日更新", + "cover": "https://p2.music.126.net/m9hQzC-d5wefBipedNPaHg==/109951168178601971.jpg", + "update_frequency": "更新92首", + "updated": "2025-08-27 04:05:36", + "updated_at": 1756267536926, + "created": "2022-11-28 06:46:19", + "created_at": 1669617979380, + "link": "https://music.163.com/#/discover/toplist?id=7775163417" + }, + { + "id": 7785123708, + "name": "黑胶VIP新歌榜", + "description": "云音乐站内播放热度TOP50的7日内新晋会员歌曲,每日更新。\n更适合黑胶体质的新歌榜单来啦!\n耳机分你一只,新曲一起来听~\n成为尊贵黑胶,不错过每一首VIP新歌!", + "cover": "https://p2.music.126.net/vjitpkT9nXBCth6tvdDMWg==/109951169743115266.jpg", + "update_frequency": "更新33首", + "updated": "2025-08-27 04:05:38", + "updated_at": 1756267538662, + "created": "2022-12-02 10:51:16", + "created_at": 1669978276103, + "link": "https://music.163.com/#/discover/toplist?id=7785123708" + }, + { + "id": 7785066739, + "name": "黑胶VIP热歌榜", + "description": "云音乐站内播放和付费热度TOP50的会员歌曲,每日更新。\n更适合黑胶体质的热歌榜单来啦!\n哪首是你的单曲循环?\n成为尊贵黑胶,随心畅听热门好歌!", + "cover": "https://p2.music.126.net/Ay3mLgQ9weG_c8JjYrD-Bw==/109951169743106495.jpg", + "update_frequency": "刚刚更新", + "updated": "2025-08-27 04:05:37", + "updated_at": 1756267537688, + "created": "2022-12-02 10:51:31", + "created_at": 1669978291024, + "link": "https://music.163.com/#/discover/toplist?id=7785066739" + }, + { + "id": 7785091694, + "name": "黑胶VIP爱搜榜", + "description": "云音乐站内会员搜索播放热度TOP50的歌曲,每日更新。\n更适合黑胶体质的搜歌榜单来啦!\n热搜好歌一网打尽,只为有品位的你~\n成为尊贵黑胶,你搜我听畅听不停!", + "cover": "https://p2.music.126.net/R7DtZqNraesnsiaIKvzTHA==/109951169743112799.jpg", + "update_frequency": "更新36首", + "updated": "2025-08-27 04:05:42", + "updated_at": 1756267542318, + "created": "2022-12-02 10:51:43", + "created_at": 1669978303210, + "link": "https://music.163.com/#/discover/toplist?id=7785091694" + }, + { + "id": 8246775932, + "name": "实时热度榜", + "description": "每天9-23点为你精选当下歌曲热度最高的歌曲", + "cover": "https://p2.music.126.net/U7ZbdpWzRdmZVr6Khn_4ag==/109951168673982478.jpg", + "update_frequency": "刚刚更新", + "updated": "2025-08-27 13:15:01", + "updated_at": 1756300501119, + "created": "2023-03-20 02:39:59", + "created_at": 1679279999154, + "link": "https://music.163.com/#/discover/toplist?id=8246775932" + }, + { + "id": 8537588450, + "name": "喜力®星电音派对潮音榜", + "description": "乐无界,越未来!《星电音联盟》歌曲官方榜单,每周一更新,让云村村民们随时随地躁起高燃派对氛围!喜力®星电音构建狂欢永不停歇的新奇电音宇宙,激活潮流基因,释放先锋灵感,跨维开启奇妙电音之旅!", + "cover": "https://p2.music.126.net/HVu2hGYvzN5XBuvFc_4Bgg==/109951168730309120.jpg", + "update_frequency": "每周五更新", + "updated": "2024-09-16 04:05:30", + "updated_at": 1726459530378, + "created": "2023-07-07 02:48:39", + "created_at": 1688698119437, + "link": "https://music.163.com/#/discover/toplist?id=8537588450" + }, + { + "id": 8661209031, + "name": "乐夏榜", + "description": "听乐夏,上网易云,一头扎进爱音乐的人群! 综艺《乐队的夏天3》官方榜单,每周一更新。和三星折叠屏手机一起畅听《乐队的夏天3》官方榜单,折叠看三星,五代更来劲。", + "cover": "https://p2.music.126.net/RlStCmE97y0xYFk7rS3Zww==/109951168864907822.jpg", + "update_frequency": "每周一更新", + "updated": "2025-08-25 04:05:40", + "updated_at": 1756094740529, + "created": "2023-08-16 09:47:27", + "created_at": 1692179247425, + "link": "https://music.163.com/#/discover/toplist?id=8661209031" + }, + { + "id": 8703179781, + "name": "特斯拉车友爱听榜", + "description": null, + "cover": "https://p2.music.126.net/UL8dhobSa3TR6Wd1JmWe_g==/109951168924385363.jpg", + "update_frequency": "每周一更新", + "updated": "2025-08-25 08:05:04", + "updated_at": 1756109104224, + "created": "2023-08-31 04:29:59", + "created_at": 1693456199735, + "link": "https://music.163.com/#/discover/toplist?id=8703179781" + }, + { + "id": 8703052295, + "name": "理想车友爱听榜", + "description": null, + "cover": "https://p2.music.126.net/U--PWdWupY1ER5cVSjr1jQ==/109951168928365496.jpg", + "update_frequency": "每周一更新", + "updated": "2025-08-25 08:05:04", + "updated_at": 1756109104985, + "created": "2023-08-31 04:38:29", + "created_at": 1693456709598, + "link": "https://music.163.com/#/discover/toplist?id=8703052295" + }, + { + "id": 8702582160, + "name": "比亚迪车友爱听榜", + "description": null, + "cover": "https://p2.music.126.net/S1OG-OLTaofa3HfrHW48kA==/109951168924393585.jpg", + "update_frequency": "每周一更新", + "updated": "2025-08-25 08:05:03", + "updated_at": 1756109103855, + "created": "2023-08-31 04:38:42", + "created_at": 1693456722262, + "link": "https://music.163.com/#/discover/toplist?id=8702582160" + }, + { + "id": 8703220480, + "name": "蔚来车友爱听榜", + "description": null, + "cover": "https://p2.music.126.net/r9kBQNsOro1EAB82Ol51WQ==/109951168924380971.jpg", + "update_frequency": "每周一更新", + "updated": "2025-08-25 08:05:02", + "updated_at": 1756109102267, + "created": "2023-08-31 04:38:56", + "created_at": 1693456736086, + "link": "https://music.163.com/#/discover/toplist?id=8703220480" + }, + { + "id": 8702982391, + "name": "极氪车友爱听榜", + "description": null, + "cover": "https://p2.music.126.net/Cu0RXoKewSPM9Gyc7Cp8jw==/109951168924391596.jpg", + "update_frequency": "每周一更新", + "updated": "2025-08-25 08:05:03", + "updated_at": 1756109103634, + "created": "2023-08-31 04:39:19", + "created_at": 1693456759762, + "link": "https://music.163.com/#/discover/toplist?id=8702982391" + }, + { + "id": 8532443277, + "name": "蛋仔派对听歌榜", + "description": "来自蛋仔岛的热播歌曲速递,网易《蛋仔派对》官方榜单,每周五更新。云村村民们,和蛋仔们一起随歌摇摆吧!", + "cover": "https://p2.music.126.net/TMb0be5QLMZKOFeuOKT4tg==/109951168717283910.jpg", + "update_frequency": "每周五更新", + "updated": "2025-08-22 04:05:44", + "updated_at": 1755835544365, + "created": "2023-07-05 02:32:04", + "created_at": 1688524324879, + "link": "https://music.163.com/#/discover/toplist?id=8532443277" + }, + { + "id": 9651277674, + "name": "AI歌曲榜", + "description": "精心挑选每日最新最热AI生成歌曲,榜单每日更新,一起感受AI的独特魅力吧!", + "cover": "https://p2.music.126.net/M0m6GeZ1Y8Osz9jqxaW8Wg==/109951169462048035.jpg", + "update_frequency": "更新12首", + "updated": "2025-08-27 04:05:43", + "updated_at": 1756267543655, + "created": "2024-04-02 10:25:12", + "created_at": 1712053512213, + "link": "https://music.163.com/#/discover/toplist?id=9651277674" + }, + { + "id": 10131772880, + "name": "昊铂车友爱听榜", + "description": null, + "cover": "https://p2.music.126.net/EL7H4rkKejZY7Uv54EFNXg==/109951169655010112.jpg", + "update_frequency": "每周一更新", + "updated": "2025-08-25 08:05:01", + "updated_at": 1756109101438, + "created": "2024-06-04 08:50:00", + "created_at": 1717491000945, + "link": "https://music.163.com/#/discover/toplist?id=10131772880" + }, + { + "id": 10162841534, + "name": "埃安车友爱听榜", + "description": "埃安车友平时都在听什么??", + "cover": "https://p2.music.126.net/FcP1U6Bck0wPKqd0XgBwSQ==/109951169679731241.jpg", + "update_frequency": "每周一更新", + "updated": "2025-08-25 08:05:03", + "updated_at": 1756109103115, + "created": "2024-06-12 05:31:44", + "created_at": 1718170304691, + "link": "https://music.163.com/#/discover/toplist?id=10162841534" + }, + { + "id": 12225155968, + "name": "欧美R&B榜", + "description": "云音乐用户一周内收听节奏布鲁斯(R&B)官方TOP排行榜,每周五更新。", + "cover": "https://p2.music.126.net/0E6MzYzyA5uvQ4CSoIG2mw==/109951169739660034.jpg", + "update_frequency": "每周五更新", + "updated": "2025-08-22 04:05:46", + "updated_at": 1755835546525, + "created": "2024-06-25 10:14:05", + "created_at": 1719310445382, + "link": "https://music.163.com/#/discover/toplist?id=12225155968" + }, + { + "id": 12344472377, + "name": "黑胶VIP限免榜", + "description": "云音乐站内热度最高的限免播放歌曲TOP50,每日更新。\n人气旋律一听就会爱上!现在马上进入免费模式(点击云音乐首页左上角侧边栏,选择“免费听歌”)畅听全榜吧!", + "cover": "https://p2.music.126.net/WXCSf4ZNcDCdOTY5ixm3Bg==/109951169809318325.jpg", + "update_frequency": "更新11首", + "updated": "2025-08-27 04:05:44", + "updated_at": 1756267544856, + "created": "2024-07-23 08:08:37", + "created_at": 1721722117311, + "link": "https://music.163.com/#/discover/toplist?id=12344472377" + }, + { + "id": 12717025277, + "name": "吉利车友爱听榜", + "description": null, + "cover": "https://p2.music.126.net/XVmZb3JSyrwMgqu9WVz61A==/109951170037568570.jpg", + "update_frequency": "每周一更新", + "updated": "2025-08-25 08:05:00", + "updated_at": 1756109100809, + "created": "2024-10-12 05:44:04", + "created_at": 1728711844151, + "link": "https://music.163.com/#/discover/toplist?id=12717025277" + } + ] +} \ No newline at end of file diff --git a/frontend/60sapi/热搜榜单/网易云榜单详情/css/background.css b/frontend/60sapi/热搜榜单/网易云榜单详情/css/background.css new file mode 100644 index 00000000..a4c76f7a --- /dev/null +++ b/frontend/60sapi/热搜榜单/网易云榜单详情/css/background.css @@ -0,0 +1,123 @@ +/* 背景样式文件 */ +body { + background: linear-gradient(135deg, #E8F5E8 0%, #F1F8E9 25%, #E0F2F1 50%, #E8F5E8 75%, #F3E5F5 100%); + background-size: 400% 400%; + animation: gradientShift 15s ease infinite; + position: relative; +} + +/* 背景渐变动画 */ +@keyframes gradientShift { + 0% { + background-position: 0% 50%; + } + 50% { + background-position: 100% 50%; + } + 100% { + background-position: 0% 50%; + } +} + +/* 背景装饰元素 */ +body::before { + content: ''; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-image: + radial-gradient(circle at 20% 80%, rgba(76, 175, 80, 0.1) 0%, transparent 50%), + radial-gradient(circle at 80% 20%, rgba(129, 199, 132, 0.1) 0%, transparent 50%), + radial-gradient(circle at 40% 40%, rgba(165, 214, 167, 0.08) 0%, transparent 50%); + pointer-events: none; + z-index: -2; +} + +/* 背景粒子效果 */ +body::after { + content: ''; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-image: + radial-gradient(2px 2px at 20px 30px, rgba(76, 175, 80, 0.3), transparent), + radial-gradient(2px 2px at 40px 70px, rgba(129, 199, 132, 0.2), transparent), + radial-gradient(1px 1px at 90px 40px, rgba(165, 214, 167, 0.3), transparent), + radial-gradient(1px 1px at 130px 80px, rgba(76, 175, 80, 0.2), transparent), + radial-gradient(2px 2px at 160px 30px, rgba(129, 199, 132, 0.3), transparent); + background-repeat: repeat; + background-size: 200px 100px; + animation: particleFloat 20s linear infinite; + pointer-events: none; + z-index: -1; + opacity: 0.6; +} + +@keyframes particleFloat { + 0% { + transform: translateY(0px); + } + 100% { + transform: translateY(-100px); + } +} + +/* 响应式背景调整 */ +@media (max-width: 768px) { + body::after { + background-size: 150px 75px; + animation-duration: 25s; + } +} + +@media (max-width: 480px) { + body::after { + background-size: 100px 50px; + animation-duration: 30s; + opacity: 0.4; + } +} + +/* 高性能模式 - 减少动画 */ +@media (prefers-reduced-motion: reduce) { + body { + animation: none; + background: linear-gradient(135deg, #E8F5E8 0%, #F1F8E9 50%, #E0F2F1 100%); + } + + body::after { + animation: none; + } + + .title { + animation: none; + } +} + +/* 深色模式支持 */ +@media (prefers-color-scheme: dark) { + body { + background: linear-gradient(135deg, #1B5E20 0%, #2E7D32 25%, #388E3C 50%, #43A047 75%, #4CAF50 100%); + } + + body::before { + background-image: + radial-gradient(circle at 20% 80%, rgba(255, 255, 255, 0.05) 0%, transparent 50%), + radial-gradient(circle at 80% 20%, rgba(255, 255, 255, 0.03) 0%, transparent 50%), + radial-gradient(circle at 40% 40%, rgba(255, 255, 255, 0.02) 0%, transparent 50%); + } + + body::after { + background-image: + radial-gradient(1px 1px at 20px 30px, rgba(255, 255, 255, 0.1), transparent), + radial-gradient(1px 1px at 40px 70px, rgba(255, 255, 255, 0.08), transparent), + radial-gradient(1px 1px at 90px 40px, rgba(255, 255, 255, 0.06), transparent), + radial-gradient(1px 1px at 130px 80px, rgba(255, 255, 255, 0.04), transparent), + radial-gradient(1px 1px at 160px 30px, rgba(255, 255, 255, 0.05), transparent); + opacity: 0.3; + } +} \ No newline at end of file diff --git a/frontend/60sapi/热搜榜单/网易云榜单详情/css/style.css b/frontend/60sapi/热搜榜单/网易云榜单详情/css/style.css new file mode 100644 index 00000000..5f93a361 --- /dev/null +++ b/frontend/60sapi/热搜榜单/网易云榜单详情/css/style.css @@ -0,0 +1,483 @@ +/* 基础样式重置 */ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: 'Microsoft YaHei', 'PingFang SC', 'Helvetica Neue', Arial, sans-serif; + line-height: 1.6; + color: #2c3e50; + min-height: 100vh; + overflow-x: hidden; +} + +.container { + max-width: 1200px; + margin: 0 auto; + padding: 20px; + position: relative; + z-index: 1; +} + +/* 头部样式 */ +.header { + text-align: center; + margin-bottom: 40px; + padding: 40px 20px; + background: rgba(255, 255, 255, 0.9); + border-radius: 20px; + backdrop-filter: blur(10px); + box-shadow: 0 8px 32px rgba(76, 175, 80, 0.1); +} + +.title { + font-size: 2.5rem; + font-weight: 700; + background: linear-gradient(135deg, #4CAF50, #81C784); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; + margin-bottom: 10px; + animation: titleGlow 3s ease-in-out infinite alternate; +} + +@keyframes titleGlow { + from { filter: drop-shadow(0 0 5px rgba(76, 175, 80, 0.3)); } + to { filter: drop-shadow(0 0 15px rgba(76, 175, 80, 0.6)); } +} + +.subtitle { + font-size: 1.1rem; + color: #666; + opacity: 0.8; +} + +/* 榜单信息样式 */ +.rank-info { + background: rgba(255, 255, 255, 0.95); + border-radius: 15px; + padding: 25px; + margin-bottom: 30px; + box-shadow: 0 6px 25px rgba(76, 175, 80, 0.1); + border: 1px solid rgba(76, 175, 80, 0.2); +} + +.rank-header { + display: flex; + gap: 20px; + align-items: flex-start; +} + +.rank-cover { + width: 120px; + height: 120px; + border-radius: 12px; + object-fit: cover; + box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2); + flex-shrink: 0; +} + +.rank-details { + flex: 1; +} + +.rank-name { + font-size: 1.8rem; + color: #2c3e50; + margin-bottom: 10px; + font-weight: 600; +} + +.rank-description { + color: #666; + margin-bottom: 15px; + line-height: 1.6; +} + +.rank-meta { + display: flex; + gap: 20px; + flex-wrap: wrap; +} + +.update-time, .update-frequency { + background: linear-gradient(135deg, #E8F5E8, #C8E6C9); + padding: 6px 12px; + border-radius: 20px; + font-size: 0.9rem; + color: #2E7D32; + border: 1px solid rgba(76, 175, 80, 0.3); +} + +/* 控制区域样式 */ +.controls { + background: rgba(255, 255, 255, 0.9); + border-radius: 15px; + padding: 25px; + margin-bottom: 30px; + box-shadow: 0 6px 25px rgba(76, 175, 80, 0.1); +} + +.input-group { + display: flex; + gap: 15px; + align-items: center; + flex-wrap: wrap; +} + +.input-group label { + font-weight: 600; + color: #2c3e50; + min-width: 80px; +} + +#rankId { + flex: 1; + min-width: 200px; + padding: 12px 16px; + border: 2px solid #E0E0E0; + border-radius: 10px; + font-size: 1rem; + transition: all 0.3s ease; + background: rgba(255, 255, 255, 0.9); +} + +#rankId:focus { + outline: none; + border-color: #4CAF50; + box-shadow: 0 0 0 3px rgba(76, 175, 80, 0.1); +} + +.load-btn { + padding: 12px 24px; + background: linear-gradient(135deg, #4CAF50, #66BB6A); + color: white; + border: none; + border-radius: 10px; + font-size: 1rem; + font-weight: 600; + cursor: pointer; + transition: all 0.3s ease; + box-shadow: 0 4px 15px rgba(76, 175, 80, 0.3); +} + +.load-btn:hover { + transform: translateY(-2px); + box-shadow: 0 6px 20px rgba(76, 175, 80, 0.4); +} + +.load-btn:active { + transform: translateY(0); +} + +.load-btn:disabled { + opacity: 0.6; + cursor: not-allowed; + transform: none; +} + +/* 加载动画 */ +.loading { + text-align: center; + padding: 40px; + background: rgba(255, 255, 255, 0.9); + border-radius: 15px; + margin-bottom: 30px; +} + +.spinner { + width: 40px; + height: 40px; + border: 4px solid #E0E0E0; + border-top: 4px solid #4CAF50; + border-radius: 50%; + animation: spin 1s linear infinite; + margin: 0 auto 15px; +} + +@keyframes spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} + +/* 错误提示 */ +.error { + text-align: center; + padding: 30px; + background: rgba(255, 245, 245, 0.95); + border: 2px solid #ffcdd2; + border-radius: 15px; + margin-bottom: 30px; +} + +.error-icon { + font-size: 3rem; + margin-bottom: 15px; +} + +.error-message { + color: #c62828; + margin-bottom: 20px; + font-size: 1.1rem; +} + +.retry-btn { + padding: 10px 20px; + background: #f44336; + color: white; + border: none; + border-radius: 8px; + cursor: pointer; + transition: all 0.3s ease; +} + +.retry-btn:hover { + background: #d32f2f; + transform: translateY(-1px); +} + +/* 歌曲列表样式 */ +.song-list { + background: rgba(255, 255, 255, 0.95); + border-radius: 15px; + padding: 25px; + margin-bottom: 30px; + box-shadow: 0 6px 25px rgba(76, 175, 80, 0.1); +} + +.list-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 25px; + padding-bottom: 15px; + border-bottom: 2px solid #E8F5E8; +} + +.list-header h3 { + font-size: 1.5rem; + color: #2c3e50; + font-weight: 600; +} + +.song-count { + background: linear-gradient(135deg, #4CAF50, #66BB6A); + color: white; + padding: 6px 12px; + border-radius: 20px; + font-size: 0.9rem; + font-weight: 600; +} + +/* 歌曲项样式 */ +.song-item { + display: flex; + align-items: center; + padding: 15px; + margin-bottom: 12px; + background: rgba(248, 255, 248, 0.8); + border-radius: 12px; + transition: all 0.3s ease; + border: 1px solid rgba(76, 175, 80, 0.1); + cursor: pointer; +} + +.song-item:hover { + transform: translateY(-2px); + box-shadow: 0 6px 20px rgba(76, 175, 80, 0.15); + background: rgba(232, 245, 232, 0.9); +} + +.song-rank { + font-size: 1.2rem; + font-weight: 700; + color: #4CAF50; + min-width: 40px; + text-align: center; +} + +.song-rank.top3 { + background: linear-gradient(135deg, #FFD700, #FFA000); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; +} + +.song-info { + flex: 1; + margin-left: 15px; +} + +.song-title { + font-size: 1.1rem; + font-weight: 600; + color: #2c3e50; + margin-bottom: 5px; + display: -webkit-box; + -webkit-line-clamp: 1; + -webkit-box-orient: vertical; + overflow: hidden; +} + +.song-artist { + color: #666; + font-size: 0.9rem; + margin-bottom: 3px; +} + +.song-album { + color: #888; + font-size: 0.85rem; +} + +.song-meta { + display: flex; + flex-direction: column; + align-items: flex-end; + gap: 5px; +} + +.song-duration { + color: #666; + font-size: 0.9rem; +} + +.song-popularity { + background: linear-gradient(135deg, #4CAF50, #66BB6A); + color: white; + padding: 3px 8px; + border-radius: 12px; + font-size: 0.8rem; + font-weight: 600; +} + +/* 返回按钮 */ +.back-to-list { + text-align: center; + margin: 30px 0; +} + +.back-btn { + display: inline-flex; + align-items: center; + gap: 8px; + padding: 12px 24px; + background: linear-gradient(135deg, #81C784, #A5D6A7); + color: white; + text-decoration: none; + border-radius: 10px; + font-weight: 600; + transition: all 0.3s ease; + box-shadow: 0 4px 15px rgba(129, 199, 132, 0.3); +} + +.back-btn:hover { + transform: translateY(-2px); + box-shadow: 0 6px 20px rgba(129, 199, 132, 0.4); +} + +/* 页脚 */ +.footer { + text-align: center; + padding: 30px 20px; + background: rgba(255, 255, 255, 0.9); + border-radius: 15px; + margin-top: 40px; + color: #666; + backdrop-filter: blur(10px); +} + +/* 响应式设计 */ +@media (max-width: 768px) { + .container { + padding: 15px; + } + + .title { + font-size: 2rem; + } + + .rank-header { + flex-direction: column; + text-align: center; + } + + .rank-cover { + width: 100px; + height: 100px; + margin: 0 auto 15px; + } + + .input-group { + flex-direction: column; + align-items: stretch; + } + + .input-group label { + min-width: auto; + margin-bottom: 5px; + } + + #rankId { + min-width: auto; + margin-bottom: 10px; + } + + .song-item { + flex-direction: column; + text-align: center; + gap: 10px; + } + + .song-info { + margin-left: 0; + } + + .song-meta { + align-items: center; + flex-direction: row; + justify-content: center; + } + + .list-header { + flex-direction: column; + gap: 10px; + text-align: center; + } +} + +@media (max-width: 480px) { + .title { + font-size: 1.8rem; + } + + .header { + padding: 30px 15px; + } + + .rank-info, .controls, .song-list { + padding: 20px; + } + + .song-item { + padding: 12px; + } +} + +/* 平板端适配 */ +@media (min-width: 769px) and (max-width: 1024px) { + .container { + padding: 25px; + } + + .song-item { + padding: 18px; + } + + .rank-cover { + width: 110px; + height: 110px; + } +} \ No newline at end of file diff --git a/frontend/60sapi/热搜榜单/网易云榜单详情/index.html b/frontend/60sapi/热搜榜单/网易云榜单详情/index.html new file mode 100644 index 00000000..9215b81c --- /dev/null +++ b/frontend/60sapi/热搜榜单/网易云榜单详情/index.html @@ -0,0 +1,69 @@ + + + + + + 网易云榜单详情 + + + + +
+
+

🎵 网易云榜单详情

+

发现音乐的魅力

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

© 2025 网易云榜单详情 - 数据来源于官方API

+
+ + + + \ No newline at end of file diff --git a/frontend/60sapi/热搜榜单/网易云榜单详情/js/script.js b/frontend/60sapi/热搜榜单/网易云榜单详情/js/script.js new file mode 100644 index 00000000..0ff2eb10 --- /dev/null +++ b/frontend/60sapi/热搜榜单/网易云榜单详情/js/script.js @@ -0,0 +1,349 @@ +// 网易云榜单详情 JavaScript +class NeteaseMusicRankDetail { + constructor() { + this.apiUrls = []; + this.currentApiIndex = 0; + this.rankData = null; + this.init(); + } + + async init() { + try { + await this.loadApiUrls(); + this.bindEvents(); + this.checkUrlParams(); + } catch (error) { + console.error('初始化失败:', error); + this.showError('初始化失败,请刷新页面重试'); + } + } + + // 加载API接口列表 + async loadApiUrls() { + try { + const response = await fetch('./接口集合.json'); + if (!response.ok) { + throw new Error('无法加载API接口配置'); + } + this.apiUrls = await response.json(); + console.log('API接口加载成功:', this.apiUrls); + } catch (error) { + console.error('加载API接口失败:', error); + // 使用默认接口 + this.apiUrls = [ + 'https://60s-cf.viki.moe', + 'https://60s.viki.moe', + 'https://60s.b23.run', + 'https://60s.114128.xyz', + 'https://60s-cf.114128.xyz' + ]; + } + } + + // 绑定事件 + bindEvents() { + const loadBtn = document.getElementById('loadBtn'); + const rankIdInput = document.getElementById('rankId'); + const retryBtn = document.getElementById('retryBtn'); + + loadBtn.addEventListener('click', () => this.loadRankDetail()); + retryBtn.addEventListener('click', () => this.loadRankDetail()); + + // 回车键加载 + rankIdInput.addEventListener('keypress', (e) => { + if (e.key === 'Enter') { + this.loadRankDetail(); + } + }); + + // 输入验证 + rankIdInput.addEventListener('input', (e) => { + const value = e.target.value.trim(); + loadBtn.disabled = !value || !/^\d+$/.test(value); + }); + } + + // 检查URL参数 + checkUrlParams() { + const urlParams = new URLSearchParams(window.location.search); + const rankId = urlParams.get('id'); + const rankName = urlParams.get('name'); + + if (rankId && /^\d+$/.test(rankId)) { + document.getElementById('rankId').value = rankId; + + // 如果有榜单名称,更新页面标题 + if (rankName) { + document.title = `${decodeURIComponent(rankName)} - 网易云榜单详情`; + document.querySelector('.title').textContent = `🎵 ${decodeURIComponent(rankName)}`; + document.querySelector('.subtitle').textContent = '正在加载榜单详情...'; + } + + this.loadRankDetail(); + } + } + + // 加载榜单详情 + async loadRankDetail() { + const rankId = document.getElementById('rankId').value.trim(); + + if (!rankId) { + this.showError('请输入榜单ID'); + return; + } + + if (!/^\d+$/.test(rankId)) { + this.showError('榜单ID必须是数字'); + return; + } + + this.showLoading(); + this.currentApiIndex = 0; + + try { + const data = await this.fetchRankDetail(rankId); + this.displayRankDetail(data); + this.hideLoading(); + + // 更新URL + const newUrl = new URL(window.location); + newUrl.searchParams.set('id', rankId); + window.history.replaceState({}, '', newUrl); + + } catch (error) { + console.error('加载榜单详情失败:', error); + this.hideLoading(); + this.showError(error.message || '加载失败,请检查榜单ID是否正确'); + } + } + + // 获取榜单详情数据 + async fetchRankDetail(rankId) { + let lastError = null; + + for (let i = 0; i < this.apiUrls.length; i++) { + try { + const apiUrl = this.apiUrls[this.currentApiIndex]; + const url = `${apiUrl}/v2/ncm-rank/${rankId}`; + + console.log(`尝试API ${this.currentApiIndex + 1}:`, url); + + const controller = new AbortController(); + const timeoutId = setTimeout(() => controller.abort(), 10000); + + const response = await fetch(url, { + signal: controller.signal, + headers: { + 'Accept': 'application/json', + } + }); + + clearTimeout(timeoutId); + + if (!response.ok) { + throw new Error(`HTTP ${response.status}: ${response.statusText}`); + } + + const data = await response.json(); + + if (data.code !== 200) { + throw new Error(data.message || '获取数据失败'); + } + + console.log('API调用成功:', data); + return data; + + } catch (error) { + console.warn(`API ${this.currentApiIndex + 1} 失败:`, error.message); + lastError = error; + this.currentApiIndex = (this.currentApiIndex + 1) % this.apiUrls.length; + + if (error.name === 'AbortError') { + lastError = new Error('请求超时,请重试'); + } + } + } + + throw lastError || new Error('所有API接口都无法访问'); + } + + // 显示榜单详情 + displayRankDetail(data) { + this.rankData = data; + const songs = data.data || []; + + // 显示榜单信息(如果有的话) + this.displayRankInfo(songs[0]); + + // 显示歌曲列表 + this.displaySongList(songs); + + // 显示相关区域 + document.getElementById('songList').style.display = 'block'; + document.getElementById('error').style.display = 'none'; + } + + // 显示榜单信息 + displayRankInfo(firstSong) { + const rankInfo = document.getElementById('rankInfo'); + + if (firstSong && firstSong.rank_name) { + document.getElementById('rankName').textContent = firstSong.rank_name; + document.getElementById('rankDescription').textContent = `${firstSong.rank_name} - 网易云音乐官方榜单`; + + // 如果有专辑封面,使用第一首歌的专辑封面作为榜单封面 + if (firstSong.album && firstSong.album.cover) { + document.getElementById('rankCover').src = firstSong.album.cover; + document.getElementById('rankCover').alt = firstSong.rank_name; + } + + document.getElementById('updateTime').textContent = `更新时间: ${this.formatDate(new Date())}`; + document.getElementById('updateFrequency').textContent = '实时更新'; + + rankInfo.style.display = 'block'; + } else { + rankInfo.style.display = 'none'; + } + } + + // 显示歌曲列表 + displaySongList(songs) { + const songsContainer = document.getElementById('songs'); + const songCount = document.getElementById('songCount'); + + songCount.textContent = `共 ${songs.length} 首歌曲`; + + songsContainer.innerHTML = ''; + + songs.forEach((song, index) => { + const songElement = this.createSongElement(song, index); + songsContainer.appendChild(songElement); + }); + } + + // 创建歌曲元素 + createSongElement(song) { + const songDiv = document.createElement('div'); + songDiv.className = 'song-item'; + + // 处理艺术家信息 + const artists = Array.isArray(song.artist) ? song.artist : [song.artist].filter(Boolean); + const artistNames = artists.map(artist => + typeof artist === 'object' ? artist.name : artist + ).join(', ') || '未知艺术家'; + + // 处理专辑信息 + const albumName = song.album && song.album.name ? song.album.name : '未知专辑'; + + // 处理时长 + const duration = song.duration_desc || this.formatDuration(song.duration); + + // 处理热度 + const popularity = song.popularity || song.score || 0; + + songDiv.innerHTML = ` +
${song.rank}
+
+
${this.escapeHtml(song.title)}
+
${this.escapeHtml(artistNames)}
+
${this.escapeHtml(albumName)}
+
+
+
${duration}
+
${popularity}%
+
+ `; + + // 添加点击事件 + if (song.link) { + songDiv.style.cursor = 'pointer'; + songDiv.addEventListener('click', () => { + window.open(song.link, '_blank'); + }); + } + + return songDiv; + } + + // 格式化时长 + formatDuration(duration) { + if (!duration) return '--:--'; + + const seconds = Math.floor(duration / 1000); + const minutes = Math.floor(seconds / 60); + const remainingSeconds = seconds % 60; + + return `${minutes}:${remainingSeconds.toString().padStart(2, '0')}`; + } + + // 格式化日期 + formatDate(date) { + return date.toLocaleString('zh-CN', { + year: 'numeric', + month: '2-digit', + day: '2-digit', + hour: '2-digit', + minute: '2-digit' + }); + } + + // HTML转义 + escapeHtml(text) { + const div = document.createElement('div'); + div.textContent = text; + return div.innerHTML; + } + + // 显示加载状态 + showLoading() { + document.getElementById('loading').style.display = 'block'; + document.getElementById('error').style.display = 'none'; + document.getElementById('songList').style.display = 'none'; + document.getElementById('loadBtn').disabled = true; + } + + // 隐藏加载状态 + hideLoading() { + document.getElementById('loading').style.display = 'none'; + document.getElementById('loadBtn').disabled = false; + } + + // 显示错误信息 + showError(message) { + document.getElementById('error').style.display = 'block'; + document.getElementById('errorMessage').textContent = message; + document.getElementById('loading').style.display = 'none'; + document.getElementById('songList').style.display = 'none'; + document.getElementById('loadBtn').disabled = false; + } +} + +// 全局错误处理 +window.addEventListener('error', (event) => { + console.error('全局错误:', event.error); +}); + +window.addEventListener('unhandledrejection', (event) => { + console.error('未处理的Promise拒绝:', event.reason); +}); + +// 页面加载完成后初始化 +document.addEventListener('DOMContentLoaded', () => { + new NeteaseMusicRankDetail(); +}); + +// 添加CSS动画类 +document.addEventListener('DOMContentLoaded', () => { + // 为页面元素添加淡入动画 + const elements = document.querySelectorAll('.container > *'); + elements.forEach((el, index) => { + el.style.opacity = '0'; + el.style.transform = 'translateY(20px)'; + el.style.transition = 'opacity 0.6s ease, transform 0.6s ease'; + + setTimeout(() => { + el.style.opacity = '1'; + el.style.transform = 'translateY(0)'; + }, index * 100); + }); +}); \ No newline at end of file diff --git a/frontend/60sapi/热搜榜单/网易云榜单详情/接口集合.json b/frontend/60sapi/热搜榜单/网易云榜单详情/接口集合.json new file mode 100644 index 00000000..04e92b7f --- /dev/null +++ b/frontend/60sapi/热搜榜单/网易云榜单详情/接口集合.json @@ -0,0 +1,7 @@ +[ + "https://60s-cf.viki.moe", + "https://60s.viki.moe", + "https://60s.b23.run", + "https://60s.114128.xyz", + "https://60s-cf.114128.xyz" +] diff --git a/frontend/60sapi/热搜榜单/网易云榜单详情/返回接口.json b/frontend/60sapi/热搜榜单/网易云榜单详情/返回接口.json new file mode 100644 index 00000000..c5ed47a3 --- /dev/null +++ b/frontend/60sapi/热搜榜单/网易云榜单详情/返回接口.json @@ -0,0 +1,5612 @@ +{ + "code": 200, + "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841", + "data": [ + { + "id": 2040015902, + "rank": 1, + "rank_name": "飙升榜", + "title": "熄灭", + "artist": [ + { + "id": 12324449, + "name": "TC", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=12324449" + } + ], + "album": { + "id": 163848123, + "name": "熄灭", + "cover": "http://p1.music.126.net/sNOy5UAdfk_OYumV4qF-0g==/109951168551205771.jpg", + "published": "2023-07-15", + "published_at": 1689436800000, + "company": "" + }, + "duration": 148611, + "duration_desc": "2:28", + "popularity": 100, + "score": 100, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 29724874, + "size_desc": "29.72 MB", + "bitrate": 1600134, + "extension": "flac" + }, + "hq": { + "size": 5947603, + "size_desc": "5.95 MB", + "bitrate": 320000, + "extension": "mp3" + }, + "mq": { + "size": 3568579, + "size_desc": "3.57 MB", + "bitrate": 192000, + "extension": "mp3" + }, + "lq": { + "size": 2379067, + "size_desc": "2.38 MB", + "bitrate": 128000, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2040015902" + }, + { + "id": 2733008419, + "rank": 2, + "rank_name": "飙升榜", + "title": "LOVE", + "artist": [ + { + "id": 12356808, + "name": "范世錡", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=12356808" + } + ], + "album": { + "id": 280422980, + "name": "LOVE,So...", + "cover": "http://p1.music.126.net/BHdtr1R0-yuXLdoY3kJGUg==/109951171697418256.jpg", + "published": "2025-08-04", + "published_at": 1754323200000, + "company": "天娱传媒" + }, + "duration": 238523, + "duration_desc": "3:58", + "popularity": 100, + "score": 100, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 30885411, + "size_desc": "30.89 MB", + "bitrate": 1035740, + "extension": "flac" + }, + "hq": { + "size": 9543405, + "size_desc": "9.54 MB", + "bitrate": 320000, + "extension": "mp3" + }, + "mq": { + "size": 5726061, + "size_desc": "5.73 MB", + "bitrate": 192000, + "extension": "mp3" + }, + "lq": { + "size": 3817389, + "size_desc": "3.82 MB", + "bitrate": 128000, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2733008419" + }, + { + "id": 2735554018, + "rank": 3, + "rank_name": "飙升榜", + "title": "拍拍灰", + "artist": [ + { + "id": 30000014, + "name": "脏饼干", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=30000014" + } + ], + "album": { + "id": 281295264, + "name": "拍拍灰", + "cover": "http://p1.music.126.net/4riboo3M7VuJj6We6Sc1xw==/109951171845374025.jpg", + "published": "2025-08-14", + "published_at": 1755187200000, + "company": "" + }, + "duration": 184106, + "duration_desc": "3:04", + "popularity": 100, + "score": 100, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 21134984, + "size_desc": "21.13 MB", + "bitrate": 918233, + "extension": "flac" + }, + "hq": { + "size": 7367085, + "size_desc": "7.37 MB", + "bitrate": 320002, + "extension": "mp3" + }, + "mq": { + "size": 4420269, + "size_desc": "4.42 MB", + "bitrate": 192002, + "extension": "mp3" + }, + "lq": { + "size": 2946861, + "size_desc": "2.95 MB", + "bitrate": 128002, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2735554018" + }, + { + "id": 2684422547, + "rank": 4, + "rank_name": "飙升榜", + "title": "Money Loves Me", + "artist": [ + { + "id": 97594003, + "name": "Alchemist Harmony", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=97594003" + } + ], + "album": { + "id": 265812259, + "name": "Money Loves Me", + "cover": "http://p1.music.126.net/nKyjr2f050Dl7CD4NUyKCQ==/109951170609858632.jpg", + "published": "2025-03-09", + "published_at": 1741536000000, + "company": "Alchemist Harmony" + }, + "duration": 174000, + "duration_desc": "2:54", + "popularity": 100, + "score": 100, + "fee": 1, + "status": 0, + "mb": { + "sq": { + "size": 34717430, + "size_desc": "34.72 MB", + "bitrate": 1596056, + "extension": "flac" + }, + "hq": { + "size": 6962199, + "size_desc": "6.96 MB", + "bitrate": 320002, + "extension": "mp3" + }, + "mq": { + "size": 4177337, + "size_desc": "4.18 MB", + "bitrate": 192002, + "extension": "mp3" + }, + "lq": { + "size": 2784906, + "size_desc": "2.78 MB", + "bitrate": 128002, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2684422547" + }, + { + "id": 2677396501, + "rank": 5, + "rank_name": "飙升榜", + "title": "NOT GOOD", + "artist": [ + { + "id": 12563131, + "name": "Rapeter", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=12563131" + } + ], + "album": { + "id": 263242113, + "name": "IMGOOD别担心我", + "cover": "http://p1.music.126.net/QpNRZsfMP5J4tOlziA8Pnw==/109951170504642760.jpg", + "published": "2025-02-21", + "published_at": 1740153600000, + "company": "" + }, + "duration": 190558, + "duration_desc": "3:10", + "popularity": 100, + "score": 100, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 24001098, + "size_desc": "24 MB", + "bitrate": 1007462, + "extension": "flac" + }, + "hq": { + "size": 7624365, + "size_desc": "7.62 MB", + "bitrate": 320000, + "extension": "mp3" + }, + "mq": { + "size": 4574637, + "size_desc": "4.57 MB", + "bitrate": 192000, + "extension": "mp3" + }, + "lq": { + "size": 3049773, + "size_desc": "3.05 MB", + "bitrate": 128000, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2677396501" + }, + { + "id": 405253632, + "rank": 6, + "rank_name": "飙升榜", + "title": "梦回还 (TV size)", + "artist": [ + { + "id": 1215003, + "name": "呦猫UNEKO", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=1215003" + } + ], + "album": { + "id": 34513527, + "name": "梦回还", + "cover": "http://p1.music.126.net/hAfIXJP_ZBRQKd1VE_Hqbg==/16625715324173485.jpg", + "published": "2016-03-05", + "published_at": 1457142849504, + "company": "" + }, + "duration": 72456, + "duration_desc": "1:12", + "popularity": 100, + "score": 100, + "fee": 0, + "status": 0, + "mb": { + "sq": null, + "hq": { + "size": 2902769, + "size_desc": "2.9 MB", + "bitrate": 320000, + "extension": "mp3" + }, + "mq": { + "size": 1741679, + "size_desc": "1.74 MB", + "bitrate": 192000, + "extension": "mp3" + }, + "lq": { + "size": 1161133, + "size_desc": "1.16 MB", + "bitrate": 128000, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=405253632" + }, + { + "id": 1975295694, + "rank": 7, + "rank_name": "飙升榜", + "title": "小哑巴", + "artist": [ + { + "id": 48277407, + "name": "BOBBYNOPEACE", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=48277407" + } + ], + "album": { + "id": 150299202, + "name": "小哑巴", + "cover": "http://p1.music.126.net/IhsEqn9OXuBYt2_Y8pAgCQ==/109951167815351812.jpg", + "published": "2022-08-27", + "published_at": 1661616000000, + "company": "" + }, + "duration": 171176, + "duration_desc": "2:51", + "popularity": 100, + "score": 100, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 17473483, + "size_desc": "17.47 MB", + "bitrate": 816630, + "extension": "flac" + }, + "hq": { + "size": 6849645, + "size_desc": "6.85 MB", + "bitrate": 320000, + "extension": "mp3" + }, + "mq": { + "size": 4109805, + "size_desc": "4.11 MB", + "bitrate": 192000, + "extension": "mp3" + }, + "lq": { + "size": 2739885, + "size_desc": "2.74 MB", + "bitrate": 128000, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=1975295694" + }, + { + "id": 88926, + "rank": 8, + "rank_name": "飙升榜", + "title": "想你的夜", + "artist": [ + { + "id": 2868, + "name": "关喆", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=2868" + } + ], + "album": { + "id": 8668, + "name": "永远的永远", + "cover": "http://p1.music.126.net/zu9MjBERozqTv_0NpM91Rg==/109951164094037727.jpg", + "published": "2009-07-05", + "published_at": 1246809600000, + "company": "爱贝克思" + }, + "duration": 265960, + "duration_desc": "4:25", + "popularity": 100, + "score": 100, + "fee": 1, + "status": 0, + "mb": { + "sq": { + "size": 26941966, + "size_desc": "26.94 MB", + "bitrate": 1411000, + "extension": "flac" + }, + "hq": { + "size": 10641285, + "size_desc": "10.64 MB", + "bitrate": 320000, + "extension": "mp3" + }, + "mq": { + "size": 6384788, + "size_desc": "6.38 MB", + "bitrate": 192000, + "extension": "mp3" + }, + "lq": { + "size": 4256540, + "size_desc": "4.26 MB", + "bitrate": 128000, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=88926" + }, + { + "id": 2118740086, + "rank": 9, + "rank_name": "飙升榜", + "title": "黒のバースデイ", + "artist": [ + { + "id": 56525844, + "name": "Ave Mujica", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=56525844" + } + ], + "album": { + "id": 183578899, + "name": "黒のバースデイ", + "cover": "http://p1.music.126.net/0QwEBXfAZ8RzE41vZPlu7A==/109951170223390839.jpg", + "published": "2023-04-10", + "published_at": 1681142400000, + "company": "ブシロードミュージック" + }, + "duration": 225706, + "duration_desc": "3:45", + "popularity": 100, + "score": 100, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 31389013, + "size_desc": "31.39 MB", + "bitrate": 1112559, + "extension": "flac" + }, + "hq": { + "size": 9030765, + "size_desc": "9.03 MB", + "bitrate": 320000, + "extension": "mp3" + }, + "mq": { + "size": 5418477, + "size_desc": "5.42 MB", + "bitrate": 192000, + "extension": "mp3" + }, + "lq": { + "size": 3612333, + "size_desc": "3.61 MB", + "bitrate": 128000, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2118740086" + }, + { + "id": 2729810172, + "rank": 10, + "rank_name": "飙升榜", + "title": "Montagem Nada Tropic", + "artist": [ + { + "id": 99376836, + "name": "MHM", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=99376836" + } + ], + "album": { + "id": 279515736, + "name": "Montagem Nada Tropic", + "cover": "http://p1.music.126.net/YTA1HZJcLit_QoFfG81puQ==/109951171520378357.jpg", + "published": "2025-07-26", + "published_at": 1753545600000, + "company": "" + }, + "duration": 121997, + "duration_desc": "2:01", + "popularity": 100, + "score": 100, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 12718907, + "size_desc": "12.72 MB", + "bitrate": 833893, + "extension": "flac" + }, + "hq": { + "size": 4882852, + "size_desc": "4.88 MB", + "bitrate": 320003, + "extension": "mp3" + }, + "mq": { + "size": 2929729, + "size_desc": "2.93 MB", + "bitrate": 192003, + "extension": "mp3" + }, + "lq": { + "size": 1953167, + "size_desc": "1.95 MB", + "bitrate": 128003, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2729810172" + }, + { + "id": 2734387620, + "rank": 11, + "rank_name": "飙升榜", + "title": "No title -10 Years Later Edition-", + "artist": [ + { + "id": 13059968, + "name": "Reol", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=13059968" + } + ], + "album": { + "id": 280924754, + "name": "“No title” in NIPPON BUDOKAN", + "cover": "http://p1.music.126.net/1OmrYxGKdMGXH_lql-N3iA==/109951171817417918.jpg", + "published": "2025-08-16", + "published_at": 1755360000000, + "company": "索尼音乐" + }, + "duration": 265264, + "duration_desc": "4:25", + "popularity": 100, + "score": 100, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 58682245, + "size_desc": "58.68 MB", + "bitrate": 1769624, + "extension": "flac" + }, + "hq": { + "size": 10613072, + "size_desc": "10.61 MB", + "bitrate": 320000, + "extension": "mp3" + }, + "mq": { + "size": 6367861, + "size_desc": "6.37 MB", + "bitrate": 192000, + "extension": "mp3" + }, + "lq": { + "size": 4245255, + "size_desc": "4.25 MB", + "bitrate": 128000, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2734387620" + }, + { + "id": 2738501239, + "rank": 12, + "rank_name": "飙升榜", + "title": "七小夕", + "artist": [ + { + "id": 53868079, + "name": "Vvy王泽宇", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=53868079" + } + ], + "album": { + "id": 282255005, + "name": "七小夕", + "cover": "http://p1.music.126.net/EcEdbDFwZS41UcleVx5rAA==/109951171907096312.jpg", + "published": "2025-08-20", + "published_at": 1755705600000, + "company": "" + }, + "duration": 234461, + "duration_desc": "3:54", + "popularity": 100, + "score": 100, + "fee": 0, + "status": 0, + "mb": { + "sq": { + "size": 25150986, + "size_desc": "25.15 MB", + "bitrate": 858023, + "extension": "flac" + }, + "hq": { + "size": 9381138, + "size_desc": "9.38 MB", + "bitrate": 320000, + "extension": "mp3" + }, + "mq": { + "size": 5628700, + "size_desc": "5.63 MB", + "bitrate": 192000, + "extension": "mp3" + }, + "lq": { + "size": 3752481, + "size_desc": "3.75 MB", + "bitrate": 128000, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2738501239" + }, + { + "id": 2622939350, + "rank": 13, + "rank_name": "飙升榜", + "title": "莆田才子", + "artist": [ + { + "id": 35884195, + "name": "翁杰Winjay", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=35884195" + } + ], + "album": { + "id": 247120411, + "name": "莆田才子", + "cover": "http://p1.music.126.net/quYbskDqRirX3-wqgRLk7A==/109951169934912352.jpg", + "published": "2024-09-06", + "published_at": 1725638400000, + "company": "" + }, + "duration": 150205, + "duration_desc": "2:30", + "popularity": 100, + "score": 100, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 17815377, + "size_desc": "17.82 MB", + "bitrate": 948852, + "extension": "flac" + }, + "hq": { + "size": 6010605, + "size_desc": "6.01 MB", + "bitrate": 320000, + "extension": "mp3" + }, + "mq": { + "size": 3606381, + "size_desc": "3.61 MB", + "bitrate": 192000, + "extension": "mp3" + }, + "lq": { + "size": 2404269, + "size_desc": "2.4 MB", + "bitrate": 128000, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2622939350" + }, + { + "id": 2737575141, + "rank": 14, + "rank_name": "飙升榜", + "title": "陪你度过漫长岁月", + "artist": [ + { + "id": 58810912, + "name": "赵小童", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=58810912" + } + ], + "album": { + "id": 282015216, + "name": "漫漫协奏曲", + "cover": "http://p1.music.126.net/a0yqXomXz_85AzybTmxBCA==/109951171910165132.jpg", + "published": "2025-08-21", + "published_at": 1755792000000, + "company": "网易·云上" + }, + "duration": 307472, + "duration_desc": "5:07", + "popularity": 100, + "score": 100, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 32893926, + "size_desc": "32.89 MB", + "bitrate": 855708, + "extension": "flac" + }, + "hq": { + "size": 12301485, + "size_desc": "12.3 MB", + "bitrate": 320000, + "extension": "mp3" + }, + "mq": { + "size": 7380909, + "size_desc": "7.38 MB", + "bitrate": 192000, + "extension": "mp3" + }, + "lq": { + "size": 4920621, + "size_desc": "4.92 MB", + "bitrate": 128000, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2737575141" + }, + { + "id": 2739871903, + "rank": 15, + "rank_name": "飙升榜", + "title": "路", + "artist": [ + { + "id": 62183661, + "name": "DOMMIU李由音", + "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=62183661" + } + ], + "album": { + "id": 282846013, + "name": "路", + "cover": "http://p2.music.126.net/RWMmqPsIpY96teLLGPVKqg==/109951171928997751.jpg", + "published": "2025-08-25", + "published_at": 1756137600000, + "company": "索尼音乐X 深声不息" + }, + "duration": 222890, + "duration_desc": "3:42", + "popularity": 100, + "score": 100, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 27957021, + "size_desc": "27.96 MB", + "bitrate": 1003287, + "extension": "flac" + }, + "hq": { + "size": 8918445, + "size_desc": "8.92 MB", + "bitrate": 320000, + "extension": "mp3" + }, + "mq": { + "size": 5351085, + "size_desc": "5.35 MB", + "bitrate": 192000, + "extension": "mp3" + }, + "lq": { + "size": 3567405, + "size_desc": "3.57 MB", + "bitrate": 128000, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2739871903" + }, + { + "id": 2161222939, + "rank": 16, + "rank_name": "飙升榜", + "title": "沦陷", + "artist": [ + { + "id": 13005262, + "name": "JuggShots", + "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=13005262" + } + ], + "album": { + "id": 197781559, + "name": "沦陷", + "cover": "http://p2.music.126.net/ctib5R--oR68W2IrOk765w==/109951169635716223.jpg", + "published": "2024-05-28", + "published_at": 1716912000000, + "company": "" + }, + "duration": 183770, + "duration_desc": "3:03", + "popularity": 100, + "score": 100, + "fee": 1, + "status": 0, + "mb": { + "sq": { + "size": 22189011, + "size_desc": "22.19 MB", + "bitrate": 965943, + "extension": "flac" + }, + "hq": { + "size": 7353645, + "size_desc": "7.35 MB", + "bitrate": 320000, + "extension": "mp3" + }, + "mq": { + "size": 4412205, + "size_desc": "4.41 MB", + "bitrate": 192000, + "extension": "mp3" + }, + "lq": { + "size": 2941485, + "size_desc": "2.94 MB", + "bitrate": 128000, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2161222939" + }, + { + "id": 26093064, + "rank": 17, + "rank_name": "飙升榜", + "title": "Sacred Play Secret Place", + "artist": [ + { + "id": 12283, + "name": "Matryoshka", + "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=12283" + } + ], + "album": { + "id": 2386118, + "name": "Laideronnette", + "cover": "http://p2.music.126.net/1opYZaMgfAQrKMKfLy1xZA==/109951169789816801.jpg", + "published": "2012-12-11", + "published_at": 1355241600000, + "company": "Virgin Babylon Records" + }, + "duration": 317547, + "duration_desc": "5:17", + "popularity": 100, + "score": 100, + "fee": 1, + "status": 0, + "mb": { + "sq": { + "size": 30171985, + "size_desc": "30.17 MB", + "bitrate": 760124, + "extension": "flac" + }, + "hq": { + "size": 12704958, + "size_desc": "12.7 MB", + "bitrate": 320000, + "extension": "mp3" + }, + "mq": { + "size": 7622992, + "size_desc": "7.62 MB", + "bitrate": 192000, + "extension": "mp3" + }, + "lq": { + "size": 5082009, + "size_desc": "5.08 MB", + "bitrate": 128000, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=26093064" + }, + { + "id": 2081549596, + "rank": 18, + "rank_name": "飙升榜", + "title": "下次见", + "artist": [ + { + "id": 55305505, + "name": "林心念", + "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=55305505" + } + ], + "album": { + "id": 174605542, + "name": "下次见", + "cover": "http://p2.music.126.net/g6STNqcm32HjAm4CpoJcBg==/109951168910388635.jpg", + "published": "2023-09-15", + "published_at": 1694793600000, + "company": "讯飞音乐" + }, + "duration": 159375, + "duration_desc": "2:39", + "popularity": 100, + "score": 100, + "fee": 1, + "status": 0, + "mb": { + "sq": { + "size": 17672725, + "size_desc": "17.67 MB", + "bitrate": 887101, + "extension": "flac" + }, + "hq": { + "size": 6377325, + "size_desc": "6.38 MB", + "bitrate": 320000, + "extension": "mp3" + }, + "mq": { + "size": 3826413, + "size_desc": "3.83 MB", + "bitrate": 192000, + "extension": "mp3" + }, + "lq": { + "size": 2550957, + "size_desc": "2.55 MB", + "bitrate": 128000, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2081549596" + }, + { + "id": 1894316939, + "rank": 19, + "rank_name": "飙升榜", + "title": "最渣男主角", + "artist": [ + { + "id": 12292664, + "name": "Shooter", + "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=12292664" + }, + { + "id": 30003804, + "name": "404 RAPPER", + "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=30003804" + } + ], + "album": { + "id": 136039945, + "name": "最渣男主角", + "cover": "http://p2.music.126.net/9UTbTz8efieRMQvnaoJRwQ==/109951166612306430.jpg", + "published": "2021-11-11", + "published_at": 1636646400000, + "company": "" + }, + "duration": 203664, + "duration_desc": "3:23", + "popularity": 100, + "score": 100, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 20614401, + "size_desc": "20.61 MB", + "bitrate": 809738, + "extension": "flac" + }, + "hq": { + "size": 8149485, + "size_desc": "8.15 MB", + "bitrate": 320000, + "extension": "mp3" + }, + "mq": { + "size": 4889709, + "size_desc": "4.89 MB", + "bitrate": 192000, + "extension": "mp3" + }, + "lq": { + "size": 3259821, + "size_desc": "3.26 MB", + "bitrate": 128000, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=1894316939" + }, + { + "id": 2740938171, + "rank": 20, + "rank_name": "飙升榜", + "title": "须臾Karios(栩渝同人曲)", + "artist": [ + { + "id": 33696439, + "name": "周冠宏", + "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=33696439" + }, + { + "id": 34270051, + "name": "赵春寒Z&Hanl", + "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=34270051" + } + ], + "album": { + "id": 283152840, + "name": "须臾Karios(栩渝同人曲)", + "cover": "http://p2.music.126.net/s28QYI-yCjr2kHRGVsrr2g==/109951171943770807.jpg", + "published": "2025-08-27", + "published_at": 1756310400000, + "company": "" + }, + "duration": 246342, + "duration_desc": "4:06", + "popularity": 100, + "score": 100, + "fee": 0, + "status": 0, + "mb": { + "sq": { + "size": 32856508, + "size_desc": "32.86 MB", + "bitrate": 1066872, + "extension": "flac" + }, + "hq": { + "size": 9856365, + "size_desc": "9.86 MB", + "bitrate": 320000, + "extension": "mp3" + }, + "mq": { + "size": 5913837, + "size_desc": "5.91 MB", + "bitrate": 192000, + "extension": "mp3" + }, + "lq": { + "size": 3942573, + "size_desc": "3.94 MB", + "bitrate": 128000, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2740938171" + }, + { + "id": 2738228860, + "rank": 21, + "rank_name": "飙升榜", + "title": "Dehors (普通话版)", + "artist": [ + { + "id": 338718, + "name": "JORDANN", + "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=338718" + } + ], + "album": { + "id": 282257834, + "name": "Dehors (普通话版)", + "cover": "http://p2.music.126.net/8mNbLer5tKnkgj3Q4JPpWw==/109951171903070287.jpg", + "published": "2025-08-21", + "published_at": 1755792000000, + "company": "JORDANN" + }, + "duration": 198026, + "duration_desc": "3:18", + "popularity": 100, + "score": 100, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 20334981, + "size_desc": "20.33 MB", + "bitrate": 821356, + "extension": "flac" + }, + "hq": { + "size": 7923885, + "size_desc": "7.92 MB", + "bitrate": 320002, + "extension": "mp3" + }, + "mq": { + "size": 4754349, + "size_desc": "4.75 MB", + "bitrate": 192002, + "extension": "mp3" + }, + "lq": { + "size": 3169581, + "size_desc": "3.17 MB", + "bitrate": 128002, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2738228860" + }, + { + "id": 2710416778, + "rank": 22, + "rank_name": "飙升榜", + "title": "Long term", + "artist": [ + { + "id": 94359653, + "name": "AI MUSIC MATRIX", + "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=94359653" + } + ], + "album": { + "id": 273690835, + "name": "Relax R&B 76", + "cover": "http://p2.music.126.net/p8hySF3PjpGyEdExUAocCw==/109951171182041062.jpg", + "published": "2025-05-30", + "published_at": 1748620800000, + "company": "Sound Matrix" + }, + "duration": 189960, + "duration_desc": "3:09", + "popularity": 100, + "score": 100, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 14200860, + "size_desc": "14.2 MB", + "bitrate": 597909, + "extension": "flac" + }, + "hq": { + "size": 7600631, + "size_desc": "7.6 MB", + "bitrate": 320000, + "extension": "mp3" + }, + "mq": { + "size": 4560396, + "size_desc": "4.56 MB", + "bitrate": 192000, + "extension": "mp3" + }, + "lq": { + "size": 3040279, + "size_desc": "3.04 MB", + "bitrate": 128000, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2710416778" + }, + { + "id": 2038203229, + "rank": 23, + "rank_name": "飙升榜", + "title": "FRIDAY9 II", + "artist": [ + { + "id": 28642672, + "name": "kkluv", + "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=28642672" + } + ], + "album": { + "id": 163444153, + "name": "FRIDAY9 II", + "cover": "http://p2.music.126.net/TAz4QuITFBhN4D1xsiq0kg==/109951168538063565.jpg", + "published": "2023-01-17", + "published_at": 1673971200000, + "company": "索尼音乐" + }, + "duration": 166285, + "duration_desc": "2:46", + "popularity": 100, + "score": 100, + "fee": 1, + "status": 0, + "mb": { + "sq": { + "size": 32263929, + "size_desc": "32.26 MB", + "bitrate": 1552216, + "extension": "flac" + }, + "hq": { + "size": 6653954, + "size_desc": "6.65 MB", + "bitrate": 320000, + "extension": "mp3" + }, + "mq": { + "size": 3992390, + "size_desc": "3.99 MB", + "bitrate": 192000, + "extension": "mp3" + }, + "lq": { + "size": 2661608, + "size_desc": "2.66 MB", + "bitrate": 128000, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2038203229" + }, + { + "id": 2740641241, + "rank": 24, + "rank_name": "飙升榜", + "title": "归舟", + "artist": [ + { + "id": 9491, + "name": "谭晶", + "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=9491" + }, + { + "id": 53926051, + "name": "燕云十六声", + "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=53926051" + } + ], + "album": { + "id": 283122508, + "name": "归舟", + "cover": "http://p2.music.126.net/gWQj5VbaDK8kUvJS3uOl2g==/109951171939389473.jpg", + "published": "2025-08-27", + "published_at": 1756310400000, + "company": "" + }, + "duration": 301006, + "duration_desc": "5:01", + "popularity": 100, + "score": 100, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 35503109, + "size_desc": "35.5 MB", + "bitrate": 943436, + "extension": "flac" + }, + "hq": { + "size": 12042285, + "size_desc": "12.04 MB", + "bitrate": 320001, + "extension": "mp3" + }, + "mq": { + "size": 7225389, + "size_desc": "7.23 MB", + "bitrate": 192001, + "extension": "mp3" + }, + "lq": { + "size": 4816941, + "size_desc": "4.82 MB", + "bitrate": 128001, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2740641241" + }, + { + "id": 2604224368, + "rank": 25, + "rank_name": "飙升榜", + "title": "São Paulo", + "artist": [ + { + "id": 30384202, + "name": "Fyex", + "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=30384202" + } + ], + "album": { + "id": 240979251, + "name": "São Paulo", + "cover": "http://p2.music.126.net/aGGl_ANW0kVZzfJMtmLR9Q==/109951169743205693.jpg", + "published": "2024-06-06", + "published_at": 1717689600000, + "company": "Fyex" + }, + "duration": 97850, + "duration_desc": "1:37", + "popularity": 100, + "score": 100, + "fee": 1, + "status": 0, + "mb": { + "sq": { + "size": 9831272, + "size_desc": "9.83 MB", + "bitrate": 803775, + "extension": "flac" + }, + "hq": { + "size": 3916321, + "size_desc": "3.92 MB", + "bitrate": 320000, + "extension": "mp3" + }, + "mq": { + "size": 2349810, + "size_desc": "2.35 MB", + "bitrate": 192000, + "extension": "mp3" + }, + "lq": { + "size": 1566555, + "size_desc": "1.57 MB", + "bitrate": 128000, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2604224368" + }, + { + "id": 2738715964, + "rank": 26, + "rank_name": "飙升榜", + "title": "染春", + "artist": [ + { + "id": 27730224, + "name": "回春丹", + "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=27730224" + } + ], + "album": { + "id": 282452357, + "name": "大把时间璀璨", + "cover": "http://p2.music.126.net/_gJgbfqTgWH2T1vk1Br1ig==/109951171911478103.jpg", + "published": "2025-08-25", + "published_at": 1756137600000, + "company": "池沼版全" + }, + "duration": 206094, + "duration_desc": "3:26", + "popularity": 100, + "score": 100, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 23766803, + "size_desc": "23.77 MB", + "bitrate": 922409, + "extension": "flac" + }, + "hq": { + "size": 8246445, + "size_desc": "8.25 MB", + "bitrate": 320002, + "extension": "mp3" + }, + "mq": { + "size": 4947885, + "size_desc": "4.95 MB", + "bitrate": 192002, + "extension": "mp3" + }, + "lq": { + "size": 3298605, + "size_desc": "3.3 MB", + "bitrate": 128002, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2738715964" + }, + { + "id": 2716412355, + "rank": 27, + "rank_name": "飙升榜", + "title": "Supra", + "artist": [ + { + "id": 52410166, + "name": "泰格西", + "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=52410166" + }, + { + "id": 32438941, + "name": "cLoner23", + "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=32438941" + } + ], + "album": { + "id": 275450408, + "name": "Block Core", + "cover": "http://p2.music.126.net/w6MAd3zX38cPTkB9v9aMZg==/109951171319396818.jpg", + "published": "2025-06-17", + "published_at": 1750176000000, + "company": "" + }, + "duration": 126666, + "duration_desc": "2:06", + "popularity": 100, + "score": 100, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 15475009, + "size_desc": "15.48 MB", + "bitrate": 977219, + "extension": "flac" + }, + "hq": { + "size": 5068845, + "size_desc": "5.07 MB", + "bitrate": 320000, + "extension": "mp3" + }, + "mq": { + "size": 3041325, + "size_desc": "3.04 MB", + "bitrate": 192000, + "extension": "mp3" + }, + "lq": { + "size": 2027565, + "size_desc": "2.03 MB", + "bitrate": 128000, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2716412355" + }, + { + "id": 109196, + "rank": 28, + "rank_name": "飙升榜", + "title": "想太多", + "artist": [ + { + "id": 3689, + "name": "李玖哲", + "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=3689" + } + ], + "album": { + "id": 10826, + "name": "想太多", + "cover": "http://p2.music.126.net/rseQHt6MVwmyLMpY_f5bOQ==/131941395346293.jpg", + "published": "2007-10-11", + "published_at": 1192118400000, + "company": "华纳音乐" + }, + "duration": 216613, + "duration_desc": "3:36", + "popularity": 100, + "score": 100, + "fee": 0, + "status": 0, + "mb": { + "sq": { + "size": 23196782, + "size_desc": "23.2 MB", + "bitrate": 856705, + "extension": "flac" + }, + "hq": { + "size": 8667472, + "size_desc": "8.67 MB", + "bitrate": 320000, + "extension": "mp3" + }, + "mq": { + "size": 5200501, + "size_desc": "5.2 MB", + "bitrate": 192000, + "extension": "mp3" + }, + "lq": { + "size": 3467015, + "size_desc": "3.47 MB", + "bitrate": 128000, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=109196" + }, + { + "id": 167942, + "rank": 29, + "rank_name": "飙升榜", + "title": "王妃", + "artist": [ + { + "id": 5768, + "name": "萧敬腾", + "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=5768" + } + ], + "album": { + "id": 16961, + "name": "王妃", + "cover": "http://p2.music.126.net/Ewy0QAwwv6gXxszRn1KNpQ==/109951168271412207.jpg", + "published": "2009-07-16", + "published_at": 1247760000000, + "company": "华纳音乐" + }, + "duration": 221760, + "duration_desc": "3:41", + "popularity": 100, + "score": 100, + "fee": 1, + "status": 0, + "mb": { + "sq": { + "size": 29095408, + "size_desc": "29.1 MB", + "bitrate": 1049617, + "extension": "flac" + }, + "hq": { + "size": 8873317, + "size_desc": "8.87 MB", + "bitrate": 320000, + "extension": "mp3" + }, + "mq": { + "size": 5324008, + "size_desc": "5.32 MB", + "bitrate": 192000, + "extension": "mp3" + }, + "lq": { + "size": 3549353, + "size_desc": "3.55 MB", + "bitrate": 128000, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=167942" + }, + { + "id": 2738583947, + "rank": 30, + "rank_name": "飙升榜", + "title": "Happy Hare", + "artist": [ + { + "id": 97654074, + "name": "X Chamber", + "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=97654074" + } + ], + "album": { + "id": 282405671, + "name": "Happy Hare", + "cover": "http://p2.music.126.net/ctQm9kmi8CjooxADvLyMQA==/109951171908403517.jpg", + "published": "2025-08-20", + "published_at": 1755705600000, + "company": "" + }, + "duration": 96190, + "duration_desc": "1:36", + "popularity": 100, + "score": 100, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 20048170, + "size_desc": "20.05 MB", + "bitrate": 1667227, + "extension": "flac" + }, + "hq": { + "size": 3850493, + "size_desc": "3.85 MB", + "bitrate": 320000, + "extension": "mp3" + }, + "mq": { + "size": 2310313, + "size_desc": "2.31 MB", + "bitrate": 192000, + "extension": "mp3" + }, + "lq": { + "size": 1540223, + "size_desc": "1.54 MB", + "bitrate": 128000, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2738583947" + }, + { + "id": 2735962127, + "rank": 31, + "rank_name": "飙升榜", + "title": "放大", + "artist": [ + { + "id": 49844742, + "name": "徐子未", + "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=49844742" + } + ], + "album": { + "id": 281446148, + "name": "放大", + "cover": "http://p2.music.126.net/WBbtAlKQBRgItkpbzUXa1w==/109951171856097610.jpg", + "published": "2025-08-15", + "published_at": 1755273600000, + "company": "索尼音乐" + }, + "duration": 205200, + "duration_desc": "3:25", + "popularity": 100, + "score": 100, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 23835315, + "size_desc": "23.84 MB", + "bitrate": 929104, + "extension": "flac" + }, + "hq": { + "size": 8209965, + "size_desc": "8.21 MB", + "bitrate": 320000, + "extension": "mp3" + }, + "mq": { + "size": 4925997, + "size_desc": "4.93 MB", + "bitrate": 192000, + "extension": "mp3" + }, + "lq": { + "size": 3284013, + "size_desc": "3.28 MB", + "bitrate": 128000, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2735962127" + }, + { + "id": 2738719308, + "rank": 32, + "rank_name": "飙升榜", + "title": "骑士", + "artist": [ + { + "id": 27730224, + "name": "回春丹", + "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=27730224" + } + ], + "album": { + "id": 282452357, + "name": "大把时间璀璨", + "cover": "http://p2.music.126.net/_gJgbfqTgWH2T1vk1Br1ig==/109951171911478103.jpg", + "published": "2025-08-25", + "published_at": 1756137600000, + "company": "池沼版全" + }, + "duration": 205376, + "duration_desc": "3:25", + "popularity": 100, + "score": 100, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 24969418, + "size_desc": "24.97 MB", + "bitrate": 972482, + "extension": "flac" + }, + "hq": { + "size": 8217645, + "size_desc": "8.22 MB", + "bitrate": 320000, + "extension": "mp3" + }, + "mq": { + "size": 4930605, + "size_desc": "4.93 MB", + "bitrate": 192000, + "extension": "mp3" + }, + "lq": { + "size": 3287085, + "size_desc": "3.29 MB", + "bitrate": 128000, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2738719308" + }, + { + "id": 2162160807, + "rank": 33, + "rank_name": "飙升榜", + "title": "NEXT!", + "artist": [ + { + "id": 54842340, + "name": "NCTS", + "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=54842340" + } + ], + "album": { + "id": 198075556, + "name": "NEXT!", + "cover": "http://p2.music.126.net/W4C4eI4EAE4dXwtZAeZv8Q==/109951169644186817.jpg", + "published": "2024-06-06", + "published_at": 1717689600000, + "company": "broke" + }, + "duration": 99692, + "duration_desc": "1:39", + "popularity": 100, + "score": 100, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 12133996, + "size_desc": "12.13 MB", + "bitrate": 973715, + "extension": "flac" + }, + "hq": { + "size": 3990509, + "size_desc": "3.99 MB", + "bitrate": 320000, + "extension": "mp3" + }, + "mq": { + "size": 2394323, + "size_desc": "2.39 MB", + "bitrate": 192000, + "extension": "mp3" + }, + "lq": { + "size": 1596230, + "size_desc": "1.6 MB", + "bitrate": 128000, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2162160807" + }, + { + "id": 2099778087, + "rank": 34, + "rank_name": "飙升榜", + "title": "发迹", + "artist": [ + { + "id": 49141872, + "name": "Top Barry", + "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=49141872" + } + ], + "album": { + "id": 179034955, + "name": "发迹", + "cover": "http://p2.music.126.net/WKf8wp_58LjK2I2EA1gKjQ==/109951169055625483.jpg", + "published": "2023-11-14", + "published_at": 1699977600000, + "company": "" + }, + "duration": 162304, + "duration_desc": "2:42", + "popularity": 100, + "score": 100, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 16266288, + "size_desc": "16.27 MB", + "bitrate": 801764, + "extension": "flac" + }, + "hq": { + "size": 6494445, + "size_desc": "6.49 MB", + "bitrate": 320000, + "extension": "mp3" + }, + "mq": { + "size": 3896685, + "size_desc": "3.9 MB", + "bitrate": 192000, + "extension": "mp3" + }, + "lq": { + "size": 2597805, + "size_desc": "2.6 MB", + "bitrate": 128000, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2099778087" + }, + { + "id": 2738719309, + "rank": 35, + "rank_name": "飙升榜", + "title": "梦蝶", + "artist": [ + { + "id": 27730224, + "name": "回春丹", + "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=27730224" + } + ], + "album": { + "id": 282452357, + "name": "大把时间璀璨", + "cover": "http://p2.music.126.net/_gJgbfqTgWH2T1vk1Br1ig==/109951171911478103.jpg", + "published": "2025-08-25", + "published_at": 1756137600000, + "company": "池沼版全" + }, + "duration": 239939, + "duration_desc": "3:59", + "popularity": 100, + "score": 100, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 32723142, + "size_desc": "32.72 MB", + "bitrate": 1090898, + "extension": "flac" + }, + "hq": { + "size": 9600045, + "size_desc": "9.6 MB", + "bitrate": 320000, + "extension": "mp3" + }, + "mq": { + "size": 5760045, + "size_desc": "5.76 MB", + "bitrate": 192000, + "extension": "mp3" + }, + "lq": { + "size": 3840045, + "size_desc": "3.84 MB", + "bitrate": 128000, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2738719309" + }, + { + "id": 2740511420, + "rank": 36, + "rank_name": "飙升榜", + "title": "WANTCHU (94bpm)", + "artist": [ + { + "id": 12544511, + "name": "keshi", + "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=12544511" + } + ], + "album": { + "id": 283084927, + "name": "WANTCHU (94bpm)", + "cover": "http://p2.music.126.net/6EQM-q53CjlapnKMTOSyKQ==/109951171937786942.jpg", + "published": "2025-08-26", + "published_at": 1756224000000, + "company": "Island Records" + }, + "duration": 254873, + "duration_desc": "4:14", + "popularity": 100, + "score": 100, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 29015872, + "size_desc": "29.02 MB", + "bitrate": 910607, + "extension": "flac" + }, + "hq": { + "size": 10197203, + "size_desc": "10.2 MB", + "bitrate": 320000, + "extension": "mp3" + }, + "mq": { + "size": 6118339, + "size_desc": "6.12 MB", + "bitrate": 192000, + "extension": "mp3" + }, + "lq": { + "size": 4078907, + "size_desc": "4.08 MB", + "bitrate": 128000, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2740511420" + }, + { + "id": 2729743751, + "rank": 37, + "rank_name": "飙升榜", + "title": "Dreamin", + "artist": [ + { + "id": 51253492, + "name": "穆祉丞", + "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=51253492" + } + ], + "album": { + "id": 279543769, + "name": "Dreamin", + "cover": "http://p2.music.126.net/X0NUwa8wMffZGXoPZtNpsA==/109951171517669783.jpg", + "published": "2025-07-27", + "published_at": 1753632000000, + "company": "北京时代峰峻文化艺术发展有限公司" + }, + "duration": 136944, + "duration_desc": "2:16", + "popularity": 95, + "score": 95, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 19166561, + "size_desc": "19.17 MB", + "bitrate": 1119520, + "extension": "flac" + }, + "hq": { + "size": 5480685, + "size_desc": "5.48 MB", + "bitrate": 320000, + "extension": "mp3" + }, + "mq": { + "size": 3288429, + "size_desc": "3.29 MB", + "bitrate": 192000, + "extension": "mp3" + }, + "lq": { + "size": 2192301, + "size_desc": "2.19 MB", + "bitrate": 128000, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2729743751" + }, + { + "id": 2729689943, + "rank": 38, + "rank_name": "飙升榜", + "title": "为时已晚(越大越觉孤单)", + "artist": [ + { + "id": 58568204, + "name": "管小天", + "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=58568204" + } + ], + "album": { + "id": 279534034, + "name": "为时已晚", + "cover": "http://p2.music.126.net/xSs5l9BWlKJGqXdH3SW_oA==/109951171516866306.jpg", + "published": "2025-07-24", + "published_at": 1753372800000, + "company": "看见音乐" + }, + "duration": 204218, + "duration_desc": "3:24", + "popularity": 100, + "score": 100, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 18189938, + "size_desc": "18.19 MB", + "bitrate": 712421, + "extension": "flac" + }, + "hq": { + "size": 8171146, + "size_desc": "8.17 MB", + "bitrate": 320000, + "extension": "mp3" + }, + "mq": { + "size": 4902705, + "size_desc": "4.9 MB", + "bitrate": 192000, + "extension": "mp3" + }, + "lq": { + "size": 3268484, + "size_desc": "3.27 MB", + "bitrate": 128000, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2729689943" + }, + { + "id": 2736196294, + "rank": 39, + "rank_name": "飙升榜", + "title": "你啊你,我的心", + "artist": [ + { + "id": 37092139, + "name": "babychair", + "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=37092139" + }, + { + "id": 12789956, + "name": "陈婧霏", + "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=12789956" + } + ], + "album": { + "id": 281535136, + "name": "你啊你,我的心", + "cover": "http://p2.music.126.net/zWRB5KYDrulefgh_FVzIfw==/109951171865682128.jpg", + "published": "2025-08-18", + "published_at": 1755532800000, + "company": "网易云音乐|网易音乐人 x 中国数字音乐基地" + }, + "duration": 199621, + "duration_desc": "3:19", + "popularity": 100, + "score": 100, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 17022552, + "size_desc": "17.02 MB", + "bitrate": 682047, + "extension": "flac" + }, + "hq": { + "size": 7987245, + "size_desc": "7.99 MB", + "bitrate": 320000, + "extension": "mp3" + }, + "mq": { + "size": 4792365, + "size_desc": "4.79 MB", + "bitrate": 192000, + "extension": "mp3" + }, + "lq": { + "size": 3194925, + "size_desc": "3.19 MB", + "bitrate": 128000, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2736196294" + }, + { + "id": 27955654, + "rank": 40, + "rank_name": "飙升榜", + "title": "其实", + "artist": [ + { + "id": 5781, + "name": "薛之谦", + "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=5781" + } + ], + "album": { + "id": 2681139, + "name": "意外", + "cover": "http://p2.music.126.net/ywVjRpbu9KpcBQh9KJz2HA==/109951164499974026.jpg", + "published": "2013-11-10", + "published_at": 1384099200000, + "company": "潮石音乐" + }, + "duration": 242146, + "duration_desc": "4:02", + "popularity": 100, + "score": 100, + "fee": 1, + "status": 0, + "mb": { + "sq": { + "size": 23339701, + "size_desc": "23.34 MB", + "bitrate": 771093, + "extension": "flac" + }, + "hq": { + "size": 9688338, + "size_desc": "9.69 MB", + "bitrate": 320002, + "extension": "mp3" + }, + "mq": { + "size": 5813020, + "size_desc": "5.81 MB", + "bitrate": 192002, + "extension": "mp3" + }, + "lq": { + "size": 3875361, + "size_desc": "3.88 MB", + "bitrate": 128001, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=27955654" + }, + { + "id": 2738459901, + "rank": 41, + "rank_name": "飙升榜", + "title": "空心人札记", + "artist": [ + { + "id": 98856697, + "name": "Calia-林焰", + "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=98856697" + }, + { + "id": 12046092, + "name": "星尘", + "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=12046092" + } + ], + "album": { + "id": 282297325, + "name": "空心人札记", + "cover": "http://p2.music.126.net/7pZP5egJfBxAnJ1xZNdhXg==/109951171906929489.jpg", + "published": "2025-08-19", + "published_at": 1755619200000, + "company": "" + }, + "duration": 178909, + "duration_desc": "2:58", + "popularity": 100, + "score": 100, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 22224636, + "size_desc": "22.22 MB", + "bitrate": 993636, + "extension": "flac" + }, + "hq": { + "size": 7158765, + "size_desc": "7.16 MB", + "bitrate": 320000, + "extension": "mp3" + }, + "mq": { + "size": 4295277, + "size_desc": "4.3 MB", + "bitrate": 192000, + "extension": "mp3" + }, + "lq": { + "size": 2863533, + "size_desc": "2.86 MB", + "bitrate": 128000, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2738459901" + }, + { + "id": 2721839629, + "rank": 42, + "rank_name": "飙升榜", + "title": "Velvet Horizon/天鹅绒地平线", + "artist": [ + { + "id": 97183508, + "name": "朱砂未央", + "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=97183508" + } + ], + "album": { + "id": 275635771, + "name": "Eternal Echoes", + "cover": "http://p2.music.126.net/RxQ2ueBidRYZBCtQTXJdLw==/109951171331877000.jpg", + "published": "2025-06-18", + "published_at": 1750262400000, + "company": "" + }, + "duration": 203149, + "duration_desc": "3:23", + "popularity": 95, + "score": 95, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 20906818, + "size_desc": "20.91 MB", + "bitrate": 823160, + "extension": "flac" + }, + "hq": { + "size": 8128365, + "size_desc": "8.13 MB", + "bitrate": 320002, + "extension": "mp3" + }, + "mq": { + "size": 4877037, + "size_desc": "4.88 MB", + "bitrate": 192002, + "extension": "mp3" + }, + "lq": { + "size": 3251373, + "size_desc": "3.25 MB", + "bitrate": 128002, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2721839629" + }, + { + "id": 63574, + "rank": 43, + "rank_name": "飙升榜", + "title": "背叛", + "artist": [ + { + "id": 2110, + "name": "曹格", + "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=2110" + } + ], + "album": { + "id": 6295, + "name": "Superman", + "cover": "http://p2.music.126.net/eDinSMXNYMZHP9nAZ_sQkw==/48378511634444.jpg", + "published": "2006-12-26", + "published_at": 1167148800000, + "company": "滚石唱片" + }, + "duration": 321629, + "duration_desc": "5:21", + "popularity": 100, + "score": 100, + "fee": 1, + "status": 0, + "mb": { + "sq": { + "size": 34294620, + "size_desc": "34.29 MB", + "bitrate": 853022, + "extension": "flac" + }, + "hq": { + "size": 12867962, + "size_desc": "12.87 MB", + "bitrate": 320000, + "extension": "mp3" + }, + "mq": { + "size": 7720795, + "size_desc": "7.72 MB", + "bitrate": 192000, + "extension": "mp3" + }, + "lq": { + "size": 5147211, + "size_desc": "5.15 MB", + "bitrate": 128000, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=63574" + }, + { + "id": 2738719310, + "rank": 44, + "rank_name": "飙升榜", + "title": "福寿螺", + "artist": [ + { + "id": 27730224, + "name": "回春丹", + "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=27730224" + } + ], + "album": { + "id": 282452357, + "name": "大把时间璀璨", + "cover": "http://p2.music.126.net/_gJgbfqTgWH2T1vk1Br1ig==/109951171911478103.jpg", + "published": "2025-08-25", + "published_at": 1756137600000, + "company": "池沼版全" + }, + "duration": 171106, + "duration_desc": "2:51", + "popularity": 100, + "score": 100, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 22295052, + "size_desc": "22.3 MB", + "bitrate": 1042244, + "extension": "flac" + }, + "hq": { + "size": 6846765, + "size_desc": "6.85 MB", + "bitrate": 320002, + "extension": "mp3" + }, + "mq": { + "size": 4108077, + "size_desc": "4.11 MB", + "bitrate": 192002, + "extension": "mp3" + }, + "lq": { + "size": 2738733, + "size_desc": "2.74 MB", + "bitrate": 128002, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2738719310" + }, + { + "id": 2730270719, + "rank": 45, + "rank_name": "飙升榜", + "title": "Hollow", + "artist": [ + { + "id": 1132066, + "name": "Fayzz", + "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=1132066" + } + ], + "album": { + "id": 279675457, + "name": "Patch", + "cover": "http://p2.music.126.net/AmLRTNKjHJwOo11jlQX0lw==/109951171525802692.jpg", + "published": "2025-08-04", + "published_at": 1754323200000, + "company": "HIFIVE" + }, + "duration": 360000, + "duration_desc": "6:00", + "popularity": 90, + "score": 90, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 44161333, + "size_desc": "44.16 MB", + "bitrate": 981217, + "extension": "flac" + }, + "hq": { + "size": 14401965, + "size_desc": "14.4 MB", + "bitrate": 320001, + "extension": "mp3" + }, + "mq": { + "size": 8641197, + "size_desc": "8.64 MB", + "bitrate": 192001, + "extension": "mp3" + }, + "lq": { + "size": 5760813, + "size_desc": "5.76 MB", + "bitrate": 128001, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2730270719" + }, + { + "id": 2738719307, + "rank": 46, + "rank_name": "飙升榜", + "title": "降临", + "artist": [ + { + "id": 27730224, + "name": "回春丹", + "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=27730224" + } + ], + "album": { + "id": 282452357, + "name": "大把时间璀璨", + "cover": "http://p2.music.126.net/_gJgbfqTgWH2T1vk1Br1ig==/109951171911478103.jpg", + "published": "2025-08-25", + "published_at": 1756137600000, + "company": "池沼版全" + }, + "duration": 330139, + "duration_desc": "5:30", + "popularity": 100, + "score": 100, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 41595472, + "size_desc": "41.6 MB", + "bitrate": 1007803, + "extension": "flac" + }, + "hq": { + "size": 13207725, + "size_desc": "13.21 MB", + "bitrate": 320001, + "extension": "mp3" + }, + "mq": { + "size": 7924653, + "size_desc": "7.92 MB", + "bitrate": 192001, + "extension": "mp3" + }, + "lq": { + "size": 5283117, + "size_desc": "5.28 MB", + "bitrate": 128001, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2738719307" + }, + { + "id": 2730270717, + "rank": 47, + "rank_name": "飙升榜", + "title": "隐藏(Hide)", + "artist": [ + { + "id": 1132066, + "name": "Fayzz", + "cover": "http://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=1132066" + } + ], + "album": { + "id": 279675457, + "name": "Patch", + "cover": "http://p1.music.126.net/AmLRTNKjHJwOo11jlQX0lw==/109951171525802692.jpg", + "published": "2025-08-04", + "published_at": 1754323200000, + "company": "HIFIVE" + }, + "duration": 306000, + "duration_desc": "5:06", + "popularity": 90, + "score": 90, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 31438598, + "size_desc": "31.44 MB", + "bitrate": 821778, + "extension": "flac" + }, + "hq": { + "size": 12241965, + "size_desc": "12.24 MB", + "bitrate": 320001, + "extension": "mp3" + }, + "mq": { + "size": 7345197, + "size_desc": "7.35 MB", + "bitrate": 192001, + "extension": "mp3" + }, + "lq": { + "size": 4896813, + "size_desc": "4.9 MB", + "bitrate": 128001, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2730270717" + }, + { + "id": 413812470, + "rank": 48, + "rank_name": "飙升榜", + "title": "One More Time", + "artist": [ + { + "id": 29959, + "name": "Craig David", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=29959" + } + ], + "album": { + "id": 34701579, + "name": "One More Time", + "cover": "http://p1.music.126.net/yGOnOKbJYXd7O_h0Ns_W_w==/1390882218000288.jpg", + "published": "2016-05-19", + "published_at": 1463673600007, + "company": "索尼音乐" + }, + "duration": 194520, + "duration_desc": "3:14", + "popularity": 100, + "score": 100, + "fee": 1, + "status": 0, + "mb": { + "sq": { + "size": 40301209, + "size_desc": "40.3 MB", + "bitrate": 1657462, + "extension": "flac" + }, + "hq": { + "size": 7783489, + "size_desc": "7.78 MB", + "bitrate": 320000, + "extension": "mp3" + }, + "mq": { + "size": 4670111, + "size_desc": "4.67 MB", + "bitrate": 192000, + "extension": "mp3" + }, + "lq": { + "size": 3113422, + "size_desc": "3.11 MB", + "bitrate": 128000, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=413812470" + }, + { + "id": 2740182817, + "rank": 49, + "rank_name": "飙升榜", + "title": "暗码", + "artist": [ + { + "id": 12236269, + "name": "高天佐", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=12236269" + }, + { + "id": 12085066, + "name": "ZIV", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=12085066" + } + ], + "album": { + "id": 282953625, + "name": "暗码", + "cover": "http://p1.music.126.net/zUqNfcfmNePSEazkOt9KXg==/109951171933460415.jpg", + "published": "2025-08-27", + "published_at": 1756310400000, + "company": "" + }, + "duration": 186838, + "duration_desc": "3:06", + "popularity": 95, + "score": 95, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 22486402, + "size_desc": "22.49 MB", + "bitrate": 962670, + "extension": "flac" + }, + "hq": { + "size": 7475565, + "size_desc": "7.48 MB", + "bitrate": 320000, + "extension": "mp3" + }, + "mq": { + "size": 4485357, + "size_desc": "4.49 MB", + "bitrate": 192000, + "extension": "mp3" + }, + "lq": { + "size": 2990253, + "size_desc": "2.99 MB", + "bitrate": 128000, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2740182817" + }, + { + "id": 2735983727, + "rank": 50, + "rank_name": "飙升榜", + "title": "光影戒断反应.wav", + "artist": [ + { + "id": 99613013, + "name": "云落", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=99613013" + } + ], + "album": { + "id": 281406500, + "name": "光影戒断反应", + "cover": "http://p1.music.126.net/BZYzH0ODE-ypCtJvC6_x7w==/109951171857042141.jpg", + "published": "2025-08-12", + "published_at": 1755014400000, + "company": "" + }, + "duration": 275439, + "duration_desc": "4:35", + "popularity": 95, + "score": 95, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 31477192, + "size_desc": "31.48 MB", + "bitrate": 914091, + "extension": "flac" + }, + "hq": { + "size": 11019885, + "size_desc": "11.02 MB", + "bitrate": 320000, + "extension": "mp3" + }, + "mq": { + "size": 6611949, + "size_desc": "6.61 MB", + "bitrate": 192000, + "extension": "mp3" + }, + "lq": { + "size": 4407981, + "size_desc": "4.41 MB", + "bitrate": 128000, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2735983727" + }, + { + "id": 2738715963, + "rank": 51, + "rank_name": "飙升榜", + "title": "宝藏", + "artist": [ + { + "id": 27730224, + "name": "回春丹", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=27730224" + } + ], + "album": { + "id": 282452357, + "name": "大把时间璀璨", + "cover": "http://p1.music.126.net/_gJgbfqTgWH2T1vk1Br1ig==/109951171911478103.jpg", + "published": "2025-08-25", + "published_at": 1756137600000, + "company": "池沼版全" + }, + "duration": 174001, + "duration_desc": "2:54", + "popularity": 95, + "score": 95, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 23432952, + "size_desc": "23.43 MB", + "bitrate": 1077220, + "extension": "flac" + }, + "hq": { + "size": 6962925, + "size_desc": "6.96 MB", + "bitrate": 320002, + "extension": "mp3" + }, + "mq": { + "size": 4177773, + "size_desc": "4.18 MB", + "bitrate": 192002, + "extension": "mp3" + }, + "lq": { + "size": 2785197, + "size_desc": "2.79 MB", + "bitrate": 128002, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2738715963" + }, + { + "id": 2730600192, + "rank": 52, + "rank_name": "飙升榜", + "title": "Out of my system", + "artist": [ + { + "id": 95288932, + "name": "Nia Nkuna", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=95288932" + } + ], + "album": { + "id": 279776498, + "name": "Mixed signals", + "cover": "http://p1.music.126.net/ulsDcoiZogmbQ96YccOp3g==/109951171529990940.jpg", + "published": "2025-08-06", + "published_at": 1754496000000, + "company": "7296470 Records DK2" + }, + "duration": 211039, + "duration_desc": "3:31", + "popularity": 100, + "score": 100, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 26480510, + "size_desc": "26.48 MB", + "bitrate": 1003662, + "extension": "flac" + }, + "hq": { + "size": 8444205, + "size_desc": "8.44 MB", + "bitrate": 320002, + "extension": "mp3" + }, + "mq": { + "size": 5066541, + "size_desc": "5.07 MB", + "bitrate": 192002, + "extension": "mp3" + }, + "lq": { + "size": 3377709, + "size_desc": "3.38 MB", + "bitrate": 128002, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2730600192" + }, + { + "id": 2739853860, + "rank": 53, + "rank_name": "飙升榜", + "title": "幻想彼岸", + "artist": [ + { + "id": 95441940, + "name": "Tekoo", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=95441940" + }, + { + "id": 29303235, + "name": "PSY.P", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=29303235" + } + ], + "album": { + "id": 282839523, + "name": "幻想彼岸", + "cover": "http://p1.music.126.net/Gi4zmlg7bemQ7_TG5QLI0w==/109951171928760549.jpg", + "published": "2025-08-25", + "published_at": 1756137600000, + "company": "" + }, + "duration": 154532, + "duration_desc": "2:34", + "popularity": 100, + "score": 100, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 15954957, + "size_desc": "15.95 MB", + "bitrate": 825824, + "extension": "flac" + }, + "hq": { + "size": 6183405, + "size_desc": "6.18 MB", + "bitrate": 320000, + "extension": "mp3" + }, + "mq": { + "size": 3710061, + "size_desc": "3.71 MB", + "bitrate": 192000, + "extension": "mp3" + }, + "lq": { + "size": 2473389, + "size_desc": "2.47 MB", + "bitrate": 128000, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2739853860" + }, + { + "id": 2715139032, + "rank": 54, + "rank_name": "飙升榜", + "title": "Got It Now (Phonk)", + "artist": [ + { + "id": 52436538, + "name": "YaKio", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=52436538" + }, + { + "id": 96953508, + "name": "Wehti", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=96953508" + }, + { + "id": 48853047, + "name": "VZEUS", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=48853047" + }, + { + "id": 48855131, + "name": "离离离", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=48855131" + } + ], + "album": { + "id": 275048395, + "name": "Got It Now (Phonk)", + "cover": "http://p1.music.126.net/zmottkLtPAA6_xz4ywWXhA==/109951171301374976.jpg", + "published": "2025-06-12", + "published_at": 1749744000000, + "company": "" + }, + "duration": 113170, + "duration_desc": "1:53", + "popularity": 95, + "score": 95, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 13958890, + "size_desc": "13.96 MB", + "bitrate": 986598, + "extension": "flac" + }, + "hq": { + "size": 4529676, + "size_desc": "4.53 MB", + "bitrate": 320000, + "extension": "mp3" + }, + "mq": { + "size": 2717823, + "size_desc": "2.72 MB", + "bitrate": 192000, + "extension": "mp3" + }, + "lq": { + "size": 1811897, + "size_desc": "1.81 MB", + "bitrate": 128000, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2715139032" + }, + { + "id": 2730268845, + "rank": 55, + "rank_name": "飙升榜", + "title": "Intro", + "artist": [ + { + "id": 1132066, + "name": "Fayzz", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=1132066" + } + ], + "album": { + "id": 279675457, + "name": "Patch", + "cover": "http://p1.music.126.net/AmLRTNKjHJwOo11jlQX0lw==/109951171525802692.jpg", + "published": "2025-08-04", + "published_at": 1754323200000, + "company": "HIFIVE" + }, + "duration": 122000, + "duration_desc": "2:02", + "popularity": 90, + "score": 90, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 11610545, + "size_desc": "11.61 MB", + "bitrate": 761197, + "extension": "flac" + }, + "hq": { + "size": 4882605, + "size_desc": "4.88 MB", + "bitrate": 320003, + "extension": "mp3" + }, + "mq": { + "size": 2929581, + "size_desc": "2.93 MB", + "bitrate": 192003, + "extension": "mp3" + }, + "lq": { + "size": 1953069, + "size_desc": "1.95 MB", + "bitrate": 128003, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2730268845" + }, + { + "id": 2730268846, + "rank": 56, + "rank_name": "飙升榜", + "title": "Forlorn Hope", + "artist": [ + { + "id": 1132066, + "name": "Fayzz", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=1132066" + } + ], + "album": { + "id": 279675457, + "name": "Patch", + "cover": "http://p1.music.126.net/AmLRTNKjHJwOo11jlQX0lw==/109951171525802692.jpg", + "published": "2025-08-04", + "published_at": 1754323200000, + "company": "HIFIVE" + }, + "duration": 371000, + "duration_desc": "6:11", + "popularity": 90, + "score": 90, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 47693449, + "size_desc": "47.69 MB", + "bitrate": 1028284, + "extension": "flac" + }, + "hq": { + "size": 14842605, + "size_desc": "14.84 MB", + "bitrate": 320001, + "extension": "mp3" + }, + "mq": { + "size": 8905581, + "size_desc": "8.91 MB", + "bitrate": 192001, + "extension": "mp3" + }, + "lq": { + "size": 5937069, + "size_desc": "5.94 MB", + "bitrate": 128001, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2730268846" + }, + { + "id": 2739834858, + "rank": 57, + "rank_name": "飙升榜", + "title": "调色板", + "artist": [ + { + "id": 37334229, + "name": "Sasuke", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=37334229" + } + ], + "album": { + "id": 282832994, + "name": "调色板", + "cover": "http://p1.music.126.net/F2fIIywgZ-U8-jGQnlWj-A==/109951171928465892.jpg", + "published": "2025-08-25", + "published_at": 1756137600000, + "company": "" + }, + "duration": 176206, + "duration_desc": "2:56", + "popularity": 95, + "score": 95, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 21253895, + "size_desc": "21.25 MB", + "bitrate": 964805, + "extension": "flac" + }, + "hq": { + "size": 7050285, + "size_desc": "7.05 MB", + "bitrate": 320000, + "extension": "mp3" + }, + "mq": { + "size": 4230189, + "size_desc": "4.23 MB", + "bitrate": 192000, + "extension": "mp3" + }, + "lq": { + "size": 2820141, + "size_desc": "2.82 MB", + "bitrate": 128000, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2739834858" + }, + { + "id": 2605650585, + "rank": 58, + "rank_name": "飙升榜", + "title": "Baigasai 想要有你在", + "artist": [ + { + "id": 31001926, + "name": "Bohbat", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=31001926" + }, + { + "id": 94228106, + "name": "Suie", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=94228106" + }, + { + "id": 34279887, + "name": "布和都古仁", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=34279887" + } + ], + "album": { + "id": 241400517, + "name": "Baigasai(想要有你在)", + "cover": "http://p1.music.126.net/zA3k1aD3PRCDnmSI9zDqsw==/109951169757659301.jpg", + "published": "2024-07-06", + "published_at": 1720281600000, + "company": "" + }, + "duration": 170623, + "duration_desc": "2:50", + "popularity": 95, + "score": 95, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 17200040, + "size_desc": "17.2 MB", + "bitrate": 806455, + "extension": "flac" + }, + "hq": { + "size": 6827565, + "size_desc": "6.83 MB", + "bitrate": 320000, + "extension": "mp3" + }, + "mq": { + "size": 4096557, + "size_desc": "4.1 MB", + "bitrate": 192000, + "extension": "mp3" + }, + "lq": { + "size": 2731053, + "size_desc": "2.73 MB", + "bitrate": 128000, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2605650585" + }, + { + "id": 2730270720, + "rank": 59, + "rank_name": "飙升榜", + "title": "季风(Monsoon)", + "artist": [ + { + "id": 1132066, + "name": "Fayzz", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=1132066" + } + ], + "album": { + "id": 279675457, + "name": "Patch", + "cover": "http://p1.music.126.net/AmLRTNKjHJwOo11jlQX0lw==/109951171525802692.jpg", + "published": "2025-08-04", + "published_at": 1754323200000, + "company": "HIFIVE" + }, + "duration": 279500, + "duration_desc": "4:39", + "popularity": 90, + "score": 90, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 34576225, + "size_desc": "34.58 MB", + "bitrate": 989513, + "extension": "flac" + }, + "hq": { + "size": 11182125, + "size_desc": "11.18 MB", + "bitrate": 320000, + "extension": "mp3" + }, + "mq": { + "size": 6709293, + "size_desc": "6.71 MB", + "bitrate": 192000, + "extension": "mp3" + }, + "lq": { + "size": 4472877, + "size_desc": "4.47 MB", + "bitrate": 128000, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2730270720" + }, + { + "id": 167655, + "rank": 60, + "rank_name": "飙升榜", + "title": "幻听", + "artist": [ + { + "id": 5771, + "name": "许嵩", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=5771" + } + ], + "album": { + "id": 16932, + "name": "梦游计", + "cover": "http://p1.music.126.net/IYgyEjL7w4xwPfyNDw8OzA==/109951169525619688.jpg", + "published": "2012-07-10", + "published_at": 1341936000000, + "company": "海蝶" + }, + "duration": 273266, + "duration_desc": "4:33", + "popularity": 100, + "score": 100, + "fee": 1, + "status": 0, + "mb": { + "sq": { + "size": 26751365, + "size_desc": "26.75 MB", + "bitrate": 783157, + "extension": "flac" + }, + "hq": { + "size": 10932811, + "size_desc": "10.93 MB", + "bitrate": 320000, + "extension": "mp3" + }, + "mq": { + "size": 6559704, + "size_desc": "6.56 MB", + "bitrate": 192000, + "extension": "mp3" + }, + "lq": { + "size": 4373151, + "size_desc": "4.37 MB", + "bitrate": 128000, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=167655" + }, + { + "id": 642723, + "rank": 61, + "rank_name": "飙升榜", + "title": "17", + "artist": [ + { + "id": 17635, + "name": "椎名林檎", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=17635" + } + ], + "album": { + "id": 61637, + "name": "罪と罰", + "cover": "http://p1.music.126.net/W3zh73z9SEOVx4IugvgQ-g==/109951163318826464.jpg", + "published": "2000-01-25", + "published_at": 948816000000, + "company": "Universal Music LLC" + }, + "duration": 272625, + "duration_desc": "4:32", + "popularity": 100, + "score": 100, + "fee": 1, + "status": 0, + "mb": { + "sq": { + "size": 59365794, + "size_desc": "59.37 MB", + "bitrate": 1742046, + "extension": "flac" + }, + "hq": { + "size": 10907733, + "size_desc": "10.91 MB", + "bitrate": 320000, + "extension": "mp3" + }, + "mq": { + "size": 6544657, + "size_desc": "6.54 MB", + "bitrate": 192000, + "extension": "mp3" + }, + "lq": { + "size": 4363119, + "size_desc": "4.36 MB", + "bitrate": 128000, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=642723" + }, + { + "id": 429348598, + "rank": 62, + "rank_name": "飙升榜", + "title": "沦陷", + "artist": [ + { + "id": 1081293, + "name": "李嘉格", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=1081293" + } + ], + "album": { + "id": 34841497, + "name": "四格", + "cover": "http://p1.music.126.net/svLJT1S1O0DXHRIghiuJyg==/18599338695655987.jpg", + "published": "2016-03-01", + "published_at": 1456848000000, + "company": "梦响当然" + }, + "duration": 258933, + "duration_desc": "4:18", + "popularity": 100, + "score": 100, + "fee": 1, + "status": 0, + "mb": { + "sq": { + "size": 30269959, + "size_desc": "30.27 MB", + "bitrate": 935220, + "extension": "flac" + }, + "hq": { + "size": 10360207, + "size_desc": "10.36 MB", + "bitrate": 320000, + "extension": "mp3" + }, + "mq": { + "size": 6216142, + "size_desc": "6.22 MB", + "bitrate": 192000, + "extension": "mp3" + }, + "lq": { + "size": 4144109, + "size_desc": "4.14 MB", + "bitrate": 128000, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=429348598" + }, + { + "id": 2678794854, + "rank": 63, + "rank_name": "飙升榜", + "title": "MISERICÓRDIA GALLARDO", + "artist": [ + { + "id": 34342469, + "name": "Prompto", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=34342469" + } + ], + "album": { + "id": 264022495, + "name": "MISERICÓRDIA GALLARDO", + "cover": "http://p1.music.126.net/JJYwOODi3m-YkPwAXeeiFA==/109951170518532282.jpg", + "published": "2025-03-06", + "published_at": 1741276800000, + "company": "Prompto Productions" + }, + "duration": 96000, + "duration_desc": "1:36", + "popularity": 95, + "score": 95, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 11096948, + "size_desc": "11.1 MB", + "bitrate": 924594, + "extension": "flac" + }, + "hq": { + "size": 3841965, + "size_desc": "3.84 MB", + "bitrate": 320004, + "extension": "mp3" + }, + "mq": { + "size": 2305197, + "size_desc": "2.31 MB", + "bitrate": 192004, + "extension": "mp3" + }, + "lq": { + "size": 1536813, + "size_desc": "1.54 MB", + "bitrate": 128004, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2678794854" + }, + { + "id": 1859339684, + "rank": 64, + "rank_name": "飙升榜", + "title": "般配", + "artist": [ + { + "id": 12471927, + "name": "江皓南", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=12471927" + } + ], + "album": { + "id": 130039504, + "name": "般配", + "cover": "http://p1.music.126.net/_8D98wTjXWMhYl5Bofui0w==/109951166155884642.jpg", + "published": "2021-07-09", + "published_at": 1625846400000, + "company": "" + }, + "duration": 181500, + "duration_desc": "3:01", + "popularity": 100, + "score": 100, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 37682299, + "size_desc": "37.68 MB", + "bitrate": 1660927, + "extension": "flac" + }, + "hq": { + "size": 7263129, + "size_desc": "7.26 MB", + "bitrate": 320000, + "extension": "mp3" + }, + "mq": { + "size": 4357895, + "size_desc": "4.36 MB", + "bitrate": 192000, + "extension": "mp3" + }, + "lq": { + "size": 2905278, + "size_desc": "2.91 MB", + "bitrate": 128000, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=1859339684" + }, + { + "id": 2730270721, + "rank": 65, + "rank_name": "飙升榜", + "title": "Distance", + "artist": [ + { + "id": 1132066, + "name": "Fayzz", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=1132066" + } + ], + "album": { + "id": 279675457, + "name": "Patch", + "cover": "http://p1.music.126.net/AmLRTNKjHJwOo11jlQX0lw==/109951171525802692.jpg", + "published": "2025-08-04", + "published_at": 1754323200000, + "company": "HIFIVE" + }, + "duration": 301250, + "duration_desc": "5:01", + "popularity": 90, + "score": 90, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 31481807, + "size_desc": "31.48 MB", + "bitrate": 835885, + "extension": "flac" + }, + "hq": { + "size": 12052845, + "size_desc": "12.05 MB", + "bitrate": 320000, + "extension": "mp3" + }, + "mq": { + "size": 7231725, + "size_desc": "7.23 MB", + "bitrate": 192000, + "extension": "mp3" + }, + "lq": { + "size": 4821165, + "size_desc": "4.82 MB", + "bitrate": 128000, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2730270721" + }, + { + "id": 1919524295, + "rank": 66, + "rank_name": "飙升榜", + "title": "问情", + "artist": [ + { + "id": 29234568, + "name": "陈亦洺", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=29234568" + }, + { + "id": 13699766, + "name": "尚辰", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=13699766" + } + ], + "album": { + "id": 140260623, + "name": "问情", + "cover": "http://p1.music.126.net/6_Skolb_X075lr2gSwQNew==/109951167039546994.jpg", + "published": "2022-02-15", + "published_at": 1644940800000, + "company": "雪球音乐" + }, + "duration": 247134, + "duration_desc": "4:07", + "popularity": 100, + "score": 100, + "fee": 1, + "status": 0, + "mb": { + "sq": { + "size": 31029712, + "size_desc": "31.03 MB", + "bitrate": 1004465, + "extension": "flac" + }, + "hq": { + "size": 9887913, + "size_desc": "9.89 MB", + "bitrate": 320001, + "extension": "mp3" + }, + "mq": { + "size": 5932765, + "size_desc": "5.93 MB", + "bitrate": 192001, + "extension": "mp3" + }, + "lq": { + "size": 3955191, + "size_desc": "3.96 MB", + "bitrate": 128001, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=1919524295" + }, + { + "id": 2600493765, + "rank": 67, + "rank_name": "飙升榜", + "title": "恋人", + "artist": [ + { + "id": 4292, + "name": "李荣浩", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=4292" + } + ], + "album": { + "id": 250748750, + "name": "黑马", + "cover": "http://p1.music.126.net/0bk3Iqe2OZGBH2Iuyx7RzA==/109951170045577565.jpg", + "published": "2024-10-17", + "published_at": 1729180800000, + "company": "一样音乐" + }, + "duration": 275912, + "duration_desc": "4:35", + "popularity": 100, + "score": 100, + "fee": 1, + "status": 0, + "mb": { + "sq": { + "size": 30058936, + "size_desc": "30.06 MB", + "bitrate": 871549, + "extension": "flac" + }, + "hq": { + "size": 11039085, + "size_desc": "11.04 MB", + "bitrate": 320000, + "extension": "mp3" + }, + "mq": { + "size": 6623469, + "size_desc": "6.62 MB", + "bitrate": 192000, + "extension": "mp3" + }, + "lq": { + "size": 4415661, + "size_desc": "4.42 MB", + "bitrate": 128000, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2600493765" + }, + { + "id": 1893505014, + "rank": 68, + "rank_name": "飙升榜", + "title": "年轮说", + "artist": [ + { + "id": 10199, + "name": "杨丞琳", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=10199" + } + ], + "album": { + "id": 135874294, + "name": "20首華語重溫經典", + "cover": "http://p1.music.126.net/3Ao29M_Bk9wuMe6Zq6mU2w==/109951168278832954.jpg", + "published": "2021-11-07", + "published_at": 1636300800000, + "company": "UME - Global Clearing House" + }, + "duration": 266452, + "duration_desc": "4:26", + "popularity": 100, + "score": 100, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 26845620, + "size_desc": "26.85 MB", + "bitrate": 806014, + "extension": "flac" + }, + "hq": { + "size": 10661138, + "size_desc": "10.66 MB", + "bitrate": 320000, + "extension": "mp3" + }, + "mq": { + "size": 6396700, + "size_desc": "6.4 MB", + "bitrate": 192000, + "extension": "mp3" + }, + "lq": { + "size": 4264481, + "size_desc": "4.26 MB", + "bitrate": 128000, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=1893505014" + }, + { + "id": 209923, + "rank": 69, + "rank_name": "飙升榜", + "title": "Love Love Love", + "artist": [ + { + "id": 7219, + "name": "蔡依林", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=7219" + } + ], + "album": { + "id": 21343, + "name": "城堡", + "cover": "http://p1.music.126.net/lKIkniPBdOWqZzl1yvgz9g==/109951170708258712.jpg", + "published": "2004-02-26", + "published_at": 1077811200000, + "company": "索尼音乐" + }, + "duration": 229520, + "duration_desc": "3:49", + "popularity": 100, + "score": 100, + "fee": 1, + "status": 0, + "mb": { + "sq": { + "size": 29983141, + "size_desc": "29.98 MB", + "bitrate": 1045072, + "extension": "flac" + }, + "hq": { + "size": 9183652, + "size_desc": "9.18 MB", + "bitrate": 320000, + "extension": "mp3" + }, + "mq": { + "size": 5510209, + "size_desc": "5.51 MB", + "bitrate": 192000, + "extension": "mp3" + }, + "lq": { + "size": 3673487, + "size_desc": "3.67 MB", + "bitrate": 128000, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=209923" + }, + { + "id": 2724694389, + "rank": 70, + "rank_name": "飙升榜", + "title": "背篓少年", + "artist": [ + { + "id": 54093175, + "name": "TCG尹妹", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=54093175" + } + ], + "album": { + "id": 277990540, + "name": "背篓少年", + "cover": "http://p1.music.126.net/ceoHVs2dvrfX50Ka6z2E9A==/109951171443733631.jpg", + "published": "2025-07-11", + "published_at": 1752249600000, + "company": "太合麦田" + }, + "duration": 153845, + "duration_desc": "2:33", + "popularity": 100, + "score": 100, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 21621158, + "size_desc": "21.62 MB", + "bitrate": 1124160, + "extension": "flac" + }, + "hq": { + "size": 6156525, + "size_desc": "6.16 MB", + "bitrate": 320000, + "extension": "mp3" + }, + "mq": { + "size": 3693933, + "size_desc": "3.69 MB", + "bitrate": 192000, + "extension": "mp3" + }, + "lq": { + "size": 2462637, + "size_desc": "2.46 MB", + "bitrate": 128000, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2724694389" + }, + { + "id": 1407658105, + "rank": 71, + "rank_name": "飙升榜", + "title": "我要找到你", + "artist": [ + { + "id": 5998, + "name": "易泽禹", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=5998" + } + ], + "album": { + "id": 83891446, + "name": "我要找到你", + "cover": "http://p1.music.126.net/mKjg3atpmn9M4J951CiVTA==/109951164528618554.jpg", + "published": "2019-12-03", + "published_at": 1575388800000, + "company": "" + }, + "duration": 202353, + "duration_desc": "3:22", + "popularity": 100, + "score": 100, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 21975656, + "size_desc": "21.98 MB", + "bitrate": 1411000, + "extension": "flac" + }, + "hq": { + "size": 8096958, + "size_desc": "8.1 MB", + "bitrate": 320000, + "extension": "mp3" + }, + "mq": { + "size": 4858192, + "size_desc": "4.86 MB", + "bitrate": 192000, + "extension": "mp3" + }, + "lq": { + "size": 3238809, + "size_desc": "3.24 MB", + "bitrate": 128000, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=1407658105" + }, + { + "id": 2100282715, + "rank": 72, + "rank_name": "飙升榜", + "title": "歪歪", + "artist": [ + { + "id": 37343207, + "name": "拂言", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=37343207" + } + ], + "album": { + "id": 179091457, + "name": "歪歪", + "cover": "http://p1.music.126.net/G0pr2aux9dzK9hT4-n2n5A==/109951169058424179.jpg", + "published": "2023-11-15", + "published_at": 1700064000000, + "company": "" + }, + "duration": 167927, + "duration_desc": "2:47", + "popularity": 100, + "score": 100, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 18617591, + "size_desc": "18.62 MB", + "bitrate": 886934, + "extension": "flac" + }, + "hq": { + "size": 6719085, + "size_desc": "6.72 MB", + "bitrate": 320000, + "extension": "mp3" + }, + "mq": { + "size": 4031469, + "size_desc": "4.03 MB", + "bitrate": 192000, + "extension": "mp3" + }, + "lq": { + "size": 2687661, + "size_desc": "2.69 MB", + "bitrate": 128000, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2100282715" + }, + { + "id": 2656356278, + "rank": 73, + "rank_name": "飙升榜", + "title": "HARPY HARE", + "artist": [ + { + "id": 59651243, + "name": "NoAki", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=59651243" + }, + { + "id": 12886162, + "name": "Skyver", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=12886162" + } + ], + "album": { + "id": 256868094, + "name": "HARPY HARE", + "cover": "http://p1.music.126.net/y2GIIiHLPFn44tBUGqSBlg==/109951170259120670.jpg", + "published": "2025-01-09", + "published_at": 1736438400000, + "company": "HOUSE OF PHONK" + }, + "duration": 77619, + "duration_desc": "1:17", + "popularity": 100, + "score": 100, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 10860026, + "size_desc": "10.86 MB", + "bitrate": 1119303, + "extension": "flac" + }, + "hq": { + "size": 3107570, + "size_desc": "3.11 MB", + "bitrate": 320000, + "extension": "mp3" + }, + "mq": { + "size": 1864560, + "size_desc": "1.86 MB", + "bitrate": 192000, + "extension": "mp3" + }, + "lq": { + "size": 1243054, + "size_desc": "1.24 MB", + "bitrate": 128000, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2656356278" + }, + { + "id": 2738936457, + "rank": 74, + "rank_name": "飙升榜", + "title": "Can't go back (Live)", + "artist": [ + { + "id": 49141872, + "name": "Top Barry", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=49141872" + } + ], + "album": { + "id": 281143386, + "name": "新说唱2025 第十二期", + "cover": "http://p1.music.126.net/QQsOcKcT6kleCUhIFMn-mg==/109951171834703159.jpg", + "published": "2025-08-22", + "published_at": 1755878400000, + "company": "韶愔音乐娱乐(北京)有限公司" + }, + "duration": 203999, + "duration_desc": "3:23", + "popularity": 100, + "score": 100, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 22384573, + "size_desc": "22.38 MB", + "bitrate": 877679, + "extension": "flac" + }, + "hq": { + "size": 8161965, + "size_desc": "8.16 MB", + "bitrate": 320002, + "extension": "mp3" + }, + "mq": { + "size": 4897197, + "size_desc": "4.9 MB", + "bitrate": 192002, + "extension": "mp3" + }, + "lq": { + "size": 3264813, + "size_desc": "3.26 MB", + "bitrate": 128002, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2738936457" + }, + { + "id": 2739501337, + "rank": 75, + "rank_name": "飙升榜", + "title": "余烬", + "artist": [ + { + "id": 48497149, + "name": "柠安", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=48497149" + } + ], + "album": { + "id": 282723264, + "name": "余烬", + "cover": "http://p1.music.126.net/XXwdSc8kr1b9WNCKI7FKHw==/109951171923938239.jpg", + "published": "2025-08-24", + "published_at": 1756051200000, + "company": "" + }, + "duration": 161123, + "duration_desc": "2:41", + "popularity": 90, + "score": 90, + "fee": 8, + "status": 0, + "mb": { + "sq": null, + "hq": { + "size": 6447064, + "size_desc": "6.45 MB", + "bitrate": 320002, + "extension": "mp3" + }, + "mq": { + "size": 3868256, + "size_desc": "3.87 MB", + "bitrate": 192002, + "extension": "mp3" + }, + "lq": { + "size": 2578852, + "size_desc": "2.58 MB", + "bitrate": 128002, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2739501337" + }, + { + "id": 2715166863, + "rank": 76, + "rank_name": "飙升榜", + "title": "雨会告诉你", + "artist": [ + { + "id": 12600046, + "name": "陈文非", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=12600046" + } + ], + "album": { + "id": 275076578, + "name": "我在等世界回电", + "cover": "http://p1.music.126.net/5UG9XVaPOdk7xVMjK6SS5w==/109951171301651895.jpg", + "published": "2025-06-15", + "published_at": 1750003200000, + "company": "海神音乐" + }, + "duration": 240208, + "duration_desc": "4:00", + "popularity": 100, + "score": 100, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 25879917, + "size_desc": "25.88 MB", + "bitrate": 861768, + "extension": "flac" + }, + "hq": { + "size": 9610605, + "size_desc": "9.61 MB", + "bitrate": 320000, + "extension": "mp3" + }, + "mq": { + "size": 5766381, + "size_desc": "5.77 MB", + "bitrate": 192000, + "extension": "mp3" + }, + "lq": { + "size": 3844269, + "size_desc": "3.84 MB", + "bitrate": 128000, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2715166863" + }, + { + "id": 2114019727, + "rank": 77, + "rank_name": "飙升榜", + "title": "Don't Say Goodbye (Interlude) (feat. Lodoni)", + "artist": [ + { + "id": 50848454, + "name": "thirtykay", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=50848454" + }, + { + "id": 49090888, + "name": "LODONI", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=49090888" + } + ], + "album": { + "id": 182366445, + "name": "The Gift of Music", + "cover": "http://p1.music.126.net/on9kaYplg1ozEBx7Ep3G6g==/109951169232504429.jpg", + "published": "2023-12-27", + "published_at": 1703692800000, + "company": "3377803 Records DK" + }, + "duration": 149347, + "duration_desc": "2:29", + "popularity": 100, + "score": 100, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 15661502, + "size_desc": "15.66 MB", + "bitrate": 838931, + "extension": "flac" + }, + "hq": { + "size": 5976860, + "size_desc": "5.98 MB", + "bitrate": 320000, + "extension": "mp3" + }, + "mq": { + "size": 3586133, + "size_desc": "3.59 MB", + "bitrate": 192000, + "extension": "mp3" + }, + "lq": { + "size": 2390770, + "size_desc": "2.39 MB", + "bitrate": 128000, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2114019727" + }, + { + "id": 29567193, + "rank": 78, + "rank_name": "飙升榜", + "title": "我们的时光", + "artist": [ + { + "id": 6731, + "name": "赵雷", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=6731" + } + ], + "album": { + "id": 3048030, + "name": "吉姆餐厅", + "cover": "http://p1.music.126.net/pwcUlwh9MFZ_V3hGBOPaCQ==/109951169213425474.jpg", + "published": "2014-10-18", + "published_at": 1413648000000, + "company": "华宇世博" + }, + "duration": 270746, + "duration_desc": "4:30", + "popularity": 100, + "score": 100, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 28479102, + "size_desc": "28.48 MB", + "bitrate": 841498, + "extension": "flac" + }, + "hq": { + "size": 10832501, + "size_desc": "10.83 MB", + "bitrate": 320000, + "extension": "mp3" + }, + "mq": { + "size": 6499518, + "size_desc": "6.5 MB", + "bitrate": 192000, + "extension": "mp3" + }, + "lq": { + "size": 4333026, + "size_desc": "4.33 MB", + "bitrate": 128000, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=29567193" + }, + { + "id": 2075593054, + "rank": 79, + "rank_name": "飙升榜", + "title": "林宛瑜", + "artist": [ + { + "id": 12563131, + "name": "Rapeter", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=12563131" + } + ], + "album": { + "id": 174245605, + "name": "DirtyGOOD 装乖", + "cover": "http://p1.music.126.net/-RYv_KQ7OjQYENoqhoXDmg==/109951168899147692.jpg", + "published": "2023-09-09", + "published_at": 1694275200000, + "company": "" + }, + "duration": 186109, + "duration_desc": "3:06", + "popularity": 100, + "score": 100, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 19086070, + "size_desc": "19.09 MB", + "bitrate": 820423, + "extension": "flac" + }, + "hq": { + "size": 7446765, + "size_desc": "7.45 MB", + "bitrate": 320002, + "extension": "mp3" + }, + "mq": { + "size": 4468077, + "size_desc": "4.47 MB", + "bitrate": 192002, + "extension": "mp3" + }, + "lq": { + "size": 2978733, + "size_desc": "2.98 MB", + "bitrate": 128002, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2075593054" + }, + { + "id": 2677400220, + "rank": 80, + "rank_name": "飙升榜", + "title": "NO HOOK FREESTYLE Pt.4", + "artist": [ + { + "id": 12563131, + "name": "Rapeter", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=12563131" + } + ], + "album": { + "id": 263242113, + "name": "IMGOOD别担心我", + "cover": "http://p1.music.126.net/QpNRZsfMP5J4tOlziA8Pnw==/109951170504642760.jpg", + "published": "2025-02-21", + "published_at": 1740153600000, + "company": "" + }, + "duration": 225000, + "duration_desc": "3:45", + "popularity": 100, + "score": 100, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 28370966, + "size_desc": "28.37 MB", + "bitrate": 1008598, + "extension": "flac" + }, + "hq": { + "size": 9001965, + "size_desc": "9 MB", + "bitrate": 320002, + "extension": "mp3" + }, + "mq": { + "size": 5401197, + "size_desc": "5.4 MB", + "bitrate": 192002, + "extension": "mp3" + }, + "lq": { + "size": 3600813, + "size_desc": "3.6 MB", + "bitrate": 128002, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2677400220" + }, + { + "id": 2736690863, + "rank": 81, + "rank_name": "飙升榜", + "title": "MENTE MA", + "artist": [ + { + "id": 48853047, + "name": "VZEUS", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=48853047" + } + ], + "album": { + "id": 281730160, + "name": "MENTA MA", + "cover": "http://p1.music.126.net/Jv1aVe2po_f2bE50czHSEQ==/109951171874809370.jpg", + "published": "2025-08-15", + "published_at": 1755246600000, + "company": "" + }, + "duration": 127399, + "duration_desc": "2:07", + "popularity": 100, + "score": 100, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 15420410, + "size_desc": "15.42 MB", + "bitrate": 968172, + "extension": "flac" + }, + "hq": { + "size": 5098101, + "size_desc": "5.1 MB", + "bitrate": 320000, + "extension": "mp3" + }, + "mq": { + "size": 3058878, + "size_desc": "3.06 MB", + "bitrate": 192000, + "extension": "mp3" + }, + "lq": { + "size": 2039266, + "size_desc": "2.04 MB", + "bitrate": 128000, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2736690863" + }, + { + "id": 2735855320, + "rank": 82, + "rank_name": "飙升榜", + "title": "下课钟声", + "artist": [ + { + "id": 34094059, + "name": "关浩德Walter", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=34094059" + } + ], + "album": { + "id": 281405272, + "name": "下课钟声", + "cover": "http://p1.music.126.net/_7Wa7O6fCdlRrNt17RzdAw==/109951171853737963.jpg", + "published": "2025-08-27", + "published_at": 1756310400000, + "company": "StreetVoice/触底而上DTT" + }, + "duration": 273237, + "duration_desc": "4:33", + "popularity": 95, + "score": 95, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 26949536, + "size_desc": "26.95 MB", + "bitrate": 788897, + "extension": "flac" + }, + "hq": { + "size": 10931565, + "size_desc": "10.93 MB", + "bitrate": 320000, + "extension": "mp3" + }, + "mq": { + "size": 6558957, + "size_desc": "6.56 MB", + "bitrate": 192000, + "extension": "mp3" + }, + "lq": { + "size": 4372653, + "size_desc": "4.37 MB", + "bitrate": 128000, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2735855320" + }, + { + "id": 2717035826, + "rank": 83, + "rank_name": "飙升榜", + "title": "半情歌", + "artist": [ + { + "id": 12275767, + "name": "step.jad依加", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=12275767" + } + ], + "album": { + "id": 275651228, + "name": "半情歌", + "cover": "http://p1.music.126.net/ROw9CASwYMvQvuDOH6eVbw==/109951171330027735.jpg", + "published": "2025-07-14", + "published_at": 1752508800000, + "company": "华纳音乐" + }, + "duration": 214905, + "duration_desc": "3:34", + "popularity": 100, + "score": 100, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 25754214, + "size_desc": "25.75 MB", + "bitrate": 958570, + "extension": "flac" + }, + "hq": { + "size": 8598765, + "size_desc": "8.6 MB", + "bitrate": 320000, + "extension": "mp3" + }, + "mq": { + "size": 5159277, + "size_desc": "5.16 MB", + "bitrate": 192000, + "extension": "mp3" + }, + "lq": { + "size": 3439533, + "size_desc": "3.44 MB", + "bitrate": 128000, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2717035826" + }, + { + "id": 2735409135, + "rank": 84, + "rank_name": "飙升榜", + "title": "ハンドサイン", + "artist": [ + { + "id": 27889701, + "name": "Kizuna AI", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=27889701" + } + ], + "album": { + "id": 281242596, + "name": "ハンドサイン", + "cover": "http://p1.music.126.net/1gnbsJg2rYHalSxBRSReYA==/109951171840112594.jpg", + "published": "2025-08-19", + "published_at": 1755619200000, + "company": "KizunaAI" + }, + "duration": 238693, + "duration_desc": "3:58", + "popularity": 90, + "score": 90, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 29926707, + "size_desc": "29.93 MB", + "bitrate": 1002871, + "extension": "flac" + }, + "hq": { + "size": 9550125, + "size_desc": "9.55 MB", + "bitrate": 320000, + "extension": "mp3" + }, + "mq": { + "size": 5730093, + "size_desc": "5.73 MB", + "bitrate": 192000, + "extension": "mp3" + }, + "lq": { + "size": 3820077, + "size_desc": "3.82 MB", + "bitrate": 128000, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2735409135" + }, + { + "id": 2082176014, + "rank": 85, + "rank_name": "飙升榜", + "title": "最后的道别", + "artist": [ + { + "id": 4464, + "name": "梁雨", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=4464" + } + ], + "album": { + "id": 174775874, + "name": "最后的道别", + "cover": "http://p1.music.126.net/EeoTFA6yT1e9k89QblcvHQ==/109951168914975164.jpg", + "published": "2023-09-14", + "published_at": 1694707200000, + "company": "淳music" + }, + "duration": 264444, + "duration_desc": "4:24", + "popularity": 100, + "score": 100, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 34255476, + "size_desc": "34.26 MB", + "bitrate": 1036300, + "extension": "flac" + }, + "hq": { + "size": 10580205, + "size_desc": "10.58 MB", + "bitrate": 320000, + "extension": "mp3" + }, + "mq": { + "size": 6348141, + "size_desc": "6.35 MB", + "bitrate": 192000, + "extension": "mp3" + }, + "lq": { + "size": 4232109, + "size_desc": "4.23 MB", + "bitrate": 128000, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2082176014" + }, + { + "id": 2739596293, + "rank": 86, + "rank_name": "飙升榜", + "title": "五千两百遍", + "artist": [ + { + "id": 34634779, + "name": "999PUNKSTA", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=34634779" + } + ], + "album": { + "id": 282723760, + "name": "五千两百遍", + "cover": "http://p1.music.126.net/d2BE2e7gxx0cKvZh3TiOew==/109951171925663378.jpg", + "published": "2025-08-23", + "published_at": 1755964800000, + "company": "" + }, + "duration": 158261, + "duration_desc": "2:38", + "popularity": 90, + "score": 90, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 30834253, + "size_desc": "30.83 MB", + "bitrate": 1558497, + "extension": "flac" + }, + "hq": { + "size": 6333170, + "size_desc": "6.33 MB", + "bitrate": 320000, + "extension": "mp3" + }, + "mq": { + "size": 3799920, + "size_desc": "3.8 MB", + "bitrate": 192000, + "extension": "mp3" + }, + "lq": { + "size": 2533294, + "size_desc": "2.53 MB", + "bitrate": 128000, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2739596293" + }, + { + "id": 150422, + "rank": 87, + "rank_name": "飙升榜", + "title": "今天你要嫁给我", + "artist": [ + { + "id": 7219, + "name": "蔡依林", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=7219" + }, + { + "id": 5196, + "name": "陶喆", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=5196" + } + ], + "album": { + "id": 15184, + "name": "太美丽", + "cover": "http://p1.music.126.net/Fq9QNt2SYKvPEL3ipfVc9g==/109951166916020363.jpg", + "published": "2006-08-03", + "published_at": 1154620800000, + "company": "华纳音乐" + }, + "duration": 272066, + "duration_desc": "4:32", + "popularity": 100, + "score": 100, + "fee": 1, + "status": 0, + "mb": { + "sq": { + "size": 31284971, + "size_desc": "31.28 MB", + "bitrate": 919920, + "extension": "flac" + }, + "hq": { + "size": 10885791, + "size_desc": "10.89 MB", + "bitrate": 320001, + "extension": "mp3" + }, + "mq": { + "size": 6531492, + "size_desc": "6.53 MB", + "bitrate": 192001, + "extension": "mp3" + }, + "lq": { + "size": 4354342, + "size_desc": "4.35 MB", + "bitrate": 128001, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=150422" + }, + { + "id": 1958677933, + "rank": 88, + "rank_name": "飙升榜", + "title": "不温暖的歌", + "artist": [ + { + "id": 1204076, + "name": "欧瑞SoulCore", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=1204076" + } + ], + "album": { + "id": 147035916, + "name": "不温暖的歌", + "cover": "http://p1.music.126.net/HnGeUR5qsVmbvtk5LEMvng==/109951167584589643.jpg", + "published": "2022-06-23", + "published_at": 1656000000000, + "company": "" + }, + "duration": 190000, + "duration_desc": "3:10", + "popularity": 100, + "score": 100, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 38897482, + "size_desc": "38.9 MB", + "bitrate": 1637788, + "extension": "flac" + }, + "hq": { + "size": 7602721, + "size_desc": "7.6 MB", + "bitrate": 320002, + "extension": "mp3" + }, + "mq": { + "size": 4561650, + "size_desc": "4.56 MB", + "bitrate": 192002, + "extension": "mp3" + }, + "lq": { + "size": 3041115, + "size_desc": "3.04 MB", + "bitrate": 128002, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=1958677933" + }, + { + "id": 2738570393, + "rank": 89, + "rank_name": "飙升榜", + "title": "爱情火车", + "artist": [ + { + "id": 48577041, + "name": "Mikey-18", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=48577041" + }, + { + "id": 37343744, + "name": "Katastic卡老师", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=37343744" + } + ], + "album": { + "id": 282399455, + "name": "爱情火车", + "cover": "http://p1.music.126.net/X7FCkAy-zM3KK3ulekJl-w==/109951171934200418.jpg", + "published": "2025-08-27", + "published_at": 1756310400000, + "company": "网易电波" + }, + "duration": 168874, + "duration_desc": "2:48", + "popularity": 90, + "score": 90, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 19597500, + "size_desc": "19.6 MB", + "bitrate": 928231, + "extension": "flac" + }, + "hq": { + "size": 6757399, + "size_desc": "6.76 MB", + "bitrate": 320000, + "extension": "mp3" + }, + "mq": { + "size": 4054457, + "size_desc": "4.05 MB", + "bitrate": 192000, + "extension": "mp3" + }, + "lq": { + "size": 2702986, + "size_desc": "2.7 MB", + "bitrate": 128000, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2738570393" + }, + { + "id": 2733116489, + "rank": 90, + "rank_name": "飙升榜", + "title": "云朵的歌", + "artist": [ + { + "id": 29865317, + "name": "斯丹曼簇", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=29865317" + } + ], + "album": { + "id": 280458270, + "name": "云朵的歌", + "cover": "http://p1.music.126.net/EDicVyZ4SZJAnI-RqYLPSw==/109951171914367691.jpg", + "published": "2025-08-22", + "published_at": 1755878400000, + "company": "" + }, + "duration": 254153, + "duration_desc": "4:14", + "popularity": 95, + "score": 95, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 27926440, + "size_desc": "27.93 MB", + "bitrate": 878894, + "extension": "flac" + }, + "hq": { + "size": 10168365, + "size_desc": "10.17 MB", + "bitrate": 320001, + "extension": "mp3" + }, + "mq": { + "size": 6101037, + "size_desc": "6.1 MB", + "bitrate": 192001, + "extension": "mp3" + }, + "lq": { + "size": 4067373, + "size_desc": "4.07 MB", + "bitrate": 128001, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2733116489" + }, + { + "id": 2666658963, + "rank": 91, + "rank_name": "飙升榜", + "title": "Show Me Love", + "artist": [ + { + "id": 31988286, + "name": "WizTheMC", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=31988286" + }, + { + "id": 94332017, + "name": "bees & honey", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=94332017" + } + ], + "album": { + "id": 259913344, + "name": "Show Me Love", + "cover": "http://p1.music.126.net/sPZ1mJ3Rh10cjRenbQ3bAg==/109951170383524946.jpg", + "published": "2025-02-06", + "published_at": 1738857600000, + "company": "Bamboo Artists" + }, + "duration": 176965, + "duration_desc": "2:56", + "popularity": 100, + "score": 100, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 34535501, + "size_desc": "34.54 MB", + "bitrate": 1561083, + "extension": "flac" + }, + "hq": { + "size": 7081317, + "size_desc": "7.08 MB", + "bitrate": 320000, + "extension": "mp3" + }, + "mq": { + "size": 4248808, + "size_desc": "4.25 MB", + "bitrate": 192000, + "extension": "mp3" + }, + "lq": { + "size": 2832553, + "size_desc": "2.83 MB", + "bitrate": 128000, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2666658963" + }, + { + "id": 2740196131, + "rank": 92, + "rank_name": "飙升榜", + "title": "一步几回头", + "artist": [ + { + "id": 31364543, + "name": "蒋孜怡", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=31364543" + } + ], + "album": { + "id": 282958925, + "name": "一步几回头", + "cover": "http://p1.music.126.net/rzb1yI0jHl7jgoUnzZa_qg==/109951171933563007.jpg", + "published": "2025-08-27", + "published_at": 1756310400000, + "company": "Universal Music China" + }, + "duration": 222659, + "duration_desc": "3:42", + "popularity": 90, + "score": 90, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 26687271, + "size_desc": "26.69 MB", + "bitrate": 958706, + "extension": "flac" + }, + "hq": { + "size": 8908844, + "size_desc": "8.91 MB", + "bitrate": 320000, + "extension": "mp3" + }, + "mq": { + "size": 5345324, + "size_desc": "5.35 MB", + "bitrate": 192000, + "extension": "mp3" + }, + "lq": { + "size": 3563564, + "size_desc": "3.56 MB", + "bitrate": 128000, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2740196131" + }, + { + "id": 2736339025, + "rank": 93, + "rank_name": "飙升榜", + "title": "桃花签", + "artist": [ + { + "id": 1215003, + "name": "呦猫UNEKO", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=1215003" + }, + { + "id": 816079, + "name": "薄彩生", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=816079" + } + ], + "album": { + "id": 281577462, + "name": "《百妖谱·洛阳篇》动画原声带", + "cover": "http://p1.music.126.net/MSfQ702QFv0w2OmifzyJEA==/109951171867725169.jpg", + "published": "2025-08-14", + "published_at": 1755187200000, + "company": "bilibili" + }, + "duration": 239808, + "duration_desc": "3:59", + "popularity": 95, + "score": 95, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 27381733, + "size_desc": "27.38 MB", + "bitrate": 913308, + "extension": "flac" + }, + "hq": { + "size": 9594285, + "size_desc": "9.59 MB", + "bitrate": 320000, + "extension": "mp3" + }, + "mq": { + "size": 5756589, + "size_desc": "5.76 MB", + "bitrate": 192000, + "extension": "mp3" + }, + "lq": { + "size": 3837741, + "size_desc": "3.84 MB", + "bitrate": 128000, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2736339025" + }, + { + "id": 2652410538, + "rank": 94, + "rank_name": "飙升榜", + "title": "红太狼狂想曲(《喜羊羊与灰太狼之兔年顶呱呱》动画电影插曲)", + "artist": [ + { + "id": 7481, + "name": "崔子格", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=7481" + } + ], + "album": { + "id": 255582143, + "name": "《喜羊羊与灰太狼》音乐原声带合辑", + "cover": "http://p1.music.126.net/KeZoz-csqAe30ovzgDFehQ==/109951170213887287.jpg", + "published": "2024-12-01", + "published_at": 1733068800000, + "company": "宇歌风行" + }, + "duration": 160920, + "duration_desc": "2:40", + "popularity": 100, + "score": 100, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 18494176, + "size_desc": "18.49 MB", + "bitrate": 919422, + "extension": "flac" + }, + "hq": { + "size": 6438765, + "size_desc": "6.44 MB", + "bitrate": 320000, + "extension": "mp3" + }, + "mq": { + "size": 3863277, + "size_desc": "3.86 MB", + "bitrate": 192000, + "extension": "mp3" + }, + "lq": { + "size": 2575533, + "size_desc": "2.58 MB", + "bitrate": 128000, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2652410538" + }, + { + "id": 2733113572, + "rank": 95, + "rank_name": "飙升榜", + "title": "espero(等着你)", + "artist": [ + { + "id": 46957283, + "name": "曼尼洛夫", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=46957283" + }, + { + "id": 12568026, + "name": "小白羊HUSH", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=12568026" + } + ], + "album": { + "id": 280457742, + "name": "espero(等着你)", + "cover": "http://p1.music.126.net/2CY0ZyIyAbCWErHS6VnX5g==/109951171715764900.jpg", + "published": "2025-08-03", + "published_at": 1754236800000, + "company": "独立发行" + }, + "duration": 230999, + "duration_desc": "3:50", + "popularity": 100, + "score": 100, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 26319483, + "size_desc": "26.32 MB", + "bitrate": 911350, + "extension": "flac" + }, + "hq": { + "size": 9242166, + "size_desc": "9.24 MB", + "bitrate": 320002, + "extension": "mp3" + }, + "mq": { + "size": 5545317, + "size_desc": "5.55 MB", + "bitrate": 192002, + "extension": "mp3" + }, + "lq": { + "size": 3696893, + "size_desc": "3.7 MB", + "bitrate": 128002, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2733113572" + }, + { + "id": 2738549556, + "rank": 96, + "rank_name": "飙升榜", + "title": "Vai Toma(PHONK)", + "artist": [ + { + "id": 56856041, + "name": "GTR7", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=56856041" + } + ], + "album": { + "id": 282297619, + "name": "Vai Toma", + "cover": "http://p1.music.126.net/crZu8zAKrCR3pN8lzdUUVA==/109951171907812124.jpg", + "published": "2025-08-20", + "published_at": 1755705600000, + "company": "" + }, + "duration": 131000, + "duration_desc": "2:11", + "popularity": 100, + "score": 100, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 28401103, + "size_desc": "28.4 MB", + "bitrate": 1734269, + "extension": "flac" + }, + "hq": { + "size": 5242297, + "size_desc": "5.24 MB", + "bitrate": 320003, + "extension": "mp3" + }, + "mq": { + "size": 3145395, + "size_desc": "3.15 MB", + "bitrate": 192003, + "extension": "mp3" + }, + "lq": { + "size": 2096945, + "size_desc": "2.1 MB", + "bitrate": 128003, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2738549556" + }, + { + "id": 2739231169, + "rank": 97, + "rank_name": "飙升榜", + "title": "她走的那夜下起了大雨 (纯音乐)", + "artist": [ + { + "id": 59019507, + "name": "韦大鱼", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=59019507" + } + ], + "album": { + "id": 282657964, + "name": "纯音乐合集", + "cover": "http://p1.music.126.net/cfBzsQXbFCV1E_m5y1ZA3w==/109951171919074070.jpg", + "published": "2025-08-22", + "published_at": 1755878400000, + "company": "广西青衫网络传媒有限公司" + }, + "duration": 188424, + "duration_desc": "3:08", + "popularity": 95, + "score": 95, + "fee": 0, + "status": 0, + "mb": { + "sq": null, + "hq": { + "size": 7538925, + "size_desc": "7.54 MB", + "bitrate": 320000, + "extension": "mp3" + }, + "mq": { + "size": 4523373, + "size_desc": "4.52 MB", + "bitrate": 192000, + "extension": "mp3" + }, + "lq": null + }, + "link": "https://music.163.com/#/song?id=2739231169" + }, + { + "id": 2740703897, + "rank": 98, + "rank_name": "飙升榜", + "title": "Start Today", + "artist": [ + { + "id": 56782, + "name": "Fall Out Boy", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=56782" + } + ], + "album": { + "id": 283140201, + "name": "Start Today", + "cover": "http://p1.music.126.net/gnMq2u8Nhsdewz3nnsEIVA==/109951171940498828.jpg", + "published": "2025-08-26", + "published_at": 1756224000000, + "company": "Island Records" + }, + "duration": 122706, + "duration_desc": "2:02", + "popularity": 90, + "score": 90, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 14898805, + "size_desc": "14.9 MB", + "bitrate": 971194, + "extension": "flac" + }, + "hq": { + "size": 4911064, + "size_desc": "4.91 MB", + "bitrate": 320000, + "extension": "mp3" + }, + "mq": { + "size": 2946656, + "size_desc": "2.95 MB", + "bitrate": 192000, + "extension": "mp3" + }, + "lq": { + "size": 1964452, + "size_desc": "1.96 MB", + "bitrate": 128000, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2740703897" + }, + { + "id": 2100963421, + "rank": 99, + "rank_name": "飙升榜", + "title": "山海花开不是你", + "artist": [ + { + "id": 12444269, + "name": "高源", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=12444269" + } + ], + "album": { + "id": 179350982, + "name": "山海花开不是你", + "cover": "http://p1.music.126.net/AksAWvy9M90X-quVpRm9aA==/109951169063447299.jpg", + "published": "2023-11-19", + "published_at": 1700409600000, + "company": "音符跳动" + }, + "duration": 194516, + "duration_desc": "3:14", + "popularity": 100, + "score": 100, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 21032122, + "size_desc": "21.03 MB", + "bitrate": 864999, + "extension": "flac" + }, + "hq": { + "size": 7782765, + "size_desc": "7.78 MB", + "bitrate": 320000, + "extension": "mp3" + }, + "mq": { + "size": 4669677, + "size_desc": "4.67 MB", + "bitrate": 192000, + "extension": "mp3" + }, + "lq": { + "size": 3113133, + "size_desc": "3.11 MB", + "bitrate": 128000, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2100963421" + }, + { + "id": 2731613461, + "rank": 100, + "rank_name": "飙升榜", + "title": "不会在乎时间走多快", + "artist": [ + { + "id": 1142011, + "name": "王极", + "cover": "http://p1.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg", + "link": "https://music.163.com/#/artist?id=1142011" + } + ], + "album": { + "id": 280119457, + "name": "不会在乎时间走多快", + "cover": "http://p1.music.126.net/QwXt6wm-zpToUdKVa-sXHA==/109951171580254229.jpg", + "published": "2025-08-01", + "published_at": 1754064000000, + "company": "" + }, + "duration": 138929, + "duration_desc": "2:18", + "popularity": 100, + "score": 100, + "fee": 8, + "status": 0, + "mb": { + "sq": { + "size": 16673736, + "size_desc": "16.67 MB", + "bitrate": 959978, + "extension": "flac" + }, + "hq": { + "size": 5559405, + "size_desc": "5.56 MB", + "bitrate": 320000, + "extension": "mp3" + }, + "mq": { + "size": 3335661, + "size_desc": "3.34 MB", + "bitrate": 192000, + "extension": "mp3" + }, + "lq": { + "size": 2223789, + "size_desc": "2.22 MB", + "bitrate": 128000, + "extension": "mp3" + } + }, + "link": "https://music.163.com/#/song?id=2731613461" + } + ] +} \ No newline at end of file diff --git a/frontend/60sapi/生成要求模板.txt b/frontend/60sapi/生成要求模板.txt new file mode 100644 index 00000000..0a3addc7 --- /dev/null +++ b/frontend/60sapi/生成要求模板.txt @@ -0,0 +1,8 @@ +1.生成为静态网页,js,css,html分离出来,不要混合在一起放入html里,难以阅读 +2.网页要适配手机端,电脑端和平板端三个设备分别做不同的css格式,优先优化手机端用户体验 +3.网页默认风格以淡绿色清新风格为主,除非用户要求 +4.尽量不要引用外部css,js,实在要引用就使用中国国内的cdn,否则用户可能加载不出来 +5.返回接口.json储存了网页api返回的数据格式 +6.严格按照用户要求执行,不得随意添加什么注解,如“以下数据来自...” +7.接口集合.json保存了所有已知的后端API接口,一个访问不了尝试自动切换另一个 +8.在css中有关背景的css单独一个css文件,方便我直接迁移 \ No newline at end of file diff --git a/生成要求.txt b/生成要求.txt deleted file mode 100644 index 1128df7c..00000000 --- a/生成要求.txt +++ /dev/null @@ -1,2 +0,0 @@ -1.生成一个前后端分离的网站项目,前端使用React框架,后端使用Python3.13.2的Flask框架,前端代码放在frontend文件夹,后端代码放在backend文件夹 -2. \ No newline at end of file diff --git a/用户数据模板.json b/用户数据模板.json new file mode 100644 index 00000000..be5aac90 --- /dev/null +++ b/用户数据模板.json @@ -0,0 +1,4 @@ +{ + "账号":"3205788256", + "密码":"tyh@19900420" +} \ No newline at end of file diff --git a/项目架构说明.txt b/项目架构说明.txt new file mode 100644 index 00000000..f74f571c --- /dev/null +++ b/项目架构说明.txt @@ -0,0 +1,10 @@ +1.一个前后端分离的网站项目,前端使用React框架,后端使用Python3.13.2的Flask框架,采用模块化架构避免单个文件过大 +前端代码放在frontend文件夹,后端代码放在backend文件夹,确保代码结构清晰有少量中文注释,便于后期扩展维护 +2.前端网页要适配手机竖屏端和电脑端 +3.后端目前需要一个连接MongoDB数据库来储存用户登录数据, +用户数据储存在MongoDB的InfoGenie数据库的userdata集合中 + +软件app前端分三个主要模块 +60sapi模块:为静态页面,又分四个子模块:热搜榜单,日更资讯,实用功能,娱乐消遣 +smallgame模块:为静态页面 +aimodelapp模块: 为静态页面 (需要登录验证)(暂时不弄) \ No newline at end of file