add yandex
add spoid
This commit is contained in:
parent
9bf174322c
commit
02e1ffb9c1
@ -4,209 +4,9 @@
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>OpenList Token 获取工具</title>
|
||||
<link rel="stylesheet" type="text/css" href="/static/style.css">
|
||||
<link href="https://jsd.tencent.to/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
|
||||
<script src="https://jsd.tencent.to/npm/sweetalert2@11.22.0/dist/sweetalert2.all.min.js"></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;
|
||||
}
|
||||
|
||||
/* 阿里云盘扫码v2样式 */
|
||||
.qr-modal {
|
||||
display: none;
|
||||
position: fixed;
|
||||
z-index: 1000;
|
||||
left: 0;
|
||||
top: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background-color: rgba(0,0,0,0.5);
|
||||
}
|
||||
|
||||
.qr-modal-content {
|
||||
background-color: #fefefe;
|
||||
margin: 5% auto;
|
||||
padding: 20px;
|
||||
border-radius: 10px;
|
||||
width: 90%;
|
||||
max-width: 500px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
[data-theme="dark"] .qr-modal-content {
|
||||
background-color: #2a2a3b;
|
||||
color: #f0f0f0;
|
||||
}
|
||||
|
||||
.qr-code-container {
|
||||
margin: 20px 0;
|
||||
padding: 20px;
|
||||
background: #f8f9fa;
|
||||
border-radius: 10px;
|
||||
}
|
||||
|
||||
[data-theme="dark"] .qr-code-container {
|
||||
background: #1a1a2e;
|
||||
}
|
||||
|
||||
.qr-code-img {
|
||||
max-width: 200px;
|
||||
max-height: 200px;
|
||||
border-radius: 8px;
|
||||
}
|
||||
|
||||
.qr-status {
|
||||
margin: 15px 0;
|
||||
padding: 10px;
|
||||
border-radius: 5px;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.qr-status.waiting {
|
||||
background: #fff3cd;
|
||||
color: #856404;
|
||||
border: 1px solid #ffeaa7;
|
||||
}
|
||||
|
||||
.qr-status.scaned {
|
||||
background: #d1ecf1;
|
||||
color: #0c5460;
|
||||
border: 1px solid #bee5eb;
|
||||
}
|
||||
|
||||
.qr-status.success {
|
||||
background: #d4edda;
|
||||
color: #155724;
|
||||
border: 1px solid #c3e6cb;
|
||||
}
|
||||
|
||||
.qr-status.error {
|
||||
background: #f8d7da;
|
||||
color: #721c24;
|
||||
border: 1px solid #f5c6cb;
|
||||
}
|
||||
|
||||
[data-theme="dark"] .qr-status.waiting {
|
||||
background: #3d3d00;
|
||||
color: #ffeb3b;
|
||||
border: 1px solid #ffeb3b;
|
||||
}
|
||||
|
||||
[data-theme="dark"] .qr-status.scaned {
|
||||
background: #003d4d;
|
||||
color: #00bcd4;
|
||||
border: 1px solid #00bcd4;
|
||||
}
|
||||
|
||||
[data-theme="dark"] .qr-status.success {
|
||||
background: #1b5e20;
|
||||
color: #4caf50;
|
||||
border: 1px solid #4caf50;
|
||||
}
|
||||
|
||||
[data-theme="dark"] .qr-status.error {
|
||||
background: #5d1a1a;
|
||||
color: #f44336;
|
||||
border: 1px solid #f44336;
|
||||
}
|
||||
|
||||
.close-btn {
|
||||
color: #aaa;
|
||||
float: right;
|
||||
font-size: 28px;
|
||||
font-weight: bold;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.close-btn:hover {
|
||||
color: black;
|
||||
}
|
||||
|
||||
[data-theme="dark"] .close-btn:hover {
|
||||
color: white;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="toggle-theme">
|
||||
@ -222,13 +22,13 @@
|
||||
<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="alicloud_qr2">阿里云盘 扫码登录v2</option>
|
||||
<option value="alicloud_qr">阿里网盘 应用登录</option>
|
||||
<option value="alicloud_oa">阿里云盘 直接登录</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>
|
||||
<option value="yandex_go">Yandex Drive</option>
|
||||
<option value="googleui_go">GoogleDrive Login</option>
|
||||
<option value="yandexui_go">YandexDrive Login</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
@ -238,25 +38,24 @@
|
||||
</div>
|
||||
|
||||
<div class="mb-3" id="client-id-view">
|
||||
<label for="client-id" class="form-label">Client ID(客户端ID)</label>
|
||||
<label for="client-id" class="form-label">客户端ID(ClientID/AppID)</label>
|
||||
<input type="text" id="client-id" class="form-control">
|
||||
</div>
|
||||
|
||||
<div class="mb-3">
|
||||
<label for="app-secret" class="form-label">AppKey(应用秘钥)</label>
|
||||
<label for="app-secret" class="form-label">应用秘钥 (AppKey/Secret)</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>
|
||||
<label for="secret-key" class="form-label">访问秘钥(SecretKey/Key)</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)">
|
||||
readonly onclick="autoCopy(this)">
|
||||
</div>
|
||||
|
||||
<div class="d-grid gap-2 mb-3">
|
||||
@ -272,15 +71,15 @@
|
||||
<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="mb-3">
|
||||
<div class="mb-3" id="sharepoint-url-view">
|
||||
<label for="sharepoint-url" class="form-label">SharePoint Site URL</label>
|
||||
<label for="sharepoint-url"></label><input type="text" id="sharepoint-url" class="form-control">
|
||||
</div>
|
||||
<div class="d-grid gap-2 mb-3">
|
||||
<div class="d-grid gap-2 mb-3" id="sharepoint-btn-view">
|
||||
<button class="btn btn-primary" onclick="getSiteID()">获取 SharePoint 站点ID</button>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="sharepoint-id" class="form-label">SharePoint Site URL</label>
|
||||
<div class="mb-3" id="sharepoint-uid-view">
|
||||
<label for="sharepoint-id" class="form-label">SharePoint Site ID</label>
|
||||
<textarea id="sharepoint-id" class="form-control" rows="3" readonly onclick="autoCopy(this)"></textarea>
|
||||
</div>
|
||||
<div class="text-muted text-center">
|
||||
@ -309,630 +108,19 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<script src="/static/login.js"></script>
|
||||
<script src="/static/token.js"></script>
|
||||
<script src="/static/theme.js"></script>
|
||||
<script src="/static/aliv2.js"></script>
|
||||
<script src="/static/spoid.js"></script>
|
||||
<script src="/static/input.js"></script>
|
||||
<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);
|
||||
// 阿里云盘扫码登录v2不需要验证客户端ID和应用机密
|
||||
if (apps_type !== "alicloud_qr2" && !server_use && (apps_uuid === "" || apps_keys === "")) {
|
||||
Swal.fire({
|
||||
position: 'top',
|
||||
icon: 'info',
|
||||
title: '获取失败',
|
||||
text: '请先填写AppID和AppKey',
|
||||
showConfirmButton: true,
|
||||
});
|
||||
return;
|
||||
}
|
||||
// 阿里云盘扫码v2直接调用专用API,不需要构建传统的requests路径
|
||||
if (apps_type === "alicloud_qr2") {
|
||||
await startAlicloud2Login();
|
||||
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" || apps_subs === "yandex") {
|
||||
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;
|
||||
|
||||
const clientIdInput = document.getElementById('client-id');
|
||||
const appSecretInput = document.getElementById('app-secret');
|
||||
const serverUseCheckbox = document.getElementById('server_use');
|
||||
const clientIdContainer = clientIdInput.closest('.mb-3');
|
||||
const appSecretContainer = appSecretInput.closest('.mb-3');
|
||||
const serverUseContainer = serverUseCheckbox.closest('.mb-3');
|
||||
const callbackContainer = callbackUrlInput.closest('.mb-3');
|
||||
|
||||
// 阿里云盘扫码登录v2不需要客户端ID、应用机密和回调地址
|
||||
if (siteSelect.value === "alicloud_qr2") {
|
||||
// 隐藏整个字段容器
|
||||
clientIdContainer.style.display = 'none';
|
||||
appSecretContainer.style.display = 'none';
|
||||
serverUseContainer.style.display = 'none';
|
||||
callbackContainer.style.display = 'none';
|
||||
|
||||
// 清空值
|
||||
clientIdInput.value = '';
|
||||
appSecretInput.value = '';
|
||||
serverUseCheckbox.checked = false;
|
||||
} else {
|
||||
// 恢复显示
|
||||
clientIdContainer.style.display = 'block';
|
||||
appSecretContainer.style.display = 'block';
|
||||
serverUseContainer.style.display = 'block';
|
||||
callbackContainer.style.display = 'block';
|
||||
|
||||
// 恢复正常状态
|
||||
if (!serverUseCheckbox.checked) {
|
||||
clientIdInput.disabled = false;
|
||||
appSecretInput.disabled = false;
|
||||
}
|
||||
clientIdInput.placeholder = '';
|
||||
appSecretInput.placeholder = '';
|
||||
serverUseCheckbox.disabled = false;
|
||||
}
|
||||
|
||||
if (siteSelect.value === "baiduyun_go") {
|
||||
document.getElementById('secret-key-view').hidden = false;
|
||||
document.getElementById('client-id-view').hidden = true;
|
||||
}else{
|
||||
document.getElementById('client-id-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 === "alicloud_qr2"
|
||||
|| 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,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// 获取站点ID
|
||||
function getSiteID() {
|
||||
const siteUrl = document.getElementById("sharepoint-url").value.trim();
|
||||
const access_token = document.getElementById("access-token").value.trim();
|
||||
const refresh_token = document.getElementById("refresh-token").value.trim();
|
||||
const client_uid = document.getElementById("client-id").value.trim();
|
||||
const client_key = document.getElementById("app-secret").value.trim();
|
||||
const site_type = document.getElementById("site-select").value;
|
||||
const idElement = document.getElementById("sharepoint-id");
|
||||
|
||||
// 定义站点的API Endpoint
|
||||
const GATEWAYS = {
|
||||
"onedrive_go": "https://graph.microsoft.com/v1.0/sites/",
|
||||
"onedrive_cn": "https://microsoftgraph.chinacloudapi.cn/v1.0/sites/",
|
||||
"onedrive_us": "https://graph.microsoft.us/v1.0/sites/",
|
||||
"onedrive_de": "https://graph.microsoft.de/v1.0/sites/"
|
||||
};
|
||||
|
||||
// 定义错误信息
|
||||
const ERROR_MESSAGES = {
|
||||
MISSING_CREDENTIALS: "请先填写客户端ID和应用机密",
|
||||
MISSING_TOKENS: "请获取Token",
|
||||
MISSING_URL: "请填写您的SharePoint URL",
|
||||
NOT_SUPPORTED: "仅支持OneDrive相关API",
|
||||
NOT_FOUND: "站点不存在",
|
||||
BAD_REQUEST: "获取出现问题,请检查权限和站点URL,站点URL示例:https://demo.sharepoint.com/site/demo",
|
||||
DEFAULT: "请求发生错误"
|
||||
};
|
||||
|
||||
// 验证
|
||||
if (!client_uid || !client_key) {
|
||||
idElement.value = ERROR_MESSAGES.MISSING_CREDENTIALS;
|
||||
return;
|
||||
}
|
||||
if (!access_token || !refresh_token) {
|
||||
idElement.value = ERROR_MESSAGES.MISSING_TOKENS;
|
||||
return;
|
||||
}
|
||||
if (!siteUrl) {
|
||||
idElement.value = ERROR_MESSAGES.MISSING_URL;
|
||||
return;
|
||||
}
|
||||
if (!site_type.includes("onedrive")) {
|
||||
idElement.value = ERROR_MESSAGES.NOT_SUPPORTED;
|
||||
return;
|
||||
}
|
||||
if (!GATEWAYS[site_type]) {
|
||||
idElement.value = ERROR_MESSAGES.DEFAULT;
|
||||
return;
|
||||
}
|
||||
|
||||
// 获取ID
|
||||
try {
|
||||
const urlParts = siteUrl.replace("https://", "").split("/");
|
||||
const site_hostname = urlParts[0];
|
||||
const site_sub_path = urlParts[1];
|
||||
const site_name = urlParts[2];
|
||||
const site_path = site_sub_path + "/" +site_name;
|
||||
const reqUrl = `${GATEWAYS[site_type]}${site_hostname}:/${site_path}`;
|
||||
const headers = {
|
||||
"Accept": "application/json",
|
||||
"Content-Type": "application/json",
|
||||
"Authorization": `Bearer ${access_token}`
|
||||
};
|
||||
|
||||
fetch(reqUrl, {
|
||||
method: "GET",
|
||||
headers: headers
|
||||
})
|
||||
.then(async (res) => {
|
||||
if (!res.ok) {
|
||||
if (res.status === 404) {
|
||||
idElement.value = ERROR_MESSAGES.NOT_FOUND;
|
||||
return;
|
||||
} else if (res.status === 400) {
|
||||
idElement.value = ERROR_MESSAGES.BAD_REQUEST;
|
||||
return;
|
||||
} else {
|
||||
idElement.value = `${ERROR_MESSAGES.DEFAULT} (HTTP ${res.status})`;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
const result = await res.json();
|
||||
if (result.id) {
|
||||
idElement.value = result.id;
|
||||
} else if (result.error) {
|
||||
idElement.value = result.error.message || ERROR_MESSAGES.DEFAULT;
|
||||
} else {
|
||||
idElement.value = ERROR_MESSAGES.DEFAULT;
|
||||
}
|
||||
} catch (error) {
|
||||
idElement.value = ERROR_MESSAGES.DEFAULT;
|
||||
console.error("处理响应时出错:", error);
|
||||
}
|
||||
})
|
||||
.catch((error) => {
|
||||
idElement.value = ERROR_MESSAGES.BAD_REQUEST;
|
||||
console.error("请求失败:", error);
|
||||
});
|
||||
} catch (error) {
|
||||
idElement.value = ERROR_MESSAGES.BAD_REQUEST;
|
||||
console.error("URL解析失败:", error);
|
||||
}
|
||||
}
|
||||
//手动切换主题模式
|
||||
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();
|
||||
|
||||
// 阿里云盘扫码v2相关变量
|
||||
let alicloud2SessionId = null;
|
||||
let alicloud2CheckInterval = null;
|
||||
let alicloud2StartTime = null;
|
||||
let clientFingerprint = null;
|
||||
|
||||
// 生成客户端指纹
|
||||
function generateClientFingerprint() {
|
||||
if (clientFingerprint) return clientFingerprint;
|
||||
|
||||
const canvas = document.createElement('canvas');
|
||||
const ctx = canvas.getContext('2d');
|
||||
ctx.textBaseline = 'top';
|
||||
ctx.font = '14px Arial';
|
||||
ctx.fillText('Client fingerprint', 2, 2);
|
||||
|
||||
const fingerprint = [
|
||||
navigator.userAgent,
|
||||
navigator.language,
|
||||
screen.width + 'x' + screen.height,
|
||||
new Date().getTimezoneOffset(),
|
||||
canvas.toDataURL(),
|
||||
navigator.hardwareConcurrency || 'unknown',
|
||||
navigator.deviceMemory || 'unknown'
|
||||
].join('|');
|
||||
|
||||
// 生成简单的哈希
|
||||
let hash = 0;
|
||||
for (let i = 0; i < fingerprint.length; i++) {
|
||||
const char = fingerprint.charCodeAt(i);
|
||||
hash = ((hash << 5) - hash) + char;
|
||||
hash = hash & hash; // 转换为32位整数
|
||||
}
|
||||
|
||||
clientFingerprint = Math.abs(hash).toString(36);
|
||||
console.log('客户端指纹生成:', clientFingerprint);
|
||||
return clientFingerprint;
|
||||
}
|
||||
|
||||
// 发送带有客户端指纹的请求
|
||||
async function fetchWithFingerprint(url, options = {}) {
|
||||
const fingerprint = generateClientFingerprint();
|
||||
const headers = {
|
||||
'X-Client-Fingerprint': fingerprint,
|
||||
...options.headers
|
||||
};
|
||||
|
||||
return fetch(url, {
|
||||
...options,
|
||||
headers
|
||||
});
|
||||
}
|
||||
|
||||
// 启动阿里云盘扫码v2登录
|
||||
async function startAlicloud2Login() {
|
||||
try {
|
||||
// 显示模态框
|
||||
document.getElementById('qr-modal').style.display = 'block';
|
||||
setQRStatus('正在生成二维码...', 'waiting');
|
||||
|
||||
// 生成二维码 - 使用带指纹的请求
|
||||
const response = await fetchWithFingerprint('/alicloud2/generate_qr');
|
||||
const result = await response.json();
|
||||
|
||||
if (result.success) {
|
||||
alicloud2SessionId = result.session_id;
|
||||
alicloud2StartTime = Date.now();
|
||||
showQRCode(result.qr_code_url);
|
||||
setQRStatus('请使用阿里云盘App扫描二维码', 'waiting');
|
||||
|
||||
// 显示过期时间信息
|
||||
if (result.expires_in) {
|
||||
const expireMinutes = Math.floor(result.expires_in / 60);
|
||||
console.log(`会话将在 ${expireMinutes} 分钟后过期`);
|
||||
}
|
||||
|
||||
startStatusCheck();
|
||||
} else {
|
||||
setQRStatus(result.error || '生成二维码失败', 'error');
|
||||
document.getElementById('refresh-qr-btn').style.display = 'inline-block';
|
||||
}
|
||||
} catch (error) {
|
||||
setQRStatus('网络错误,请重试', 'error');
|
||||
document.getElementById('refresh-qr-btn').style.display = 'inline-block';
|
||||
console.error('生成二维码失败:', error);
|
||||
}
|
||||
}
|
||||
|
||||
// 显示二维码
|
||||
function showQRCode(qrUrl) {
|
||||
const qrApiUrl = `https://api.qrserver.com/v1/create-qr-code/?size=200x200&data=${encodeURIComponent(qrUrl)}`;
|
||||
document.getElementById('qr-code-display').innerHTML = `<img src="${qrApiUrl}" alt="二维码" class="qr-code-img">`;
|
||||
document.getElementById('qr-code-container').style.display = 'block';
|
||||
}
|
||||
|
||||
// 设置状态
|
||||
function setQRStatus(message, type) {
|
||||
const statusEl = document.getElementById('qr-status');
|
||||
statusEl.textContent = message;
|
||||
statusEl.className = `qr-status ${type}`;
|
||||
statusEl.style.display = 'block';
|
||||
}
|
||||
|
||||
// 开始状态检查
|
||||
function startStatusCheck() {
|
||||
stopStatusCheck();
|
||||
alicloud2CheckInterval = setInterval(checkAlicloud2Status, 2000);
|
||||
}
|
||||
|
||||
// 停止状态检查
|
||||
function stopStatusCheck() {
|
||||
if (alicloud2CheckInterval) {
|
||||
clearInterval(alicloud2CheckInterval);
|
||||
alicloud2CheckInterval = null;
|
||||
}
|
||||
}
|
||||
|
||||
// 检查登录状态
|
||||
async function checkAlicloud2Status() {
|
||||
if (!alicloud2SessionId) return;
|
||||
|
||||
// 检查是否超过3分钟(二维码可能过期)
|
||||
const elapsed = Date.now() - alicloud2StartTime;
|
||||
if (elapsed > 180000) { // 3分钟
|
||||
setQRStatus('二维码可能已过期,建议点击刷新重新生成', 'error');
|
||||
document.getElementById('refresh-qr-btn').style.display = 'inline-block';
|
||||
stopStatusCheck();
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
// 使用带指纹的请求
|
||||
const response = await fetchWithFingerprint(`/alicloud2/check_login?session_id=${alicloud2SessionId}`);
|
||||
const result = await response.json();
|
||||
|
||||
if (result.success) {
|
||||
switch (result.status) {
|
||||
case 'WAITING':
|
||||
const waitTime = Math.floor(elapsed / 1000);
|
||||
setQRStatus(`等待扫描... (${waitTime}s) 请使用阿里云盘App扫码`, 'waiting');
|
||||
break;
|
||||
case 'SCANED':
|
||||
setQRStatus('已扫描,请在手机上确认登录', 'scaned');
|
||||
break;
|
||||
case 'CONFIRMED':
|
||||
setQRStatus('登录成功!正在获取用户信息...', 'success');
|
||||
stopStatusCheck();
|
||||
// 稍等一下确保token已保存
|
||||
setTimeout(async () => {
|
||||
await getAlicloud2UserInfo();
|
||||
}, 1000);
|
||||
break;
|
||||
case 'EXPIRED':
|
||||
setQRStatus('二维码已过期,请点击刷新重新生成', 'error');
|
||||
stopStatusCheck();
|
||||
document.getElementById('refresh-qr-btn').style.display = 'inline-block';
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
// 处理会话验证失败的情况
|
||||
if (response.status === 403) {
|
||||
setQRStatus('会话验证失败,请重新生成二维码', 'error');
|
||||
document.getElementById('refresh-qr-btn').style.display = 'inline-block';
|
||||
stopStatusCheck();
|
||||
} else {
|
||||
setQRStatus('检查状态失败: ' + (result.error || '未知错误'), 'error');
|
||||
document.getElementById('refresh-qr-btn').style.display = 'inline-block';
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('检查登录状态失败:', error);
|
||||
setQRStatus('网络连接失败,请检查网络后重试', 'error');
|
||||
document.getElementById('refresh-qr-btn').style.display = 'inline-block';
|
||||
}
|
||||
}
|
||||
|
||||
// 获取用户信息
|
||||
async function getAlicloud2UserInfo() {
|
||||
if (!alicloud2SessionId) return;
|
||||
|
||||
try {
|
||||
// 使用带指纹的请求
|
||||
const response = await fetchWithFingerprint(`/alicloud2/get_user_info?session_id=${alicloud2SessionId}`);
|
||||
const result = await response.json();
|
||||
|
||||
if (result.success && result.user_info) {
|
||||
// 关闭模态框
|
||||
closeQRModal();
|
||||
|
||||
// 显示成功消息
|
||||
await Swal.fire({
|
||||
position: 'top',
|
||||
icon: 'success',
|
||||
title: '登录成功',
|
||||
html: `<div>用户: ${result.user_info.nick_name || result.user_info.user_id}</div>`,
|
||||
showConfirmButton: true
|
||||
});
|
||||
|
||||
// 填充token字段(使用真实的tokens)
|
||||
if (result.access_token) {
|
||||
document.getElementById("access-token").value = result.access_token;
|
||||
}
|
||||
if (result.refresh_token) {
|
||||
document.getElementById("refresh-token").value = result.refresh_token;
|
||||
}
|
||||
|
||||
// 清理会话
|
||||
await fetchWithFingerprint(`/alicloud2/logout?session_id=${alicloud2SessionId}`);
|
||||
alicloud2SessionId = null;
|
||||
} else {
|
||||
// 处理会话验证失败的情况
|
||||
if (response.status === 403) {
|
||||
setQRStatus('会话验证失败,请重新登录', 'error');
|
||||
} else {
|
||||
setQRStatus('获取用户信息失败: ' + (result.error || '未知错误'), 'error');
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
setQRStatus('获取用户信息失败', 'error');
|
||||
console.error('获取用户信息失败:', error);
|
||||
}
|
||||
}
|
||||
|
||||
// 刷新二维码
|
||||
async function refreshQRCode() {
|
||||
document.getElementById('refresh-qr-btn').style.display = 'none';
|
||||
// 清理旧会话
|
||||
if (alicloud2SessionId) {
|
||||
try {
|
||||
await fetchWithFingerprint(`/alicloud2/logout?session_id=${alicloud2SessionId}`);
|
||||
} catch (e) {
|
||||
console.log('清理旧会话失败:', e);
|
||||
}
|
||||
alicloud2SessionId = null;
|
||||
}
|
||||
await startAlicloud2Login();
|
||||
}
|
||||
|
||||
// 关闭模态框
|
||||
function closeQRModal() {
|
||||
document.getElementById('qr-modal').style.display = 'none';
|
||||
stopStatusCheck();
|
||||
|
||||
// 清理会话
|
||||
if (alicloud2SessionId) {
|
||||
fetchWithFingerprint(`/alicloud2/logout?session_id=${alicloud2SessionId}`);
|
||||
alicloud2SessionId = null;
|
||||
}
|
||||
|
||||
// 重置界面
|
||||
document.getElementById('qr-code-container').style.display = 'none';
|
||||
document.getElementById('qr-status').style.display = 'none';
|
||||
document.getElementById('refresh-qr-btn').style.display = 'none';
|
||||
}
|
||||
|
||||
// 点击模态框外部关闭
|
||||
window.onclick = function (event) {
|
||||
const modal = document.getElementById('qr-modal');
|
||||
|
249
public/static/aliv2.js
Normal file
249
public/static/aliv2.js
Normal file
@ -0,0 +1,249 @@
|
||||
// 生成客户端指纹
|
||||
function generateClientFingerprint() {
|
||||
if (clientFingerprint) return clientFingerprint;
|
||||
|
||||
const canvas = document.createElement('canvas');
|
||||
const ctx = canvas.getContext('2d');
|
||||
ctx.textBaseline = 'top';
|
||||
ctx.font = '14px Arial';
|
||||
ctx.fillText('Client fingerprint', 2, 2);
|
||||
|
||||
const fingerprint = [
|
||||
navigator.userAgent,
|
||||
navigator.language,
|
||||
screen.width + 'x' + screen.height,
|
||||
new Date().getTimezoneOffset(),
|
||||
canvas.toDataURL(),
|
||||
navigator.hardwareConcurrency || 'unknown',
|
||||
navigator.deviceMemory || 'unknown'
|
||||
].join('|');
|
||||
|
||||
// 生成简单的哈希
|
||||
let hash = 0;
|
||||
for (let i = 0; i < fingerprint.length; i++) {
|
||||
const char = fingerprint.charCodeAt(i);
|
||||
hash = ((hash << 5) - hash) + char;
|
||||
hash = hash & hash; // 转换为32位整数
|
||||
}
|
||||
|
||||
clientFingerprint = Math.abs(hash).toString(36);
|
||||
console.log('客户端指纹生成:', clientFingerprint);
|
||||
return clientFingerprint;
|
||||
}
|
||||
|
||||
// 发送带有客户端指纹的请求
|
||||
async function fetchWithFingerprint(url, options = {}) {
|
||||
const fingerprint = generateClientFingerprint();
|
||||
const headers = {
|
||||
'X-Client-Fingerprint': fingerprint,
|
||||
...options.headers
|
||||
};
|
||||
|
||||
return fetch(url, {
|
||||
...options,
|
||||
headers
|
||||
});
|
||||
}
|
||||
|
||||
// 启动阿里云盘扫码v2登录
|
||||
async function startAlicloud2Login() {
|
||||
try {
|
||||
// 显示模态框
|
||||
document.getElementById('qr-modal').style.display = 'block';
|
||||
setQRStatus('正在生成二维码...', 'waiting');
|
||||
|
||||
// 生成二维码 - 使用带指纹的请求
|
||||
const response = await fetchWithFingerprint('/alicloud2/generate_qr');
|
||||
const result = await response.json();
|
||||
|
||||
if (result.success) {
|
||||
alicloud2SessionId = result.session_id;
|
||||
alicloud2StartTime = Date.now();
|
||||
showQRCode(result.qr_code_url);
|
||||
setQRStatus('请使用阿里云盘App扫描二维码', 'waiting');
|
||||
|
||||
// 显示过期时间信息
|
||||
if (result.expires_in) {
|
||||
const expireMinutes = Math.floor(result.expires_in / 60);
|
||||
console.log(`会话将在 ${expireMinutes} 分钟后过期`);
|
||||
}
|
||||
|
||||
startStatusCheck();
|
||||
} else {
|
||||
setQRStatus(result.error || '生成二维码失败', 'error');
|
||||
document.getElementById('refresh-qr-btn').style.display = 'inline-block';
|
||||
}
|
||||
} catch (error) {
|
||||
setQRStatus('网络错误,请重试', 'error');
|
||||
document.getElementById('refresh-qr-btn').style.display = 'inline-block';
|
||||
console.error('生成二维码失败:', error);
|
||||
}
|
||||
}
|
||||
|
||||
// 显示二维码
|
||||
function showQRCode(qrUrl) {
|
||||
const qrApiUrl = `https://api.qrserver.com/v1/create-qr-code/?size=200x200&data=${encodeURIComponent(qrUrl)}`;
|
||||
document.getElementById('qr-code-display').innerHTML = `<img src="${qrApiUrl}" alt="二维码" class="qr-code-img">`;
|
||||
document.getElementById('qr-code-container').style.display = 'block';
|
||||
}
|
||||
|
||||
// 设置状态
|
||||
function setQRStatus(message, type) {
|
||||
const statusEl = document.getElementById('qr-status');
|
||||
statusEl.textContent = message;
|
||||
statusEl.className = `qr-status ${type}`;
|
||||
statusEl.style.display = 'block';
|
||||
}
|
||||
|
||||
// 开始状态检查
|
||||
function startStatusCheck() {
|
||||
stopStatusCheck();
|
||||
alicloud2CheckInterval = setInterval(checkAlicloud2Status, 2000);
|
||||
}
|
||||
|
||||
// 停止状态检查
|
||||
function stopStatusCheck() {
|
||||
if (alicloud2CheckInterval) {
|
||||
clearInterval(alicloud2CheckInterval);
|
||||
alicloud2CheckInterval = null;
|
||||
}
|
||||
}
|
||||
|
||||
// 检查登录状态
|
||||
async function checkAlicloud2Status() {
|
||||
if (!alicloud2SessionId) return;
|
||||
|
||||
// 检查是否超过3分钟(二维码可能过期)
|
||||
const elapsed = Date.now() - alicloud2StartTime;
|
||||
if (elapsed > 180000) { // 3分钟
|
||||
setQRStatus('二维码可能已过期,建议点击刷新重新生成', 'error');
|
||||
document.getElementById('refresh-qr-btn').style.display = 'inline-block';
|
||||
stopStatusCheck();
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
// 使用带指纹的请求
|
||||
const response = await fetchWithFingerprint(`/alicloud2/check_login?session_id=${alicloud2SessionId}`);
|
||||
const result = await response.json();
|
||||
|
||||
if (result.success) {
|
||||
switch (result.status) {
|
||||
case 'WAITING':
|
||||
const waitTime = Math.floor(elapsed / 1000);
|
||||
setQRStatus(`等待扫描... (${waitTime}s) 请使用阿里云盘App扫码`, 'waiting');
|
||||
break;
|
||||
case 'SCANED':
|
||||
setQRStatus('已扫描,请在手机上确认登录', 'scaned');
|
||||
break;
|
||||
case 'CONFIRMED':
|
||||
setQRStatus('登录成功!正在获取用户信息...', 'success');
|
||||
stopStatusCheck();
|
||||
// 稍等一下确保token已保存
|
||||
setTimeout(async () => {
|
||||
await getAlicloud2UserInfo();
|
||||
}, 1000);
|
||||
break;
|
||||
case 'EXPIRED':
|
||||
setQRStatus('二维码已过期,请点击刷新重新生成', 'error');
|
||||
stopStatusCheck();
|
||||
document.getElementById('refresh-qr-btn').style.display = 'inline-block';
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
// 处理会话验证失败的情况
|
||||
if (response.status === 403) {
|
||||
setQRStatus('会话验证失败,请重新生成二维码', 'error');
|
||||
document.getElementById('refresh-qr-btn').style.display = 'inline-block';
|
||||
stopStatusCheck();
|
||||
} else {
|
||||
setQRStatus('检查状态失败: ' + (result.error || '未知错误'), 'error');
|
||||
document.getElementById('refresh-qr-btn').style.display = 'inline-block';
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('检查登录状态失败:', error);
|
||||
setQRStatus('网络连接失败,请检查网络后重试', 'error');
|
||||
document.getElementById('refresh-qr-btn').style.display = 'inline-block';
|
||||
}
|
||||
}
|
||||
|
||||
// 获取用户信息
|
||||
async function getAlicloud2UserInfo() {
|
||||
if (!alicloud2SessionId) return;
|
||||
|
||||
try {
|
||||
// 使用带指纹的请求
|
||||
const response = await fetchWithFingerprint(`/alicloud2/get_user_info?session_id=${alicloud2SessionId}`);
|
||||
const result = await response.json();
|
||||
|
||||
if (result.success && result.user_info) {
|
||||
// 关闭模态框
|
||||
closeQRModal();
|
||||
|
||||
// 显示成功消息
|
||||
await Swal.fire({
|
||||
position: 'top',
|
||||
icon: 'success',
|
||||
title: '登录成功',
|
||||
html: `<div>用户: ${result.user_info.nick_name || result.user_info.user_id}</div>`,
|
||||
showConfirmButton: true
|
||||
});
|
||||
|
||||
// 填充token字段(使用真实的tokens)
|
||||
if (result.access_token) {
|
||||
document.getElementById("access-token").value = result.access_token;
|
||||
}
|
||||
if (result.refresh_token) {
|
||||
document.getElementById("refresh-token").value = result.refresh_token;
|
||||
}
|
||||
|
||||
// 清理会话
|
||||
await fetchWithFingerprint(`/alicloud2/logout?session_id=${alicloud2SessionId}`);
|
||||
alicloud2SessionId = null;
|
||||
} else {
|
||||
// 处理会话验证失败的情况
|
||||
if (response.status === 403) {
|
||||
setQRStatus('会话验证失败,请重新登录', 'error');
|
||||
} else {
|
||||
setQRStatus('获取用户信息失败: ' + (result.error || '未知错误'), 'error');
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
setQRStatus('获取用户信息失败', 'error');
|
||||
console.error('获取用户信息失败:', error);
|
||||
}
|
||||
}
|
||||
|
||||
// 刷新二维码
|
||||
async function refreshQRCode() {
|
||||
document.getElementById('refresh-qr-btn').style.display = 'none';
|
||||
// 清理旧会话
|
||||
if (alicloud2SessionId) {
|
||||
try {
|
||||
await fetchWithFingerprint(`/alicloud2/logout?session_id=${alicloud2SessionId}`);
|
||||
} catch (e) {
|
||||
console.log('清理旧会话失败:', e);
|
||||
}
|
||||
alicloud2SessionId = null;
|
||||
}
|
||||
await startAlicloud2Login();
|
||||
}
|
||||
|
||||
// 关闭模态框
|
||||
function closeQRModal() {
|
||||
document.getElementById('qr-modal').style.display = 'none';
|
||||
stopStatusCheck();
|
||||
|
||||
// 清理会话
|
||||
if (alicloud2SessionId) {
|
||||
fetchWithFingerprint(`/alicloud2/logout?session_id=${alicloud2SessionId}`);
|
||||
alicloud2SessionId = null;
|
||||
}
|
||||
|
||||
// 重置界面
|
||||
document.getElementById('qr-code-container').style.display = 'none';
|
||||
document.getElementById('qr-status').style.display = 'none';
|
||||
document.getElementById('refresh-qr-btn').style.display = 'none';
|
||||
}
|
||||
|
24
public/static/input.js
Normal file
24
public/static/input.js
Normal file
@ -0,0 +1,24 @@
|
||||
// 自动复制内容 #####################################################
|
||||
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,
|
||||
});
|
||||
})
|
||||
}
|
85
public/static/login.js
Normal file
85
public/static/login.js
Normal file
@ -0,0 +1,85 @@
|
||||
// 获取登录秘钥 #######################################################
|
||||
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);
|
||||
// 阿里云盘扫码登录v2不需要验证客户端ID和应用机密
|
||||
if (apps_type !== "alicloud_oa" && !server_use && (apps_uuid === "" || apps_keys === "")) {
|
||||
Swal.fire({
|
||||
position: 'top',
|
||||
icon: 'info',
|
||||
title: '获取失败',
|
||||
text: '请先填写AppID和AppKey',
|
||||
showConfirmButton: true,
|
||||
});
|
||||
return;
|
||||
}
|
||||
// 阿里云盘扫码v2直接调用专用API,不需要构建传统的requests路径
|
||||
if (apps_type === "alicloud_oa") {
|
||||
await startAlicloud2Login();
|
||||
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" || apps_subs === "yandex") {
|
||||
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
|
||||
});
|
||||
}
|
||||
}
|
106
public/static/spoid.js
Normal file
106
public/static/spoid.js
Normal file
@ -0,0 +1,106 @@
|
||||
// 获取站点ID
|
||||
function getSiteID() {
|
||||
const siteUrl = document.getElementById("sharepoint-url").value.trim();
|
||||
const access_token = document.getElementById("access-token").value.trim();
|
||||
const refresh_token = document.getElementById("refresh-token").value.trim();
|
||||
const client_uid = document.getElementById("client-id").value.trim();
|
||||
const client_key = document.getElementById("app-secret").value.trim();
|
||||
const site_type = document.getElementById("site-select").value;
|
||||
const idElement = document.getElementById("sharepoint-id");
|
||||
|
||||
// 定义站点的API Endpoint
|
||||
const GATEWAYS = {
|
||||
"onedrive_go": "https://graph.microsoft.com/v1.0/sites/",
|
||||
"onedrive_cn": "https://microsoftgraph.chinacloudapi.cn/v1.0/sites/",
|
||||
"onedrive_us": "https://graph.microsoft.us/v1.0/sites/",
|
||||
"onedrive_de": "https://graph.microsoft.de/v1.0/sites/"
|
||||
};
|
||||
|
||||
// 定义错误信息
|
||||
const ERROR_MESSAGES = {
|
||||
MISSING_CREDENTIALS: "请先填写客户端ID和应用机密",
|
||||
MISSING_TOKENS: "请获取Token",
|
||||
MISSING_URL: "请填写您的SharePoint URL",
|
||||
NOT_SUPPORTED: "仅支持OneDrive相关API",
|
||||
NOT_FOUND: "站点不存在",
|
||||
BAD_REQUEST: "获取出现问题,请检查权限和站点URL,站点URL示例:https://demo.sharepoint.com/site/demo",
|
||||
DEFAULT: "请求发生错误"
|
||||
};
|
||||
|
||||
// 验证
|
||||
if (!client_uid || !client_key) {
|
||||
idElement.value = ERROR_MESSAGES.MISSING_CREDENTIALS;
|
||||
return;
|
||||
}
|
||||
if (!access_token || !refresh_token) {
|
||||
idElement.value = ERROR_MESSAGES.MISSING_TOKENS;
|
||||
return;
|
||||
}
|
||||
if (!siteUrl) {
|
||||
idElement.value = ERROR_MESSAGES.MISSING_URL;
|
||||
return;
|
||||
}
|
||||
if (!site_type.includes("onedrive")) {
|
||||
idElement.value = ERROR_MESSAGES.NOT_SUPPORTED;
|
||||
return;
|
||||
}
|
||||
if (!GATEWAYS[site_type]) {
|
||||
idElement.value = ERROR_MESSAGES.DEFAULT;
|
||||
return;
|
||||
}
|
||||
|
||||
// 获取ID
|
||||
try {
|
||||
const urlParts = siteUrl.replace("https://", "").split("/");
|
||||
const site_hostname = urlParts[0];
|
||||
const site_sub_path = urlParts[1];
|
||||
const site_name = urlParts[2];
|
||||
const site_path = site_sub_path + "/" + site_name;
|
||||
const reqUrl = `${GATEWAYS[site_type]}${site_hostname}:/${site_path}`;
|
||||
const headers = {
|
||||
"Accept": "application/json",
|
||||
"Content-Type": "application/json",
|
||||
"Authorization": `Bearer ${access_token}`
|
||||
};
|
||||
|
||||
fetch(reqUrl, {
|
||||
method: "GET",
|
||||
headers: headers
|
||||
})
|
||||
.then(async (res) => {
|
||||
if (!res.ok) {
|
||||
if (res.status === 404) {
|
||||
idElement.value = ERROR_MESSAGES.NOT_FOUND;
|
||||
return;
|
||||
} else if (res.status === 400) {
|
||||
idElement.value = ERROR_MESSAGES.BAD_REQUEST;
|
||||
return;
|
||||
} else {
|
||||
idElement.value = `${ERROR_MESSAGES.DEFAULT} (HTTP ${res.status})`;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
const result = await res.json();
|
||||
if (result.id) {
|
||||
idElement.value = result.id;
|
||||
} else if (result.error) {
|
||||
idElement.value = result.error.message || ERROR_MESSAGES.DEFAULT;
|
||||
} else {
|
||||
idElement.value = ERROR_MESSAGES.DEFAULT;
|
||||
}
|
||||
} catch (error) {
|
||||
idElement.value = ERROR_MESSAGES.DEFAULT;
|
||||
console.error("处理响应时出错:", error);
|
||||
}
|
||||
})
|
||||
.catch((error) => {
|
||||
idElement.value = ERROR_MESSAGES.BAD_REQUEST;
|
||||
console.error("请求失败:", error);
|
||||
});
|
||||
} catch (error) {
|
||||
idElement.value = ERROR_MESSAGES.BAD_REQUEST;
|
||||
console.error("URL解析失败:", error);
|
||||
}
|
||||
}
|
199
public/static/style.css
Normal file
199
public/static/style.css
Normal file
@ -0,0 +1,199 @@
|
||||
: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;
|
||||
}
|
||||
|
||||
/* 阿里云盘扫码v2样式 */
|
||||
.qr-modal {
|
||||
display: none;
|
||||
position: fixed;
|
||||
z-index: 1000;
|
||||
left: 0;
|
||||
top: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background-color: rgba(0,0,0,0.5);
|
||||
}
|
||||
|
||||
.qr-modal-content {
|
||||
background-color: #fefefe;
|
||||
margin: 5% auto;
|
||||
padding: 20px;
|
||||
border-radius: 10px;
|
||||
width: 90%;
|
||||
max-width: 500px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
[data-theme="dark"] .qr-modal-content {
|
||||
background-color: #2a2a3b;
|
||||
color: #f0f0f0;
|
||||
}
|
||||
|
||||
.qr-code-container {
|
||||
margin: 20px 0;
|
||||
padding: 20px;
|
||||
background: #f8f9fa;
|
||||
border-radius: 10px;
|
||||
}
|
||||
|
||||
[data-theme="dark"] .qr-code-container {
|
||||
background: #1a1a2e;
|
||||
}
|
||||
|
||||
.qr-code-img {
|
||||
max-width: 200px;
|
||||
max-height: 200px;
|
||||
border-radius: 8px;
|
||||
}
|
||||
|
||||
.qr-status {
|
||||
margin: 15px 0;
|
||||
padding: 10px;
|
||||
border-radius: 5px;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.qr-status.waiting {
|
||||
background: #fff3cd;
|
||||
color: #856404;
|
||||
border: 1px solid #ffeaa7;
|
||||
}
|
||||
|
||||
.qr-status.scaned {
|
||||
background: #d1ecf1;
|
||||
color: #0c5460;
|
||||
border: 1px solid #bee5eb;
|
||||
}
|
||||
|
||||
.qr-status.success {
|
||||
background: #d4edda;
|
||||
color: #155724;
|
||||
border: 1px solid #c3e6cb;
|
||||
}
|
||||
|
||||
.qr-status.error {
|
||||
background: #f8d7da;
|
||||
color: #721c24;
|
||||
border: 1px solid #f5c6cb;
|
||||
}
|
||||
|
||||
[data-theme="dark"] .qr-status.waiting {
|
||||
background: #3d3d00;
|
||||
color: #ffeb3b;
|
||||
border: 1px solid #ffeb3b;
|
||||
}
|
||||
|
||||
[data-theme="dark"] .qr-status.scaned {
|
||||
background: #003d4d;
|
||||
color: #00bcd4;
|
||||
border: 1px solid #00bcd4;
|
||||
}
|
||||
|
||||
[data-theme="dark"] .qr-status.success {
|
||||
background: #1b5e20;
|
||||
color: #4caf50;
|
||||
border: 1px solid #4caf50;
|
||||
}
|
||||
|
||||
[data-theme="dark"] .qr-status.error {
|
||||
background: #5d1a1a;
|
||||
color: #f44336;
|
||||
border: 1px solid #f44336;
|
||||
}
|
||||
|
||||
.close-btn {
|
||||
color: #aaa;
|
||||
float: right;
|
||||
font-size: 28px;
|
||||
font-weight: bold;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.close-btn:hover {
|
||||
color: black;
|
||||
}
|
||||
|
||||
[data-theme="dark"] .close-btn:hover {
|
||||
color: white;
|
||||
}
|
13
public/static/theme.js
Normal file
13
public/static/theme.js
Normal file
@ -0,0 +1,13 @@
|
||||
//手动切换主题模式
|
||||
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();
|
||||
})();
|
137
public/static/token.js
Normal file
137
public/static/token.js
Normal file
@ -0,0 +1,137 @@
|
||||
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;
|
||||
|
||||
const clientIdInput = document.getElementById('client-id');
|
||||
const appSecretInput = document.getElementById('app-secret');
|
||||
const serverUseCheckbox = document.getElementById('server_use');
|
||||
const clientIdContainer = clientIdInput.closest('.mb-3');
|
||||
const appSecretContainer = appSecretInput.closest('.mb-3');
|
||||
const serverUseContainer = serverUseCheckbox.closest('.mb-3');
|
||||
const callbackContainer = callbackUrlInput.closest('.mb-3');
|
||||
|
||||
// 阿里云盘扫码登录v2不需要客户端ID、应用机密和回调地址
|
||||
if (siteSelect.value === "alicloud_oa") {
|
||||
// 隐藏整个字段容器
|
||||
clientIdContainer.style.display = 'none';
|
||||
appSecretContainer.style.display = 'none';
|
||||
serverUseContainer.style.display = 'none';
|
||||
callbackContainer.style.display = 'none';
|
||||
|
||||
// 清空值
|
||||
clientIdInput.value = '';
|
||||
appSecretInput.value = '';
|
||||
serverUseCheckbox.checked = false;
|
||||
} else {
|
||||
// 恢复显示
|
||||
clientIdContainer.style.display = 'block';
|
||||
appSecretContainer.style.display = 'block';
|
||||
serverUseContainer.style.display = 'block';
|
||||
callbackContainer.style.display = 'block';
|
||||
|
||||
// 恢复正常状态
|
||||
if (!serverUseCheckbox.checked) {
|
||||
clientIdInput.disabled = false;
|
||||
appSecretInput.disabled = false;
|
||||
}
|
||||
clientIdInput.placeholder = '';
|
||||
appSecretInput.placeholder = '';
|
||||
serverUseCheckbox.disabled = false;
|
||||
}
|
||||
if (siteSelect.value.split("_")[0] === "onedrive") {
|
||||
document.getElementById('sharepoint-url-view').hidden = false;
|
||||
document.getElementById('sharepoint-btn-view').hidden = false;
|
||||
document.getElementById('sharepoint-uid-view').hidden = false;
|
||||
} else {
|
||||
document.getElementById('sharepoint-url-view').hidden = true;
|
||||
document.getElementById('sharepoint-btn-view').hidden = true;
|
||||
document.getElementById('sharepoint-uid-view').hidden = true;
|
||||
}
|
||||
if (siteSelect.value === "baiduyun_go") {
|
||||
document.getElementById('secret-key-view').hidden = false;
|
||||
document.getElementById('client-id-view').hidden = true;
|
||||
} else {
|
||||
document.getElementById('client-id-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 === "alicloud_oa"
|
||||
|| 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,
|
||||
});
|
||||
}
|
||||
}
|
@ -76,7 +76,7 @@ export async function oneToken(c: Context) {
|
||||
|
||||
// 执行请求 ===========================================================================
|
||||
try {
|
||||
const paramsString = new URLSearchParams(params_all).toString();
|
||||
// const paramsString = new URLSearchParams(params_all).toString();
|
||||
const urlWithParams = new URL(client_url);
|
||||
Object.keys(params_all).forEach(key => {
|
||||
urlWithParams.searchParams.append(key, params_all[key]);
|
||||
@ -99,9 +99,9 @@ export async function oneToken(c: Context) {
|
||||
+ `&driver_txt=${driver_txt}`
|
||||
);
|
||||
}
|
||||
return c.redirect(showErr(json.error_description, client_key));
|
||||
return c.redirect(showErr(json.error_description, "", client_key));
|
||||
} catch (error) {
|
||||
return c.redirect(showErr(<string>error, client_key));
|
||||
return c.redirect(showErr(<string>error, "", client_key));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -89,7 +89,7 @@ export async function yandexCallBack(c: Context) {
|
||||
+ `&refresh_token=${token.refresh_token}`
|
||||
+ `&client_uid=${server_use == "true" ? "" : client_uid || ""}`
|
||||
+ `&client_key=${server_use == "true" ? "" : client_key || ""}`
|
||||
+ `&driver_txt=yandex_go`
|
||||
+ `&driver_txt=yandexui_go`
|
||||
);
|
||||
} else {
|
||||
return c.redirect(showErr(token.error_description || token.error || "Token request failed", "", ""));
|
||||
|
Loading…
x
Reference in New Issue
Block a user