Files
weibo_signin/frontend/templates/add_account.html

150 lines
7.4 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.
{% extends "base.html" %}
{% block title %}添加账号 - 微博超话签到{% endblock %}
{% block extra_css %}
<style>
.qr-wrapper { text-align: center; padding: 40px 20px; }
.qr-box {
background: #f8fafc;
padding: 28px;
border-radius: 24px;
display: inline-block;
border: 1.5px solid #e2e8f0;
margin-bottom: 20px;
}
.qr-box img { width: 220px; height: 220px; display: block; margin: 0 auto 14px; border-radius: 12px; }
#qr-timer { color: #94a3b8; font-size: 14px; }
#qr-status { margin-top: 18px; font-size: 16px; min-height: 24px; font-weight: 500; }
.status-waiting { color: #64748b; }
.status-scanned { color: #f59e0b; }
.status-success { color: #10b981; }
.status-error { color: #ef4444; }
.info-box {
background: #f8fafc; border-radius: 16px; padding: 18px 22px; margin-top: 24px;
font-size: 14px; color: #64748b; text-align: left; max-width: 480px;
margin-left: auto; margin-right: auto; border: 1px solid #e2e8f0;
}
.info-box li { margin: 6px 0; line-height: 1.7; }
</style>
{% endblock %}
{% block content %}
<div style="max-width: 560px; margin: 0 auto;">
<div style="display:flex; align-items:center; justify-content:space-between; margin-bottom:24px;">
<h1 style="font-size:24px; font-weight:700; color:#1e293b;">📱 添加微博账号</h1>
<a href="{{ url_for('dashboard') }}" class="btn btn-secondary">返回</a>
</div>
<div class="card">
<div class="qr-wrapper">
<button id="generate-qr-btn" class="btn btn-primary" style="font-size:18px; padding:16px 40px; border-radius:18px;">
📱 生成二维码
</button>
<div id="qr-display" style="display:none;">
<div class="qr-box">
<img id="qr-image" src="" alt="QR Code">
<p style="color:#64748b; margin:0 0 4px;">请使用微博 APP 扫描</p>
<p id="qr-timer">有效期: 3:00</p>
</div>
<div id="qr-status" class="status-waiting">等待扫码...</div>
</div>
</div>
<div class="info-box">
<p style="margin:0 0 8px; font-weight:600; color:#334155;">使用说明</p>
<ol style="margin:0; padding-left:20px;">
<li>点击"生成二维码"</li>
<li>打开手机微博 APP扫描二维码</li>
<li>在手机上点击"确认登录"</li>
<li>等待自动完成,跳转到控制台</li>
</ol>
</div>
</div>
</div>
<script>
let pollInterval = null, timerInterval = null, currentQrid = null, timeLeft = 180, isProcessing = false;
document.getElementById('generate-qr-btn').addEventListener('click', async function() {
try {
const resp = await fetch('/api/weibo/qrcode/generate', {method:'POST', headers:{'Content-Type':'application/json'}});
const data = await resp.json();
if (!data.success) { alert('生成二维码失败: ' + (data.error || '未知错误')); return; }
currentQrid = data.qrid;
document.getElementById('qr-image').src = data.qr_image;
document.getElementById('generate-qr-btn').style.display = 'none';
document.getElementById('qr-display').style.display = 'block';
document.getElementById('qr-status').textContent = '等待扫码...';
document.getElementById('qr-status').className = 'status-waiting';
timeLeft = 180;
updateTimer();
timerInterval = setInterval(updateTimer, 1000);
pollInterval = setInterval(checkQRStatus, 2000);
} catch(e) { alert('生成二维码失败: ' + e.message); }
});
function updateTimer() {
if (timeLeft <= 0) {
clearInterval(timerInterval); clearInterval(pollInterval);
document.getElementById('qr-status').textContent = '二维码已过期,请重新生成';
document.getElementById('qr-status').className = 'status-error';
document.getElementById('generate-qr-btn').style.display = 'inline-block';
document.getElementById('qr-display').style.display = 'none';
return;
}
const m = Math.floor(timeLeft / 60), s = timeLeft % 60;
document.getElementById('qr-timer').textContent = `有效期: ${m}:${s.toString().padStart(2,'0')}`;
timeLeft--;
}
async function checkQRStatus() {
if (isProcessing) return;
isProcessing = true;
try {
const resp = await fetch(`/api/weibo/qrcode/check/${currentQrid}`);
const data = await resp.json();
if (data.status === 'waiting') {
document.getElementById('qr-status').textContent = '等待扫码...';
document.getElementById('qr-status').className = 'status-waiting';
} else if (data.status === 'scanned') {
document.getElementById('qr-status').textContent = '✓ 已扫码,请在手机上确认登录';
document.getElementById('qr-status').className = 'status-scanned';
} else if (data.status === 'success') {
clearInterval(pollInterval); pollInterval = null; clearInterval(timerInterval);
document.getElementById('qr-status').textContent = '✓ 登录成功,正在添加账号...';
document.getElementById('qr-status').className = 'status-success';
await new Promise(r => setTimeout(r, 500));
const addResp = await fetch('/api/weibo/qrcode/add-account', {
method:'POST', headers:{'Content-Type':'application/json'},
body: JSON.stringify({qrid: currentQrid})
});
const addResult = await addResp.json();
if (addResult.success) {
document.getElementById('qr-status').textContent = '✓ 账号添加成功,正在跳转...';
setTimeout(() => { window.location.href = '/dashboard'; }, 1000);
} else if (addResult.need_login || addResp.status === 401) {
document.getElementById('qr-status').textContent = '登录已过期,正在跳转...';
document.getElementById('qr-status').className = 'status-error';
setTimeout(() => { window.location.href = '/login'; }, 1500);
} else {
document.getElementById('qr-status').textContent = '添加失败: ' + addResult.message;
document.getElementById('qr-status').className = 'status-error';
}
return;
} else if (data.status === 'expired' || data.status === 'cancelled') {
clearInterval(pollInterval); pollInterval = null; clearInterval(timerInterval);
document.getElementById('qr-status').textContent = data.status === 'expired' ? '二维码已过期,请重新生成' : '已取消登录';
document.getElementById('qr-status').className = 'status-error';
document.getElementById('generate-qr-btn').style.display = 'inline-block';
document.getElementById('qr-display').style.display = 'none';
} else if (data.status === 'error') {
clearInterval(pollInterval); pollInterval = null; clearInterval(timerInterval);
document.getElementById('qr-status').textContent = '错误: ' + (data.error || '未知错误');
document.getElementById('qr-status').className = 'status-error';
}
} catch(e) { console.error('检查状态失败:', e); }
finally { isProcessing = false; }
}
</script>
{% endblock %}