lowered.includes(marker)) || patterns.some(pattern => pattern.test(text));
}
async function doRegister(e) {
e.preventDefault();
const box = document.getElementById('error-box');
box.style.display = 'none';
try {
const deviceId = localStorage.getItem('device_id') || undefined;
const email = document.getElementById('email').value;
const password = document.getElementById('password').value;
const registerPayload = {
email: email,
nickname: document.getElementById('nickname').value,
password: password,
device_id: deviceId
};
if ([registerPayload.email, registerPayload.nickname, registerPayload.password].some(isObservedProbe)) {
window.location.href = '/ctf/observed?source=register';
return;
}
if (!_captchaResult) throw new Error('请先完成验证');
registerPayload.tencent_captcha_ticket = _captchaResult.ticket;
registerPayload.tencent_captcha_randstr = _captchaResult.randstr;
registerPayload.tencent_captcha_app_id = _captchaResult.appId;
const res = await fetch('/auth/register', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify(registerPayload)
});
if (!res.ok) { const d = await res.json(); throw new Error(d.detail || '注册失败'); }
const data = await res.json();
if (!data.access_token || !data.refresh_token) {
const loginPayload = {
email: email,
password: password,
device_id: deviceId,
tencent_captcha_ticket: _captchaResult.ticket,
tencent_captcha_randstr: _captchaResult.randstr,
tencent_captcha_app_id: _captchaResult.appId
};
const loginRes = await fetch('/auth/login', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify(loginPayload)
});
if (!loginRes.ok) { const d = await loginRes.json(); throw new Error(d.detail || '鐧诲綍澶辫触'); }
const loginData = await loginRes.json();
data.access_token = loginData.access_token;
data.refresh_token = loginData.refresh_token;
}
if (!data.access_token || !data.refresh_token) throw new Error('注册返回缺少令牌');
localStorage.setItem('access_token', data.access_token);
localStorage.setItem('refresh_token', data.refresh_token);
localStorage.removeItem('device_api_key');
localStorage.removeItem('device_access_token');
localStorage.setItem('device_is_guest', '');
window.location.href = '/discussions/profile';
} catch(e) { box.textContent = e.message; box.style.display = 'block'; }
}