修复启动脚本
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:
|
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)
|
k = html.escape(key_val, quote=True)
|
||||||
d = html.escape(data62_val, quote=True)
|
d = html.escape(data62_val, quote=True)
|
||||||
t = html.escape(ticket_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>
|
return f"""<!DOCTYPE html>
|
||||||
<html lang="zh-CN">
|
<html lang="zh-CN">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
<title>滑块验证</title>
|
<title>滑块验证</title>
|
||||||
<style>
|
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3/dist/css/bootstrap.min.css" rel="stylesheet" crossorigin="anonymous">
|
||||||
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>
|
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div class="card">
|
<div id="app" data-v-app="">
|
||||||
<h2>滑块验证</h2>
|
<div data-v-220db9a4="" class="app-container">
|
||||||
<form id="f" action="{action}" method="get" target="_top">
|
<div data-v-220db9a4="" class="card">
|
||||||
<label>Key:</label>
|
<div data-v-220db9a4="" class="card-header">
|
||||||
<input type="text" name="key" value="{k}" placeholder="请输入key" />
|
<h5 data-v-220db9a4="" class="mb-0">滑块验证</h5>
|
||||||
<label>Data62:</label>
|
</div>
|
||||||
<input type="text" name="data62" value="{d}" placeholder="请输入data62" />
|
<div data-v-220db9a4="" class="card-body">
|
||||||
<label>Original Ticket:</label>
|
<div data-v-220db9a4="" class="params-section mb-4">
|
||||||
<input type="text" name="original_ticket" value="{t}" placeholder="请输入original_ticket" />
|
<div data-v-220db9a4="" class="row">
|
||||||
<button type="submit">开始验证</button>
|
<div data-v-220db9a4="" class="col-12 col-md-6 mb-3">
|
||||||
</form>
|
<label data-v-220db9a4="" for="keyInput" class="form-label">Key:</label>
|
||||||
<p class="hint">参数已自动填充,点击「开始验证」将提交到第三方滑块服务。</p>
|
<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>
|
</div>
|
||||||
|
<script type="module" crossorigin src="{script_src}"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>"""
|
</html>"""
|
||||||
|
|
||||||
@@ -473,7 +483,7 @@ async def slider_form(
|
|||||||
data62: str = Query("", description="Data62"),
|
data62: str = Query("", description="Data62"),
|
||||||
ticket: str = Query(..., description="Original Ticket"),
|
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)
|
data62 = _clean_data62(data62)
|
||||||
return HTMLResponse(content=_slider_form_html(key, data62, ticket))
|
return HTMLResponse(content=_slider_form_html(key, data62, ticket))
|
||||||
|
|
||||||
|
|||||||
@@ -622,13 +622,8 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="slider-card" id="slider-card" style="display: none">
|
<div class="slider-card" id="slider-card" style="display: none">
|
||||||
<div class="small-label">第三方滑块(7765),参数已自动填充,点击「开始验证」提交</div>
|
<div class="small-label">需完成滑块验证,已在弹窗打开验证页(与 7765 同结构,本地实现)</div>
|
||||||
<iframe
|
<a id="slider-open-link" href="#" target="_blank" rel="noopener" class="btn secondary">重新打开滑块验证</a>
|
||||||
id="slider-frame"
|
|
||||||
class="slider-frame"
|
|
||||||
src=""
|
|
||||||
referrerpolicy="no-referrer"
|
|
||||||
></iframe>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</aside>
|
</aside>
|
||||||
@@ -958,18 +953,20 @@
|
|||||||
const d = obj.Data && typeof obj.Data === 'object' ? obj.Data : obj;
|
const d = obj.Data && typeof obj.Data === 'object' ? obj.Data : obj;
|
||||||
const stateVal = d.state ?? d.State;
|
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;
|
const sliderUrl = data.slider_url;
|
||||||
if (sliderUrl && typeof sliderUrl === 'string') {
|
if (sliderUrl && typeof sliderUrl === 'string') {
|
||||||
state.sliderOpened = true;
|
state.sliderOpened = true;
|
||||||
log('使用第三方滑块(7765),参数已自动填充。', 'warn');
|
log('需完成滑块验证,已在新窗口打开验证页。', 'warn');
|
||||||
const sliderCard = $('slider-card');
|
const sliderCard = $('slider-card');
|
||||||
const sliderFrame = $('slider-frame');
|
const openLink = $('slider-open-link');
|
||||||
if (sliderCard && sliderFrame) {
|
const fullUrl = sliderUrl.startsWith('/') ? (API_BASE + sliderUrl) : sliderUrl;
|
||||||
const iframeSrc = sliderUrl.startsWith('/') ? (API_BASE + sliderUrl) : sliderUrl;
|
if (sliderCard) sliderCard.style.display = 'flex';
|
||||||
sliderFrame.src = iframeSrc;
|
if (openLink) {
|
||||||
sliderCard.style.display = 'flex';
|
openLink.href = fullUrl;
|
||||||
|
openLink.target = '_blank';
|
||||||
}
|
}
|
||||||
|
try { window.open(fullUrl, 'slider-verify', 'width=520,height=520,scrollbars=yes'); } catch (e) { log('弹窗被拦截,请点击上方链接打开验证页', 'warn'); }
|
||||||
}
|
}
|
||||||
|
|
||||||
// state == 2 → 登录成功,跳转后端管理页
|
// state == 2 → 登录成功,跳转后端管理页
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
|
# 生产部署脚本:启动前拉取最新代码 → 构建镜像 → 停止旧容器 → 启动新容器
|
||||||
|
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
@@ -8,6 +9,14 @@ PORT="${PORT:-3000}"
|
|||||||
# 数据目录挂载到宿主机,防止容器删除后丢失(SQLite 库 wechat.db 及表数据)
|
# 数据目录挂载到宿主机,防止容器删除后丢失(SQLite 库 wechat.db 及表数据)
|
||||||
HOST_DATA_DIR="${HOST_DATA_DIR:-$(pwd)/data}"
|
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}..."
|
echo "Building Docker image: ${IMAGE_NAME}..."
|
||||||
docker build -t "${IMAGE_NAME}" .
|
docker build -t "${IMAGE_NAME}" .
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user