# 2026-09-18 工作日志 ### 获取最新热点数据(四榜全量,8 次红狐调用) **诉求**:「获取最新热点数据」→ 即刷新工作台榜单缓存。 **先做的 0 成本盘点**(幂等铁律:先 ls 命中免 API): | 榜 | 本地最新期 | 应有最新期 | 缺口 | |---|---|---|---| | 账号周榜 | 08-31(5 赛道齐) | **09-07** | 5 赛道 × 1 期 | | 账号日榜 | 09-08 | **09-16** | 1 期 | | 视频热榜 | 08-31 | **09-07** | 1 期 | | 点赞榜 | 08-31 | **09-07** | 1 期 | 最后落盘时间 = **08-31**(7.8 天前 / 11185 min),共 82 个文件;`/api/dsh/ranking-update` 的 `cooldownMin=30`,不在冷却窗口、无运行中任务。 **★付费调用前置门禁(技能硬规矩,勿跳过)**:`mcn-data-insight/scripts/fetch_week_ranks.py` 头部明写「**必须先向用户确认调用次数与范围,禁止未经确认直接执行付费调用(教训固化)**」→ 用 AskUserQuestion 把四榜缺口 + 三种范围 + 调用次数摊开确认,用户选「四榜全量 · 8 次」。 **执行(8 次调用,全部成功)**: | 步骤 | 命令 | 调用 | 结果 | |---|---|---|---| | ① 视频热榜+点赞榜 | `mcn-data-insight/scripts/fetch_week_ranks.py --board both` | 2 | 各 50 条 → `视频热榜/`、`点赞榜/抖音周榜_{视频热榜,点赞榜}_2026-09-07.json` | | ② 账号日榜 | `douyin-top-account/scripts/fetch_rank.py --period day` | 1 | 50 条 → `账号日榜/抖音账号日榜_2026-09-16.json` | | ③ 账号周榜 5 赛道 | 同脚本 `--period week --category {生活vlog,小剧场,亲子,美食,旅行}` | 5 | 各 50 条 → `账号周榜/抖音周榜_{赛道}_2026-09-07.json` | **★关键实现细节(踩过的坑)**:`fetch_rank.py` **只写 `--output` 指定的路径,不会自动按规范命名**;而文件名里的日期必须取 **API 返回的 `dateStart`**(不能猜 20:00 规则算出来的期号)。→ 写了 runner:**每榜只调 1 次 API**,结果先写临时文件 → 读 `dateStart` → `shutil.move` 到规范文件名。**若先调一次取日期再调一次写文件,调用次数会翻倍浪费额度**。runner 用完即删(`tools/_rank_fetch_runner.py`)。 **验证(工作台接口)**:`files 82→90`、`ageMin=0`;`week`→2026-09-07(09-07~09-13, 250 条/5 赛道)、`day`→2026-09-16(11 条)、`hot`→2026-09-07(15 条)、`likes`→2026-09-07(22 条)。⚠️ 接口 total 小于文件 50 条是**正常**:`dsh-data.js` 的 `RANK_KEEP` 白名单(生活记录/生活vlog/小剧场/亲子/美食/旅行)会过滤掉其余赛道。 **数据结论(白名单视角)**:**小剧场全面霸榜**——视频热榜 TOP10 里 4 条、点赞榜 TOP10 里 6 条都是小剧场;`周小闹` 是账号周榜小剧场第 1(95.4)且日榜第 1(93.7),视频热榜 3 条进 TOP14("饭店的暑假工"系列)。旅行赛道 `张舒克和黄贝塔` 双榜靠前。日榜白名单内仅 11 条(且 rank 分散到 32 位,说明全品类排名里其他赛道占位多)。 **字段差异备忘**:点赞榜/热榜条目用 `user_nickname` + `aweme_desc` + `add_digg_count`(新增点赞);账号榜用 `accountName` + `comprehensiveScore`。工作台表格渲染时取值字段不同。 --- ### 视频热榜 / 点赞榜 增加「关注」(与账号榜一致) **诉求**:「视频热榜 和 点赞榜 也增加关注功能,可关注视频对应账号,功能和账号榜一致」。 **先摸清语义(关键)**:账号榜「功能」列 = `inDb ? 查看(#/account/{dbId}) : 关注`,其中**「关注」不是 ⭐ 收藏开关**,而是 `confirmSaveAccount()` → 提交「分析账号」任务把该账号**加进账号列表**。⭐ 收藏只在账号列表页维护。视频热榜/点赞榜原本**没有功能列**,且 `dsh-data.js` 里写着「作品榜条目不查账号表」→ `inDb` 恒 false。 **改动(4 文件)**: | 文件 | 改动 | |---|---| | `dsh-data.js` | `getRanking()` 删掉作品榜不查账号表的硬短路 → 四榜统一:有 `profileUrl` 时按 `sec_uid`、否则按**账号名**(`accountName \|\| user_nickname`)关联 `hot_accounts`,限 `del_flag=0`、同名单取已关注优先 → 输出 `inDb/dbId` | | `data-pages.js` | 新增共用 `videoActTd()`;hot/likes 两榜 `span` 9→10 并补 `功能`;`[data-import]` 绑定按 `data-import-video` 分流传 `ctx.fromVideo` | | `app.js` | `confirmSaveAccount(name,url,btn,ctx)` 增第 4 参:作品榜来源时 desc 改「确认分析**该作品作者**并添加…」、prompt 显式要求**先打开作品页再从作者入口进主页**(作品链接 ≠ 账号主页地址) | | `docs/工作台视觉交互规范.md` | §3.2 重写(四 tab + 四榜列结构 + 功能列判据)、新增坑 15、§7 变更记录 | **★实测抓到的真 bug**:**视频热榜与点赞榜字段体系完全不同** —— 热榜 `accountName`/`title`/`workUrl`(**无** user_nickname/share_url),点赞榜 `user_nickname`/`aweme_desc`/`share_url`。我第一版前端只读 `user_nickname` → **热榜整列退化成「—」**。修法:一律双向回退 `user_nickname||accountName`、`share_url||workUrl`、`aweme_desc||title`。(已固化为规范坑 15) **验证**:临时插一条 `周小闹` 到 `hot_accounts`(榜单里真实存在的名字)做**正向**验证 → 四榜均正确命中 `dbId`,且「周小闹(胡闹)」**未**被误匹配(精确匹配)。UI 实测:两榜 10 列、功能列分流正确(周小闹=查看 `#/account/1632` / 大圆哥=关注)、行高恒 42px、两榜列宽一致、账号榜无回归;关注确认弹窗 —— 作品榜「确认分析该作品作者并添加…」+ 作品链接,账号榜「确认分析该账号并添加…」+ 账号主页链接。**测完已删临时账号**(7→8→7)。 **踩坑**:①专用 Chrome 9333 有 2 个标签(含一个 liblib.tv 页,未动),跨标签后 `Page.reload` 报 `Not attached to an active page` → 改用 `location.replace('/?_r='+Date.now()+'#/...')` 强制整页重载(URL 变了必重新取文档)。②测试脚本的弹窗选择器必须排除 `#settingsModal`(它是 hidden 的静态节点,`querySelector('.modal-mask h3')` 会先命中它,读到「默认读取桌面 MCNSkill项目」)。 --- ### 顶栏最右增加「刷新」纯图标按钮 **诉求**:「顶 header 区域最右侧增加刷新按钮(只要图标)」。 **改动(3 文件)**:`index.html` 加 `#btnReload`(`refresh` 图标 + `data-color="currentColor"`,无文字);`app.js` 绑定 `location.reload()`;`style.css` 加 `.top-actions .ghost.icon-only { padding: 6px 9px }`。 **★高度硬约束(本次重点验证)**:`main#view` 高 = `100vh − 55px`,顶栏一旦超过 55px 就复现"底部溢出 1px + 第二层滚动条"(规范坑 1)。纯图标态 35×31 比文字按钮 81×35 矮 → 实测 `topbar` **仍 55px**、`html/body` `906/906` 无滚动条、`view` 851 = 906−55 ✓。**顶栏新增控件必须比文字按钮矮。** **★顺手修掉的根因(`svgIcon` 取色)**:`svgIcon(name,size,color)` 原先对 `color='currentColor'` 也注入 `style="color:currentColor"` —— 空操作(`stroke` 本就是 currentColor),但**内联样式优先级最高**,把 `.top-actions .ghost .ic{color:var(--dim)}` 与 hover 变主色整条规则废掉 → 表现是"同组图标里被传色那个偏深、hover 不变色"。修法:传 `'currentColor'` 时**不注入**内联色。另给 `initIcons()` 加 `data-color` 支持,让静态 HTML 能绕开 `ICON_COLORS` 功能色(顶栏 `refresh` 原本会被染成青色 `#0f7f8f`)。实测四图标计算色统一 `rgb(107,114,128)`(`--dim`)、hover 统一 `rgb(47,111,237)`(`--primary`)。(已固化为规范坑 16) **验证**:按钮存在 / `textContent===''`(纯图标)/ 16×16 SVG / 位于最右(x 最大)/ 点击后 JS marker 消失(确为整页重载)/ 重载后按钮仍在。版本号:`style.css?v=20260918a`、`app.js?v=20260918e`、`help-guide.js?v=20260918c`、`data-pages.js?v=20260918c`。 **顺带修正 `help-guide.js` 三处过时文案**:榜单"三个 tab/三张榜"→ 四个(漏了账号日榜)、"重新抓取三榜"→ 四榜 + 约 8 次调用、"账号周榜每行有查看/关注"→ 四榜每行都有并补充 ⭐ 在账号列表页维护。