From e08511d860d19d2a33d8d0a908db3a1297be1fe9 Mon Sep 17 00:00:00 2001
From: XsX05 <3541908431@qq.com>
Date: Tue, 2 Sep 2025 22:30:49 +0800
Subject: [PATCH] =?UTF-8?q?=E9=9A=8F=E6=9C=BA=E5=8F=91=E7=97=85=EF=BC=8C?=
=?UTF-8?q?=E8=BF=90=E5=8A=BF=EF=BC=8C=E5=86=B7=E7=AC=91=E8=AF=9D=EF=BC=8C?=
=?UTF-8?q?=E6=AE=B5=E5=AD=90?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../娱乐消遣/随机冷笑话/css/Untitled-1.html | 16 +
.../娱乐消遣/随机冷笑话/css/background.css | 107 ++++++
.../60sapi/娱乐消遣/随机冷笑话/css/style.css | 217 +++++++++++
.../60sapi/娱乐消遣/随机冷笑话/index.html | 58 +++
.../60sapi/娱乐消遣/随机冷笑话/js/script.js | 117 ++++++
.../60sapi/娱乐消遣/随机冷笑话/接口集合.json | 47 +++
.../60sapi/娱乐消遣/随机冷笑话/返回接口.json | 8 +
.../娱乐消遣/随机发病文学/css/background.css | 90 +++++
.../娱乐消遣/随机发病文学/css/style.css | 235 ++++++++++++
.../60sapi/娱乐消遣/随机发病文学/index.html | 34 ++
.../60sapi/娱乐消遣/随机发病文学/js/script.js | 147 ++++++++
.../娱乐消遣/随机发病文学/接口集合.json | 47 +++
.../娱乐消遣/随机发病文学/返回接口.json | 8 +
.../娱乐消遣/随机运势/css/background.css | 26 ++
.../60sapi/娱乐消遣/随机运势/css/style.css | 342 ++++++++++++++++++
frontend/60sapi/娱乐消遣/随机运势/index.html | 71 ++++
.../60sapi/娱乐消遣/随机运势/js/script.js | 175 +++++++++
.../60sapi/娱乐消遣/随机运势/接口集合.json | 7 +
.../60sapi/娱乐消遣/随机运势/返回接口.json | 10 +
19 files changed, 1762 insertions(+)
create mode 100644 frontend/60sapi/娱乐消遣/随机冷笑话/css/Untitled-1.html
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
diff --git a/frontend/60sapi/娱乐消遣/随机冷笑话/css/Untitled-1.html b/frontend/60sapi/娱乐消遣/随机冷笑话/css/Untitled-1.html
new file mode 100644
index 00000000..6edd77e5
--- /dev/null
+++ b/frontend/60sapi/娱乐消遣/随机冷笑话/css/Untitled-1.html
@@ -0,0 +1,16 @@
+
+
+
+
+
+ 每日笑话
+
+
+
+
+
+
+
\ 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..79480464
--- /dev/null
+++ b/frontend/60sapi/娱乐消遣/随机冷笑话/css/background.css
@@ -0,0 +1,107 @@
+/* background.css - 动态渐变背景 */
+body {
+ background: linear-gradient(-45deg, #ee7752, #e73c7e, #23a6d5, #23d5ab);
+ background-size: 400% 400%;
+ animation: gradient 15s ease infinite;
+}
+
+@keyframes gradient {
+ 0% {
+ background-position: 0% 50%;
+ }
+ 50% {
+ background-position: 100% 50%;
+ }
+ 100% {
+ background-position: 0% 50%;
+ }
+}
+:root {
+ --bg-yellow: #FFFDE7; /* 浅黄 */
+ --bg-blue: #E3F2FD; /* 淡蓝 */
+}
+
+body {
+ background: linear-gradient(180deg, var(--bg-yellow) 0%, var(--bg-blue) 100%);
+ background-attachment: fixed; /* 固定背景,滚动时不移动 */
+}
+
+body {
+ margin: 0;
+ padding: 0;
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
+ overflow: hidden;
+ transition: background-color 0.5s ease;
+}
+
+/* Light Theme (Default) */
+[data-theme="light"] {
+ background: linear-gradient(to bottom, #87CEEB, #B0E0E6);
+}
+
+/* Dark Theme */
+[data-theme="dark"] {
+ background: linear-gradient(to bottom, #232526, #414345);
+}
+[data-theme="dark"] .snowflake {
+ color: #999;
+}
+
+/* Winter Theme */
+[data-theme="winter"] {
+ background: linear-gradient(to bottom, #a1c4fd, #c2e9fb);
+}
+[data-theme="winter"] .background-bottom {
+ position: fixed;
+ bottom: 0;
+ left: 0;
+ width: 100%;
+ height: 100px;
+ background: linear-gradient(to top, white, rgba(255, 255, 255, 0));
+ z-index: -1;
+ border-radius: 50% 50% 0 0 / 20px;
+ box-shadow: 0 -10px 20px rgba(255, 255, 255, 0.5);
+}
+
+
+#snowflake-container {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ pointer-events: none;
+ z-index: 0;
+}
+
+.snowflake {
+ position: absolute;
+ top: -10%;
+ color: white;
+ font-size: 20px;
+ user-select: none;
+ animation: fall linear infinite;
+}
+
+@keyframes fall {
+ to {
+ transform: translateY(105vh) rotate(360deg);
+ }
+}
+
+#frost-overlay {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background: url('https://www.transparenttextures.com/patterns/ice-age.png') repeat;
+ opacity: 0;
+ pointer-events: none;
+ transition: opacity 0.5s ease-in-out;
+ z-index: 100;
+}
+
+#frost-overlay.is-frosted {
+ 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..1676dffd
--- /dev/null
+++ b/frontend/60sapi/娱乐消遣/随机冷笑话/css/style.css
@@ -0,0 +1,217 @@
+:root {
+ --primary-color-light: #4A90E2;
+ --text-color-light: #333;
+ --card-bg-light: rgba(255, 255, 255, 0.85);
+
+ --primary-color-dark: #5271C4;
+ --text-color-dark: #E0E0E0;
+ --card-bg-dark: rgba(40, 40, 40, 0.85);
+
+ --primary-color-winter: #6A82FB;
+ --text-color-winter: #2c3e50;
+ --card-bg-winter: rgba(255, 255, 255, 0.7);
+}
+
+.container {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ min-height: 100vh;
+ padding: 20px;
+ box-sizing: border-box;
+ text-align: center;
+ position: relative;
+ z-index: 1;
+}
+
+.top-nav {
+ position: absolute;
+ top: 20px;
+ right: 20px;
+ background: rgba(255, 255, 255, 0.3);
+ padding: 5px;
+ border-radius: 50px;
+ backdrop-filter: blur(5px);
+}
+
+.theme-switcher {
+ display: flex;
+ gap: 5px;
+}
+
+.theme-btn {
+ background: transparent;
+ border: 2px solid transparent;
+ border-radius: 50%;
+ width: 40px;
+ height: 40px;
+ font-size: 1.5em;
+ cursor: pointer;
+ transition: transform 0.2s, border-color 0.2s;
+}
+.theme-btn:hover {
+ transform: scale(1.1);
+}
+.theme-btn.active {
+ border-color: white;
+}
+
+.title {
+ font-family: 'ZCOOL KuaiLe', cursive;
+ font-size: 3em;
+ margin-bottom: 20px;
+ transition: color 0.5s ease;
+}
+
+.joke-stream {
+ width: 100%;
+ max-width: 500px;
+ display: flex;
+ flex-direction: column;
+ gap: 25px;
+}
+
+.joke-card {
+ border-radius: 20px;
+ padding: 30px 40px;
+ box-shadow: 0 10px 30px rgba(0, 0, 0, 0.15);
+ width: 100%;
+ max-width: 500px;
+ min-height: 150px;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ position: relative;
+ backdrop-filter: blur(8px);
+ border: 1px solid rgba(255, 255, 255, 0.2);
+ transition: background-color 0.5s ease, border-color 0.5s ease;
+}
+
+#joke-text {
+ font-size: 1.5em;
+ line-height: 1.6;
+ transition: opacity 0.3s, color 0.5s ease;
+}
+
+/* --- Theming --- */
+
+/* Light Theme */
+[data-theme="light"] .title { color: white; text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.2); }
+[data-theme="light"] .joke-card { background-color: var(--card-bg-light); }
+[data-theme="light"] #joke-text { color: var(--text-color-light); }
+[data-theme="light"] #new-joke-btn { background-color: var(--primary-color-light); box-shadow: 0 4px 15px rgba(74, 144, 226, 0.4); }
+[data-theme="light"] footer { color: rgba(255, 255, 255, 0.8); }
+
+/* Dark Theme */
+[data-theme="dark"] .title { color: #EAEAEA; text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.5); }
+[data-theme="dark"] .joke-card { background-color: var(--card-bg-dark); border-color: rgba(255, 255, 255, 0.1); }
+[data-theme="dark"] #joke-text { color: var(--text-color-dark); }
+[data-theme="dark"] #new-joke-btn { background-color: var(--primary-color-dark); box-shadow: 0 4px 15px rgba(82, 113, 196, 0.4); }
+[data-theme="dark"] footer { color: rgba(200, 200, 200, 0.7); }
+
+/* Winter Theme */
+[data-theme="winter"] .title { color: #1e3a5f; text-shadow: 1px 1px 2px rgba(255, 255, 255, 0.7); }
+[data-theme="winter"] .joke-card {
+ background-color: var(--card-bg-winter);
+ border-color: rgba(255, 255, 255, 0.8);
+ box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1), inset 0 0 15px rgba(255, 255, 255, 0.5);
+}
+[data-theme="winter"] #joke-text { color: var(--text-color-winter); }
+[data-theme="winter"] #new-joke-btn { background-color: var(--primary-color-winter); box-shadow: 0 4px 15px rgba(106, 130, 251, 0.4); }
+[data-theme="winter"] footer { color: #1e3a5f; }
+
+
+.controls {
+ margin-top: 30px;
+}
+
+#new-joke-btn {
+ color: white;
+ font-size: 1.2em;
+ font-weight: bold;
+ padding: 15px 35px;
+ border: none;
+ border-radius: 50px;
+ cursor: pointer;
+ transition: transform 0.2s ease, box-shadow 0.2s ease, background-color 0.5s ease;
+}
+
+#new-joke-btn:hover {
+ transform: translateY(-3px);
+}
+
+#new-joke-btn:active {
+ transform: translateY(1px);
+}
+
+.interactions {
+ margin-top: 25px;
+ display: flex;
+ gap: 20px;
+}
+
+.interaction-btn {
+ background: rgba(255, 255, 255, 0.7);
+ border: 1px solid rgba(255, 255, 255, 0.9);
+ border-radius: 50%;
+ width: 50px;
+ height: 50px;
+ font-size: 1.5em;
+ cursor: pointer;
+ transition: transform 0.2s, background-color 0.2s;
+}
+
+.interaction-btn:hover {
+ transform: scale(1.1);
+ background: white;
+}
+
+footer {
+ position: absolute;
+ bottom: 10px;
+ font-size: 0.9em;
+ transition: color 0.5s ease;
+}
+
+/* Loader */
+#loader {
+ position: absolute;
+ transition: color 0.5s ease;
+}
+[data-theme="light"] #loader { color: var(--primary-color-light); }
+[data-theme="dark"] #loader { color: var(--primary-color-dark); }
+[data-theme="winter"] #loader { color: var(--primary-color-winter); }
+
+.snowflake-loader {
+ font-size: 40px;
+ display: inline-block;
+ animation: spin 1.5s linear infinite;
+}
+.snowflake-loader::before {
+ content: '❄';
+}
+@keyframes spin {
+ to { transform: rotate(360deg); }
+}
+
+.hidden {
+ display: none;
+}
+
+/* Responsive */
+@media (max-width: 600px) {
+ .title {
+ font-size: 2.5em;
+ }
+ .joke-card {
+ padding: 25px;
+ }
+ #joke-text {
+ font-size: 1.2em;
+ }
+ .top-nav {
+ top: 10px;
+ right: 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..68477bd1
--- /dev/null
+++ b/frontend/60sapi/娱乐消遣/随机冷笑话/index.html
@@ -0,0 +1,58 @@
+
+
+
+
+
+ 随机冷笑话
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 点击下面的按钮,来点冷笑话吧!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ 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..8fe675eb
--- /dev/null
+++ b/frontend/60sapi/娱乐消遣/随机冷笑话/js/script.js
@@ -0,0 +1,117 @@
+document.addEventListener('DOMContentLoaded', () => {
+ const jokeTextElem = document.getElementById('joke-text');
+ const newJokeBtn = document.getElementById('new-joke-btn');
+ const snowflakeContainer = document.getElementById('snowflake-container');
+ const frostOverlay = document.getElementById('frost-overlay');
+ const windSound = document.getElementById('wind-sound');
+ const snowSound = document.getElementById('snow-sound');
+ const loader = document.getElementById('loader');
+ const themeBtns = document.querySelectorAll('.theme-btn');
+
+ const apiEndpoints = [
+ 'https://60s.api.shumengya.top/v2/dad-joke',
+ ];
+ let currentApiIndex = 0;
+
+ async function fetchJoke() {
+ jokeTextElem.classList.add('hidden');
+ loader.classList.remove('hidden');
+
+ try {
+ const response = await fetch(apiEndpoints[currentApiIndex]);
+ if (!response.ok) throw new Error('Network response was not ok');
+
+ const data = await response.json();
+ if (data.code === 200 && data.data.content) {
+ updateJokeText(data.data.content);
+ if (document.body.dataset.theme === 'winter' && Math.random() < 0.3) {
+ triggerFrostEffect();
+ }
+ } else {
+ throw new Error('API returned invalid data');
+ }
+ } catch (error) {
+ console.error('Fetch error:', error);
+ currentApiIndex = (currentApiIndex + 1) % apiEndpoints.length;
+ if (currentApiIndex !== 0) {
+ fetchJoke();
+ } else {
+ jokeTextElem.textContent = '冰箱坏了,暂时没有冷笑话...';
+ }
+ } finally {
+ loader.classList.add('hidden');
+ jokeTextElem.classList.remove('hidden');
+ }
+ }
+
+ function updateJokeText(text) {
+ jokeTextElem.textContent = '';
+ let i = 0;
+ const typing = setInterval(() => {
+ if (i < text.length) {
+ jokeTextElem.textContent += text.charAt(i);
+ i++;
+ } else {
+ clearInterval(typing);
+ }
+ }, 50);
+ }
+
+ function createSnowflakes() {
+ const snowflakeCount = document.body.dataset.theme === 'dark' ? 50 : 30;
+ snowflakeContainer.innerHTML = '';
+ for (let i = 0; i < snowflakeCount; i++) {
+ const snowflake = document.createElement('div');
+ snowflake.className = 'snowflake';
+ snowflake.textContent = '❄️';
+
+ snowflake.style.left = `${Math.random() * 100}vw`;
+ snowflake.style.fontSize = `${Math.random() * 15 + 10}px`;
+ snowflake.style.opacity = Math.random() * 0.5 + 0.3;
+
+ const duration = Math.random() * 10 + 8;
+ const delay = Math.random() * 10;
+
+ snowflake.style.animation = `fall ${duration}s linear ${delay}s infinite`;
+
+ snowflakeContainer.appendChild(snowflake);
+ }
+ }
+
+ function triggerFrostEffect() {
+ frostOverlay.classList.add('is-frosted');
+ windSound.play().catch(e => console.error("Audio play failed:", e));
+ setTimeout(() => {
+ frostOverlay.classList.remove('is-frosted');
+ }, 2000);
+ }
+
+ function setTheme(theme) {
+ document.body.dataset.theme = theme;
+ localStorage.setItem('joke-theme', theme);
+
+ themeBtns.forEach(btn => {
+ btn.classList.toggle('active', btn.dataset.themeTarget === theme);
+ });
+
+ if (theme === 'winter') {
+ snowSound.play().catch(e => console.error("Audio play failed:", e));
+ }
+
+ // Recreate snowflakes for theme-specific density
+ createSnowflakes();
+ }
+
+ themeBtns.forEach(btn => {
+ btn.addEventListener('click', () => {
+ setTheme(btn.dataset.themeTarget);
+ });
+ });
+
+ newJokeBtn.addEventListener('click', fetchJoke);
+
+ // Initial setup
+ const savedTheme = localStorage.getItem('joke-theme') || 'light';
+ setTheme(savedTheme);
+ fetchJoke();
+});
\ No newline at end of file
diff --git a/frontend/60sapi/娱乐消遣/随机冷笑话/接口集合.json b/frontend/60sapi/娱乐消遣/随机冷笑话/接口集合.json
new file mode 100644
index 00000000..90aa64a6
--- /dev/null
+++ b/frontend/60sapi/娱乐消遣/随机冷笑话/接口集合.json
@@ -0,0 +1,47 @@
+{
+ "api_name": "60s-api",
+ "api_version": "2.22.1",
+ "api_docs": "https://docs.60s-api.viki.moe",
+ "author": "Viki ",
+ "user_group": "595941841",
+ "github_repo": "https://github.com/vikiboss/60s",
+ "updated": "2025/09/01 11:12:08",
+ "updated_at": 1756696328000,
+ "endpoints": [
+ "/v2/60s",
+ "/v2/answer",
+ "/v2/baike",
+ "/v2/bili",
+ "/v2/bing",
+ "/v2/changya",
+ "/v2/chemical",
+ "/v2/douyin",
+ "/v2/duanzi",
+ "/v2/epic",
+ "/v2/exchange_rate",
+ "/v2/fabing",
+ "/v2/hitokoto",
+ "/v2/ip",
+ "/v2/kfc",
+ "/v2/luck",
+ "/v2/maoyan",
+ "/v2/today_in_history",
+ "/v2/toutiao",
+ "/v2/weibo",
+ "/v2/zhihu",
+ "/v2/lunar",
+ "/v2/ai-news",
+ "/v2/awesome-js",
+ "/v2/qrcode",
+ "/v2/dad-joke",
+ "/v2/hacker-news/:type",
+ "/v2/og",
+ "/v2/hash",
+ "/v2/fanyi",
+ "/v2/fanyi/langs",
+ "/v2/weather",
+ "/v2/weather/forecast",
+ "/v2/ncm-rank",
+ "/v2/ncm-rank/:id"
+ ]
+}
\ No newline at end of file
diff --git a/frontend/60sapi/娱乐消遣/随机冷笑话/返回接口.json b/frontend/60sapi/娱乐消遣/随机冷笑话/返回接口.json
new file mode 100644
index 00000000..b514f650
--- /dev/null
+++ b/frontend/60sapi/娱乐消遣/随机冷笑话/返回接口.json
@@ -0,0 +1,8 @@
+{
+ "code": 200,
+ "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841",
+ "data": {
+ "index": 121,
+ "content": "这个世界上谁最懂猪?蜘蛛(知猪)人。"
+ }
+}
\ 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..b77c1a35
--- /dev/null
+++ b/frontend/60sapi/娱乐消遣/随机发病文学/css/background.css
@@ -0,0 +1,90 @@
+body {
+ background-color: #1a1a1a;
+ color: #e0e0e0;
+ font-family: 'Courier New', Courier, monospace;
+ overflow: hidden;
+ margin: 0;
+ padding: 0;
+}
+
+#bg-container {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ z-index: -2;
+ overflow: hidden;
+ transition: transform 0.2s ease-out;
+}
+
+.floating-emoji {
+ position: absolute;
+ user-select: none;
+ opacity: 0;
+ animation-iteration-count: infinite;
+ animation-timing-function: linear;
+}
+
+@keyframes float-top-to-bottom {
+ 0% { transform: translateY(-10vh) rotate(0deg); opacity: 0; }
+ 10%, 90% { opacity: 0.7; }
+ 100% { transform: translateY(110vh) rotate(360deg); opacity: 0; }
+}
+
+@keyframes float-bottom-to-top {
+ 0% { transform: translateY(110vh) rotate(0deg); opacity: 0; }
+ 10%, 90% { opacity: 0.7; }
+ 100% { transform: translateY(-10vh) rotate(360deg); opacity: 0; }
+}
+
+@keyframes float-left-to-right {
+ 0% { transform: translateX(-10vw) rotate(0deg); opacity: 0; }
+ 10%, 90% { opacity: 0.7; }
+ 100% { transform: translateX(110vw) rotate(360deg); opacity: 0; }
+}
+
+@keyframes float-right-to-left {
+ 0% { transform: translateX(110vw) rotate(0deg); opacity: 0; }
+ 10%, 90% { opacity: 0.7; }
+ 100% { transform: translateX(-10vw) rotate(360deg); opacity: 0; }
+}
+
+.text-fragment {
+ position: absolute;
+ font-size: 24px;
+ color: rgba(255, 0, 255, 0.4);
+ opacity: 0;
+ animation: float-fragment 15s linear infinite, fade-in-out 15s linear infinite;
+ user-select: none;
+}
+
+@keyframes float-fragment {
+ 0% { transform: translate(0, 0) rotate(0deg); }
+ 25% { transform: translate(20px, 40px) rotate(15deg); }
+ 50% { transform: translate(-30px, -10px) rotate(-10deg); }
+ 75% { transform: translate(10px, -30px) rotate(5deg); }
+ 100% { transform: translate(0, 0) rotate(0deg); }
+}
+
+@keyframes fade-in-out {
+ 0%, 100% { opacity: 0; }
+ 10%, 90% { opacity: 0.4; }
+}
+
+.screen-crack {
+ position: absolute;
+ width: 200px;
+ height: 200px;
+ background-image: url('data:image/svg+xml;utf8,');
+ opacity: 0;
+ animation: flicker-crack 25s steps(1, end) infinite;
+}
+
+@keyframes flicker-crack {
+ 0%, 100% { opacity: 0; }
+ 50% { opacity: 0.3; }
+ 51% { opacity: 0; }
+ 75% { opacity: 0.2; }
+ 76% { opacity: 0; }
+}
\ 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..db1df76c
--- /dev/null
+++ b/frontend/60sapi/娱乐消遣/随机发病文学/css/style.css
@@ -0,0 +1,235 @@
+.container {
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+ min-height: 100vh;
+ padding: 20px;
+ box-sizing: border-box;
+ position: relative;
+ z-index: 1;
+}
+
+.content-card {
+ background: rgba(20, 20, 20, 0.7);
+ border: none;
+ padding: 40px;
+ max-width: 600px;
+ width: 100%;
+ text-align: center;
+ backdrop-filter: blur(5px);
+ position: relative;
+ clip-path: polygon(2% 5%, 97% 0%, 100% 95%, 0% 100%);
+}
+
+.body-animated .content-card {
+ animation: tremble 0.4s infinite, glitch-shadow 1.5s steps(1, end) infinite;
+}
+
+@keyframes tremble {
+ 0% { clip-path: polygon(2% 5%, 97% 0%, 100% 95%, 0% 100%); }
+ 25% { clip-path: polygon(2% 5%, 98% 2%, 99% 100%, 1% 98%); }
+ 50% { clip-path: polygon(3% 4%, 96% 1%, 100% 96%, 2% 100%); }
+ 75% { clip-path: polygon(1% 6%, 97% 3%, 98% 95%, 0% 99%); }
+ 100% { clip-path: polygon(2% 5%, 97% 0%, 100% 95%, 0% 100%); }
+}
+
+@keyframes glitch-shadow {
+ 0% {
+ box-shadow:
+ 0 0 8px rgba(255, 0, 255, 0.5),
+ inset 0 0 8px rgba(255, 0, 255, 0.4);
+ }
+ 33% {
+ box-shadow:
+ 0 0 8px rgba(0, 255, 255, 0.5),
+ inset 0 0 8px rgba(0, 255, 255, 0.4);
+ }
+ 66% {
+ box-shadow:
+ 0 0 8px rgba(0, 255, 0, 0.5),
+ inset 0 0 8px rgba(0, 255, 0, 0.4);
+ }
+ 100% {
+ box-shadow:
+ 0 0 8px rgba(255, 0, 255, 0.5),
+ inset 0 0 8px rgba(255, 0, 255, 0.4);
+ }
+}
+
+#literature-text {
+ font-size: 1.2em;
+ line-height: 1.8;
+ min-height: 100px;
+ color: #e0e0e0;
+ text-shadow: 0 0 5px rgba(0, 255, 135, 0.5);
+ animation: text-flicker 15s linear infinite;
+}
+
+.body-animated #literature-text {
+ animation: text-flicker 15s linear infinite, text-shadow-glitch 2s steps(1, end) infinite;
+}
+
+@keyframes text-flicker {
+ 0%, 100% { opacity: 1; }
+ 50.0% { opacity: 0.95; }
+ 50.5% { opacity: 1; }
+}
+
+@keyframes text-shadow-glitch {
+ 0% {
+ text-shadow:
+ 1px 0 0 rgba(255,0,255,0.5),
+ -1px 0 0 rgba(0,255,255,0.5);
+ }
+ 10% {
+ text-shadow:
+ -1px 0 0 rgba(255,0,255,0.5),
+ 1px 0 0 rgba(0,255,255,0.5);
+ }
+ 11%, 100% {
+ text-shadow: none;
+ }
+}
+
+.controls {
+ margin-top: 30px;
+ display: flex;
+ align-items: center;
+ gap: 20px;
+}
+
+#new-literature-btn {
+ background-color: #ff00ff;
+ color: #fff;
+ border: none;
+ padding: 12px 25px;
+ font-size: 1em;
+ cursor: pointer;
+ border-radius: 5px;
+ text-transform: uppercase;
+ font-weight: bold;
+ transition: transform 0.2s, box-shadow 0.2s;
+ box-shadow: 0 0 10px #ff00ff, 0 0 20px #ff00ff;
+}
+
+#new-literature-btn:hover {
+ transform: scale(1.05);
+ box-shadow: 0 0 15px #ff00ff, 0 0 30px #ff00ff;
+}
+
+#new-literature-btn:active {
+ transform: scale(0.95);
+}
+
+/* Animation Toggle Switch */
+.switch-container {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ color: #aaa;
+}
+
+.switch {
+ position: relative;
+ display: inline-block;
+ width: 50px;
+ height: 24px;
+}
+
+.switch input {
+ opacity: 0;
+ width: 0;
+ height: 0;
+}
+
+.slider {
+ position: absolute;
+ cursor: pointer;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ background-color: #ccc;
+ transition: .4s;
+}
+
+.slider:before {
+ position: absolute;
+ content: "";
+ height: 16px;
+ width: 16px;
+ left: 4px;
+ bottom: 4px;
+ background-color: white;
+ transition: .4s;
+}
+
+input:checked + .slider {
+ background-color: #ff00ff;
+}
+
+input:checked + .slider:before {
+ transform: translateX(26px);
+}
+
+.slider.round {
+ border-radius: 34px;
+}
+
+.slider.round:before {
+ border-radius: 50%;
+}
+
+/* Glitch Overlay & Animations */
+#glitch-overlay {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ z-index: -1;
+ pointer-events: none;
+}
+
+.body-animated #glitch-overlay {
+ animation: color-shift 15s steps(1, end) infinite;
+}
+
+@keyframes color-shift {
+ 0%, 100% { background: transparent; }
+ 10% { background: rgba(255, 0, 0, 0.05); }
+ 10.1% { background: transparent; }
+ 20% { background: rgba(0, 255, 0, 0.05); }
+ 20.1% { background: transparent; }
+ 30% { background: rgba(0, 0, 255, 0.05); }
+ 30.1% { background: transparent; }
+}
+
+.flicker-block {
+ position: absolute;
+ background: rgba(255, 255, 255, 0.1);
+ opacity: 0;
+}
+
+.body-animated .flicker-block {
+ animation: flicker 3s infinite;
+}
+
+@keyframes flicker {
+ 0%, 100% { opacity: 0; }
+ 50% { opacity: 1; }
+}
+
+/* Responsive Design */
+@media (max-width: 768px) {
+ .content-card {
+ padding: 20px;
+ }
+ #literature-text {
+ font-size: 1em;
+ }
+ .controls {
+ flex-direction: column;
+ }
+}
\ No newline at end of file
diff --git a/frontend/60sapi/娱乐消遣/随机发病文学/index.html b/frontend/60sapi/娱乐消遣/随机发病文学/index.html
new file mode 100644
index 00000000..5af98657
--- /dev/null
+++ b/frontend/60sapi/娱乐消遣/随机发病文学/index.html
@@ -0,0 +1,34 @@
+
+
+
+
+
+ 随机发病文学
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ 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..f4901b06
--- /dev/null
+++ b/frontend/60sapi/娱乐消遣/随机发病文学/js/script.js
@@ -0,0 +1,147 @@
+document.addEventListener('DOMContentLoaded', () => {
+ const literatureTextElem = document.getElementById('literature-text');
+ const newLiteratureBtn = document.getElementById('new-literature-btn');
+ const animationToggle = document.getElementById('animation-toggle');
+ const bgContainer = document.getElementById('bg-container');
+ const body = document.body;
+
+ const apiEndpoints = [
+ 'https://60s.api.shumengya.top/v2/fabing',
+ // Add fallback APIs here if available
+ ];
+
+ let currentApiIndex = 0;
+
+ async function fetchLiterature() {
+ literatureTextElem.textContent = '正在卖力发疯中...';
+ literatureTextElem.style.opacity = '0.5';
+
+ try {
+ const response = await fetch(apiEndpoints[currentApiIndex]);
+ if (!response.ok) {
+ throw new Error('Network response was not ok');
+ }
+ const data = await response.json();
+ if (data.code === 200) {
+ literatureTextElem.textContent = data.data.saying;
+ } else {
+ throw new Error('API returned an error');
+ }
+ } catch (error) {
+ console.error('Fetch error:', error);
+ currentApiIndex = (currentApiIndex + 1) % apiEndpoints.length;
+ if (currentApiIndex !== 0) {
+ fetchLiterature(); // Retry with the next API
+ } else {
+ literatureTextElem.textContent = '疯不起来了,请稍后再试。';
+ }
+ } finally {
+ literatureTextElem.style.opacity = '1';
+ }
+ }
+
+ function createFloatingEmojis() {
+ const existingEmojis = bgContainer.querySelectorAll('.floating-emoji');
+ existingEmojis.forEach(e => e.remove());
+
+ const emojis = ['🤯', '😵', '🤪', '🥴', '🤡', '👹', '👻', '💀', '💥', '🔥', '🌪️', '😵💫'];
+ const animationNames = ['float-top-to-bottom', 'float-bottom-to-top', 'float-left-to-right', 'float-right-to-left'];
+ const emojiCount = 25;
+
+ for (let i = 0; i < emojiCount; i++) {
+ const emojiEl = document.createElement('div');
+ emojiEl.className = 'floating-emoji';
+ emojiEl.textContent = emojis[Math.floor(Math.random() * emojis.length)];
+
+ const animationName = animationNames[Math.floor(Math.random() * animationNames.length)];
+ emojiEl.style.animationName = animationName;
+ emojiEl.style.animationDuration = `${Math.random() * 10 + 15}s`; // 15-25 seconds
+ emojiEl.style.animationDelay = `${Math.random() * 20}s`;
+ emojiEl.style.fontSize = `${Math.random() * 20 + 20}px`;
+
+ // Set initial position based on animation direction
+ if (animationName.includes('top') || animationName.includes('bottom')) { // Vertical movement
+ emojiEl.style.left = `${Math.random() * 100}vw`;
+ } else { // Horizontal movement
+ emojiEl.style.top = `${Math.random() * 100}vh`;
+ }
+
+ bgContainer.appendChild(emojiEl);
+ }
+ }
+
+ function createFragments() {
+ const existingFragments = bgContainer.querySelectorAll('.text-fragment');
+ existingFragments.forEach(f => f.remove());
+
+ const fragments = ['我', '疯', '了', '?', '!', '…', '救命', '为什么', '好烦', '啊啊啊'];
+ for (let i = 0; i < 20; i++) {
+ const frag = document.createElement('div');
+ frag.className = 'text-fragment';
+ frag.textContent = fragments[Math.floor(Math.random() * fragments.length)];
+ frag.style.top = `${Math.random() * 100}%`;
+ frag.style.left = `${Math.random() * 100}%`;
+ frag.style.animationDelay = `${Math.random() * 15}s`;
+ frag.style.fontSize = `${Math.random() * 12 + 12}px`;
+ bgContainer.appendChild(frag);
+ }
+ }
+
+ function createCracks() {
+ for (let i = 0; i < 2; i++) {
+ const crack = document.createElement('div');
+ crack.className = 'screen-crack';
+ crack.style.top = `${Math.random() * 80}%`;
+ crack.style.left = `${Math.random() * 80}%`;
+ crack.style.transform = `rotate(${Math.random() * 360}deg)`;
+ crack.style.animationDelay = `${Math.random() * 25}s`;
+ bgContainer.appendChild(crack);
+ }
+ }
+
+ function createFlickerBlocks() {
+ const glitchOverlay = document.getElementById('glitch-overlay');
+ for (let i = 0; i < 3; i++) {
+ const block = document.createElement('div');
+ block.className = 'flicker-block';
+ block.style.width = `${Math.random() * 100 + 50}px`;
+ block.style.height = `${Math.random() * 100 + 50}px`;
+ block.style.top = `${Math.random() * 90}%`;
+ block.style.left = `${Math.random() * 90}%`;
+ block.style.animationDuration = `${Math.random() * 2 + 2}s`;
+ block.style.animationDelay = `${Math.random() * 3}s`;
+ glitchOverlay.appendChild(block);
+ }
+ }
+
+ function toggleAnimations() {
+ if (animationToggle.checked) {
+ body.classList.add('body-animated');
+ } else {
+ body.classList.remove('body-animated');
+ }
+ }
+
+ document.addEventListener('mousemove', (e) => {
+ if (!animationToggle.checked) return;
+ const x = (window.innerWidth / 2) - e.pageX;
+ const y = (window.innerHeight / 2) - e.pageY;
+ bgContainer.style.transform = `translateX(${x / 50}px) translateY(${y / 50}px)`;
+ });
+
+ newLiteratureBtn.addEventListener('click', fetchLiterature);
+ animationToggle.addEventListener('change', toggleAnimations);
+
+ // Initial setup
+ createFloatingEmojis();
+ createFragments();
+ createCracks();
+ createFlickerBlocks();
+ toggleAnimations();
+ fetchLiterature();
+
+ window.addEventListener('resize', () => {
+ createFloatingEmojis();
+ createFragments();
+ });
+});
\ No newline at end of file
diff --git a/frontend/60sapi/娱乐消遣/随机发病文学/接口集合.json b/frontend/60sapi/娱乐消遣/随机发病文学/接口集合.json
new file mode 100644
index 00000000..90aa64a6
--- /dev/null
+++ b/frontend/60sapi/娱乐消遣/随机发病文学/接口集合.json
@@ -0,0 +1,47 @@
+{
+ "api_name": "60s-api",
+ "api_version": "2.22.1",
+ "api_docs": "https://docs.60s-api.viki.moe",
+ "author": "Viki ",
+ "user_group": "595941841",
+ "github_repo": "https://github.com/vikiboss/60s",
+ "updated": "2025/09/01 11:12:08",
+ "updated_at": 1756696328000,
+ "endpoints": [
+ "/v2/60s",
+ "/v2/answer",
+ "/v2/baike",
+ "/v2/bili",
+ "/v2/bing",
+ "/v2/changya",
+ "/v2/chemical",
+ "/v2/douyin",
+ "/v2/duanzi",
+ "/v2/epic",
+ "/v2/exchange_rate",
+ "/v2/fabing",
+ "/v2/hitokoto",
+ "/v2/ip",
+ "/v2/kfc",
+ "/v2/luck",
+ "/v2/maoyan",
+ "/v2/today_in_history",
+ "/v2/toutiao",
+ "/v2/weibo",
+ "/v2/zhihu",
+ "/v2/lunar",
+ "/v2/ai-news",
+ "/v2/awesome-js",
+ "/v2/qrcode",
+ "/v2/dad-joke",
+ "/v2/hacker-news/:type",
+ "/v2/og",
+ "/v2/hash",
+ "/v2/fanyi",
+ "/v2/fanyi/langs",
+ "/v2/weather",
+ "/v2/weather/forecast",
+ "/v2/ncm-rank",
+ "/v2/ncm-rank/:id"
+ ]
+}
\ No newline at end of file
diff --git a/frontend/60sapi/娱乐消遣/随机发病文学/返回接口.json b/frontend/60sapi/娱乐消遣/随机发病文学/返回接口.json
new file mode 100644
index 00000000..4a6d180e
--- /dev/null
+++ b/frontend/60sapi/娱乐消遣/随机发病文学/返回接口.json
@@ -0,0 +1,8 @@
+{
+ "code": 200,
+ "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841",
+ "data": {
+ "index": 347,
+ "duanzi": "我不想读书,主要是因为家里牛啊,猪啊羊啊都没人喂。"
+ }
+}
\ 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..d18a8699
--- /dev/null
+++ b/frontend/60sapi/娱乐消遣/随机运势/css/background.css
@@ -0,0 +1,26 @@
+body {
+ background: linear-gradient(-45deg, #0a021a, #2a0d3f, #4a1a6c, #7b2f8f);
+ background-size: 400% 400%;
+ animation: gradientBG 20s ease infinite;
+ color: #ffffff;
+ font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
+ margin: 0;
+ padding: 0;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ min-height: 100vh;
+ overflow-x: hidden;
+}
+
+@keyframes gradientBG {
+ 0% {
+ background-position: 0% 50%;
+ }
+ 50% {
+ background-position: 100% 50%;
+ }
+ 100% {
+ background-position: 0% 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..7792be02
--- /dev/null
+++ b/frontend/60sapi/娱乐消遣/随机运势/css/style.css
@@ -0,0 +1,342 @@
+.container {
+ text-align: center;
+ padding: 20px;
+ max-width: 600px;
+ width: 100%;
+ box-sizing: border-box;
+}
+
+header h1 {
+ font-size: 2.8em;
+ color: #f0e6ff;
+ text-shadow: 0 0 10px #d1a9ff, 0 0 20px #d1a9ff;
+ margin-bottom: 0.2em;
+}
+
+header p {
+ font-size: 1.2em;
+ color: #e0c8ff;
+ margin-bottom: 40px;
+}
+
+.crystal-ball-container {
+ perspective: 1000px;
+ margin-bottom: 40px;
+}
+
+.crystal-ball {
+ width: 200px;
+ height: 200px;
+ background: radial-gradient(circle at 30% 30%, rgba(255, 255, 255, 0.6), rgba(200, 180, 255, 0.1));
+ border-radius: 50%;
+ margin: 0 auto;
+ position: relative;
+ box-shadow: 0 0 30px #c390ff, 0 0 60px #a060e0, inset 0 0 20px rgba(255, 220, 255, 0.3);
+ animation: float 6s ease-in-out infinite;
+ transform-style: preserve-3d;
+}
+
+.reflection {
+ width: 80px;
+ height: 40px;
+ background: rgba(255, 255, 255, 0.3);
+ border-radius: 50%;
+ position: absolute;
+ top: 20px;
+ left: 40px;
+ transform: rotate(-30deg);
+ filter: blur(5px);
+}
+
+.swirl {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ width: 120%;
+ height: 120%;
+ background: linear-gradient(45deg, rgba(255, 192, 203, 0.1), rgba(128, 0, 128, 0.2));
+ border-radius: 50%;
+ animation: swirl 10s linear infinite;
+ transform: translate(-50%, -50%);
+}
+
+@keyframes float {
+ 0%, 100% { transform: translateY(0); }
+ 50% { transform: translateY(-20px); }
+}
+
+@keyframes swirl {
+ from { transform: translate(-50%, -50%) rotate(0deg); }
+ to { transform: translate(-50%, -50%) rotate(360deg); }
+}
+
+.fortune-card {
+ background: rgba(255, 255, 255, 0.05);
+ border-radius: 15px;
+ padding: 30px;
+ margin-bottom: 30px;
+ min-height: 120px;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ backdrop-filter: blur(10px);
+ border: 1px solid rgba(255, 255, 255, 0.1);
+ box-shadow: 0 8px 32px 0 rgba(31, 38, 135, 0.37);
+ transition: opacity 0.5s ease-in-out;
+}
+
+.fortune-content {
+ opacity: 0;
+ transition: opacity 0.5s ease-in-out;
+}
+
+.fortune-content.visible {
+ opacity: 1;
+}
+
+#luck-desc {
+ font-size: 2em;
+ color: #ffc0cb;
+ margin: 0 0 10px;
+}
+
+#luck-tip {
+ font-size: 1.1em;
+ color: #e0e0e0;
+ margin: 0;
+ padding-bottom: 20px; /* Add some space before the new details */
+}
+
+.fortune-details {
+ display: flex;
+ justify-content: space-around;
+ margin-top: 20px;
+ padding-top: 20px;
+ border-top: 1px solid rgba(255, 255, 255, 0.2);
+}
+
+.detail-item {
+ text-align: center;
+}
+
+.detail-item h3 {
+ font-size: 0.9em;
+ color: #ffc0cb;
+ margin: 0 0 5px;
+ font-weight: normal;
+}
+
+.detail-item p {
+ font-size: 1.2em;
+ margin: 0;
+ font-weight: bold;
+}
+
+#lucky-color {
+ display: inline-block;
+ width: 24px;
+ height: 24px;
+ border-radius: 50%;
+ border: 2px solid white;
+ box-shadow: 0 0 5px rgba(0, 0, 0, 0.5);
+ /* Remove the text content */
+ font-size: 0;
+}
+
+/* Tarot Card Styles */
+.tarot-container {
+ margin-top: 40px;
+ margin-bottom: 40px;
+}
+
+.tarot-container h2 {
+ font-size: 1.5em;
+ color: #f0e6ff;
+ text-shadow: 0 0 8px #d1a9ff;
+ margin-bottom: 20px;
+}
+
+.tarot-card-container {
+ width: 180px;
+ height: 280px;
+ perspective: 1000px;
+ margin: 0 auto;
+ cursor: pointer;
+}
+
+.tarot-card-inner {
+ position: relative;
+ width: 100%;
+ height: 100%;
+ transition: transform 0.8s;
+ transform-style: preserve-3d;
+}
+
+.tarot-card-container.flipped .tarot-card-inner {
+ transform: rotateY(180deg);
+}
+
+.tarot-card-front,
+.tarot-card-back {
+ position: absolute;
+ width: 100%;
+ height: 100%;
+ -webkit-backface-visibility: hidden;
+ backface-visibility: hidden;
+ border-radius: 10px;
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.4);
+}
+
+.tarot-card-back {
+ background: linear-gradient(135deg, #4a1a6c, #2a0d3f);
+ border: 2px solid #d1a9ff;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ font-size: 3em;
+ color: #d1a9ff;
+}
+
+.tarot-card-back::after {
+ content: '✧'; /* A simple star symbol */
+ text-shadow: 0 0 10px #f0e6ff;
+}
+
+.tarot-card-front {
+ background: linear-gradient(135deg, #3e165b, #592883);
+ border: 2px solid #d1a9ff;
+ color: white;
+ transform: rotateY(180deg);
+ padding: 20px;
+ box-sizing: border-box;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+}
+
+#tarot-name {
+ font-size: 1.4em;
+ color: #ffc0cb;
+ margin: 0 0 10px;
+}
+
+#tarot-interpretation {
+ font-size: 0.9em;
+ text-align: center;
+ margin: 0;
+}
+
+/* Side Decorations */
+.side-decor {
+ position: fixed;
+ top: 0;
+ bottom: 0;
+ width: 15vw;
+ height: 100vh;
+ pointer-events: none;
+ z-index: 0;
+}
+
+.left-decor {
+ left: 0;
+}
+
+.right-decor {
+ right: 0;
+}
+
+.decor-symbol {
+ position: absolute;
+ color: rgba(209, 169, 255, 0.5);
+ text-shadow: 0 0 10px rgba(240, 230, 255, 0.7);
+ animation: floatSymbol 20s infinite ease-in-out;
+}
+
+@keyframes floatSymbol {
+ 0%, 100% {
+ transform: translateY(0) rotate(0deg);
+ opacity: 0;
+ }
+ 25%, 75% {
+ opacity: 0.8;
+ }
+ 50% {
+ transform: translateY(-20vh) rotate(180deg);
+ opacity: 0.3;
+ }
+}
+
+#get-fortune-btn {
+ background: linear-gradient(45deg, #da70d6, #8a2be2);
+ color: white;
+ border: none;
+ border-radius: 50px;
+ padding: 15px 30px;
+ font-size: 1.1em;
+ cursor: pointer;
+ transition: transform 0.2s, box-shadow 0.2s;
+ box-shadow: 0 0 15px #c390ff;
+}
+
+#get-fortune-btn:hover {
+ transform: scale(1.05);
+ box-shadow: 0 0 25px #d1a9ff;
+}
+
+#get-fortune-btn:active {
+ transform: scale(0.98);
+}
+
+.loading-spinner {
+ border: 4px solid rgba(255, 255, 255, 0.2);
+ border-left-color: #ffc0cb;
+ border-radius: 50%;
+ width: 40px;
+ height: 40px;
+ animation: spin 1s linear infinite;
+ display: none; /* Hidden by default */
+}
+
+.loading-spinner.visible {
+ display: block;
+}
+
+@keyframes spin {
+ to { transform: rotate(360deg); }
+}
+
+footer {
+ margin-top: 40px;
+ color: rgba(255, 255, 255, 0.6);
+}
+
+/* Responsive Design */
+@media (max-width: 768px) {
+ header h1 {
+ font-size: 2.2em;
+ }
+ .crystal-ball {
+ width: 150px;
+ height: 150px;
+ }
+ .fortune-card {
+ padding: 20px;
+ }
+ .fortune-details {
+ flex-direction: column;
+ gap: 15px;
+ }
+
+ .tarot-card-container {
+ width: 150px;
+ height: 233px;
+ }
+}
+
+/* Hide side decor on smaller screens */
+@media (max-width: 1200px) {
+ .side-decor {
+ 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..4214eeb4
--- /dev/null
+++ b/frontend/60sapi/娱乐消遣/随机运势/index.html
@@ -0,0 +1,71 @@
+
+
+
+
+
+ 水晶球占卜
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ 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..28f7d514
--- /dev/null
+++ b/frontend/60sapi/娱乐消遣/随机运势/js/script.js
@@ -0,0 +1,175 @@
+document.addEventListener('DOMContentLoaded', () => {
+ const getFortuneBtn = document.getElementById('get-fortune-btn');
+ const fortuneCard = document.getElementById('fortune-card');
+ const fortuneContent = fortuneCard.querySelector('.fortune-content');
+ const luckDescElem = document.getElementById('luck-desc');
+ const luckTipElem = document.getElementById('luck-tip');
+ const fortuneSummaryElem = document.getElementById('fortune-summary');
+ const luckyColorElem = document.getElementById('lucky-color');
+ const luckyNumberElem = document.getElementById('lucky-number');
+ const loadingSpinner = fortuneCard.querySelector('.loading-spinner');
+ const tarotCardContainer = document.getElementById('tarot-card');
+ const tarotNameElem = document.getElementById('tarot-name');
+ const tarotInterpretationElem = document.getElementById('tarot-interpretation');
+
+ const apiBaseUrls = [
+ "https://60s.api.shumengya.top",
+ "https://60s-cf.viki.moe",
+ "https://60s.viki.moe",
+ "https://60s.b23.run",
+ "https://60s.114128.xyz",
+ "https://60s-cf.114128.xyz"
+ ];
+ const apiPath = "/v2/luck";
+
+ const mantras = [
+ "顺其自然,皆是美好。",
+ "相信直觉,它知道方向。",
+ "每一次呼吸都是新的开始。",
+ "心怀感恩,好运自来。",
+ "拥抱变化,发现惊喜。",
+ "你的能量,超乎想象。",
+ "保持微笑,宇宙会回应你。"
+ ];
+
+ const tarotDeck = [
+ { name: "愚者", interpretation: "新的开始,无限的潜力,天真和自由。勇敢地迈出第一步。" },
+ { name: "魔术师", interpretation: "创造力,意志力,显化。你拥有实现目标所需的一切资源。" },
+ { name: "女祭司", interpretation: "直觉,潜意识,神秘。倾听你内心的声音,智慧在你之内。" },
+ { name: "皇后", interpretation: "丰饶,母性,创造。享受生活的美好,与自然和谐相处。" },
+ { name: "皇帝", interpretation: "权威,结构,控制。建立秩序和纪律,掌控你的生活。" },
+ { name: "教皇", interpretation: "传统,信仰,灵性指导。寻求智慧和知识,遵循传统。" },
+ { name: "恋人", interpretation: "爱,和谐,选择。做出与你内心价值观一致的决定。" },
+ { name: "战车", interpretation: "胜利,决心,控制。以坚定的意志力克服障碍,勇往直前。" },
+ { name: "力量", interpretation: "勇气,内在力量,同情。用温柔和耐心驯服内心的野兽。" },
+ { name: "隐士", interpretation: "内省,孤独,寻求真理。花时间独处,向内寻求答案。" },
+ { name: "命运之轮", interpretation: "变化,命运,转折点。生活总在变化,顺应潮流。" },
+ { name: "正义", interpretation: "公平,真理,因果。为你的行为负责,寻求平衡。" },
+ { name: "倒吊人", interpretation: "新的视角,顺从,牺牲。放手,从不同的角度看问题。" },
+ { name: "死神", interpretation: "结束,转变,新生。一个周期的结束是另一个周期的开始。" },
+ { name: "节制", interpretation: "平衡,和谐,耐心。融合对立的力量,找到中间道路。" },
+ { name: "恶魔", interpretation: "束缚,物质主义,诱惑。认识到你的束缚,并寻求解放。" },
+ { name: "塔", interpretation: "突变,启示,解放。旧的结构正在崩塌,为新的结构让路。" },
+ { name: "星星", interpretation: "希望,灵感,平静。在黑暗之后,总有希望的曙光。" },
+ { name: "月亮", interpretation: "幻觉,恐惧,潜意识。面对你的恐惧,相信你的直觉。" },
+ { name: "太阳", interpretation: "成功,喜悦,活力。拥抱光明,享受生活的乐趣。" },
+ { name: "审判", interpretation: "觉醒,重生,评估。一个反思和更新的时刻。" },
+ { name: "世界", interpretation: "完成,整合,成就。一个旅程的成功结束,庆祝你的成就。" }
+ ];
+
+ let currentApiIndex = 0;
+
+ const showLoading = (isLoading) => {
+ if (isLoading) {
+ fortuneContent.classList.remove('visible');
+ loadingSpinner.classList.add('visible');
+ } else {
+ loadingSpinner.classList.remove('visible');
+ setTimeout(() => {
+ fortuneContent.classList.add('visible');
+ }, 100);
+ }
+ };
+
+ const fetchFortune = async () => {
+ showLoading(true);
+ tarotCardContainer.classList.remove('flipped'); // Reset card on new fetch
+
+ try {
+ const url = apiBaseUrls[currentApiIndex] + apiPath;
+ const response = await fetch(url, { timeout: 5000 });
+ if (!response.ok) {
+ throw new Error('Network response was not ok');
+ }
+ const data = await response.json();
+
+ if (data.code === 200 && data.data) {
+ updateFortune(data.data);
+ drawTarotCard(); // Draw a tarot card on success
+ } else {
+ throw new Error('Invalid data format');
+ }
+ } catch (error) {
+ console.error(`API error with ${apiBaseUrls[currentApiIndex]}:`, error);
+ currentApiIndex = (currentApiIndex + 1) % apiBaseUrls.length;
+ if (currentApiIndex !== 0) {
+ fetchFortune(); // Try next API
+ } else {
+ displayError();
+ }
+ }
+ };
+
+ const updateFortune = (data) => {
+ luckDescElem.textContent = data.luck_desc || '运势';
+ luckTipElem.textContent = data.luck_tip || '今日运势平平,保持好心情。';
+
+ // Generate and display additional details
+ fortuneSummaryElem.textContent = mantras[Math.floor(Math.random() * mantras.length)];
+ luckyColorElem.style.backgroundColor = `#${Math.floor(Math.random()*16777215).toString(16).padStart(6, '0')}`;
+ luckyNumberElem.textContent = Math.floor(Math.random() * 100);
+
+ showLoading(false);
+ };
+
+ const displayError = () => {
+ luckDescElem.textContent = '占卜失败';
+ luckTipElem.textContent = '无法连接到星辰之力,请稍后再试。';
+ fortuneSummaryElem.textContent = '---';
+ luckyColorElem.style.backgroundColor = 'transparent';
+ luckyNumberElem.textContent = '-';
+ showLoading(false);
+ tarotNameElem.textContent = '指引中断';
+ tarotInterpretationElem.textContent = '星辰之力暂时无法连接。';
+ tarotCardContainer.classList.add('flipped'); // Show error on card
+ };
+
+ const drawTarotCard = () => {
+ const card = tarotDeck[Math.floor(Math.random() * tarotDeck.length)];
+ tarotNameElem.textContent = card.name;
+ tarotInterpretationElem.textContent = card.interpretation;
+
+ // Flip the card after a short delay to allow the main content to appear
+ setTimeout(() => {
+ tarotCardContainer.classList.add('flipped');
+ }, 500);
+ };
+
+ const createSideDecorations = () => {
+ const leftContainer = document.querySelector('.left-decor');
+ const rightContainer = document.querySelector('.right-decor');
+ if (!leftContainer || !rightContainer) return;
+
+ const symbols = ['✧', '✦', '☾', '✶', '✵', '✩', '✨'];
+ const symbolCount = 15; // Number of symbols per side
+
+ const createSymbols = (container) => {
+ for (let i = 0; i < symbolCount; i++) {
+ const symbol = document.createElement('span');
+ symbol.classList.add('decor-symbol');
+ symbol.textContent = symbols[Math.floor(Math.random() * symbols.length)];
+
+ // Randomize properties for a more natural look
+ symbol.style.top = `${Math.random() * 90}vh`;
+ symbol.style.left = `${Math.random() * 80}%`;
+ symbol.style.fontSize = `${Math.random() * 20 + 10}px`;
+ symbol.style.animationDelay = `${Math.random() * 20}s`;
+ symbol.style.animationDuration = `${Math.random() * 20 + 15}s`; // Duration between 15s and 35s
+
+ container.appendChild(symbol);
+ }
+ };
+
+ createSymbols(leftContainer);
+ createSymbols(rightContainer);
+ };
+
+ getFortuneBtn.addEventListener('click', fetchFortune);
+ tarotCardContainer.addEventListener('click', () => {
+ tarotCardContainer.classList.toggle('flipped');
+ });
+
+ // Initial actions on page load
+ fetchFortune();
+ createSideDecorations();
+});
\ 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..f5498794
--- /dev/null
+++ b/frontend/60sapi/娱乐消遣/随机运势/返回接口.json
@@ -0,0 +1,10 @@
+{
+ "code": 200,
+ "message": "获取成功。数据来自官方/权威源头,以确保稳定与实时。开源地址 https://github.com/vikiboss/60s,反馈群 595941841",
+ "data": {
+ "luck_desc": "恋愛運",
+ "luck_rank": 21,
+ "luck_tip": "闪亮的邂逅之日!顺其自然吧",
+ "luck_tip_index": 19
+ }
+}
\ No newline at end of file