diff --git a/backend/main.py b/backend/main.py
index bbd126b..318eaa9 100644
--- a/backend/main.py
+++ b/backend/main.py
@@ -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"""
滑块验证
-
+
-
-
滑块验证
-
-
参数已自动填充,点击「开始验证」将提交到第三方滑块服务。
+
+
"""
@@ -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))
diff --git a/public/index.html b/public/index.html
index 62711ac..747493f 100644
--- a/public/index.html
+++ b/public/index.html
@@ -622,13 +622,8 @@
-
第三方滑块(7765),参数已自动填充,点击「开始验证」提交
-
+
需完成滑块验证,已在弹窗打开验证页(与 7765 同结构,本地实现)
+
重新打开滑块验证
@@ -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 → 登录成功,跳转后端管理页
diff --git a/run-docker.sh b/run-docker.sh
index 54c5df9..78ab977 100755
--- a/run-docker.sh
+++ b/run-docker.sh
@@ -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}" .