新增朋友圈作者筛选;新增前台登入登出;深度优化
This commit is contained in:
@@ -4,7 +4,8 @@ function modify_m_bottom_music_button_link() {
|
||||
if (!music) return;
|
||||
music.addEventListener('click', function (event) {
|
||||
event.preventDefault();
|
||||
mu_box_show();
|
||||
if (!box_up) mu_box_show();
|
||||
else mu_box_hide(0);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -24,13 +25,209 @@ function modify_m_bottom_music_button_link() {
|
||||
// });
|
||||
// }
|
||||
|
||||
// 登录逻辑
|
||||
let csrfToken = '';
|
||||
let publicKey = '';
|
||||
let loginTimer = null;
|
||||
let countdownSeconds = 3;
|
||||
const login_modal = document.getElementById('customLoginModal');
|
||||
const login_closeBtn = document.getElementById('closeLoginModal');
|
||||
const login_loginBtn = document.getElementById('customLoginBtn');
|
||||
|
||||
// 获取令牌及公钥
|
||||
async function fetchCSRFToken() {
|
||||
login_modal.classList.add('show');
|
||||
login_loginBtn.disabled = true;
|
||||
login_loginBtn.textContent = '加载中...';
|
||||
|
||||
try {
|
||||
const response = await fetch('/login', { credentials: 'include' });
|
||||
if (response.url.includes('/uc')) {
|
||||
return 'logged';
|
||||
}
|
||||
const htmlText = await response.text();
|
||||
const parser = new DOMParser();
|
||||
const doc = parser.parseFromString(htmlText, 'text/html');
|
||||
// 获取 CSRF Token
|
||||
const csrfInput = doc.querySelector('input[name="_csrf"]');
|
||||
if (!csrfInput || !csrfInput.value) {
|
||||
throw new Error('页面未找到 CSRF 令牌');
|
||||
}
|
||||
csrfToken = csrfInput.value;
|
||||
// 获取 PublicKey
|
||||
const publicKeyMatch = htmlText.match(/const publicKey = "([^"]+)";/);
|
||||
if (!publicKeyMatch || !publicKeyMatch[1]) {
|
||||
throw new Error('页面未找到 PublicKey');
|
||||
}
|
||||
publicKey = publicKeyMatch[1].replace(/\\\//g, '/');
|
||||
return 'ok';
|
||||
} catch (err) {
|
||||
return 'error';
|
||||
}
|
||||
}
|
||||
|
||||
// 打开弹窗逻辑
|
||||
async function open_login_box() {
|
||||
if (loginTimer) {
|
||||
clearInterval(loginTimer);
|
||||
}
|
||||
countdownSeconds = 3;
|
||||
const success = await fetchCSRFToken();
|
||||
if (success === 'logged') {
|
||||
cocoMessage.success('您已经署名过了,请刷新');
|
||||
login_modal.classList.remove('show');
|
||||
} else if (success === 'ok') {
|
||||
loginTimer = setInterval(() => {
|
||||
if (countdownSeconds > 0) {
|
||||
login_loginBtn.textContent = '请稍等...' + countdownSeconds;
|
||||
} else {
|
||||
clearInterval(loginTimer);
|
||||
login_loginBtn.textContent = '署 名';
|
||||
login_loginBtn.disabled = false;
|
||||
}
|
||||
countdownSeconds--;
|
||||
}, 1000);
|
||||
} else {
|
||||
cocoMessage.error('服务器错误,请刷新');
|
||||
login_modal.classList.remove('show');
|
||||
}
|
||||
}
|
||||
|
||||
// 关闭弹窗
|
||||
login_closeBtn.addEventListener('click', () => {
|
||||
login_modal.classList.remove('show');
|
||||
});
|
||||
|
||||
// 加密逻辑
|
||||
function encryptPassword(password) {
|
||||
try {
|
||||
const encrypt = new JSEncrypt();
|
||||
encrypt.setPublicKey(publicKey);
|
||||
return encrypt.encrypt(password);
|
||||
} catch (e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
// 提交登录
|
||||
login_loginBtn.addEventListener('click', async () => {
|
||||
const username = document.getElementById('customUsername').value.trim();
|
||||
const password = document.getElementById('customPassword').value.trim();
|
||||
if (!username || !password) {
|
||||
cocoMessage.warning('请先填写信息');
|
||||
return;
|
||||
}
|
||||
const encryptedPwd = encryptPassword(password);
|
||||
login_loginBtn.disabled = true;
|
||||
login_loginBtn.textContent = '验证中...';
|
||||
try {
|
||||
countdownSeconds = 3
|
||||
const response = await fetch('/login', {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/x-www-form-urlencoded',
|
||||
},
|
||||
credentials: 'include',
|
||||
body: new URLSearchParams({
|
||||
_csrf: csrfToken,
|
||||
username: username,
|
||||
password: encryptedPwd,
|
||||
'remember-me': 'true'
|
||||
})
|
||||
});
|
||||
// 核心细节:判断最终落点 URL
|
||||
const finalUrl = response.url;
|
||||
if (loginTimer) {
|
||||
clearInterval(loginTimer);
|
||||
}
|
||||
if (finalUrl.includes('/uc')) {
|
||||
cocoMessage.success('署名成功,正在跳转...');
|
||||
login_loginBtn.textContent = '跳转中...';
|
||||
setTimeout(() => {
|
||||
window.location.reload();
|
||||
}, 800);
|
||||
} else if (finalUrl.includes('error=invalid-credential')) {
|
||||
cocoMessage.warning('署名人与心上锁不匹配');
|
||||
fetchCSRFToken();
|
||||
} else {
|
||||
cocoMessage.error('速度过快,请稍后重试');
|
||||
}
|
||||
} catch (err) {
|
||||
cocoMessage.error('服务器连接失败');
|
||||
} finally {
|
||||
loginTimer = setInterval(() => {
|
||||
if (countdownSeconds > 0) {
|
||||
login_loginBtn.textContent = '请稍等...' + countdownSeconds;
|
||||
} else {
|
||||
clearInterval(loginTimer);
|
||||
login_loginBtn.textContent = '署 名';
|
||||
login_loginBtn.disabled = false;
|
||||
}
|
||||
countdownSeconds--;
|
||||
}, 1000);
|
||||
}
|
||||
});
|
||||
|
||||
// 回车登录
|
||||
document.addEventListener("keydown", function (e) {
|
||||
if (e.key === "Enter") {
|
||||
const modal = document.getElementById("customLoginModal");
|
||||
if (modal.classList.contains("show")) {
|
||||
document.getElementById("customLoginBtn").click();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
// 退出登录
|
||||
async function customLogout() {
|
||||
try {
|
||||
const getResponse = await fetch('/logout', { credentials: 'include' });
|
||||
const htmlText = await getResponse.text();
|
||||
const parser = new DOMParser();
|
||||
const doc = parser.parseFromString(htmlText, 'text/html');
|
||||
const logoutCsrfToken = doc.querySelector('input[name="_csrf"]')?.value;
|
||||
if (!logoutCsrfToken) {
|
||||
cocoMessage.error('页面未找到 CSRF 令牌');
|
||||
return;
|
||||
}
|
||||
const postResponse = await fetch('/logout', {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/x-www-form-urlencoded',
|
||||
},
|
||||
credentials: 'include',
|
||||
body: new URLSearchParams({
|
||||
'_csrf': logoutCsrfToken
|
||||
})
|
||||
});
|
||||
if (postResponse.ok) {
|
||||
cocoMessage.success('您已成功退出登录');
|
||||
setTimeout(() => {
|
||||
window.location.reload();
|
||||
}, 800);
|
||||
} else {
|
||||
throw new Error('退出请求被拒绝');
|
||||
}
|
||||
} catch (err) {
|
||||
console.error('Logout Error:', err);
|
||||
cocoMessage.error('退出失败,请手动刷新页面');
|
||||
}
|
||||
}
|
||||
|
||||
function showPixarCard() {
|
||||
const wrapper = document.getElementById("pixarNoticeWrapper");
|
||||
wrapper.style.display = "flex";
|
||||
}
|
||||
|
||||
function hidePixarCard() {
|
||||
const wrapper = document.getElementById("pixarNoticeWrapper");
|
||||
wrapper.style.display = "none";
|
||||
}
|
||||
|
||||
|
||||
|
||||
function confirmPixarAction() {
|
||||
customLogout();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user