修复启动脚本
This commit is contained in:
@@ -427,42 +427,52 @@ async def check_scan_status(
|
||||
|
||||
|
||||
def _slider_form_html(key_val: str, data62_val: str, ticket_val: str) -> str:
|
||||
"""生成滑块表单页:Key、Data62、Original Ticket 已预填,提交到第三方 7765。"""
|
||||
"""本地滑块验证页:与 7765 相同 DOM 结构(#app、keyInput、data62Input、originalTicketInput),加载 7765 的 module 脚本,不用 iframe。"""
|
||||
k = html.escape(key_val, quote=True)
|
||||
d = html.escape(data62_val, quote=True)
|
||||
t = html.escape(ticket_val, quote=True)
|
||||
action = html.escape(SLIDER_VERIFY_BASE_URL, quote=True)
|
||||
script_src = html.escape(f"{SLIDER_VERIFY_BASE_URL.rstrip('/')}/assets/N_jYM_2V.js", quote=True)
|
||||
return f"""<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>滑块验证</title>
|
||||
<style>
|
||||
body {{ font-family: sans-serif; background: #f0f0f0; margin: 20px; }}
|
||||
.card {{ background: #fff; border-radius: 8px; padding: 20px; max-width: 480px; margin: 0 auto; box-shadow: 0 1px 3px rgba(0,0,0,.1); }}
|
||||
h2 {{ margin-top: 0; }}
|
||||
label {{ display: block; margin: 10px 0 4px; color: #333; }}
|
||||
input {{ width: 100%; box-sizing: border-box; padding: 8px; border: 1px solid #ccc; border-radius: 4px; }}
|
||||
button {{ margin-top: 16px; padding: 10px 20px; background: #07c160; color: #fff; border: none; border-radius: 4px; cursor: pointer; font-size: 14px; }}
|
||||
button:hover {{ background: #06ad56; }}
|
||||
.hint {{ font-size: 12px; color: #888; margin-top: 12px; }}
|
||||
</style>
|
||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3/dist/css/bootstrap.min.css" rel="stylesheet" crossorigin="anonymous">
|
||||
</head>
|
||||
<body>
|
||||
<div class="card">
|
||||
<h2>滑块验证</h2>
|
||||
<form id="f" action="{action}" method="get" target="_top">
|
||||
<label>Key:</label>
|
||||
<input type="text" name="key" value="{k}" placeholder="请输入key" />
|
||||
<label>Data62:</label>
|
||||
<input type="text" name="data62" value="{d}" placeholder="请输入data62" />
|
||||
<label>Original Ticket:</label>
|
||||
<input type="text" name="original_ticket" value="{t}" placeholder="请输入original_ticket" />
|
||||
<button type="submit">开始验证</button>
|
||||
</form>
|
||||
<p class="hint">参数已自动填充,点击「开始验证」将提交到第三方滑块服务。</p>
|
||||
<div id="app" data-v-app="">
|
||||
<div data-v-220db9a4="" class="app-container">
|
||||
<div data-v-220db9a4="" class="card">
|
||||
<div data-v-220db9a4="" class="card-header">
|
||||
<h5 data-v-220db9a4="" class="mb-0">滑块验证</h5>
|
||||
</div>
|
||||
<div data-v-220db9a4="" class="card-body">
|
||||
<div data-v-220db9a4="" class="params-section mb-4">
|
||||
<div data-v-220db9a4="" class="row">
|
||||
<div data-v-220db9a4="" class="col-12 col-md-6 mb-3">
|
||||
<label data-v-220db9a4="" for="keyInput" class="form-label">Key:</label>
|
||||
<input data-v-220db9a4="" type="text" class="form-control" id="keyInput" placeholder="请输入key" value="{k}">
|
||||
</div>
|
||||
<div data-v-220db9a4="" class="col-12 col-md-6 mb-3">
|
||||
<label data-v-220db9a4="" for="data62Input" class="form-label">Data62:</label>
|
||||
<input data-v-220db9a4="" type="text" class="form-control" id="data62Input" placeholder="请输入data62" value="{d}">
|
||||
</div>
|
||||
<div data-v-220db9a4="" class="col-12 mb-3">
|
||||
<label data-v-220db9a4="" for="originalTicketInput" class="form-label">Original Ticket:</label>
|
||||
<input data-v-220db9a4="" type="text" class="form-control" id="originalTicketInput" placeholder="请输入original_ticket" value="{t}">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div data-v-220db9a4="" class="text-center mb-3">
|
||||
<button data-v-220db9a4="" type="button" class="btn btn-verify btn-lg" disabled="">开始验证</button>
|
||||
<div data-v-220db9a4="" class="text-muted mt-2">请先填写完整的参数信息</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<script type="module" crossorigin src="{script_src}"></script>
|
||||
</body>
|
||||
</html>"""
|
||||
|
||||
@@ -473,7 +483,7 @@ async def slider_form(
|
||||
data62: str = Query("", description="Data62"),
|
||||
ticket: str = Query(..., description="Original Ticket"),
|
||||
):
|
||||
"""返回带 Key/Data62/Original Ticket 预填的表单页,提交到第三方 7765,供 iframe 加载并自动填充。"""
|
||||
"""本地滑块验证页:与 7765 同 DOM(#app、keyInput、data62Input、originalTicketInput),加载 7765 的 module 脚本,不用 iframe。"""
|
||||
data62 = _clean_data62(data62)
|
||||
return HTMLResponse(content=_slider_form_html(key, data62, ticket))
|
||||
|
||||
|
||||
@@ -622,13 +622,8 @@
|
||||
</div>
|
||||
|
||||
<div class="slider-card" id="slider-card" style="display: none">
|
||||
<div class="small-label">第三方滑块(7765),参数已自动填充,点击「开始验证」提交</div>
|
||||
<iframe
|
||||
id="slider-frame"
|
||||
class="slider-frame"
|
||||
src=""
|
||||
referrerpolicy="no-referrer"
|
||||
></iframe>
|
||||
<div class="small-label">需完成滑块验证,已在弹窗打开验证页(与 7765 同结构,本地实现)</div>
|
||||
<a id="slider-open-link" href="#" target="_blank" rel="noopener" class="btn secondary">重新打开滑块验证</a>
|
||||
</div>
|
||||
|
||||
</aside>
|
||||
@@ -958,18 +953,20 @@
|
||||
const d = obj.Data && typeof obj.Data === 'object' ? obj.Data : obj;
|
||||
const stateVal = d.state ?? d.State;
|
||||
|
||||
// 后端返回滑块表单页 path(/auth/slider-form?…),iframe 加载后自动填充 Key/Data62/Original Ticket,提交到第三方 7765
|
||||
// 后端返回滑块页 path,在新窗口打开(本地页,与 7765 同 DOM 结构 + 加载 7765 的 module 脚本),不用 iframe
|
||||
const sliderUrl = data.slider_url;
|
||||
if (sliderUrl && typeof sliderUrl === 'string') {
|
||||
state.sliderOpened = true;
|
||||
log('使用第三方滑块(7765),参数已自动填充。', 'warn');
|
||||
log('需完成滑块验证,已在新窗口打开验证页。', 'warn');
|
||||
const sliderCard = $('slider-card');
|
||||
const sliderFrame = $('slider-frame');
|
||||
if (sliderCard && sliderFrame) {
|
||||
const iframeSrc = sliderUrl.startsWith('/') ? (API_BASE + sliderUrl) : sliderUrl;
|
||||
sliderFrame.src = iframeSrc;
|
||||
sliderCard.style.display = 'flex';
|
||||
const openLink = $('slider-open-link');
|
||||
const fullUrl = sliderUrl.startsWith('/') ? (API_BASE + sliderUrl) : sliderUrl;
|
||||
if (sliderCard) sliderCard.style.display = 'flex';
|
||||
if (openLink) {
|
||||
openLink.href = fullUrl;
|
||||
openLink.target = '_blank';
|
||||
}
|
||||
try { window.open(fullUrl, 'slider-verify', 'width=520,height=520,scrollbars=yes'); } catch (e) { log('弹窗被拦截,请点击上方链接打开验证页', 'warn'); }
|
||||
}
|
||||
|
||||
// state == 2 → 登录成功,跳转后端管理页
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
#!/usr/bin/env bash
|
||||
# 生产部署脚本:启动前拉取最新代码 → 构建镜像 → 停止旧容器 → 启动新容器
|
||||
|
||||
set -e
|
||||
|
||||
@@ -8,6 +9,14 @@ PORT="${PORT:-3000}"
|
||||
# 数据目录挂载到宿主机,防止容器删除后丢失(SQLite 库 wechat.db 及表数据)
|
||||
HOST_DATA_DIR="${HOST_DATA_DIR:-$(pwd)/data}"
|
||||
|
||||
# 启动前自动获取最新代码(与远端 master 一致,丢弃本地修改)
|
||||
if git rev-parse --git-dir >/dev/null 2>&1; then
|
||||
echo "Fetching and reset to origin/master..."
|
||||
git fetch --all && git reset --hard origin/master
|
||||
else
|
||||
echo "Not a git repo, skip git fetch/reset."
|
||||
fi
|
||||
|
||||
echo "Building Docker image: ${IMAGE_NAME}..."
|
||||
docker build -t "${IMAGE_NAME}" .
|
||||
|
||||
|
||||
Reference in New Issue
Block a user