cf-worker-api/public/index.html

382 lines
14 KiB
HTML
Raw Normal View History

2025-06-12 15:13:36 +08:00
<!DOCTYPE html>
<html lang="zh-CN" data-theme="light">
2025-06-12 00:13:57 +08:00
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>OpenList Token 获取工具</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
2025-06-12 00:13:57 +08:00
<style>
:root {
--bg-color-light: #ffffff;
--text-color-light: #000000;
--bg-color-dark: #1e1e2f;
--text-color-dark: #f0f0f0;
--accent-color: #00d1b2;
2025-06-12 15:13:36 +08:00
}
2025-06-12 15:13:36 +08:00
[data-theme="light"] body {
background-color: var(--bg-color-light);
color: var(--text-color-light);
}
2025-06-12 15:13:36 +08:00
[data-theme="dark"] body {
background-color: var(--bg-color-dark);
color: var(--text-color-dark);
}
2025-06-12 15:13:36 +08:00
.form-container {
max-width: 800px;
margin: 3rem auto;
padding: 2rem;
border-radius: 1rem;
box-shadow: 0 0 30px rgba(0, 0, 0, 0.1);
background: inherit;
backdrop-filter: blur(10px);
}
2025-06-12 15:13:36 +08:00
label {
font-weight: 600;
}
2025-06-12 15:13:36 +08:00
.form-control:read-only {
background-color: #f5f5f5;
cursor: pointer;
}
.toggle-theme {
position: fixed;
top: 1rem;
right: 1rem;
}
a {
text-decoration: none;
}
2025-06-12 17:21:53 +08:00
[data-theme="dark"] body {
background-color: var(--bg-color-dark);
color: var(--text-color-dark);
}
[data-theme="dark"] .form-control {
background-color: #2a2a3b;
color: #f0f0f0;
border-color: #444;
}
[data-theme="dark"] .form-control:read-only {
background-color: #2a2a3b;
color: #ccc;
border-color: #444;
}
[data-theme="dark"] .form-select {
background-color: #2a2a3b;
color: #f0f0f0;
border-color: #444;
}
2025-06-12 00:13:57 +08:00
[data-theme="dark"] .btn {
background-color: #00bfa5;
color: #ffffff;
border: none;
}
[data-theme="dark"] .btn:hover {
background-color: #00a58e;
color: #ffffff;
}
2025-06-12 17:21:53 +08:00
[data-theme="dark"] p {
color: #ffffff;
}
</style>
2025-06-12 00:13:57 +08:00
</head>
<body>
<div class="toggle-theme">
<button class="btn btn-outline-secondary" onclick="toggleTheme()">切换主题</button>
2025-06-12 15:10:28 +08:00
</div>
<div class="container form-container">
<h2 class="text-center mb-4">🔐 OpenList Token 获取工具</h2>
2025-06-12 15:13:36 +08:00
<div class="mb-3">
<label for="site-select" class="form-label">网盘名称</label>
<select id="site-select" class="form-select">
2025-06-13 17:21:19 +08:00
<!-- <option value="onedrive_pr" selected>OneDrive 个人账户</option>-->
2025-06-13 19:26:04 +08:00
<option value="onedrive_go" selected>OneDrive 企业版本</option>
2025-06-12 15:13:36 +08:00
<option value="onedrive_cn">OneDrive 世纪互联</option>
<option value="onedrive_us">OneDrive 美国版本</option>
<option value="onedrive_de">OneDrive 德国版本</option>
2025-06-12 17:21:53 +08:00
<option value="alicloud_qr">阿里网盘 扫码登录</option>
2025-06-13 17:21:19 +08:00
<option value="baiduyun_go">百度网盘 验证登录</option>
<option value="115cloud_go">115 网盘 验证登录</option>
2025-06-13 19:26:04 +08:00
<option value="123cloud_go">123 网盘 直接登录</option>
2025-06-13 17:21:19 +08:00
<option value="googleui_go">Google Drive Team</option>
2025-06-12 15:13:36 +08:00
</select>
2025-06-13 19:26:04 +08:00
</div>
<div class="mb-3" style="margin-top: 15px">
<input type="checkbox" id="server_use" class="form-check-input">
<label for="server_use" class="form-check-label">使用 OpenList 提供的API</label>
</div>
<div class="mb-3">
<label for="client-id" class="form-label">客户端ID</label>
<input type="text" id="client-id" class="form-control">
</div>
<div class="mb-3">
<label for="app-secret" class="form-label">应用机密</label>
<input type="text" id="app-secret" class="form-control">
</div>
<div class="mb-3" id="secret-key-view">
<label for="secret-key" class="form-label">访问密钥SecretKey</label>
<input type="text" id="secret-key" class="form-control">
</div>
<div class="mb-3">
<label for="callback-url" class="form-label">回调地址</label>
<input type="text" id="callback-url" class="form-control" value="https://api.oplist.org/onedrive/callback"
readonly
onclick="autoCopy(this)">
</div>
<div class="d-grid gap-2 mb-3">
<button class="btn btn-primary" onclick="getLogin()">获取 Token</button>
</div>
2025-06-12 15:13:36 +08:00
2025-06-13 19:26:04 +08:00
<div class="mb-3">
<label for="access-token" class="form-label">访问秘钥</label>
<textarea id="access-token" class="form-control" rows="3" readonly onclick="autoCopy(this)"></textarea>
</div>
<div class="mb-3">
<label for="refresh-token" class="form-label">刷新秘钥</label>
<textarea id="refresh-token" class="form-control" rows="3" readonly onclick="autoCopy(this)"></textarea>
</div>
<div class="text-muted text-center">
<p style="text-align:center">
本工具所有信息只以Cookie形式存储于浏览器本地<br>
开源于 <a href="https://github.com/OpenListTeam/cf-worker-api" target="_blank">GitHub</a> | By <a
href="https://github.com/OpenListTeam"
target="_blank">OpenListTeam</a>
</p>
2025-06-12 00:13:57 +08:00
</div>
</div>
2025-06-13 19:26:04 +08:00
</div>
2025-06-12 00:13:57 +08:00
<script>
let intervalId;
2025-06-12 13:01:25 +08:00
// 获取登录秘钥 #######################################################
2025-06-12 00:13:57 +08:00
async function getLogin() {
2025-06-13 20:48:13 +08:00
let server_use = document.getElementById("server_use").checked;
2025-06-12 00:13:57 +08:00
let apps_uuid = document.getElementById("client-id").value;
let apps_keys = document.getElementById("app-secret").value;
2025-06-12 15:08:01 +08:00
let apps_type = document.getElementById("site-select").value;
2025-06-13 17:21:19 +08:00
let secret_key = document.getElementById("secret-key").value;
2025-06-13 21:42:12 +08:00
console.log(server_use);
2025-06-13 20:48:13 +08:00
if (!server_use && (apps_uuid === "" || apps_keys === "")) {
2025-06-12 13:01:25 +08:00
Swal.fire({
position: 'top',
icon: 'info',
title: '获取失败',
text: '请先填写客户端ID和应用机密',
showConfirmButton: true,
});
return;
}
2025-06-12 17:21:53 +08:00
let apps_subs = apps_type.split("_")[0]
let post_urls = "/" + apps_subs + "/requests?client_uid=" + apps_uuid
2025-06-13 19:26:04 +08:00
+ "&client_key=" + apps_keys + "&apps_types=" + apps_type
+ "&server_use=" + server_use
2025-06-13 17:21:19 +08:00
if (apps_subs === "baiduyun") post_urls += "&secret_key=" + secret_key
2025-06-12 00:13:57 +08:00
try {
const response = await fetch(post_urls, {
method: 'GET', headers: {'Content-Type': 'application/json'}
});
// 解析响应内容 ===============================================
const response_data = await response.json();
if (response.status === 200) {
2025-06-13 17:21:19 +08:00
if (apps_subs === "onedrive" || apps_subs === "115cloud"
2025-06-13 19:26:04 +08:00
|| apps_subs === "baiduyun" || apps_subs === "googleui") {
2025-06-12 17:21:53 +08:00
window.location.href = response_data.text;
}
2025-06-13 19:26:04 +08:00
if (apps_subs === "123cloud") {
document.getElementById("access-token").value = response_data.text;
return;
}
2025-06-12 17:21:53 +08:00
if (apps_type === "alicloud_qr") {
let sid = response_data.sid;
await Swal.fire({
position: 'top',
icon: 'info',
title: '扫码登录',
html: `<div>请扫码登录,完成后点确定</div>` +
`<img src="${response_data.text}" alt="">`,
showConfirmButton: true
});
post_urls = "/alicloud/callback" +
"?client_id=" + apps_uuid +
"&client_secret=" + apps_keys +
"&grant_type=" + "authorization_code" +
"&code=" + sid
let auth_post = await fetch(post_urls, {method: 'GET'});
let auth_data = await auth_post.json();
if (auth_post.status === 200) {
window.location.href = `/?access_token=${auth_data.access_token}`
+ `&refresh_token=${auth_data.refresh_token}`
+ `&client_uid=${apps_uuid}`
+ `&client_key=${apps_keys}`;
}
}
2025-06-12 00:13:57 +08:00
} else Swal.fire({
icon: 'error',
title: "获取秘钥失败: " + response_data.text,
showConfirmButton: true,
timer: 1000
});
} catch (error) {
Swal.fire({
icon: 'error',
title: '获取秘钥失败: ' + error,
showConfirmButton: true,
timer: 1000
});
}
}
2025-06-12 13:01:25 +08:00
// 自动复制内容 #####################################################
function autoCopy(on_element) {
// if (on_element.innerText === "") return;
navigator.clipboard.writeText(on_element.value).then(() => {
// 显示复制成功的提示
Swal.fire({
position: 'top',
icon: 'success',
title: '内容已复制',
showConfirmButton: false,
timer: 700
});
}).catch(err => {
// 复制失败时的处理
console.error('无法复制文本:', err);
2025-06-12 00:13:57 +08:00
Swal.fire({
2025-06-12 13:01:25 +08:00
position: 'top',
2025-06-12 00:13:57 +08:00
icon: 'error',
2025-06-12 13:01:25 +08:00
title: '复制失败',
text: '请手动复制',
2025-06-12 00:13:57 +08:00
showConfirmButton: true,
});
2025-06-12 13:01:25 +08:00
})
}
2025-06-12 00:13:57 +08:00
2025-06-12 13:01:25 +08:00
async function getToken() {
const strSearch = window.location.search;
const urlParams = new URLSearchParams(strSearch);
2025-06-13 19:26:04 +08:00
const server_use = urlParams.get("server_use");
2025-06-12 13:01:25 +08:00
const client_uid = urlParams.get("client_uid");
2025-06-13 17:21:19 +08:00
const secret_key = urlParams.get("secret_key");
const driver_txt = urlParams.get("driver_txt");
2025-06-12 13:01:25 +08:00
const client_key = urlParams.get("client_key");
const access_token = urlParams.get("access_token");
const refresh_token = urlParams.get("refresh_token");
const message_err = urlParams.get("message_err");
2025-06-13 17:21:19 +08:00
document.getElementById("site-select").value = driver_txt;
2025-06-13 19:26:04 +08:00
if (!driver_txt || driver_txt === "")
document.getElementById("site-select").value = "onedrive_go";
2025-06-13 17:21:19 +08:00
document.getElementById("app-secret").value = client_key;
document.getElementById("client-id").value = client_uid;
document.getElementById("access-token").value = access_token;
document.getElementById("refresh-token").value = refresh_token;
2025-06-13 19:26:04 +08:00
if (secret_key)
2025-06-13 17:21:19 +08:00
document.getElementById("secret-key").value = secret_key;
// 获取select元素和输入框元素
const siteSelect = document.getElementById('site-select');
const callbackUrlInput = document.getElementById('callback-url');
// 监听select的变化
siteSelect.addEventListener('change', function () {
const selectedValue = this.value.split("_")[0]; // 获取选中的value
// 更新输入框的值
callbackUrlInput.value = `https://api.oplist.org/${selectedValue}/callback`;
document.getElementById('secret-key-view').hidden = true;
if (siteSelect.value === "baiduyun_go") {
document.getElementById('secret-key-view').hidden = false;
}
});
2025-06-13 19:26:04 +08:00
document.getElementById('server_use').addEventListener('change', function () {
const clientIdInput = document.getElementById('client-id');
const appSecretInput = document.getElementById('app-secret');
const secretKeyInput = document.getElementById('secret-key');
const server_flag = document.getElementById('server_use');
2025-06-13 20:16:49 +08:00
if ((siteSelect.value === "alicloud_qr"
2025-06-13 21:42:12 +08:00
|| siteSelect.value === "123cloud_go"
|| siteSelect.value === "onedrive_cn"
|| siteSelect.value === "onedrive_us"
|| siteSelect.value === "onedrive_de"
) && server_flag.checked) {
2025-06-13 19:26:04 +08:00
server_flag.checked = false;
Swal.fire({
position: 'top',
icon: 'error',
title: '暂不支持',
2025-06-13 21:42:12 +08:00
html: "阿里云、123云盘、OneDrive非官方区域暂不支持使用官方密钥",
2025-06-13 19:26:04 +08:00
showConfirmButton: true,
});
return;
}
if (this.checked) {
// 禁用输入框并清空内容
clientIdInput.disabled = true;
clientIdInput.value = '';
appSecretInput.disabled = true;
appSecretInput.value = '';
secretKeyInput.disabled = true;
secretKeyInput.value = '';
} else {
// 启用输入框
clientIdInput.disabled = false;
appSecretInput.disabled = false;
secretKeyInput.disabled = false;
}
});
2025-06-13 17:21:19 +08:00
// 页面加载时初始化回调地址
window.onload = function () {
siteSelect.dispatchEvent(new Event('change'));
2025-06-13 19:26:04 +08:00
2025-06-13 17:21:19 +08:00
};
if (message_err) {
Swal.fire({
position: 'top',
icon: 'error',
title: '授权失败',
2025-06-12 15:55:03 +08:00
html: message_err,
showConfirmButton: true,
});
}
2025-06-13 17:21:19 +08:00
}
//手动切换主题模式
function toggleTheme() {
const html = document.documentElement;
const current = html.getAttribute("data-theme");
html.setAttribute("data-theme", current === "dark" ? "light" : "dark");
}
2025-06-12 15:13:36 +08:00
// 自动切换暗黑模式
(function () {
const hour = new Date().getHours();
if (hour < 6 || hour >= 18) document.documentElement.setAttribute("data-theme", "dark");
getToken();
})();
2025-06-13 19:26:04 +08:00
2025-06-13 17:21:19 +08:00
getToken();
2025-06-12 15:13:36 +08:00
</script>
</body>
</html>