> 作者 @zzzzzzzp(立意 · 判据 · 取舍) · 协作 多多 · AI 助手(检索 · 编码 · 核查)
> 版权 著作权归 @zzzzzzzp 所有(All Rights Reserved) · 版本 v1.3.0
✨ 两个不一样的地方
📈 它会成长 —— 带位次(三阶九位:百工 · 良工 · 营国)。升级不靠买,靠用:
每次真实使用与反馈都折算成经验,推动它升位。
🔁 经验回流 —— 默认不联网:只用一条最小事实(技能名/版本/时间)记在你本机,
不含任何对话内容、不含文件与身份。想让它回传,你在本机配一个收件地址即可;不配就一个字节都不发出。
「他山之石,可以攻玉」——《诗经·小雅·鹤鸣》。
万象-上传流水(L0 未习) —— 把方案文本脱敏、打包并自动提交到知末网创作者中心,含合规检查与状态追踪。
知末网(znzmo.com)方案文本批量上传 · 业务级技能手册
> 用途:让另一个 AI 看一遍即可独立完成「方案文本」类作品的批量上传。
> 所有带「实测」「官网」「seq=1 真实提交」标注的为已核实事实;带「需站内确认」「未公开」的为未核实项。
0. 快速上手(给任意 AI 模型 · 5 分钟接手)
> 本章专为「换一个模型来干这活」设计。本流水线零第三方依赖(Python 标准库 + CDP over WebSocket),
> 不绑定任何大模型、不需要任何 API key。任何模型读完本章 + 跑下面命令即可独立完成,不必重新踩坑。
最小可执行路径(单件上传)
$PY = ~/.workbuddy/binaries/python/envs/default/Scripts/python.exe
$SCRIPTS = ~/.workbuddy/skills/omni-asset-upload/scripts
# ① 只读确认环境(浏览器调试端口 9333 + 登录态),并记下当前作品计数
$PY $SCRIPTS/verify_uploads.py
# ② 跑单件 —— 必须用后台运行,单件实测 15~20 分钟
# 不带 --yes:保留二次确认,提交前会停下等你确认(见步骤 5 检查点)
cd $SCRIPTS && $PY auto_fill.py --seq N --submit
# ③ 复核是否真的进系统(关键:别信脚本自己报的「提交成功」)
$PY $SCRIPTS/verify_uploads.py
必知坑(不知道必失败,详见第 5、11 节)
| # | 坑 | 一句话规避 |
|---|---|---|
| 1 | 后台窗口 → visibilityState='hidden' → 下拉/图片全部静默失效 |
用 Emulation.setFocusEmulationEnabled({enabled:true}),不是 Page.bringToFront |
| 2 | DOM.setFileInputFiles 把文件写进了 input,但 React 收不到 → 不上传 |
之后补派 change + input(bubbles:true) |
| 3 | 复用上一件的残留表单;成功判定误含常驻导航词「作品管理」 | 每次强制重新导航拿干净表单;success_kw 只留回执词 |
| 4 | 提交按钮「禁用」只是 CSS class 带 Disabled(样式),DOM 属性 disabled=False 其实可点;旧逻辑误判为永久禁用、放弃点击 |
按钮可用判定以 DOM disabled 属性为准,超时后仍做强制点击兜底 |
| 5 | toast「提交成功」是诱饵:AI 识别未完成时点提交就会冒,实际没提交;原脚本看到就 break 只点 1 次 → 没进系统 |
严禁以 toast 判成功;最多点 5 次、间隔 5s、只认「表单清空/按钮消失」;5 次后还表单在再等 30s 复核 |
| 6 | 单张配图上传偶发失败(同图某次 FAIL 另次 OK)→ 凑不满 6 张 → 提交按钮永久 disabled | upload_text_images 已是「待传队列 + 多轮补传」(最多 4 轮、单张 12 次尝试);固定不稳页用 EXCLUDE_PAGES 剔除 |
完成判定(唯一可信标准)
- ✅
verify_uploads.py的「全部」计数 +1、「待审核」+1,且新增条目的品类标签与 manifest 吻合。 - ❌ 绝不只看脚本日志 / 页面 toast 的「提交成功」——历史上多次误报(残留表单 / 常驻导航词 / toast 诱饵),必须复核平台计数。
- ⚠ 「待审核」徽标计数偶尔与列表条数不一致 → 以逐卡片标签核对为准(
upload-prep/probe_cards.py)。 - ⚠
verify_uploads.py的「待审核条目」列表有 bug(会把未通过条目也列进去),以顶部「全部/待审核/未通过」计数 + 新增待审核 ID 为准。
换模型 / 改脚本时的纪律
- 改完脚本先
py_compile校验语法。 - 用只读探针验证修复生效(如
probe_dropdown.py验下拉、probe_set_file.py验图片上传),
不要直接跑完整流程——一次全量要 20 分钟,失败成本太高。 - 探针里
connect_cdp()返回的是 tuple(s, c),要写s, c = connect_cdp()。
1. 适用场景 / 触发条件
何时调用本技能
- 一次性把一批「方案文本 PDF」上传到知末网创作者中心售卖(多为甲方委托景观方案、扩初、建议书)。
- 需要主动「脱敏」(真实甲方/项目名/事务所水印 → 虚拟名),降低公开传播第三方权益风险。
- 项目目录下已存在 upload-prep/ 与 manifest.json,且每件作品已具备:封面图 1 张 + 辅图 5~8 张(不与封面重复)+ 标签 + 分类 + 价格 + 协议。
触发词(任意一条即进入本技能)
- 「按计划上传第 N 件」「再传 X 件」「上传到知末」「重跑 seq N」
- 「上传 E:\整理上传文件夹\02 方案文本\ 里的方案」
- 用户给出某目录并要求「脱敏 + 打包 + 上传」
硬门槛:单账号须已完成「实名认证」,否则平台弹窗拦截、无法提交(平台硬规则,不可代码绕过)。
2. 前提确认清单
| # | 检查项 | 工具 / 命令 | 通过条件 |
|---|---|---|---|
| 1 | 浏览器已起 | start_debug_edge.bat |
:9333 可连、tab 含 znzmo.com |
| 2 | 登录态有效 | scripts/probe_state.py(看页面状态)+ 浏览器控制台看 localStorage |
/creatorCenter/workManage 可进、无登录弹窗;精查时 localStorage.userInfo 含 accountId |
| 3 | 账号已实名 | 访问 /creatorCenter/workManage 看「实名认证」标签 |
无「去认证」红字提示 |
| 4 | Manifest 就绪 | upload-prep/manifest.json |
长度 ≥ N,含 seq/title/archive_path/source_pdf |
| 5 | 配图已生成 | upload-prep/fill_imgs/0N_p*.jpg |
每个 seq 至少 6 张互不重复的真实页 |
| 6 | 源 PDF 存在 | 用户指定目录 | 文件可读、非纯扫描图(文本层可检索) |
任一不通过的修复路径
- 浏览器未起 → 跑 start_debug_edge.bat
- 登录态空/被毒化 → skills/omni-web/scripts_qa/restore_session.py
- 账号未认证 → 告知用户手动去 znzmo.com 创作者中心实名,不可自动绕过
- Manifest 空 → 跑 scripts/prepare_upload.py
- 配图重复/不足 → 跑 scripts/extract_doc_images.py
环境常量(已验证)
- Python:~/.workbuddy/binaries/python/envs/default/Scripts/python.exe(记为 $PY)
- CDP 调试端口:9333;独立用户目录:~\.workbuddy\zhimo_browser_profile
- 项目工作根:<工作区>(脚本内 BASE_DIR,按需改)
3. 全业务流程(每步给可执行命令/操作)
步骤 0 · 账号认证
- 手动:用户到 znzmo.com 创作者中心完成「身份证 + 银行卡」实名认证。
- 验证:只能人工 —— 到
/creatorCenter/workManage看「实名认证」标签,或控制台确认localStorage.userInfo含accountId。(2026-09-22 更正:本库没有probe_current_state.py,原「脚本代查」的说法不成立;现用scripts/probe_state.py看页面状态。) - ⚠ 此项只能人工,脚本检测到未认证会停机并报「请用户提供认证后账号」。
步骤 1 · 素材准备(脱敏 + 打包 + 配图抽取)
# ① 脱敏整批(真实标识→虚拟名,写入 desensitized/)
$PY scripts/desensitize.py
# 或单文件:$PY scripts/desensitize.py --src "E:\...\xxx.pdf"
# ② 一条龙:脱敏 → 打包 zip → 生成封面 → 写 manifest.json
$PY scripts/prepare_upload.py
# ③ 按 PDF 不同真实页抽 6 张互不重复图(4:3 / 1200x900 / JPEG)
$PY scripts/extract_doc_images.py --src <脱敏后PDF> --seq N --want 6
- 脱敏仅改文本层,不处理位图内嵌入字(位图残留是已知边界,靠步骤 5 目视必查)。
- 标题用显式虚拟名(不自动拼接,避免「云泽云澜云溪项目」怪名)。
> 🔴 检查点 · 打包完先自查一遍再往下走:后面上传的是 desensitized/ 里那一份,不是原件。
> 传之前做两件事:① 确认 zip 来自脱敏目录;② 打开抽 1~2 页目视看项目名/甲方名/设计公司名
> 是否已变成虚拟名。脱敏脚本只改文本层,印在位图上的字它管不到 —— 这一步漏了,后面全白做,
> 而且发出去就收不回来。
步骤 2 · 作品信息填写(脚本自动)
# 单件填表 + 提交(默认有二次确认)
$PY scripts/auto_fill.py --seq N --submit
# 跳过二次确认(慎用):加 --yes
# 仅填表不提交:去掉 --submit
# 不重填只点提交(当前页已是该 seq 表单):--submit-only
脚本自动完成:导航 /creatorCenter/upload → 选「方案文本」(radio value=20)/「原创文本」(value=0) → 上传 zip → 等表单 → 填领域/文本类型/设计阶段/分类/标签/价格/协议 → 上传 6 张配图 → 等 AI 识别 → 点提交 → 读提交信号。
已实测固定三选(来自 seq=1 真实提交):领域=景观 / 文本类型=设计方案 / 设计阶段=方案阶段。
步骤 3 · 分类与标签选择
- 分类:三级级联
景观 / 居住区景观 / 示范区景观(或小区景观 / 商业综合体景观)。 - 脚本用自研组件
.ClassifyInfo__classifyItemText___*的 JS click;面板常驻一级网格,JS/真实鼠标均无法下钻激活二级时,失败不阻断——交平台 AI 按 zip 内容自动识别。 - 标签:3~5 个中性词(景观方案/方案文本/居住区/示范区/商业景观/度假酒店/城市广场)。受控 antd Tag,必须用
keyDown+char(\n)+keyUp完整序列才提交为 chip。
步骤 4 · 封面与预览图制作
- 封面:脱敏后 PDF 首页渲染(
prepare_upload.py的make_cover,PNG 1600 内缩略)。 - 预览图(文本图片区):从 PDF 不同真实页取 6 张,4:3、长边 ≥1200px、JPEG quality=90。
- 取图优先级:封面(第1页) → 总平面图(关键词:总平面/平面图/MasterPlan) → 效果图(关键词:效果图/鸟瞰/透视/人视/夜景/Rendering) → 兜底(图多字少页)。
步骤 5 · 提交
> 🔴 检查点 · 提交前必须停下(对外不可逆):提交是把作品发到公网平台的动作,撤下成本高。
> 点提交前逐条确认这三样,缺一条就不许提交:
> ① 脱敏已过(含位图内嵌字 —— 脚本只改文本层,位图残留必须目视查一遍);
> ② 网络可达已实测(站点能打开、登录态有效,不要假定);
> ③ 用户已明确确认本批要提交 —— "等用户回复"这一步不能跳。
> 顺带一条纪律:不要用 --yes(它跳过二次确认,等于把上面三条一起跳过)。
# 默认即带二次确认,直接用即可
$PY scripts/auto_fill.py --seq N --submit
提交前必做(脚本内置):
- wait_for_ai_complete(timeout=120):等「AI 智能识别」toast 消失 + 提交按钮解除 Disabled(识别中按钮点击无效)。
- close_blocking_modals(max_rounds=4):关「创作者通知/分成调整」公告 modal(遮挡提交按钮会把点击吞掉)。
- ensure_agreement_checked():协议须知 checkbox 多种手段轮番点,直到 checked===true(提交解禁前提)。
- 提交按钮非 <button>,是 div[class*=footerWrapperBtn],滚动后重取坐标、重试 3 次。
步骤 6 · 审核跟踪
- 提交成功信号:
workManage「待审核」+1;页面跳「我的作品」;toast 含「提交成功/审核中」。 - 平台审核周期未公开,经验帖口径,站内观察为 1~3 个工作日(需站内确认)。
- 失败处理:HR 结果回显校验错误 → 按
常见错误表修复 →auto_fill.py --submit-only重提。
步骤 7 · 上架后数据查看
- 路径:创作者中心 → 作品管理 → 单件详情,看浏览/下载/收藏。
- 排序入口(站内观察,已确认存在):首页/分类页有「最新」「热门」「精品」基础排序;「编推/推荐」流量位无任何公开出处,勿臆造。
步骤 8 · 收益结算
- 结算逻辑、提现门槛、知币兑现金比例、分成比例官网未公开,需站内确认。
- 操作:作品管理 → 收益/钱包 → 提现(具体入口以站内当前版本为准,不臆造)。
- 每次成功提交后回填:
accountId / 作品ID / 单价 / 提交时间 / 状态写入workbench.db的submissions表(旧手动记录在data/audit_log)。
4. 平台规则速查表
4.1 已核实规则(逐条标来源)
| 规则 | 内容 | 来源 |
|---|---|---|
| 资质 | 单账号须实名认证(身份证+银行卡),未认证无法提交 | 平台弹窗「去认证」实测 |
| 品类 | 方案文本 → 原创文本 路径(radio 20 / 0) | auto_fill.py 实测 |
| 三选字段 | 领域=景观 / 文本类型=设计方案 / 设计阶段=方案阶段 | seq=1 真实提交 |
| 主文件 | zip 主文件,≤800MB(实测可传) | auto_fill.py 实测 |
| 配图 | 3+ 张,实测 6 张;1200x900、4:3 JPEG | extract_doc_images.py 实测 |
| 配图去重 | 不得重复(同图裁剪会报「请勿上传相同的图片」) | 错误表实测 |
| 协议 | 协议须知须勾选,否则提交按钮 Disabled | ensure_agreement_checked 实测 |
| 描述字段 | 当前表单「作品描述」字段已移除 | auto_fill.py 2026-09-06 改版 |
| 权属 | 上传者保证权属、侵权自担;平台获全球范围免费/永久/非独占使用权及代为维权 | 协议 agreement.html 第 22-26 条 |
| 下架 | 违规/灌水/重复/广告/影响浏览,平台可删 | 协议 agreement.html 第 32 条 |
4.1.1 审核驳回口径(2026-09-09 实测,5/5 全驳回)
昨天提交的 5 件全部未通过。驳回原因是悬停 tooltip(不是弹窗)——
在「未通过」列表里 hover 卡片上的「查看未通过原因」才会显示:
.hant-tooltip → 未通过原因:
1:文件内容三分之二是设计说明或平面规划施工图,无参考意义
抓法:必须先 Emulation.setFocusEmulationEnabled,再用
Input.dispatchMouseEvent{type:"mouseMoved"} 悬停(click 无效),
且元素要先 scrollIntoView,否则视口外的卡片 hover 不到。
实测到的三类驳回理由与对策:
| 驳回理由 | 含义 | 对策 |
|---|---|---|
| 文件内容三分之二是设计说明或平面规划施工图,无参考意义 | 平台看整份 PDF 构成,非配图 | 选品阶段就要筛:先跑 analyze_content_mix.py,(说明+平面+施工)/总页数 ≥60% 直接换素材 |
| 图片与内容不符,请勿上传非文本类素材! | 配图选到了非方案文本页 | 配图只取效果图/形象图版,排除设计说明、施工图、大样、剖面等页(extract_doc_images.KW_AVOID) |
| 展示内容请勿上传相同图片 | 配图重复或高度相似 | 6 张必须来自不同真实页,不可从同一页裁剪 |
选品优先级(经验值):效果图占比越高越安全。
实测「杭州良渚展示区」84 页中 62 页效果图 → 风险占比 5%;
而「重庆水土示范区」47 页中 25 页施工类 → 风险占比 72%,必驳。
4.2 未核实 / 需站内确认
- 创作者分成比例——未公开,需站内确认。
- 提现门槛——未公开,需站内确认。
- 知币兑现金比例——未公开,需站内确认。
- 独家 / 首发激励政策——未公开,需站内确认。
- 推荐/曝光机制——未公开;仅观察到「最新/热门/精品」排序入口,「编推」流量位无公开出处。
- 是否仍有「金标 / 独家」勾选按钮——未实测,需站内确认。
- 是否还有「作品描述」字段——当前表单已无,旧版本可能有,需站内确认。
4.3 旧文档(下载券体系)可能已废
- 来源:
css.znzmo.com/html/helpme.html(旧帮助页)。 - 旧规则:模型 4 张图(1 主 3 附)、定价 0~5 券、券不可兑现金。
- 状态:与现行「知币 / 现金」体系并存或更替关系不明——具体哪些旧规则仍有效、哪些已废,需站内确认,勿直接套用。
- 本手册采用的现行口径(知币定价、6 张配图)以实测表单为准;若用户账号仍处于旧券体系,按站内实际表单字段执行。
5. 图片上传技术核心(五步法 · 2026-09-08 修订,不可省略)
知末文本图片槽位用原生 <input type=file>。直塞 DOM.setFileInputFiles、DataTransfer、拖拽、React fiber 调用全部失败。实测可行路径(旧版「三步法」漏了 ⓪ 和 ④,正是 2026-09-08 反复失败的根因):
⓪ Emulation.setFocusEmulationEnabled({enabled:true}) ← 前置,最易漏
→ 后台标签 / 后台窗口下 visibilityState='hidden',rAF 暂停、antd 不渲染,
所有点击与下拉静默失效。
⚠ Page.bringToFront 不够:它只把标签在浏览器内提到最前,管不了
**操作系统层面的窗口焦点**。必须靠焦点模拟才能真正回到 visible。
① Page.setInterceptFileChooserDialog({enabled:True})
→ 拦截原生文件选择框,避免点击挂起原生对话框
② JS 点击该槽位的可视上传盒 .modelImageUploadContent
→ 激活内部 input(不点击则 input 处于未激活态,槽位永远空)
③ DOM.setFileInputFiles({objectId: 该槽位 input 句柄, files:[path]})
→ 对该槽位「自己的」input 写文件(不是全局 file input)
④ Runtime.callFunctionOn 手动派发 change + input(bubbles:true) ← 关键
→ ③ 只改了 files 集合,**React 合成事件收不到,平台不发起上传**。
确诊手法:对同一 objectId 回读 this.files.length === 1(文件确实写入),
但已传图数不变 —— 写进去了,React 不知道。补派事件后立刻上传。
- ⓪②④ 缺一不可。
- 槽位定位:不要用
content.children[idx]固定下标(React 重渲染会重排/替换子节点,
导致后段槽位「取不到 input 句柄 / FAIL」)。改用_mark_next_empty():
清旧标记 → 扫modelImageContent.children找第一个「无 img 且有 file input」的槽位 →
打data-af-target/data-af-box标记 → 按标记点击与取句柄。
也不要依赖脚本赋的id(React 重渲染会丢 id,属性标记同理需在每次操作前重打)。 - 槽位标签依次
封面/辅图1/辅图2…(最多 11 个辅图位);
上传后 slot innerText 被清空,不能用startsWith(sel_label)匹配。 - 完成信号:文本图片区
.ModelImage__modelImageItemUploaded__*≥ IMG_COUNT(=6,不是 3),
且每张<img>有真实https://CDN src(不要看 antd message toast 文字——历史 toast 池化累积、永久命中)。 - 单件全流程实测 15~20 分钟(19MB zip + 6 图 + AI 识别 5~10 分钟),
wait_for_ai_complete默认 240s;注意它会被调用两次(submit_step 内部还有一次),总时长可能翻倍。
6. 质量验收标准
硬验收(任一不达标 → 重跑或跳过该 seq)
workManage「待审核」+1- 作品标题 =
manifest.json的title(虚拟名,非源 PDF 文件名) - 配图 6 张互不重复(MD5 全不同)
- 标签 / 分类 / 价格均已填
- 协议已勾选
- zip ≤ 800 MB;单图 ≥ 1200x900(裁剪不足放大保底)
- 文本层无真名残留(pymupdf 全文搜索检查)
- 封面渲染图无真名 / 事务所水印(目视必查——最易栽跟头)
软验收
- 单件全程 ≤ 4 分钟(zip 大 + AI 识别久时可达 6 分钟)
- 提交按钮坐标自动重定位(随 antd 版本微调,不写死)
- 遮挡 modal 自动关闭 ≤ 4 轮
7. 脱敏红线与决策记录机制
7.1 脱敏红线(2026-09-06 升级)
以下一律视为违规,即使不在文本层、不在文件名:
- 真人照片(含甲方/业主/施工方人员肖像)
- 真实姓名(自然人姓名、签字)
- 事务所 / 设计院水印、logo、图框署名
- 真实甲方企业名、真实项目地名(须走虚拟名映射)
> 位图内嵌字、水印无法自动处理,属已知边界——事前目视封面渲染图筛除,不靠自动脱敏兜底。
7.2 决策记录机制(强制)
- 凡涉及「是否上传」「是否放宽脱敏」「是否改价/改分类」等关键决策,须 ≥3 次主动确认(脚本二次确认 + 用户明确回 yes + 决策时间戳落盘)。
- 每次决策写入
upload-prep/decision_log.jsonl,字段:timestamp(ISO8601) | seq | decision | confirmed_by | evidence。 - 未落盘、未达 3 次确认的,视为未完成,禁止进入提交。
- 脱敏命中统计写入
desensitized.json/desensitize_report.json(源词→虚拟名→命中页数),可追溯。
8. 曝光与收益优化实操建议
> 以下为创作者经验共识,不臆造平台机制;未公开项标注来源,供用户自行验证。
- 标题关键词:品类+地域虚拟名+阶段,如「云泽江畔示范区景观方案」「云港星汇商业广场景观方案」;避免堆砌,1~2 个核心词。
- 标签组合:3~5 个,「景观方案 + 方案文本 + 细分品类(示范区/居住区/商业景观/度假酒店/城市广场)」;中性、可被检索。
- 分类归属:选最细三级节点(示范区景观 / 小区景观 / 商业综合体景观),利于进对应频道。
- 封面与效果图排版:封面用最有表现力的鸟瞰/人视效果图;预览图按「封面→总平→效果图序列」排列,首图决定点击率。
- 定价:新号默认 20 知币(≈2 元)低档快速过审;经验帖口径后续可随下载量调价(具体调价策略需站内确认)。
- 更新频率:经验帖口径建议保持稳定节奏(如每周 2~3 件),避免灌水(协议第 32 条可删)。
- 系列化上传:同项目多阶段(方案/扩初/施工图)成系列,利于「精品」频道沉淀与复购。
- 推荐机制:仅「最新/热门/精品」排序可见;「编推」无公开入口,不投入精力揣测。
9. 发布前检查清单
- [ ] 账号已实名认证(无「去认证」提示)
- [ ] 浏览器 9333 已连、tab 在 znzmo.com
- [ ]
manifest.json含该 seq 的 title/category/tags/archive_path/cover_path - [ ] zip ≤ 800 MB,主文件为脱敏后 PDF
- [ ] 6 张配图互不重复(MD5 不同)、≥1200x900、4:3 JPEG
- [ ] 文本层 pypdf 检索无真名残留
- [ ] 封面渲染图目视无真人照片/真实姓名/事务所水印
- [ ] 决策记录已落盘(≥3 次确认、带时间戳)
- [ ] 分类三级路径与品类匹配
- [ ] 协议须知将勾选(脚本自动,提交前复核)
- [ ] 提交前无遮挡 modal(脚本自动关)
- [ ] 提交后
workManage「待审核」+1,回填submissions表
10. 标题 / 标签 / 封面模板(按品类)
| 品类 | 标题模板 | 标签(3~5) | 封面建议 |
|---|---|---|---|
| 住宅示范区 | {虚拟地}示范区景观方案 |
景观方案 / 方案文本 / 示范区 | 示范区入口/样板区人视效果图 |
| 居住大区 | {虚拟地}居住区景观方案 |
景观方案 / 方案文本 / 居住区 | 大区中心花园鸟瞰 |
| 商业广场 | {虚拟地}商业广场景观方案 |
景观方案 / 方案文本 / 商业景观 | 商业街/中庭人视 |
| 市政公园 | {虚拟地}市政公园景观方案 |
景观方案 / 方案文本 / 市政公园 | 公园大场景鸟瞰 |
| 度假酒店 | {虚拟地}度假酒店景观方案 |
景观方案 / 方案文本 / 度假酒店 | 泳池/客房区度假氛围图 |
- 虚拟地取自
desensitize.py的 PLACE 映射(上海→云泽、重庆→云岭…),不拼怪名。 - 封面统一 PNG 1600 内缩略;预览图取 6 张不同真实页。
11. 常见错误与规避
| 症状 | 根因 | 规避 |
|---|---|---|
| 「提交按钮 disabled」无反应 | 图未上传完 / zip 未传完 / AI 识别中 | 强制重跑;先看 dbg_images5.py 查 slots=0 还是 >0;wait_for_ai_complete |
| 「请勿上传相同的图片~」 | 多张图来自同一张封面裁剪 | 改用 extract_doc_images.py 按 PDF 不同真实页取值 |
| 「尊敬的用户,请实名认证」 | 账号未认证 | 让用户手动去创作者中心实名,不可代码绕过 |
| 「localStorage.userInfo=undefined」SPA 静默 abort | 旧 session 被清空/反序列化失败 | restore_session.py 把 cookie 反写回 localStorage 三键 + Page.reload |
| 标签 chip 始终 0 | 受控 antd Tag,CDP 注入 Enter 不入 React 监听 | 用 keyDown+char(\n)+keyUp 完整序列;失败不强求,平台默认空也能提交 |
| 分类面板点了没反应 | 自研常驻一级网格,JS/鼠标难下钻 | set_category_cascader 失败不阻断,交平台 AI 按 zip 识别 |
| 端口改了页面不刷新 | SO_REUSEADDR 让 bind 测试失效 |
用 connect() 探测;同端口重复启动直接报错退出 |
cdp_min arguments 传参返回 None |
标准库 WebSocket 不支持 large args | 大 payload 内联进表达式字符串(f-string 花括号转义) |
| PDF 文本层零命中(图片型 PDF) | 名称在位图里 | 看封面渲染图判断;这类不传 |
Edge --dump-dom 截 PDF 空白 |
Edge 无头不渲染 PDF | PDF→图走 pymupdf,别截 |
rm -rf 类操作破坏资料 |
触发个人文件安全红线 | 任何写盘只走 shutil / Write 工具;绝不直接删 |
| 券 / 知币混用陷阱(新增) | 旧帮助页是「下载券」体系(0~5 券、不可兑现金),与现行「知币/现金」并存或更替关系不明 | 不套用旧券规则;以实测表单字段(知币定价、6 张配图)为准;若账号落在旧体系,按站内实际字段执行,并标注「需站内确认」 |
| 2026-09-08 新增 · 下拉/图片全部静默失效 | 后台标签 + 后台窗口,visibilityState='hidden',rAF 暂停、antd 不渲染 |
Page.bringToFront 不够;用 Emulation.setFocusEmulationEnabled({enabled:true}),并按 visibilityState 校验;每次导航后要重新施加 |
2026-09-08 新增 · setFileInputFiles 成功但图数不变 |
文件写进了 input,但 React 合成事件没收到,平台不发起上传 | 补派 change + input(bubbles:true)。判定依据:对同一 objectId 回读 this.files.length===1 但图数不变 |
| 2026-09-08 新增 · 后段槽位「取不到 input 句柄 / FAIL」 | content.children[idx] 固定下标错位;脚本赋的 id 被 React 重渲染丢弃 |
用 _mark_next_empty():data 属性标记「下一个空槽位」,每次操作前重打标记 |
| 2026-09-08 新增 · 报「提交成功」但作品没进系统 | ① 复用了上一件的残留表单 ② 成功判定含常驻导航词「作品管理/我的作品」(任何页面都有) | ① 每次强制重新导航拿干净表单 ② success_kw 只留回执词 + URL 跳 workManage 信号 |
| 2026-09-08 新增 · 待审核计数与列表条数不一致 | 平台徽标计数滞后 / 列表混入非待审核项 | 以逐卡片标签核对为准(脚本 probe_cards.py),别只看计数 |
| 2026-09-08 新增 · 分类被平台 AI 改掉 | 平台 AI auto-classification 优先于脚本下拉选择 | 已知现象(seq2→其他旅游度假、seq3→小区景观、seq5→商业广场景观);纠偏需创作者中心编辑权限 |
| 2026-09-08 新增 · 文本层残留 Aedas / SOM 等英文名 | 脱敏器词表只有中文本土房企/地名,对英文事务所名失明 | desensitize.py 已加 FIRM 词表;上传前仍须正则全量扫 PDF 文本层确认 |
2026-09-08 新增 · 探针 c.call() 抛 AttributeError: 'tuple' object ... |
connect_cdp() 返回的是 tuple (s, c),不是单个 CDP 对象 |
写 s, c = connect_cdp()。注意 bring_to_front 内部 try/except 会吞掉该异常,表现像「焦点模拟失败」,极易误判方向 |
2026-09-09 新增 · 日志报 submit_btn_disabled 但平台计数已 +1 |
提交按钮「禁用」只是 CSS class 带 Disabled(样式标记),DOM 属性 disabled=False 实际可点;脚本曾用 !!el.disabled \|\| /Disabled/.test(cls) 误判为永久禁用、直接放弃点击 |
wait_for_ai_complete 与提交循环改为以 DOM disabled 属性为准(domDisabled);超时后仍做「强制坐标点击 + 判定表单是否清空」兜底。带水印图 AI 识别常需 >480s,按钮等待已加长到 720s |
| 2026-09-09 新增 · 报「提交成功」但平台计数没 +1(假成功) | 价格下拉偶发打不开 → 价格缺失 → 后端拒收;但页面 toast 仍显示「提交成功」,脚本误判为成功 | ① set_price_if_available 改为 5 次重试 + ArrowDown 方向键兜底,价格必选上;② 价格选不上直接 [FATAL] 中断提交,不再白跑;③ 成功判定收紧:必须跳转到 workManage(作品管理页)才算真成功,仅 toast「提交成功」但仍是上传页判为「不确定/疑似假成功」,强制靠平台计数复核 |
| 2026-09-09 新增 · 价格下拉偶发打不开 | antd Select 对点击时机敏感,单次点击常漏开,导致价格缺失连锁失败 | set_price_if_available 重试 5 次 + ArrowDown 兜底;选不上则中断提交 |
| 2026-09-09 新增 · toast「提交成功」是诱饵,点 1 次就停 → 没进系统 | 在 AI 识别未完成时点提交,平台会冒「提交成功」toast,但实际未提交;原脚本看到该 toast 就 break 只点 1 次。对照:toast 为「AI智能识别图片中」时不 break、Retry 3 次反而进了系统 |
提交点击循环严禁以 toast 含「成功」为成功信号;只认「表单清空 / 提交按钮消失」。改为最多点 5 次、每次间隔 5s、全程不 break;5 次后若表单仍在,再等 30s 复核(平台常在识别完成后才真正收下提交,前几次点击被排队)。seq15 即因 1 次点击被此诱饵坑掉,改后重跑 |
| 2026-09-09 新增 · 单张图上传偶发失败 → 凑不满 6 张 → 提交按钮永久 disabled | 配图上传是随机失败(同一张图某次 FAIL、另次 OK,如 seq12 p016、seq15 p017),原逻辑每张只重试 3 次就放弃,导致槽位永远空、按钮禁灰 | upload_text_images 改为「待传队列 + 多轮补传」:最多 4 轮,每轮把失败图滚入下一轮,单张最多 12 次尝试;同时:某张图上传失败且槽位卡死时直接 [FATAL] 快速失败(不再硬等 30 分钟)。固定不稳页用 EXCLUDE_PAGES(如 seq12 剔除 p16),随机失败用多轮补传 |
| 2026-09-09 铁律 · 日志信号不可信,平台计数 +1 才是唯一真相 | seq12/seq14 日志报「失败/不确定」但计数都 +1 进了待审核;seq15 日志报「提交成功」但计数没 +1 没进系统。脚本/页面 toast 都不可靠 | 每次上传结束必跑 verify_uploads.py 只读探针:以「全部计数 +1 且出现新待审核条目(ID)」为成功判据。脚本内部 success/uncertain/fail 仅供调试,不作为结论 |
| 2026-09-09 根因 · 平台在 AI 识别完成前彻底忽略提交点击 | 连 live CDP 探针实测:表单就绪、按钮 disabled=False、JS 直点 + 坐标点 5 次,60s 内表单纹丝不动(URL 不变、hasForm 不变)。判定「可点」的 DOM disabled=False 只是必要非充分条件——真正闸门是 AI 识别完成(busy==0)。识别没完就点 = 纯浪费(seq14 蒙进、seq15 连点 5 次都没进,全看运气) |
submit_step 开头先清陈旧 toast(ant-message-notice 多次失败会堆积「AI智能识别图片中」旧 toast,让 busy 虚高),再 wait_for_ai_complete(timeout=900) 以 busy==0(无「AI智能识别」类 toast)为闸门,没完不点。带水印/大图识别常需 >480s,最长等 900s。该修复后重跑 seq15 |
| 2026-09-09 已知非阻塞 · 价格下拉选了不生效(默认 4 元) | 脚本点 20知币(2元) 但平台表单显示 40知币(4元),下拉选择未真正写入;seq11/12/14 待审核全是 4 元印证 |
暂不影响入审(只是定价偏低/默认),待后续修 set_price_if_available 的写入方式 |
2026-09-09 终验 · uncertain/click_no_effect 连续两次证实为误报 |
知末上传页提交成功后表单原地保留(不跳 workManage、提交按钮也不消失),脚本「表单仍在=失败」判定彻底失效。seq15(第4次重跑)、seq16(第3次重跑)均在此报错下实际已进系统(计数 34→35、35→36,各出现新待审核 ID) | 铁律:脚本返回 uncertain / click_no_effect 时,一律以 verify_uploads.py 复核为准,绝不据此重跑。当日 seq16 因此白跑了 2 次完整 17 分钟重传。后续流程改为:每 seq 跑一次 → 立即跑 verify_uploads.py → 计数 +1 即收工,不再看脚本结论 |
| 2026-09-09 抓「未通过原因」tooltip 串味坑 | 驳回原因在卡片 hover 的 .ant-tooltip 里(非弹窗,须 mouseMoved 悬停+scrollIntoView)。旧 tooltip 不消失,若读 querySelectorAll('.ant-tooltip')[last] 或 [first] 会读到上一条残留原因,导致 5 件原因被误判为「全相同 / 错配」 |
用 get_reasons_strict.py:逐条先 scrollIntoView 滚入视口→取该按钮最新坐标→悬停→只取中心距按钮 <260px 的 tooltip(按位置去串味)。已抓到 5 件真实各不相同的原因:内容构成 / 图文不符 / 重复图×2 / 图片质量差。复盘脚本 read_reject_tooltips.py 用 [last] 是 bug 源,勿复用 |
| 2026-09-09 驳回原因归两类,红线(版权/水印)本次非主因 | 5 件驳回 = ①主文件内容构成(文字/图纸页占比高,无参考意义)②配图质量/合规(质量差、重复、图文不符)。无一条因位图真实标识/水印/版权 | 调整聚焦:选品优先「效果图密集」项目 + 上传前 analyze_content_mix.py 估占比 + 配图门禁(md5 去重、宽≥1200px、禁照片);版权红线仍是上传前硬约束但非本次被驳点 |
| 2026-09-10 修正 · 封面问题是系统性硬伤(被驳主因之一) | 隔夜全驳(10 件全未通过)证实:seq15/16 被驳因「展示图封面含乱码」(封面渲染选错页/脱敏占位符「??」变乱码);其余封面含位图级真实标识(JTL/Aedas/丰景/Weimar logo、重庆龙湖/中海海曙/天津/杭州良渚/郑州 等地名、真人肖像)。用户 3 次确认「按现状继续、不处理封面」,但事实证明其后果 = 直接被驳 | 不修复封面,只调内容/配图必定再驳。封面必须用「无文字/无真实标识的纯效果图页」重新生成;封面含真实项目名/公司logo/人像 = 红线硬伤,上传前必修 |
| 2026-09-10 修正 · "本网站已经存在此模型" 是硬驳回,调图无效 | seq11/12/14 被驳原因全是「本网站已经存在此模型,模型ID:xxx」——平台已有同模型,与配图/内容无关。调图、裁 PDF、重传全无效 | 这类作品须:①放弃重传;或 ②换「平台无重复、内容合规」的新素材;或 ③改名+改内容让平台判为新模型。切勿在重复模型上反复重试 |
| 2026-09-10 确诊 · 已存在「未通过」作品会静默拦截重传 | seq1 重传(已调整配图)与 seq15 原图重传均报 uncertain/click_no_effect,verify_uploads.py 复核计数 36→36 未变。表现高度一致:表单/配图/AI 识别全 OK、提交按钮可见且 disabled=False、点击 8 次 + 3 波补点均无报错 toast,但表单始终在 |
确诊:平台对已有「未通过」记录的同名作品做了重传拦截。必须先删除/下架原未通过作品,再重新上传。单纯换图/换 PDF 无法绕过;uncertain/click_no_effect 时须用 verify_uploads.py 复核计数 |
12. 隐含约定
命名
- 文件名前缀
0N_,N = manifest seq(02d 格式)。 - 配图:
{seq:02d}_p{pno:03d}.jpg(pno = 1-based PDF 页号)。 - zip:用
manifest.title经文件名清洗(去掉\/:*?"<>|)。 - 脱敏后 PDF 与 zip 同名(仅扩展名不同),分置
desensitized/与zips/。
目录组织
upload-prep/
├── manifest.json # 每件:seq/title/category/tags/archive_path/cover_path/source_pdf/desensitized_pdf
├── desensitized/ # 脱敏后 PDF
├── zips/ # 同名压缩包(<800MB)
├── fill_imgs/ # 配图 6 张/件(互不重复,1200x900)
├── screenshots/ # 填表完成截图(debug)
├── shots/ # 临时 debug 截图(可清)
├── sigs/ # 自动填写/提交 flag
├── desensitize_report.json# 脱敏命中统计
└── decision_log.jsonl # 关键决策时间戳落盘
输出格式
manifest.json:JSON list,ensure_ascii=False,UTF-8,indent=2。- 配图:JPEG,quality=90,optimize=True;≥1200x900;4:3。
- 脱敏 PDF:保留矢量图,仅
add_redact_annot+apply_redactions改文本(images=PDF_REDACT_IMAGE_NONE)。
详略默认值
- 领域=景观 / 文本类型=设计方案 / 设计阶段=方案阶段(固定三选)。
- 标签:3~5 个中性词(见 §10)。
- 分类:固定三段式
景观/居住区景观/示范区景观、景观/居住区景观/小区景观、景观/商业景观/商业综合体景观。 - 价格:默认 20 知币(≈2 元)最低档过审;用户认可后人工调价。
- 描述:空(平台字段已无;不写)。
13. 复用触发与待人工确认项
默认调用方式
当用户说「上传知末 / 继续传 / 再传 N 件 / 按计划跑」时,直接进入标准步骤:
1. 跑 §2 前提确认 → 不通过就修,不问用户
2. 默认 auto_fill.py --seq N --submit(有二次确认);批量 for s in ...; do $PY auto_fill.py --seq $s --submit; done
3. 完成报告:①seq ②workManage 验证结果 ③耗时
会主动询问的只有:账号未实名(必须人工);源文件夹不存在 / 选件清单变更;用户主动指定价格、标题、标签。
需用户确认的策略(5 项)
- 配图规则:当前固定 6 张。是否改「封面 1 + 总平 1 + 效果图 4~6」按需生成?
- 价格档:当前固定 20 知币。是否按品类分档(住宅/商业/度假)?
- 批量上限:单账号每日上传上限未测,是否做节流/排队?
- 跨账号:当前绑定单一
accountId=20171803132129;切账号改 manifest 字段还是运行时注入? - 金标/独家勾选:当前未点;是否加?(该功能是否存在需站内确认)
默认按 §12 详略默认值执行;仅用户主动提及上述任一项才调整。
常见误用与常见问题(FAQ)
常见误用(反模式)
| 误用 | 后果 | 正解 |
|---|---|---|
| 直接跑完整流程 | 一次全量要 20 分钟,失败成本太高 | 不要直接跑完整流程 —— 分步跑、逐步验证 |
| 只看脚本日志或页面 toast 的「提交成功」 | 历史上多次误报(残留表单/常驻导航词/toast 诱饵) | 必须复核平台计数,不能只信提示 |
用 content.children[idx] 固定下标定位槽位 |
React 重渲染会重排/替换子节点 | 不要用固定下标 |
依赖脚本赋的 id |
React 重渲染会丢 id | 属性标记需在每次操作前重打 |
| 未落盘、未达 3 次确认就进入提交 | 视为未完成 | 未落盘、未达 3 次确认的,视为未完成,禁止进入提交 |
常见问题
- Q:提交失败怎么办? A:HR 结果回显校验错误 → 按「常见错误」表修复 →
auto_fill.py --submit-only重提。 - Q:图片上传有坑吗? A:有,见「5. 图片上传技术核心(五步法)」。
- Q:怎么算达标? A:见「6. 质量验收标准」—— 硬验收任一不达标 → 重跑或跳过该 seq;另有软验收。
- Q:素材要先做什么? A:步骤 1 素材准备(脱敏 + 打包 + 配图抽取);红线见「7.1 脱敏红线」,留痕见「7.2 决策记录机制」。
- Q:平台规则以哪份为准? A:以「4.1 已核实规则(逐条标来源)」为准;「4.2 未核实/需站内确认」与「4.3 旧文档(下载券体系)可能已废」不得当依据。
- Q:上架后怎么看收益? A:步骤 7 上架后数据查看 → 步骤 8 收益结算。
附录 A · 脚本命令速查
| 脚本 | 命令 | 作用 |
|---|---|---|
| desensitize.py | $PY scripts/desensitize.py [--src 路径] |
文本层真实标识→虚拟名,输出 desensitize_report.json |
| prepare_upload.py | $PY scripts/prepare_upload.py |
脱敏→打包 zip→生成封面→写 manifest.json(按内置 PLAN 清单) |
| extract_doc_images.py | $PY scripts/extract_doc_images.py --src <PDF> --seq N --want 6 |
按不同真实页抽 6 张 4:3/1200x900 JPEG |
| auto_fill.py | $PY scripts/auto_fill.py --seq N [--submit] [--yes] [--submit-only] [--no-upload] |
CDP 自动填表 + 配图 + 提交 |
auto_fill.py 参数
- --seq N:指定作品序号(必填)。
- --submit:填完表点「提交审核」(默认不点)。
- --yes:跳过提交二次确认(慎用)。
- --submit-only:不重填,只点提交(当前页已是该 seq 表单)。
- --no-upload:不上传 zip,仅填表(假设已在发布页)。
关键类/函数(脚本内,勿随意改)
- upload_text_images():图片三步法实现(§5)。
- wait_for_ai_complete() / close_blocking_modals() / ensure_agreement_checked():提交前置三关。
- set_category_cascader() / set_tags() / set_price_if_available():分类/标签/价格填写。
- category_for(item):按 subdir 映射三级分类路径。