cf-worker-api/public/index.html
2025-06-13 21:42:12 +08:00

382 lines
14 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="zh-CN" data-theme="light">
<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>
<style>
:root {
--bg-color-light: #ffffff;
--text-color-light: #000000;
--bg-color-dark: #1e1e2f;
--text-color-dark: #f0f0f0;
--accent-color: #00d1b2;
}
[data-theme="light"] body {
background-color: var(--bg-color-light);
color: var(--text-color-light);
}
[data-theme="dark"] body {
background-color: var(--bg-color-dark);
color: var(--text-color-dark);
}
.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);
}
label {
font-weight: 600;
}
.form-control:read-only {
background-color: #f5f5f5;
cursor: pointer;
}
.toggle-theme {
position: fixed;
top: 1rem;
right: 1rem;
}
a {
text-decoration: none;
}
[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;
}
[data-theme="dark"] .btn {
background-color: #00bfa5;
color: #ffffff;
border: none;
}
[data-theme="dark"] .btn:hover {
background-color: #00a58e;
color: #ffffff;
}
[data-theme="dark"] p {
color: #ffffff;
}
</style>
</head>
<body>
<div class="toggle-theme">
<button class="btn btn-outline-secondary" onclick="toggleTheme()">切换主题</button>
</div>
<div class="container form-container">
<h2 class="text-center mb-4">🔐 OpenList Token 获取工具</h2>
<div class="mb-3">
<label for="site-select" class="form-label">网盘名称</label>
<select id="site-select" class="form-select">
<!-- <option value="onedrive_pr" selected>OneDrive 个人账户</option>-->
<option value="onedrive_go" selected>OneDrive 企业版本</option>
<option value="onedrive_cn">OneDrive 世纪互联</option>
<option value="onedrive_us">OneDrive 美国版本</option>
<option value="onedrive_de">OneDrive 德国版本</option>
<option value="alicloud_qr">阿里网盘 扫码登录</option>
<option value="baiduyun_go">百度网盘 验证登录</option>
<option value="115cloud_go">115 网盘 验证登录</option>
<option value="123cloud_go">123 网盘 直接登录</option>
<option value="googleui_go">Google Drive Team</option>
</select>
</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>
<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>
</div>
</div>
</div>
<script>
let intervalId;
// 获取登录秘钥 #######################################################
async function getLogin() {
let server_use = document.getElementById("server_use").checked;
let apps_uuid = document.getElementById("client-id").value;
let apps_keys = document.getElementById("app-secret").value;
let apps_type = document.getElementById("site-select").value;
let secret_key = document.getElementById("secret-key").value;
console.log(server_use);
if (!server_use && (apps_uuid === "" || apps_keys === "")) {
Swal.fire({
position: 'top',
icon: 'info',
title: '获取失败',
text: '请先填写客户端ID和应用机密',
showConfirmButton: true,
});
return;
}
let apps_subs = apps_type.split("_")[0]
let post_urls = "/" + apps_subs + "/requests?client_uid=" + apps_uuid
+ "&client_key=" + apps_keys + "&apps_types=" + apps_type
+ "&server_use=" + server_use
if (apps_subs === "baiduyun") post_urls += "&secret_key=" + secret_key
try {
const response = await fetch(post_urls, {
method: 'GET', headers: {'Content-Type': 'application/json'}
});
// 解析响应内容 ===============================================
const response_data = await response.json();
if (response.status === 200) {
if (apps_subs === "onedrive" || apps_subs === "115cloud"
|| apps_subs === "baiduyun" || apps_subs === "googleui") {
window.location.href = response_data.text;
}
if (apps_subs === "123cloud") {
document.getElementById("access-token").value = response_data.text;
return;
}
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}`;
}
}
} 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
});
}
}
// 自动复制内容 #####################################################
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);
Swal.fire({
position: 'top',
icon: 'error',
title: '复制失败',
text: '请手动复制',
showConfirmButton: true,
});
})
}
async function getToken() {
const strSearch = window.location.search;
const urlParams = new URLSearchParams(strSearch);
const server_use = urlParams.get("server_use");
const client_uid = urlParams.get("client_uid");
const secret_key = urlParams.get("secret_key");
const driver_txt = urlParams.get("driver_txt");
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");
document.getElementById("site-select").value = driver_txt;
if (!driver_txt || driver_txt === "")
document.getElementById("site-select").value = "onedrive_go";
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;
if (secret_key)
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;
}
});
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');
if ((siteSelect.value === "alicloud_qr"
|| siteSelect.value === "123cloud_go"
|| siteSelect.value === "onedrive_cn"
|| siteSelect.value === "onedrive_us"
|| siteSelect.value === "onedrive_de"
) && server_flag.checked) {
server_flag.checked = false;
Swal.fire({
position: 'top',
icon: 'error',
title: '暂不支持',
html: "阿里云、123云盘、OneDrive非官方区域暂不支持使用官方密钥",
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;
}
});
// 页面加载时初始化回调地址
window.onload = function () {
siteSelect.dispatchEvent(new Event('change'));
};
if (message_err) {
Swal.fire({
position: 'top',
icon: 'error',
title: '授权失败',
html: message_err,
showConfirmButton: true,
});
}
}
//手动切换主题模式
function toggleTheme() {
const html = document.documentElement;
const current = html.getAttribute("data-theme");
html.setAttribute("data-theme", current === "dark" ? "light" : "dark");
}
// 自动切换暗黑模式
(function () {
const hour = new Date().getHours();
if (hour < 6 || hour >= 18) document.documentElement.setAttribute("data-theme", "dark");
getToken();
})();
getToken();
</script>
</body>
</html>