面向小黑盒 Web 端的用户脚本(UserScript):网页收藏列表不显示“插眼”(CY)条目,但主页收藏总数会把它们算进去。本脚本单独拉取插眼收藏,在收藏页把插眼条目补到收藏列表下方,按帖子去重。社区首页(/app/bbs/home)移除右栏热门社区等冗余模块,改为定宽卡片信息流,并支持在右侧预览帖子评论;全站搜索页补齐搜索建议浮层的深色对比度。帖子详情页(/app/bbs/link/*)默认进入全屏沉浸阅读,封面优先取站点头图,头图加载失败时回退正文最大图,没有可用图片时取消封面而不留空白占位;标题、正文、媒体与结尾提示避开独占 46px 栏位的底部阅读进度条。正文连续滚动,沉浸模式隐藏站点原生评论区与回复框,改用脚本自建评论侧栏:回复按父子关系递归成树,子回复带分支引导线、24px 头像与“回复 @昵称”,头像和昵称可跳转对方主页;顶部可发布文章主评论,任意层级条目都能就地回复,发送对应的 reply_id 与 root_id;评论输入框还能一次选择最多 9 张图片,选后逐张上传到站点自己的对象存储,上传完成的地址随评论的 imgs 字段提交;表情选择器同时提供 109 个 cube 与 24 个 heygirl 表情,评论里的 cube、heygirl 以及旧版图标字体与 img 标记形态的表情都能按精灵图渲染、Ctrl/⌘+Enter、字数统计、提交锁、失败重试、取消回复与加载更多,列表仍可按 is_cy 过滤插眼评论;评论区里的图片与表情包(含接口 imgs 字段里的图片)按独立行渲染,图片不会挤在文字行内或被裁掉,点开大图后查看器显示在评论侧栏之上,左键逐级放大、右键逐级缩小、双击复位,长图按约半屏宽度展开;楼中楼回复提交后先以本地行即时显示,再重读该楼层所在的页并合并进列表,不会因为只重读第一页而消失;站点迟迟不回显时该本地行改标“已提交”并在后台稀疏复查,回显到达后由真实评论替换,不再长时间停在“同步中…”;任意一层回复都能连整棵子树一起收起,收起处保留短缩进、虚线分支与“N 条回复已收起”提示,缩进到第 4 层后停止加深,嵌套再深也不会把面板撑宽;登录账号自己发布的楼层与楼中楼回复额外带“删除”,二次确认后调用站点删除接口,并从列表与评论数同步减去。非沉浸模式下,原生评论区监听评论列自身的滚动,接近底部时加载下一页,不再要求整页滚动。纯视频帖生成独立视频阅读页,帖子尚未渲染时显示可重试的等待页。右侧互动栏可直接点赞、收藏与发布 CY;点收藏会弹出多选收藏夹面板,可当场新建收藏夹,勾选决定加入哪些收藏夹、取消勾选决定从哪些收藏夹移除。顶部导航收敛为社区、收藏、文章三个「SVG + 文本」入口(官方根首页 / 保持站点原样、不注入脚本导航),静态与动态两套 SVG 图标随“动态导航图标”开关切换:开启后三个入口全部换成常驻描边流转加轻微呼吸的 CSS 动态 SVG,关闭开关时退回完全静止的静态 SVG,系统的减少动效设置默认让图标静止,但用户手动打开的开关优先;帖子页纵轴中心左右两侧提供 SVG 上一篇/下一篇箭头,切换走站内路由,不整页刷新,上一篇沿本次会话的访问顺序逐篇回退;沉浸阅读右侧常驻完整“阅读时间轴”,900px 及以下通过按钮打开抽屉,大于 900px 时在视口右缘 16px 处常驻显示;按访问顺序倒序列出本次会话读过的帖子并高亮当前篇,点任意一行直接跳回,面板右侧另有可拖动的时间轴滑轨,滑块显示 x/n 并支持拖动预览、松手跳转;时间轴只按帖子 ID 与标题节点化保存,保留条数可在齿轮设置中调整(默认 40,0 表示不限,条数过多会提示内存占用),也可单独关闭(默认开启)。正文图片使用主题背景,桌面上下留白 2rem、移动端 1.5rem。社区页(/app/topic/link/*)提供只在该社区内生效的帖子搜索;宽屏社区首页改为左频道、中信息流、右热度三栏工作台。
https://www.xiaoheihe.cn/*、https://xiaoheihe.cn/*link.linkid,缺省时回退 link.id。.link-comment 与文章回复框,评论按钮打开脚本自建面板(宽 min(440px, 100vw))。回复按 parent_id / replyid / reply_id 递归成父子树,每层用左侧竖线与短横线标出从属关系,缩进到第 4 层后改为同列显示,嵌套再深也不会撑宽面板;任意一层都能连同整棵子树收起,收起处保留短缩进、虚线分支与“N 条回复已收起”按钮;子回复显示 24px 头像、昵称、时间、正文、“回复 @昵称”与回复入口,头像和昵称都链到 /app/user/profile/<userId>。悬停或点任意层级的“回复”把输入框切到“回复 @昵称”,提交时带上该条评论的 reply_id 与所在楼层的 root_id;未选回复对象时仍发布文章主评论(is_cy: 0,两个关系参数为 -1)。父级缺失、跨组、自指或成环时该条提升为楼层直系回复,评论不会丢失。关闭沉浸阅读后恢复站点原生评论区。[cube_名称] 与 [heygirl_名称],评论里的两套表情都按各自精灵图渲染;Ctrl+Enter / Command+Enter 发送、1000 字计数、空内容禁用提交与提交锁,失败时保留原文、回复目标并就地显示接口错误、可直接重试,成功后清空输入、跳过缓存重读该条评论所在楼层的页并合并进列表、同步阅读栏的评论数;楼层来自第 2 页以后时也只重读它自己那一页,先前翻出的楼层不会被第一页覆盖。评论正文里的图片与接口单独的 imgs 字段都会渲染成块级图片,图片独占一行、限高 180px 并去重,点击任意一张打开大图查看;表情按 [cube_名称] 与 [heygirl_名称] 两种标记解析,分别取 cube v34(6x19,含 191 号“抱拳”)与 heygirl(6x4)精灵图,旧帖里的 <i class="cube cube-e012"> 图标字体标记按站点自己的 unicode 表还原成同名表情,未知表情保留原文。提交后先插入一行本地“同步中…”回复,接口返回的新评论 id、同账号同文本,或该楼层写前没有的评论 id 都会用于轮询该页,直到新评论真的出现在列表里(先 5 次、间隔 400 / 600 / 900 / 1200 / 1500ms,之后每 6 / 12 / 20 秒复查一次);确认窗口内仍未回显的本地行改标“已提交”留在原位,后续复查命中后由真实评论替换,不再长时间停在“同步中…”。Esc 先取消回复目标,再关闭评论区。is_cy 标记隐藏插眼评论;默认不隐藏,用户点“屏蔽 CY”后才生效。阅读栏的 CY 按钮不参与过滤,只负责发布新的插眼。/app/topic/link/<topic_id>)的搜索只在该社区内请求,结果与全站搜索分开,不离开当前页面。插眼收藏走评论列表接口,路径 /bbs/app/profile/bbs/comment/list,关键参数:
| 参数 | 值 | 说明 |
|---|---|---|
only_cy |
1 |
只要插眼记录 |
filter_type |
0 |
不过滤类型 |
enable_new_style_collect |
1 |
新版收藏结构 |
userid / heybox_id |
账号 ID:Cookie、站点 storeV2API、存储、restore_login 依次回退 |
当前登录用户 |
limit / offset |
20 / 递增 | 分页 |
no_more |
false |
首页固定值 |
其余基础参数(os_type=web、app=heybox、client_type=web、version=999.0.4、web_version=2.5、x_client_type=web、x_app=heybox_website、x_os_type=Windows、device_info=Chrome)与站点网页端保持一致。
响应判定:status === "ok" 时先看 result 本身是否为数组,否则依次读 result.links、result.list、result.comment_list 中的数组,都读不到数组就按空页处理。翻页结束优先看 has_next(顶层或 result 内,"0" / 0 / false 表示没有下一页,"1" / 1 / true 表示还有),其次看 no_more === true,两者都缺省时以本页没有条目结束。单条记录取以下字段:
link.linkid:帖子 ID(新版收藏结构的字段),缺省时回退 link.id,同时用于去重与跳转 /app/bbs/link/<id>。link.title:标题,空值回退“无标题帖子”。link.thumbs[0]:缩略图,可缺省。text:插眼时附带的评论内容。create_at:时间,按秒处理,兼容毫秒值。comment_type:1 记为“回复”,其余记为“评论”。请求使用页面内 fetch,credentials: include 携带登录态。账号 ID 按可信度逐层解析:先读 Cookie heybox_id,缺失或为 None、null、undefined 这类占位值时回退 user_heybox_id;再读站点 window.storeV2API.read(["account.heybox_id"]) 的快照(要求 entry.exists === true);随后扫本机 localStorage / sessionStorage 的 heybox_id、user_heybox_id、account.heybox_id(裸数字或 JSON 快照都能取);最后带签名调 GET /account/restore_login,从 result.account_detail、result.profile、result 依次取 ID。站点现在把账号写进 storeV2API,Cookie 要等站点自己的 restore_login 返回后才落地,只读 Cookie 会在刚进收藏页时误判成未登录,这条链就是为此补齐;解析结果在内存里缓存 60 秒。所有写请求(点赞、收藏、收藏夹列表、新建收藏夹、成员扫描、文章主评论与 CY)也都使用这条链解析出的账号 ID,而不是只读 Cookie,避免已登录却仍提示登录。全部落空才按未登录处理,不发出插眼请求。接口对 https://www.xiaoheihe.cn 返回 Access-Control-Allow-Origin 与 Access-Control-Allow-Credentials(实测),因此无需 GM_xmlhttpRequest,脚本保持 @grant none。
信息流评论预览、沉浸阅读自建评论区与 CY 标记共用帖子评论树接口 /bbs/app/link/tree,除同一套基础参数外传 heybox_id(逐层恢复后的账号 ID)、link_id、is_first(首页为 1)、page(从 1 起)、index=1、limit=20、owner_only=0。站点网页端还会带一个空的 h_src 参数,脚本在 link_id 前补齐,缺省时更容易触发风控。响应 status === "ok" 时读 result.comments(按楼层分组的数组,每组 comment[0] 为楼,后续为楼中楼)、result.total_floor_num、result.link.title 与 result.link.comment_num。单条评论取评论 ID(comment_id、commentid、id 依次回退)、user.username、user.avatar(兼容拼写 avartar)、text、create_at、support_num(兼容 support_count)、reply_count(兼容 sub_comment_num)、is_cy(1、"1" 或 true 视为插眼),以及回复关系 root_id(兼容 root_comment_id、reply_root_id)与 parent_id(兼容 replyid、reply_id、reply_to_comment_id、reply_comment_id、reply_to、to_comment_id),回复对象昵称取 replyuser / reply_user 的 username 或 nickname。-1、0 与空值这类占位关系不当作父级,回退到楼层 ID。评论配图不在 text 里,官方网页端读的是同级的 imgs 数组,每项取 url(缺省回退 thumb、src),脚本把这类图片追加到正文之后,并与正文内联 <img> 去重;只接受 http(s) 与协议相对地址,javascript:、data: 与含空白的串一律丢弃,单条评论最多 80 个片段且图片优先于文字保留。表情标记为 [cube_名称] 与 [heygirl_名称],站点 bundle 另有 <span class="hb-emoji hb-emoji-<type>_<id>" data-emoji="<type>_<名称>"> 三种 DOM 形态,部分行还会用 <img data-emoji="..."> 承载表情标记,四种形态都解析成同一份 { pack, id };旧版 <i class="cube cube-e012"> / <i class="heygirl heygirl-e005"> 另有图标字体码位表兜底;cube 名称表 109 项(11–186 与 191“抱拳”),heygirl 24 项(11–46),两套 id 空间不同,所以每个表情都带 pack。站点的表情精灵图 <img> 会被跳过,不会当成评论配图。楼中楼全部保留并按评论 ID 去重,quotes 保留为 subComments 的兼容别名;构建显示树时,父级缺失、跨组、自指、重复 ID 或父子成环的条目整体提升为楼层直系回复,任何一条都不会被丢弃。分页在本页为空、没有新增楼层、已加载楼层达到 total_floor_num,或缺少总数且本页不足 20 组时停止。写操作后的刷新把新页合并进已加载列表:同 ID 楼层原位替换、新楼层排到列表顶部、其他页的楼层保持原位置,因此回复楼中楼不会丢掉先前翻出的楼层。
文章连读的连续发现走信息流接口 /bbs/app/feeds,参数与站点信息流一致:pull=0、offset、dw=660。没有已存游标时,首次 offset 取已渲染信息流之后最近的 30 的整数倍位置,避免从头重复已看过的页面;之后每成功取一页递增 30,并把成功写入的游标按账号存下来。响应 status === "ok" 时读 result.links,并按站点规则排除 content_type === 18 的推广条目;同页重复帖子按 linkid 去重。原始 result.links 为空数组才视为信息流末尾,整页都被过滤时继续取下一页。脚本先带 hkey、_time、nonce 与 heybox_id 请求,签名计算失败、HTTP 失败、网络异常、JSON 解析失败或签名请求返回非登录失败状态时,回退到同一路径的无签名请求;签名请求返回登录失效时不再重试。登录态下该接口的实际返回待确认:未登录公开请求返回 HTTP 200,但 status 不是 ok;实现按站点网页端同一路径与查询参数对齐。
沉浸阅读的点赞、收藏、文章评论、楼层回复、评论删除与 CY 发布走站点写接口,全部由用户点击触发:POST /bbs/app/profile/award/link 传 link_id 与 award_type(点赞 1、取消 0);POST /bbs/app/link/favour 传 favour_type(收藏 1、取消 2)、link_id、userid 与 folder_id;POST /bbs/app/comment/create 传 link_id、reply_id、root_id 与 text。文章主评论与 CY 发布用 reply_id: "-1"、root_id: "-1",楼层与楼中楼回复改用该条评论 ID 与所属楼层 ID;主评论与楼层回复传 is_cy: 0,CY 发布传 is_cy: 1。这些请求共用同一接口与签名参数,区别在 is_cy 与回复关系:主评论与楼层回复计入普通评论数与楼层,CY 计入插眼列表。收藏夹列表走 GET /bbs/app/profile/fav/folders;新建收藏夹走 POST /bbs/app/profile/fav/folder/add(name);成员关系按收藏夹分页扫 GET /bbs/app/profile/fav/folder/v2/links(folder_id、offset、limit=30)。收藏按钮打开多选面板:勾选表示加入、取消勾选表示移出,保存时先加后减;原来已收藏、所有勾选都清空且没有未知收藏夹时,改为 favour_type: "2" 全局取消收藏。每个收藏夹最多扫 10 页、整轮最多 48 次请求;扫描失败、读不到成员关系或多个收藏夹返回同一列表时标记「待核对」,只允许加入、不会被隐式移除;收藏夹列表为空时不推断全局取消收藏。删除自己发布的评论走 POST /bbs/app/comment/delete,只传 comment_id,与创建评论共用同一套签名参数与 target=heybox_app,但不带 _rnd。网页端 bundle 未暴露该路径,未登录请求返回“非法请求”,真实登录态与 App/Web 端行为仍待确认;脚本只在评论作者 id 与解析出的账号 id 严格相等时才显示删除入口。写请求与站点自身 axios 配置一致,使用 application/x-www-form-urlencoded;charset=UTF-8 请求体,query 携带同一套签名参数、评论创建专用的 _rnd 与 target=heybox_app;status === "login" 时统一提示「请先登录小黑盒」。
社区内搜索走通用搜索接口 /bbs/app/api/general/search/v1,除同一套基础参数外传 q、search_type=link、topic_id(当前社区 ID)、offset、limit=30、is_pull_down=0;时间筛选非空时追加 time_range。响应 status === "ok" 时读 result.items 与 result.time_range_list;result.items 里的 space 条目只用于占位,offset 按 link 条数推进,空页或没有新增帖子时停止翻页。空结果提示优先取顶层 search_not_result_tips,其次取 result.search_not_result_tips。脚本先带 hkey、_time、nonce 请求,失败后回退不带签名的请求,两条都失败才显示错误。
评论发图不复刻站点前端的 Chunked 上传,只走默认的整文件路径:POST /bbs/app/api/qcloud/cos/upload/info/v2 传 file_infos(name / mimetype / fsize / width / height 的 JSON 数组)、scope=bbs 与 need_cache=0,返回 keys[0]、bucket 与 region;POST /bbs/app/api/qcloud/cos/upload/token/v2 传 bucket、keys、mimetypes 与 is_multipart_upload=0,返回 tmpSecretId / tmpSecretKey / sessionToken 与 startTime / expiredTime;随后按 COS v5 签名直接 PUT https://<bucket>.cos.<region>.myqcloud.com/<key>,只签 host 头,临时凭证放进 x-cos-security-token;最后 POST /bbs/app/api/qcloud/cos/upload/callback/v2 把 is_finished=true 放在 query、keys 放在表单体,读回 preview_urls[0] 写入评论的 imgs 字段(多张以 ; 拼接)。站点默认 region 为 ap-shanghai。
通用接口要求 hkey、_time、nonce 三个签名参数;评论创建接口 /bbs/app/comment/create 另要求 _rnd。脚本内独立实现:
time = floor(Date.now() / 1000)。nonce = md5(time + Math.random()).toUpperCase(),32 位十六进制。hkey 的签名输入为 time + 1、归一化路径与 nonce:路径归一化为 /a/b/c/,三部分分别按 35 字符字母表 AB45STUVWZEFGJ6CH01D237IXYPQRKLMN89 映射后交织,截取前 20 个字符作为种子。% 100 得到 2 位校验,组合成 hkey。两个容易写错的细节:
xtime 左移结果不能对 255 取模,服务端算法保留高位;截断会算出不同的校验位。MD5 覆盖 UTF-8 字节,md5Hex 与 Node crypto 结果一致。hkey 的签名输入包含时间、归一化路径与 nonce,不包含 link_id、page 等其他查询参数;评论创建的 _rnd 则使用本次请求查询参数中的 nonce 与 _time。
评论创建的 _rnd 复用同一次请求的 nonce 与 _time。站点当前使用 15 作为版本前缀,并以 Z7mFG4tQp9Ws2LxB8H 作为 HMAC 密钥;签名为小写十六进制:
message = secret + nonce + _time + ":" + nonce
_rnd = "15:" + lowercaseHex(HMAC-SHA256(secret, message))
_rnd 只加在评论创建请求上,点赞与收藏沿用原有查询参数。
#page-user-favour 的内容区末尾,列表出现后再挪到它正下方,不会因为挂载顺序而整块缺失。区块使用 Shadow DOM,样式与页面隔离。.nav-links and replaces the original seven text links with three inline SVG links for Community, Favorites, and Articles. The official root homepage at / is left to the site: no theme, navigation, feed width, or CY hiding is mounted there, and in-app navigation back to / removes whatever the script had mounted while keeping stored preferences. Two icon sets are kept: a static one without motion hooks, and an animated one where every stroked path is painted twice - a solid base copy plus a pathLength="1" flow copy whose short accent dash sweeps the same geometry on a loop - while the SVG itself carries a 4 percent breathing scale. Only the animated set is rendered while the setting is on; turning it off or enabling the system reduced-motion preference leaves static icons with no transform, transition, animation, dash array, or dash offset, and the flow copies leave the layout. Motion is limited to devices matching (hover: hover) and (pointer: fine) so tapping a link on a touch screen does not leave the icon enlarged, while keyboard focus and press feedback remain available./ 不出现脚本导航;按 location.pathname 标记当前入口,社区包含 /app/bbs/home 与帖子详情;收藏页同时承载插眼收藏区块。视口 ≤940px 时只显示图标,保留 aria-label 与悬停提示。导航使用静态与动态两套 SVG:动态图标只出现在齿轮设置菜单“动态导航图标”开启时,每个描边路径绘制两遍:一层常亮的基础描边保证图形完整,一层带 pathLength="1" 的流动描边沿同一路径持续循环,整枚 SVG 另有 4% 以内的轻微呼吸;三个入口的周期与负延迟互不相同,不会同步闪动,悬停、键盘焦点与按下时流动加快;关闭开关或系统启用减少动效后替换为不带动画钩子的静态图标,流动层直接移出布局。切换只替换图标子树,保留链接地址、文本、aria-label、title、激活态、焦点与监听。社区页左右栏的浏览入口也按当前偏好渲染,搜索图标不参与切换。图标悬停与键盘焦点使用 180ms 的位移与缩放过渡,通用入口上移 2px 并放大到 1.14 倍,文章入口额外旋转 -7°;按下时缩到 0.9 倍。悬停规则只在 (hover: hover) and (pointer: fine) 下生效,触屏点按后即使链接保留 :hover,图标也不会停留放大;键盘焦点与按压反馈在触屏上继续可用。动画只改图标自身的 transform、颜色与描边,不改变 18×18 的布局盒;关闭“动态导航图标”或系统启用减少动效时,变换、过渡、动画与描边虚线的偏移均清除。0 表示不限,超过 500 或填 0 时提示可能占用更多内存与站点存储),以及“中栏宽度(占屏幕宽度)”的 40% / 48% / 56% / 64% / 72% 分段按钮和可自行输入 40–76 整数的百分比输入框:留空或填非法值恢复已存宽度,超出范围自动夹到上下限;菜单内容高于视口时自身滚动。两个菜单各自开关,打开一个会收起另一个,支持 Esc 与点击外部关闭;选中项立即生效并写入本机,当前项用强调色描边标出。html 根元素、#app > main > section、.hb-bbs-home__feed-splitline、.hb-bbs-home__splitline、main.list、.hb-cpt__moment-list-content),这些颜色不随 CSS 变量走,需单独覆盖。登录表单保持浅色,避免第三方登录控件失去可读性。#page-user-profile,路径 /app/user/profile/*)的投稿卡片去掉站点用伪元素画的 4px 近白分隔带,标题改用主题文字色,时间、评论数与标签页改用次级色;右栏只放小黑盒 APP 下载二维码、加速器、语音与备案信息,整栏隐藏并让主列表撑满内容区。鼠标停在作者行弹出的 .name-box .detail-info 作者信息浮层改用主题底色、描边与阴影,箭头同步取主题底色,里面的等级、IP 与简介文字跟随主题,浮层尺寸与层级不变。contain 完整露出,背后是同一张图的模糊底色,不再裁切两侧;封面分成图片区与 32px 分页条带两行,分页条落在图片下方的独立空白行里,不会盖住画面;标题、标签与作者行移到封面下方的独立区块,使用主题底色,不再以玻璃卡压住图片。正文改为连续滚动,段落、图片、富文本块与外部站点嵌入自然衔接,长图和长文按原始高度展开,大图仍可点开遮罩。文本页的每个自然段单独生成 p,段距统一为 .72em,页内不再保留上下内边距,跨页时也只出现一次段间距,不会因页内边距叠加出大空隙。正文中每个可见的 iframe、video、audio、embed 与 object 会复制为独立阅读页,同一无文字容器里的多个播放器按原顺序逐页排列,空段落里的多个播放器同样逐页显示;普通容器里的播放器沿用自身声明的宽高,.iframe 包装容器缺少尺寸时,宽与高分别独立回退到子播放器的声明值,两者都缺失且非纯音频时按 16:9 显示。含文字与播放器的段落、div、section 与 article 保留为富文本页,文字与播放器一起显示;站点自身隐藏的嵌入不会进入阅读页或富文本克隆。原生播放器在阅读期间暂停并静音,关闭阅读器后恢复未被站点改动的原属性;若站点在阅读期间清空、移除或写入任何新的来源值,该属性保持站点值,不会在关闭时被写回,即使写入值等于暂停占位。外部站点能否在克隆页中继续播放仍取决于其嵌入策略(待确认)。右侧互动栏离正文 36px,移动端收进舞台右缘并隐藏栏内头像;封面多图可横向切换或点下方的分页条,左右滑动只切封面,滑到末图再左滑进入正文。顶部左侧为返回、社区首页、作者与关注,右侧为分享与关闭;结尾操作区同样提供“社区首页”按钮。右侧竖排点赞、收藏、评论、CY 发布、分享、阅读时间轴、行距设置,底部显示阅读百分比与进度。阅读时间轴按钮打开右侧面板,按访问顺序倒序列出本次会话读过的帖子,当前篇用强调色与实心圆点标出,其余行可直接跳转;列表默认保留最近 40 条,超出后丢弃最早的一条,面板自身滚动,点外部或按 Esc 收起。行距设置按钮打开右侧小面板,底色与文字随当前主题取值,可输入 1.0–2.2 倍并一键恢复默认 1.7 倍,点外部或按 Esc 收起,与收藏夹菜单互斥。阅读器顶栏、圆形按钮、作者与关注、互动栏、收藏夹与行距菜单、进度条、提示条与 CY/评论遮罩都由阅读器自己的主题令牌取色:浅色用浅玻璃与深字,纸页用暖纸底与褐字,雾青用冷雾底与青灰字,夜航与纯黑沿用原来的深色控件;正文链接、引用边线、焦点轮廓与主按钮按预设单独调过对比度。封面、图片页、视频与嵌入播放器仍用中性黑底衬图,不跟随主题变色。阅读器开启时站点原有的左右翻页箭头隐藏。时间轴面板右侧另有一条竖向滑轨,滑块内显示 x/n(当前第 x 篇 / 共 n 篇),可直接拖动:拖动时只预览目标篇并在滑块下方显示标题,松手后关闭面板并进入该篇;点滑轨空白处立即跳转,聚焦滑块后 ↑/→ 走向更新的帖子、↓/← 走向更早的帖子,Home 到最早、End 到最新,Enter 或空格确认。滑轨只在 2–30 条时绘制刻度点,条数更多时只保留滑块,避免刻度糊成一片。用户直接上传的图片页把内容起点下移到 calc(84px + env(safe-area-inset-top))(≤760px 为 72px),图片最上沿不再被顶栏渐变压暗;首屏封面的压暗渐变从 52%/24% 收到 28%/14%,只覆盖顶栏文字所在的一小条。长图大图查看器按图片高宽比大于 1.6 判定为长图,初始宽度取半屏(不超过原图),左键每步放大 1.55 倍、最多 2 步,右键逐步缩小,双击回到初始宽度,滚轮或拖动可浏览长图其余部分。↑ / ↓、PageUp / PageDown、j / k 与空格按约 0.82 屏滚动,Home / End 跳首尾,← / → 只在封面切图,C 开关评论,H 返回社区首页,R 或 Esc 关闭当前文章的沉浸阅读。点在输入框、文本域或可编辑区域内时不拦截滚动键与 H,但 Esc 仍先关评论。阅读器开启时 [ 与 ] 由阅读器直接切换上一篇/下一篇,外部翻页器不重复响应。min(440px, 100vw),从右侧滑出;打开时背景铺半透明遮罩,焦点移到关闭按钮,阅读区 inert,关闭后焦点回到评论按钮,Tab 在面板内循环。每次重新打开面板都跳过缓存回源读第一页,站点在发评论后只把新楼层插进它自己的第一页缓存、不会改写脚本缓存,退出帖子再进来也能看到自己刚发的评论。面板顶部是评论输入框,默认可发表文章主评论,点楼层或楼中楼的“回复”后显示“回复 @昵称”,提交时带上对应 reply_id 与 root_id,可点“取消回复”或按 Esc 退回主评论。列表按 20 条分页,显示头像、昵称、时间、正文与 cube 表情;楼中楼按父子关系递归排列,左侧分支线标出层级,子回复使用 24px 头像并显示“回复 @昵称”,头像与昵称都跳转 /app/user/profile/<userId>,任意层级都可回复且提交实际评论 ID 与楼层 ID。缩进到第 4 层后不再加深,后续层级改为同列显示;任意一层带“收起回复”,收起后连整棵子树一起隐藏,只留短缩进、虚线分支与“N 条回复已收起”,点它恢复。按 is_cy 屏蔽时会连同整棵子树一起隐藏,删除也按子树移除;底部“加载更多”继续拉取;面板右上角另有“刷新评论”按钮,点它跳过缓存重读第一页,已翻出的其他页楼层保留在原位置,加载期间按钮禁用并旋转图标。评论条目除了“回复”,登录账号自己发布的楼层与楼中楼回复还带“删除”:点击先二次确认,成功后调用 POST /bbs/app/comment/delete(comment_id),把该条从当前列表移除(楼层连同其楼中楼),并按移除条数同步递减面板总数与阅读栏评论数,同时让该帖评论缓存进入 10 秒冷却;删除期间按钮禁用并显示“删除中…”,失败时保留条目并在提示条显示接口原因,未登录提示「请先登录小黑盒」。沉浸阅读期间站点原生评论区与回复框隐藏,DOM 不搬动。result.link;点收藏始终打开多选收藏夹面板:面板内可新建收藏夹,勾选即加入、取消勾选即移出,保存时先加后减;全部取消且已确认没有未知收藏夹时全局取消收藏。收藏数只在“未收藏 → 已收藏”或反向翻转时增减一次;CY 按钮下方常驻显示当前帖子的 CY 数量(无 CY 时显示 0,计数来自评论树第一页的 is_cy 评论),点击打开 520px 输入卡,提交后以 is_cy=1 发布,并同时上升评论数与 CY 数量;关注按钮转发站点原生关注按钮,请求结束后重新同步状态,已关注时再点一次走站点的取消关注确认对话框;确认框改用主题底色并抬到阅读舞台之上,Esc 先关确认框再关阅读器;未登录统一提示「请先登录小黑盒」。https://www.xiaoheihe.cn/app/bbs/link/<id> 并显示“链接已复制”,不再代理隐藏的原生分享按钮。R 与 Esc 只关闭当前文章的阅读器,并提示已退出;齿轮菜单的“沉浸阅读”开关才修改持久偏好。两种关闭都立即恢复站点原生双栏与外部翻页器,进入其他帖子仍按全局偏好自动开启。阅读位置按帖子写入 sessionStorage,返回同一帖时回到原页。calc(100vh - 112px),楼层内边距 14px 16px、正文 14px/1.7。--heybox-up-bg、surface、subtle、raised、border、text、text-2、muted、on-accent 与 --heybox-up-page-w、feed-w、feed-pct、reading-line-height、radius-card、gap、card-pad、shadow-1、shadow-2。纸页主题把卡片圆角收到 4px、去掉一级阴影并改用 Georgia 衬线标题;雾青用 18px 圆角与更柔的投影;纯黑用 8px 圆角与深投影。min(960px, 100%),卡片内边距收到 16px;≤900px 时沉浸阅读的互动栏收进舞台右缘,≤760px 时舞台占满宽度、正文 17px,≤520px 隐藏作者名与“继续阅读”,结尾卡保留作者、统计、标签、社区首页与翻页。顶栏的社区首页按钮在 ≤520px 收为 38×38 圆形图标。视口高 ≤820px 时结尾页隐藏“继续阅读”,≤520px 时再隐藏统计并收小头像,结尾卡保留 min-height: 100dvh,内容超出时按自然高度展开。None、null、undefined 这类占位值不算登录态。解析链路走完后仍为空时,间隔 1.5 秒自动复查,最多 3 次,避免登录态写入较晚还需要手动刷新;离开收藏页或区块销毁时立即取消待执行的复查。hkey 不能为空、该用户已注销 或登录相关失败时,提示改为「登录状态已失效,请重新登录小黑盒后点击刷新。」,不再显示原始英文状态码。.cpt-right-side.right),热门社区、二维码、App 链接与页脚一并移除;信息流收成 960px 居中阅读栏,话题条也改成同风格卡片。.search__pull-list、.search__suggestion、.suggestion__item 及其内容、名称、描述、图标与匹配片段:名称改用主文字色,描述使用次要文字色,匹配片段使用强调色,行悬停、选中与 aria-selected 状态使用主题底色,键盘焦点保留 2px 轮廓。规则仅在 data-heybox-up-dark 下生效,浅色、纸页与雾青主题的搜索建议外观不变。https://xiaoheihe.cn/app/bbs/link/<id>:默认显示沉浸阅读,原生正文与回复编辑器留在 DOM 中不搬动;关闭阅读模式后回到左栏正文、右栏 424px 原生评论区的双栏布局,右栏原有的相关推荐与二维码模块隐藏。.topic-link__main 的筛选行上方插入搜索栏,左侧固定显示当前社区名,输入关键词后只请求该社区的帖子。筛选行位于 .topic-link__panel 时,搜索栏与筛选行插在同一父节点并保持前后相邻。结果面板替换原生信息流,顶部显示社区与关键词,并提供“全站搜索”和“返回社区”;时间筛选来自接口 time_range_list,切换后重置分页;“加载更多”按接口返回的 link 条数递增 offset。Esc 或“返回社区”恢复原生列表,切换到别的社区或离开页面时自动收起。窄屏隐藏社区胶囊并缩小缩略图。.content 改为 1fr | 中栏 | 1fr 三栏栅格:中栏宽度取自 --heybox-up-feed-pct(默认 56vw,上限 1180px,并至少给两侧留 560px),左右两列等分剩余宽度,中栏因此始终落在视口正中;左栏 208px 贴住中栏左缘,≥1500px 时右栏 288px 贴住中栏右缘。1200–1499px 只保留左栏与信息流,<1200px 回到站点单列。左栏是浏览入口与站点话题频道,中栏是原信息流,右栏是当前信息流按“评论数 × 2 + 点赞数”生成的热门排行与快捷入口。桌面隐藏站点顶部 sticky 搜索条,把它为搜索条铺的 146px 固定顶部遮罩压缩到导航 64px 加页面顶部留白 16px 的 80px 区域,搜索入口收进左栏“浏览”,右栏“快捷入口”不再重复全站搜索;左右栏 sticky 吸顶改为 top: 80px、最大高度 calc(100vh - 100px),首屏不再留下搜索条高度造成的空白,滚动时正文也不会从导航下方的留白处露出。左栏已有频道列表,站点原生的横向频道条(.bbs-home__topic-list-wrapper)在 ≥1200px 时隐藏。.bbs-home__topic-item,点击时转发给站点原按钮;热门排行读取已渲染卡片,点击滚动到对应帖子并临时描边,不请求新接口、不伪造榜单。评论预览展开时右栏自动让位给预览侧栏。.scroll-list__button-group 的右偏移绑在内容列上,窄视口会把它推到屏幕外,宽屏又会压到自定义右栏或评论预览下方。首页、频道页与帖子页因此隐藏原生按钮;其余页面把按钮固定到距右边 20px、距底部 24px,保证 800–1159px 下完整可见。router.push),地址与内容由 SPA 更新,不整页刷新;切换后滚动回顶部。键盘 [ 与 ] 分别切上一篇、下一篇,输入框、文本域与可编辑区域内不拦截;沉浸阅读开启时由阅读器接管这两个键,外部翻页器不重复响应。sessionStorage;帖子页按当前 ID 定位,并跳过浏览记录里已访问的帖子。下一篇优先在信息流顺序中挑选与最近浏览作者、话题重合度最低的未访问项;信息流顺序没有候选时使用连续发现队列,仍不足则拉取 /bbs/app/feeds 的后续页(每次最多 3 页、每页 30 条)并继续挑选。探索请求失败、到达信息流末尾或队列耗尽后,如果页面“相关推荐”里还有未访问项,按钮会直接进入其中第一篇;只有这时也没有候选,按钮才恢复并提示可重试。点“下一篇”后先显示“正在寻找下一篇…”,该按钮在请求期间禁用,完成后自动进入选中的文章。结尾“继续阅读”同样过滤当前文章与已访问帖子,最多显示 4 条。“上一篇”仍由本次会话的浏览记录提供,回退时只移动记录里的游标。.link-comment 排成左右两列;开启时用 display: none 隐藏原生评论区与 .hb-bbs-link__reply-target 回复框,两种模式都不搬动节点,站点祖先选择器与原生样式继续生效。#page-bbs-link .link-comment 自身的滚动,距底部 240px 内触发:优先点击评论列内可见且可用的“加载更多 / 查看更多”按钮,没有按钮时向 window 与 document 各派发一次 scroll,让站点的整页滚动监听继续工作,但不移动页面位置。触发后冷却 1.2 秒,列表高度没有增长就不再重复请求;沉浸阅读、评论列不可滚动或离开帖子页时解除监听。style.order,不改 DOM 顺序;站点重渲染后自动重建工具栏并恢复上次模式。沉浸阅读隐藏该区域时工具栏不参与布局。[data-comment-id] 匹配接口返回的 is_cy 评论,给对应楼层加 data-heybox-up-cy="1" 并由 body.heybox-up-hide-cy 统一隐藏;按钮显示已屏蔽条数,关闭后立即恢复。--heybox-up-shadow-2。展开时页面使用全宽,桌面栅格只在右侧为面板预留与其实宽相同的轨道,不再额外叠加右内边距;中栏按可用空间收缩并保持居中,面板与信息流之间只保留 24px 级间距。首条帖子只自动打开一次:手动收起后不会再次弹出,点右缘的“评论预览”标签才会重新展开。.bbs-new-style-bottom__comment、.content-list__comment)即可切换到该帖,页面不跳转。linkId + accountId + page 缓存 2 分钟、最多 24 页,悬停切换等待 900ms,避免连续请求触发站点验证码;签名请求被拒时自动改用无签名参数重试一次。仍失败时面板显示原因与“打开帖子”入口,点提示文字可再试。display: none、页面右缘不留标签,信息流恢复正常宽度,评论数字恢复站点原生行为(进入帖子);偏好写入 localStorage,刷新后保持。重新开启会立刻带出首条帖子的评论。/app/bbs/link/* 时浮层隐藏,视口窄于 1200px 时同样不显示。heybox-up.cy.v1:<userid>,值为 { savedAt, items }。localStorage 不可用时仅本次会话生效。heybox-up.theme.v1,取值为 system、dark、oled、light、paper、mist,仅存本机;旧值 dark、light 继续有效。heybox-up.hideCy.v1,取值 1 或 0,默认 0(不隐藏);仅存本机,帖子页与评论预览共用。heybox-up.commentPreview.v1,取值 1 或 0,默认 1(开启);仅存本机,由齿轮设置菜单里的开关写入。heybox-up.navMotion.v1,取值 1 或 0,默认 1(动态);仅存本机,由齿轮设置菜单里的“动态导航图标”开关写入。heybox-up.feedWidth.v1,取值为 40–76 的整数百分比,默认 56;齿轮设置菜单里的分段按钮(40 / 48 / 56 / 64 / 72)与自定义输入框共用这一键,只改 CSS 变量 --heybox-up-feed-pct,不重排 DOM。heybox-up.readerTimeline.v1,默认开启(未写入或不是 0 即视为开启),写入 0 关闭;帖子访问顺序、游标与标题缓存分别存在 heybox-up.postTrail.v1、heybox-up.postHistoryCursor.v1 与 heybox-up.postHistoryTitles.v1,都只在本次会话内有效。heybox-up.readerHistoryLimit.v1,取值为非负整数,默认 40,0 表示不限条数;由齿轮设置菜单的“时间轴最多保留条数”输入框写入,改小后立即按新上限截断。时间轴只做节点化存储:浏览顺序是一个帖子 ID 字符串数组(heybox-up.postTrail.v1),标题单独存成 id → 标题 的小字典(heybox-up.postHistoryTitles.v1),不含正文、图片或接口响应;被裁掉的 ID 会连同它的标题、阅读位置(heybox-up.readerScroll.v1:<id>)与阅读比例(heybox-up.readerRatio.v1:<id>)一起删除,缩短上限不会留下孤儿键。heybox-up.readerLineHeight.v1,取值为 1.0–2.2 的倍数(保留两位小数),默认 1.7;齿轮设置菜单与阅读页右侧行距面板共用,写入根级 CSS 变量 --heybox-up-reading-line-height,只作用于正文文本,标题、代码块、引用与站点卡片保持各自行高。heybox-up.feedOrder.v1:<heybox_id> 与浏览记录键 heybox-up.postTrail.v1,只写 sessionStorage,关闭标签页即清除;信息流顺序最多保留最近 600 条。连续发现另用 heybox-up.feedQueue.v1:<heybox_id>(最多 80 条待读候选)、heybox-up.feedCursor.v1:<heybox_id>(下一次 /bbs/app/feeds 的 offset)、heybox-up.feedSeen.v1:<heybox_id>(最多 600 个本次会话已见帖子)与 heybox-up.feedRecent.v1:<heybox_id>(最近 12 篇的作者与话题元数据);没有 heybox_id 时后缀为 :anonymous。这些键同样只写 sessionStorage,关闭标签页即清除;切换账号后读取各自的状态,不会沿用上一个账号的队列与游标。插眼区块只响应收藏页 URL 的 #heybox-up-cy 锚点。linkId + accountId + page 缓存在内存里,最多 24 页、2 分钟失效;第一页只接受 15 秒内的缓存,发布文章主评论或删除评论后该帖缓存进入 10 秒冷却(既不读也不写),期间页面一律回源并轮询到目标评论出现或消失;评论内容不落盘,排序仍由站点原生组件管理,脚本不保存排序状态。localStorage:关键词、时间筛选与已加载结果只保存在当前页面的内存里,刷新或离开页面即清空。验证以语法检查和真实登录态页面上的无头 Edge(CDP)DOM 断言为主,不依赖仓库内的辅助脚本:
pnpm build -- --target heybox-up
node --check dist/heybox-up.user.js
签名用真实被服务端接受的样本 (time=1792587363, nonce=2B3C207C9CF9AF2779DEE63C509DA4E8, path=/bbs/app/profile/bbs/comment/list) 复核,得到 hkey=VX2Y254;服务端接受该签名,时间错误时返回 系统时间不正确。
v0.4.47 的 10 组 DOM 用例在仓库外的 E:\Temp\hbu-inspect 用 playwright-core 驱动本机 Edge 执行,命令依次为 node smoke-panel.js、node inspect-reader.js、node verify-race.js、node verify-actions.js、node verify-regressions.js、node verify-nav.js、node verify-search-contrast.js、node verify-media.js、node verify-login.js 与 node verify-pending.js,全部通过;评论加载失败后的键盘重试另以 node verify-retry-keyboard.js 覆盖,从评论输入框按 Tab 可到达“重试”按钮,回车后重新请求并恢复列表。v0.4.48 的导航动效与搜索对比度回归用同一目录下的 node verify-105.js 复核,逐项断言悬停、焦点、按压、静态与减少动效状态,以及六套主题下建议面板的颜色和尺寸;触屏点按后的残留悬停另用 node verify-105-touch.js 在 390×844、hasTouch 环境下复测。这些脚本与依赖不进入仓库。仓库现在提供 package.json、tests/ 与 CI 工作流:导航与搜索建议的样式状态契约固化在 tests/heybox-up-style-contract.test.ts,共享层与样式用例统一用 pnpm test 运行,类型检查用 pnpm typecheck,构建产物由 pnpm build 生成并可用 node --check 复核。
社区内搜索用无头 Edge(CDP)验证:1440×900、900×800 与 390×844(内容宽 390px)下,面板均挂在 .topic-link__main 内筛选行的实际父节点 .topic-link__panel,且紧挨筛选行之前;390px 下社区胶囊实算为 display: none。提交“显卡”后请求带 topic_id=18745、q、search_type=link、limit=30 与 hkey,渲染 10 条结果,原生筛选行与信息流同时隐藏;焦点在站点导航时按 Esc 不关闭面板,焦点回到输入框后按 Esc 关闭并把焦点交还输入框。接口每页再夹 10 条 space 占位时,“加载更多”仍以 offset=10、offset=20 正常追加,结果从 10 条增至 30 条。夜航下搜索栏底色 rgb(23, 29, 36)、结果标题 rgb(220, 229, 239);浅色下分别为 rgb(255, 255, 255) 与 rgb(20, 25, 30)。
桌面工作台在早期版本用 jsdom 用例验证(该用例随测试目录一并移出仓库):社区页启用 heybox-up-desktop,左栏插到 .content 最前、右栏插到最后;两个话题按钮生成两个频道项;热门排行按“评论数 × 2 + 点赞数”排出三帖顺序,1.2万 正确换算为 12000;点排行项滚动到对应卡片,点频道项后高亮且转发给站点原按钮。
实时验证:用同一实现生成当前时间的 URL 请求接口,返回 {"status":"failed","msg":"该用户已注销"}。这是用户级错误,说明签名与时间被接受;签名错误时返回 系统时间不正确。
布局用无头 Edge(CDP,1600×1000、1280×900、800×900)做 DOM 级验证:评论预览展开时,1280 下内容栅格为 288 / 592.8 / 288px,信息流 x=336、宽 592.8,搜索条已隐藏,左栏 x=104、宽 208,评论浮层 x=956.8、宽 288;1600 下栅格为 320 / 848.8 / 320px,信息流 x=368、宽 848.8,搜索条已隐藏,评论浮层 x=1244.8、宽 320。两种视口均无横向溢出,浮层与信息流之间仅余 28px 间距,不再出现“侧栏宽度 + 48px”额外内边距造成的空白区。帖子页正文卡 832×868,评论卡 424,排序栏 407×48,首条评论内边距 14px 16px,正文标题 25px/35.5px。800 下正文与评论纵向堆叠、宽 744,无横向溢出。夜航全页扫描未发现白色大底块;帖子页与社区首页的伪元素底色(卡片底部 4px 色带、楼层分隔线、相关推荐分隔线)与浅色边框扫描结果均为 0。
沉浸阅读用 1440×900、1024×768、800×700、390×844 与 844×390 验证:1440 下整组宽 812(x=314),舞台 732(x=354)、正文 612(x=414,右缘 1026)、互动栏 x=1062,左右留白 314 / 330;1024 下整组 x=106、舞台 x=146、正文右缘 818、互动栏 x=854、间隔 36;800 下舞台占满 800、正文宽 612 居中、互动栏 x=738、间隔 32;390 下正文宽 302、互动栏 x=338、栏内头像隐藏、按钮 42px;320 下正文宽 232;各视口 .hbu-reader-scroll 的 scrollWidth 均等于视口宽。封面 object-fit: contain 完整显示,背后铺同一张图的模糊底色;标题移到封面下方独立区块,1440 与 390 下封面与标题的矩形均无重叠,封面分页条 36×36,左右滑动只切封面,末图再左滑进入正文。正文段落、图片与富文本按自然高度连续衔接,长文与长图不再被一屏截断,也不在页内二次滚动;插入 30 段长文与长图后,文本页高度为 399、700、198,图片页 1514,容器 scrollHeight 8811。进度显示阅读百分比,方向键与空格每次滚动 0.82 屏(390 高下实测 320px),关闭重开按比例恢复(0.55 恢复到 621/1131)。结尾卡按内容自然增高,视口高 ≤820px 时收起“继续阅读”,≤520px 再隐藏统计并收小头像。v0.4.46 及以前的评论抽屉复用原生 .link-comment,844×390 与 1440×900 下分别测得 440×390 与 440×900,回复编辑器固定在 y=823、高 61px;这些数字仅作历史对照。互动栏点赞与收藏在 mock 写接口下分别发出 award_type=1 与 favour_type=1、folder_id 正确,再次点击发出取消参数并更新计数;CY 按钮打开 520px 输入卡,提交体含 is_cy:1、reply_id:"-1"、root_id:"-1",成功后评论数 +1;未登录点赞、收藏与 CY 均提示「请先登录小黑盒」。夜航正文 18px/33.48px、rgb(230, 237, 245),纯黑舞台 rgb(9, 9, 9)、正文 rgb(230, 237, 245),纸页舞台 rgb(250, 245, 234)、正文 rgb(51, 43, 33);六套主题中除浅色关注按钮外无近白大底块。全部阅读控件不小于 36px;帖子数据未渲染时出现“正在加载文章…”占位(实测于响应较慢的帖子页)。
v0.4.47 用同一套无头 Edge 在 1440×900 与 390×844 复核自建评论区:打开面板后 .link-comment 与 .hb-bbs-link__reply-target 实算 display: none,面板宽 440 与 390,阅读区 inert 为 true,关闭后恢复为 false 且焦点回到评论按钮;输入“hello”后按 Ctrl+Enter,拦截到的请求体为 is_cy=0&link_id=900001&reply_id=-1&root_id=-1&text=hello,成功提示后输入清空、计数递增。表情按钮展开 108 个 cube 表情,点选插入 [cube_xxx];Esc 先收起表情面板、再关闭评论面板。把评论树响应延迟注入后,失败分支保留正文并重新启用发布按钮;旧文章响应晚到时不会解锁新文章按钮,也不会把错误写进新文章的提示区。视频帖生成 data-kind="video" 的阅读页并保留原生 <video controls>;来源节点尚未渲染时先出现等待页,9 秒后显示“重试 / 查看原帖”,源节点出现后等待页自动移除,切换到另一篇文章只保留一张等待卡。头图 src 指向 404 时改用正文最大图,正文也无图时封面节点被移除;进度条高 46px,滚动区在三行布局中占据顶栏与 46px 进度栏之间的剩余高度,标题与结尾文字均不与进度条重叠。
登录恢复在 mock 页面覆盖四条路径:Cookie、storeV2API 快照、本机存储与 /account/restore_login;仅当四条都为空时才拒绝写请求并提示「请先登录小黑盒」。恢复后的账号 ID 会写入评论树、收藏夹列表与文章主评论请求,不再只看 Cookie。真实登录态下实际发布文章评论,以及线上真实视频帖在阅读器中的播放,仍待确认。
v0.4.30 在 1440×900 与 390×844 复核写请求与回退抽屉:mock 点赞捕获 link_id=194343256&award_type=1,mock 收藏捕获 favour_type=1&link_id=194343256&userid=12345&folder_id=123,mock CY 捕获 is_cy=1&link_id=194343256&reply_id=-1&root_id=-1&text=hello+CY+test,三者请求头均为 application/x-www-form-urlencoded;charset=UTF-8,成功后分别提示“已点赞”“已收藏”“CY 已发布”,按钮状态与评论数同步更新;无登录态的真实 CY 请求返回“请先登录小黑盒”,不再出现 link_id 缺失。把 .link-comment 临时改名模拟原生节点缺席后,评论按钮在约 1.4 秒后打开回退抽屉,1440 下 440px 宽、读取 24 条评论、scrollWidth=439 与 clientWidth=439,390 下抽屉占满 390px、无横向溢出;回退抽屉内头像、昵称、时间、正文、表情与引用回复均可见,关闭后 inert 恢复为 false,再次点击可重新打开。分享按钮在 1440 与 390 下均复制 https://www.xiaoheihe.cn/app/bbs/link/194343256 并显示“链接已复制”,不再触发隐藏的原生分享按钮。
社区频道页用 1200×900 夜航主题验证:.topic-link__main::after 的 8px sticky 底条实算为 rgb(23, 29, 36),.topic-link__splitline::after 的 4px 分隔线实算为 rgb(30, 38, 48),与 --heybox-up-surface / --heybox-up-subtle 一致;截图不再出现白色横带。
全站搜索页用 1440×900 夜航主题验证:#page-bbs-list、.list 与 .hb-search-result 实宽同为 1032px,与 .search-wrapper 对齐;右侧 .cpt-right-side.right 为 display: none;页面上下固定条与列表 sticky 条实算为 rgb(15, 20, 25),4px 结果分隔条为透明,横向列表右侧遮罩不再带白色渐变;近白底色扫描仅剩 4×4 加载点。
原生回到顶部按钮用 800×900、1000×900、1100×900 与 1440×900 验证:社区首页、频道页与帖子页的按钮组始终 display: none,1000×900 下不再只露出 1.2px;全站搜索页的按钮组保持 56×56,右偏移统一为 20px、底偏移 24px,1000×900 下完整可见且右侧留白 20px。
搜索建议面板用 1440×900 夜航主题验证:历史搜索胶囊底色 rgb(30, 38, 48)、文字 rgb(220, 229, 239),悬停底色为 rgb(23, 29, 36);搜索发现标题与热榜标签为 rgb(180, 192, 206),热榜条目为 rgb(220, 229, 239),条目悬停底色为 rgb(30, 38, 48)。v0.4.47 补充 Element Plus 自动完成浮层:popper 底色 rgb(23, 29, 36)、主文字 rgb(220, 229, 239)、关键词匹配片段 rgb(143, 176, 207),输入“显卡”后下拉项不再出现浅底浅字。v0.4.48 在真实搜索页输入“原”复核站点自有建议列表:夜航面板 rgb(23, 29, 36),名称 rgb(220, 229, 239)(13.329:1),匹配片段 rgb(143, 176, 207)(7.497:1),描述示例 5.413:1;纯黑面板 rgb(8, 9, 11),名称 rgb(230, 235, 242)(16.628:1),匹配片段 10.62:1,描述示例 7.899:1。Tab 可到达建议行,:focus-visible 为真,夜航与纯黑焦点底色分别为 rgb(30, 38, 48) 与 rgb(16, 18, 22),并带 2px 实线轮廓;建议面板在五套测试主题下保持 1032×656,浅色、纸页与雾青仍为白底与 rgb(20, 25, 30) 名称色。
导航栏用 1440×900 夜航主题验证:社区、收藏悬停时图标为 scale(1.14)、上移 2px,文章入口为 scale(1.1)、上移约 2px 并旋转 -7°;三个入口按压缩放均为 0.9,文章按压时旋转回 0。真实 Tab 可到达导航链接,:focus-visible 为真,图标同步上移缩放,链接显示 2px rgb(143, 176, 207) 轮廓。悬停期间图标布局盒恒为 18×18,链接 77×64、导航 314×64 均无位移;导航入口从 /creator/content_management/home 跳到 /app/bbs/home 后宿主仍在,页面无脚本错误。官方根首页的路由跳过由 tests/heybox-up-official-home.test.ts 的 jsdom 用例覆盖:/ 下默认同步任务不执行,切到 /app/bbs/home 后恢复执行;进入 / 时主题样式、导航宿主与 CY 类名被移除,存储中的偏好不变。静态偏好下根元素带 heybox-up-nav-static,减少动效环境下图标 transform、transition 与 animation 均为 none。390×844 触屏环境点按社区链接后链接仍处于 :hover,但图标 transform 为 none,布局盒保持 18×18,没有残留放大。v0.4.54 把打包后的真实 NAV_CSS 与导航图标标记渲染到本地页面,在 prefers-reduced-motion: no-preference 下复核:三个入口的流动层 animation-name 均为 hbu-nav-ico-flow、播放次数 infinite,时长 3.6 / 3 / 3.9 秒并带负延迟,stroke-dashoffset 逐帧从 0 推进到 -1,描边色 rgb(111, 141, 179),SVG 同时运行 hbu-nav-ico-breathe,图标布局盒仍为 18×18。
排序用合成用例验证:改写点赞数 1/9/4 与相对时间 3天前/5分钟前/1小时前 后,点赞与时间两种模式都按期望重排(order 为 2/0/1,纵坐标随之变化),切回默认清空 order;删除工具栏后 MutationObserver 在下一帧重建,选中模式与顺序保持。
评论预览用同一组视口验证:注入脚本后首页出现 #heybox-up-comment-rail,默认 data-state="open" 且 body 带 heybox-up-rail-open;点收起按钮回到 collapsed,点标签重新展开,Esc 同样收起;打开 /app/bbs/link/<id> 后浮层 data-state="hidden"、display: none。夜航主题下面板底色为 rgb(23, 29, 36)、文字 rgb(220, 229, 239),无浅色残留。主题令牌实测:夜航 #0f1419 / #171d24 / #dce5ef / #8593a3 / #8fb0cf;纸页 #f4efe4 / #fffdf7、圆角 4、无阴影、标题 Georgia;浅色 #fff / #14191e;纯黑 #000 / #08090b、圆角 8。接口受限时面板显示“评论需要验证,请稍后重试,或打开帖子查看。”并附“打开帖子”链接,点提示可重试;换用新会话后首条帖子恢复 16 条评论。
文章编辑器验证(1440×900,夜航 / 纸页 / 雾青):html 背景分别为 #0f1419 / #f4efe4 / #eef3f5;#page-creator-editor 与右侧预览内除开关滑块外无 rgb(255, 255, 255) 大底块,正文与预览正文的对比度分别为 12 / 11.7 / 12;发布与关注按钮不再保留站点写死的深色渐变。
文章编辑器细节用 1440×900 夜航主题验证:.creator-editor__form-wrapper::before 的 4px 分隔带由 rgb(250, 251, 252) 改为 rgb(15, 20, 25);.cpt-editor__publish::after、.hb-cpt__editor-title::after 与 .editor-menu__item-splitline 的 1px 浅线由 rgb(243, 244, 245) 改为 rgb(45, 56, 69);工具栏图标由 rgb(140, 145, 150) / 0.4 透明度改为 rgb(180, 192, 206) / 0.8 透明度;更多组件菜单文字由 rgb(100, 105, 110) 改为 rgb(180, 192, 206);扫描编辑器根节点未再发现近白背景或近白描边。
文章编辑器用 1440×900 复核纸页与雾青:.editor-article__main-content、.hb-editor 与 .ProseMirror 的底色分别为 rgb(255, 253, 247) 与 rgb(251, 253, 254),和标题栏、工具栏共用编辑器卡片的 surface,不再出现更深的 --heybox-up-subtle 色块。图文与视频编辑器在雾青、夜航下,.editor-image-text__main-content、.editor-video__main-content 与上传框均使用主题 surface,描边分别为 rgb(211, 224, 229) 与 rgb(45, 56, 69);主画布不再残留 rgb(250, 251, 252) 近白底,深色主题下浅色文字保持可读。
性能回归用无头 Edge、1440×900 与 4 倍 CPU 降速验证:社区首页注入脚本并稳定后,连续触发 150 帧与前版相同的合成 DOM 变更,优化前两轮 ScriptDuration 为 1.08 / 1.12 秒,优化后为 0.34 / 0.29 秒,降幅约 71%;同组 TaskDuration 由 1.83 / 1.89 秒降至 0.54 / 0.78 秒,RecalcStyleDuration 由约 0.10 秒降至 0.03 / 0.06 秒。正常滚动 180 帧时脚本耗时与前版持平,页面交互不受节流影响;编辑器输入区与脚本自身面板产生的 DOM 变化不触发全站同步。
v0.4.33 用同一套无头 Edge / 1440×900 / 4 倍 CPU 降速用例连续复测两轮:150 帧合成变更下,页面同步任务从 PR #69 基线的 102 / 103 次、67.6 / 43.4ms 降至 10 / 10 次、10.6 / 16.4ms,任务次数均值下降约 90%,总任务耗时均值下降约 76%。同一轮整页 ScriptDuration 为基线 0.455 / 0.339 秒、当前 0.285 / 0.331 秒,受站点渲染与 GC 噪声影响,只作为辅助参考;任务级计数才是本次调度的稳定指标。文章直读用例中,基线产生 85 次页面同步任务、约 38.0ms,当前为 0 次;阅读器 101 帧滚动只写入 5 次阅读比例(每 400ms 合并)。390×844 复测 #app 为 375.2px、页面横向溢出为 0,阅读器容器宽 390px、scrollWidth 与 clientWidth 均为 390px。
首页默认预览验证(1600×1000,夜航):注入后首页浮层直接 data-state="open",body 带 heybox-up-hide-cy heybox-up-rail-open,无需点击即显示首条帖子的标题与 6 条楼层;点第二张卡片的评论数字后浮层标题切换为该帖,地址仍是 /app/bbs/home。齿轮设置菜单里的开关点击后 heybox-up.commentPreview.v1=0、浮层 data-state="hidden"、display: none、body 类移除,此时点评论数字走站点原生跳转;再点一次开关恢复 open 并重新带出首条帖子的评论,刷新后开关状态与偏好一致。收起按钮回到 collapsed 并移除 body 类,点右缘“评论预览”标签可重新展开;视口窄于 1200px 时浮层不显示。
CY 屏蔽用合成 DOM 与假接口在无头 Edge 中验证。帖子页:三条评论中 1001 与 1003 的 is_cy 分别为 1 和 "1",注入脚本后两节点均带 data-heybox-up-cy="1";点“屏蔽 CY”后 body.heybox-up-hide-cy 生效,两条 CY 楼层 display: none,普通楼层仍为 block,按钮显示“屏蔽 CY (2)”,偏好写入 heybox-up.hideCy.v1=1;再点一次恢复显示并写回 0。评论预览:两条楼层组中一条根评论为 CY、另一组含一条 CY 楼中楼,开启后列表只剩普通楼层,楼中楼引用中的 CY 也被过滤,说明行显示“已屏蔽 1 条 CY”。
v0.4.34 用本地无头 Edge(CDP)与合成文章 DOM 复核,控制台错误为 0:阅读器开启后站点外部翻页器实算 display: none,顶部与结尾各有一个“社区首页”按钮;从 order=1001,1002、浏览记录 1001,1002、相关推荐 1001,1003 进入 1002 时,下一篇指向未访问的 1003,结尾推荐只剩 1003;order=1001,1002,1003 且浏览记录 1001,1002 时下一篇为 1003,候选耗尽时按钮禁用并显示“没有下一篇”,结尾不出现“继续阅读”。点顶部关闭后阅读器移除、外部翻页器恢复 display: block、localStorage["heybox-up.reader.v1"] 仍为 "1",提示“已退出当前文章的沉浸阅读”在 1.2 秒内未自动重开;READER_EVENT 可重新开启,Esc 同样只关闭当前文章。阅读器开启时 [ 与 ] 不改变地址,关闭后分别进入 1001 与 1003 并重新开启阅读器。H 与两处首页按钮都跳到 /app/bbs/home,焦点在输入框时 H 不触发。320 / 390 / 520 / 820 / 1440px 下页面与顶栏横向溢出均为 0,标题栏在 1440 下宽 812px;320–520px 首页按钮为 38×38 圆形,820px 与 1440px 为 96px 宽的图标加文字;320px 结尾卡与操作区位于 24–256px,首页按钮宽 103px。以上为本地 DOM 级验证,真实登录态页面仍受图片验证码影响。
v0.5.0 的评论发图与查看器层级回归由 tests/heybox-up-upload.test.ts、tests/heybox-up-reader-composer-images.test.ts、tests/heybox-up-comments.test.ts 与 tests/heybox-up-reader-lightbox.test.ts 覆盖:SHA1 / HMAC-SHA1 与 Node crypto 对齐,COS 签名串固定为已知向量,四步上传的请求体、失败保留与移除、9 张上限、回复时清空,以及从 READER_CSS 解析出的层级大小关系都在 pnpm test 内断言;pnpm check 同时跑 typecheck 与 build。
dist/heybox-up.user.js 分发,源码在 scripts/heybox-up/ 内按签名、存储、请求、样式、页面调度、主题、评论预览、沉浸阅读与路由工具分模块,由 esbuild 打包成一个自包含文件;不引入框架,也不在运行时加载外部模块。MutationObserver,每个任务声明适用路由与 DOM 区域。路由切换时强制执行一轮清理,平时只有相关区域变化才唤醒对应任务,避免文章页的观察器为首页或收藏页重复工作。AbortController;关闭收藏夹面板时取消面板请求;切换帖子、社区、预览或离开路由时取消旧请求,并把过期响应丢弃。linkId + accountId + page 缓存,最多 24 页、2 分钟失效,第一页额外收紧到 15 秒;发布文章主评论、删除评论或发布 CY 后只让对应帖子进入 10 秒冷却,冷却期内读写都回源。收藏列表仍按用户隔离并使用 10 分钟缓存。localStorage / sessionStorage 经同一访问器提供内存降级与 JSON 读写;样式优先写入构造样式表,不支持时回退到 <style>;状态样式表与内容样式表分别按 ID 持有。pagehide 与页面隐藏时强制落盘。正文分页先写入 DocumentFragment,再一次性挂载。下表按根因合并重复项,逐项记录当前版本仍存在的限制、最优可行方案与落地状态。固有约束 表示不能在不伪造数据或绕过站点权限的前提下消除;部分缓解 表示已有降级路径,但仍依赖站点结构。
| 限制 | 最优可行方案 | 状态 |
|---|---|---|
| 站点 DOM、类名与路由会无通知改版 | 集中选择器注册表、主备选择器、可见失败态与真实页面回归 | 部分缓解 |
| 接口签名、风控、验证码与登录要求由站点控制 | 共用签名请求层、超时、取消、签名回退与明确的登录/验证提示 | 部分缓解 |
| 收藏总数由服务端计算,插眼条目不计入网页收藏列表 | 只解释数量差异,不伪造或改写服务端计数 | 固有约束 |
| 插眼列表单用户最多 200 条,搜索只覆盖已加载缓存 | 增加游标分页与“加载更多”,有索引时再走服务端搜索 | 未实施 |
| 评论预览只读,不能直接回复、点赞或展开楼中楼 | 保留“打开帖子”入口,只读边界保持清晰 | 设计取舍 |
| 评论树按楼层分页,楼中楼只随所在楼层返回,单帖最多读取 200 条 | 楼中楼按父子关系递归渲染并支持就地回复;超出上限的楼层交给站点原生评论区 | 部分缓解 |
| 悬停预览过去每次切换都会发新请求 | 600ms 悬停延迟、切换取消、24 页有界缓存与 pointerout 取消 |
已实施 |
| 自动预览依赖信息流首个帖子链接 | 保持评论数字手动入口;容器缺失时明确回退到原生跳转 | 部分缓解 |
| 沉浸阅读覆盖图文帖、文本帖与纯视频帖,纯投票帖走原布局 | 按帖子类型增加通用块解析器,无法解析时明确回退 | 部分缓解 |
| 外部站点 iframe、视频与音频能否播放由提供方嵌入策略决定 | 每个可见嵌入单独成页;容器宽高独立回退到子播放器声明值;含文字的容器保留富文本;阅读期间暂停并静音原生播放器;任何后续站点来源写入后不再写回旧来源;隐藏嵌入不进入阅读页或富文本克隆 | 部分缓解 |
| 克隆正文里的画布与纯图标组件不保证可交互 | 语义块渲染、事件代理、受支持组件转发;其余标明“打开原帖” | 部分缓解 |
| 深色、纸页、雾青仍依赖站点类名;新增卡片和伪元素可能漏白 | 主题令牌桥接、空闲兜底扫描、伪元素清单与新增卡片登记 | 部分缓解 |
站点全局 * 重置会覆盖 Shadow DOM 的普通声明 |
Shadow 组件关键样式继续使用 !important,新增组件沿用约束 |
固有约束 |
| 宽屏三栏、右栏隐藏与全站搜索撑满依赖站点容器结构 | 选择器注册表、逐模块隐藏与结构缺失时的原生回退 | 部分缓解 |
| 桌面右栏整栏隐藏,热门排行只统计已渲染卡片 | 改成模块级开关;排名只对已加载数据标注范围,后续接服务端排序 | 未实施 |
| 顶部导航按地址判断激活项,纯前端状态切换时可能滞后 | 监听站点路由状态并以 MutationObserver 校正,保留路径兜底 |
部分缓解 |
| 原生评论区加载更多依赖评论列自身可滚动与站点的整页滚动监听 | 监听评论列滚动并优先点击可见的加载控件;无按钮时补发 scroll 事件,列表未增长时停止重复触发 |
部分缓解 |
| 连读候选最终受站点信息流长度与登录态限制;Vue router 不可用时退化为整页跳转 | 按 30 条分页连续发现并保留重试提示;router 缺失时继续使用站内原生链接 | 部分缓解 |
社区搜索依赖 .topic-link__main 与筛选行结构 |
优先插到筛选行父节点,缺失时回退 .topic-link__main;名称多级回退 |
已实施 |
社区搜索不支持 filter_tag、不持久化关键词,重复页不会自动继续翻页 |
对齐站点筛选参数,使用 URL 会话状态,并设置有限次自动翻页 | 未实施 |
| 阅读位置只存当前标签页;作者排序按用户名,同名用户会并列 | 阅读位置改存带版本与过期的本机记录;作者排序改用用户 ID | 未实施 |
| 单文件约 10689 行,样式、请求与存储曾重复实现 | 保持单文件分发,先抽内部纯函数与生命周期;后续再引入确定性构建 | 部分缓解 |
| 页面级同步曾按全局 DOM 变化广播到所有任务 | 单观察器、路由过滤、六类区域版本号与延迟任务重排 | 已实施 |
| 导航或切换预览后旧请求仍可能回写 UI | 15 秒超时、按任务取消、响应代际校验、有界评论缓存 | 已实施 |
阅读器滚动每帧查节点并写 sessionStorage |
缓存进度与源节点,400ms 合并写入,退出时刷新 | 已实施 |
站点 CSP 若禁止内联样式,旧 <style> 注入会失效 |
优先 adoptedStyleSheets,不支持或构造失败时回退 <style> |
已实施 |
| 仓库没有 CI,也没有完整登录态端到端自动化 | 增加 node --check 工作流,再用隔离配置补 Playwright/CDP 冒烟 |
未实施 |
移动端、低高度视口与旧版 100dvh 兼容需要逐项回归 |
响应式夹取、100vh 回退与 390×844 / 844×390 冒烟 |
已实施 |
不改站点收藏总数;该数字由服务端 bbs_info.favour_num 计算,脚本只能解释差异,不能修正。
收藏页的插眼条目由脚本另插节点,不是站点返回的数据;节点挂在列表容器外,站点分页、排序与计数不受影响。站点改版换容器或类名时插入会失效。
单用户上限 200 条;更多插眼需要分页按钮,当前未实现。
搜索只覆盖已拉取并缓存的条目,不会额外请求服务端;200 条上限同样作用于搜索范围。
接口字段与签名规则由站点控制,改版后可能失效;失效时以“加载失败”提示,不会显示假数据。
评论预览只读,不能回复、点赞或展开楼中楼;这些交互只在帖子页的原生评论区提供。
预览依赖登录态与 link/tree 接口的风控策略:未登录或触发验证码时返回 show_captcha 等状态,面板显示失败原因,需要打开帖子查看。
预览按楼层分页,楼中楼随所在楼层返回并全部显示;评论触发入口依赖 .bbs-new-style-bottom__comment 与 .content-list__comment 类名,站点改版后需同步选择器。
悬停切换只在面板展开时生效,鼠标需在卡片上停留 600 毫秒以上;每次切换都会请求一次评论接口,长时间来回划过信息流会累积请求,触发风控时面板显示失败原因。
自动预览依赖 #page-bbs-community .bbs-home__content-list 容器与其中首个 a[href*='/app/bbs/link/'] 链接;容器或链接结构变化时不会自动带出评论,需点评论数字手动切换。关闭开关后脚本不拦截评论数字,恢复站点原生跳转。
脚本未在真实登录态页面内做过端到端点击验证;DOM 逻辑依赖 Shadow DOM 与 fetch 的常规行为。
站点 CSP 目前允许内联样式;若收紧到禁止 style-src 内联,收藏区块的样式需要改为构造样式表。
深色模式基于站点现有类名覆盖,站点改版后可能出现未覆盖的浅色块或正文;反馈时请附页面地址与截图。
帖子页与收藏页的部分内容需要登录才能渲染,深色样式按站点样式表选择器覆盖,未在登录态逐页点击验证。
宽屏布局只在 ≥1200px 生效,依赖站点 #app > main、section、.layout-normal 与 #page-bbs-community main.list 结构;站点改版换容器后需要同步选择器。
沉浸阅读覆盖图文帖(.hb-bbs-image-text)、文本帖(.hb-bbs-post)与纯视频帖(.hb-bbs__video),纯投票帖仍走站点原布局。正文分块依赖 .image-text__content、.post__content 的块级结构;站点改版换容器后需要同步选择器,否则只会显示封面与结尾。视频帖若暂时读不到 <video> 或 <source>,阅读器先显示等待页,9 秒后提供“重试 / 查看原帖”,源节点出现后自动替换。
正文分块会克隆静态 HTML,链接可直接点击;内嵌组件里的按钮按“类名 + 文本”转发给原生按钮,组件若使用纯图标按钮或画布交互,克隆页上的表现可能与原页不同。正文中每个可见的 iframe、video、audio、embed 与 object 会各自复制为独立阅读页;同一容器内的多个播放器按原顺序拆页,.iframe 包装容器缺失的宽或高独立回退到子播放器的声明值。含文字与播放器的段落、div、section 与 article 保留为富文本页,原生播放器在阅读期间暂停并静音。关闭阅读器时只恢复未被站点再次写入的来源;站点清空、移除或写入任何新值的来源保持站点值,即使新值等于暂停占位。外部站点是否允许在克隆页中播放仍由提供方决定(待确认),站点自身隐藏的嵌入不会进入阅读页或富文本克隆。
沉浸阅读用 display: none 隐藏站点原生评论区与回复框,DOM 不搬动;关闭后恢复原双栏与原生评论区。自建评论面板只读取评论树,不写入站点评论 DOM。
收藏夹面板依赖 GET /bbs/app/profile/fav/folders、POST /bbs/app/profile/fav/folder/add 与 GET /bbs/app/profile/fav/folder/v2/links。站点是否真的按 folder_id 过滤成员关系尚未在登录态页面确认;多个收藏夹返回完全相同的列表时会视为服务端忽略该参数,相关收藏夹标为「待核对」。扫描失败的收藏夹同样只允许加入,不会被取消勾选隐式移除。
收藏夹成员扫描每夹最多 10 页、整轮最多 48 次请求,超过上限的收藏夹按未知处理;收藏夹列表为空时不触发全局取消收藏。真实登录态下的收藏、新建收藏夹与多夹增删仍待页面点击验证。
正文是连续滚动,没有页高上限;100dvh 不可用的旧浏览器退回 100vh。
阅读位置按帖子保存在 sessionStorage,关闭标签页即失效;页面结构变化导致页数减少时,恢复位置会夹到最后一页。
排序工具栏挂在 .link-comment 内,站点清空该节点时会被移除;MutationObserver 在下一帧重建并恢复选中模式。
排序读取已渲染的点赞数、相对时间与用户名;“作者”模式按用户名与帖子作者比对,同名用户会一并排到前面。
CY 屏蔽依赖 link/tree 返回的 is_cy 字段与楼层的 data-comment-id;站点改版去掉字段或属性后,开关仍可点,但不会命中评论。
帖子页只为已渲染但未识别的楼层补拉接口,最多 10 页(200 条);超过上限的楼层保持原样,不误隐藏。
帖子页首次识别会额外请求评论接口;未登录或触发风控时请求失败,评论保持可见,需打开帖子或稍后重试。
回复编辑器仍由站点原生逻辑管理;沉浸阅读期间它随原生评论区一起隐藏,退出沉浸后回到原来的双栏位置,原生回复、点赞与展开楼中楼都由站点处理。站点原生评论区的“加载更多”由 #page-bbs-link .link-comment 的滚动触发,该容器或站点的加载控件结构变化时可能失效,需要重新对齐选择器。
沉浸阅读的文章主评论发送 is_cy: 0、reply_id: "-1" 与 root_id: "-1";楼层回复发送该条评论 ID 与楼层 ID,楼中楼回复同样以所属楼层作为根。渲染时按 parent_id / replyid / reply_id 递归成树,父级异常时回退到楼层。发布成功后清除该帖缓存、重置回复目标,先插入本地待同步行,再重读目标楼层所在页并与已加载列表合并,同时更新阅读栏计数。真实评论树的 root_id / parent_id 字段形态、replyuser 昵称回显,以及回复接口对 reply_id / root_id 的接受结果仍待确认;未在登录态页面实测回复发布。
社区首页隐藏整个右栏;若后续需要保留右栏中的其他模块,需要改为按模块隐藏。
社区首页没有找到可确认的未读筛选路由或接口参数:H 与“社区首页”按钮只返回 /app/bbs/home,是否仅展示未读内容仍由站点信息流决定,待登录真实页面复核。
纸页与雾青预设依赖站点现有类名着色,站点改版后可能出现未着色的新容器;深色预设同样按类名覆盖,登录表单始终保留浅色。
站点全局 * { padding: 0; margin: 0; font: ... } 会覆盖 Shadow DOM 的 :host 普通声明,排序栏的 host 样式因此全部加 !important;新增 Shadow 组件时需沿用同样写法。
站点用 ::before / ::after 画卡片底部色带与 1px 分隔线,颜色写死为浅灰;底部色带在所有主题下隐藏,其余分隔线在深色主题逐个覆盖。站点改版新增同类伪元素时需同步补充,否则会再次出现白条。
正文内嵌卡片(com-game-card、com-album-card、com-award-table-card、com-chatroom-card、com-league-card、com-match-card、com-mod-card、com-sku-card、com-wiki-card)的底色、描边、文字、药丸底与按钮在站点样式表里写死为浅色,深色主题按这 9 类容器逐组覆盖;站点新增卡片类型时同样会出现未覆盖的浅色块。
顶部导航依赖 .nav .nav-links 与 .nav-link 类名:脚本隐藏原生按钮并插入自己的入口,站点改版换容器后需要同步选择器。隐藏的原生按钮仍留在 DOM 中,站点自己的路由与统计不受影响。
导航按地址判断激活项;站点若改用纯前端状态切换而地址不变,激活项可能停在上一页,直到下一次地址变化或导航重建。
连读候选来自会话浏览记录、已渲染信息流、连续发现队列与相关推荐:信息流每页 30 条,每次发现最多取 3 页并推进 offset;到达站点信息流末尾、队列耗尽或请求失败时,相关推荐仍有未访问项就自动进入,只有没有任何可用候选时才停止并显示可重试提示,不伪造候选。已访问与已见集合按账号隔离,只保留在本次会话,跨标签页或清空 sessionStorage 后重新开始。直接打开帖子或刷新后,信息流顺序可能尚未建立,此时先尝试连续发现,相关推荐仅作兜底。登录态下 /bbs/app/feeds 的实际返回仍待确认;未登录公开请求返回 HTTP 200 但 status 不是 ok。
连读切换优先调用站点 Vue 路由(#app.__vue_app__.config.globalProperties.$router);取不到 router 时退回站点 <a> 点击,会退化为整页跳转,功能仍可用但会刷新。
社区内搜索依赖 /app/topic/link/<topic_id> 路由与 .topic-link__main、.topic-link__filter-row 结构;筛选行存在时优先插在它的实际父节点 .topic-link__panel 内,筛选行缺失时退回 .topic-link__main。站点改版换容器后搜索栏可能不会挂载或位置改变。
社区名优先读右栏社区卡 .topic-aside__topic-indicator,读不到再退回页头标题与 document.title;右栏尚未渲染时占位文案会短暂使用页头名称。
社区搜索接口受站点风控影响:未登录或触发验证码时返回非 JSON 或失败状态,面板显示错误,不回退到全站结果;回退请求不带签名,若风控要求签名则仍会失败。
社区搜索按 link 条数推进 offset,并对单页内已显示的帖子 ID 去重;返回 0 条 link 时停止翻页。若后续整页都是重复 ID,列表不会增长,但需用户再次点“加载更多”,脚本不会自动循环请求。
社区搜索不持久化关键词、时间筛选与结果,也不实现站点搜索的 filter_tag 分类筛选;刷新后回到社区原生信息流。
桌面工作台依赖 #page-bbs-community .content、main.list、.bbs-home__topic-item 与 .bbs-home__content-item 结构;站点改版换容器后左右栏不会挂载。频道点击是转发站点原按钮,站点若改成非按钮容器需要同步选择器。
热门排行只统计已渲染到 DOM 的信息流卡片,未滚动到视口外的帖子不在榜内;评论数与点赞数按页面显示文本解析,站点改成隐藏数字或换单位后排序会失真。右栏不提供折扣与活动挂件,因为脚本没有对应数据接口,不生成占位内容。
全站搜索页整栏隐藏右栏;隐藏与撑满规则依赖 #page-bbs-list、.content > .list 与 .cpt-right-side.right 结构,站点改版换容器后需同步选择器。
评论发图依赖站点的三个 COS 上传接口与浏览器直传:真实登录态下未做端到端上传验证;对象键、临时凭证与回调都按站点 bundle 的参数位置对齐,站点参数调整后需要同步。大于 1 MiB 时站点另有分片上传统一路径,本脚本只用整文件 put。站点一次评论可发的图片数(max_image_cnt)在 bundle 里没有具体数值,脚本按 9 张限制。
clamp(240px, 22vw, 300px);正文最大 732px,与操作栏、历史栏分别保留 24px 间距,空间不足时缩窄正文。900px 及以下保留抽屉、遮罩、Escape 关闭与焦点恢复。196145343 的登录提示与提交结果仍待验证:ScriptCat 扩展未连接,真实投票须由用户选择并确认。@version 与本文版本号更新为 0.7.0。63% 这类百分比,读到末尾的记为“读完”,行底另有一条细进度条,扫一眼就能挑出读到一半的帖子。进度直接读取阅读器已按文章保存的滚动比例,不额外请求帖子内容。@version 与本文版本号更新为 0.6.0。4050 提到 4070,高于评论侧栏的 4065 和提示条的 4060,仍低于站点账号提示的 4100,从正文与评论侧栏打开都正常。; 拼接写进评论的 imgs 字段,纯图片评论也能提交。scripts/heybox-up/src/core/upload.ts:纯 TypeScript 的 SHA1 / HMAC-SHA1 / camSafeEncode 与 COS v5 签名,摘要与 Node crypto 逐项对齐;请求参数按站点 bundle 对齐,token 请求把 bucket、keys、mimetypes 放在表单体,回调把 is_finished 放在 query、keys 放在表单体。tests/heybox-up-upload.test.ts(摘要向量、编码、签名串、载荷解析、四步上传、非图片拒绝、站点错误透传)与 tests/heybox-up-reader-composer-images.test.ts(选图、上传后以 imgs 提交、失败保留与移除、非图片拒绝、9 张上限、回复时清空);tests/heybox-up-comments.test.ts 增加 imgs 拼接与过滤用例,tests/heybox-up-reader-lightbox.test.ts 改为从 READER_CSS 解析层级并断言查看器高于评论侧栏、低于站点提示。pnpm check(typecheck、280 项测试、build)。max_image_cnt 是组件属性,bundle 里没有具体数值,脚本按 9 张实现;token 请求的 is_multipart_upload 固定为 0,对应站点默认的 put 上传统一路径,大于 1 MiB 时的分片分支未复刻;真实登录态下的端到端上传尚未验证。@version 与本文版本号更新为 0.5.0。calc(84px + env(safe-area-inset-top))(≤760px 为 72px),首屏封面的压暗渐变由 rgba(0,0,0,.52) 到 24% 收到 rgba(0,0,0,.28) 到 14%,只覆盖顶栏文字所在的一小条,图片最上沿保持原亮度。[cube_名称] 与 [heygirl_名称],方向键在两组之间连续移动。解析器新增旧版图标字体 <i class="cube cube-e012"> / <i class="heygirl heygirl-e005">(按站点自己的 unicode 表还原),以及带 data-emoji 的 <img> 标记;精灵图 <img> 仍被跳过,未知标记保留为原文。imgs 字段渲染出的图片都带上 cursor: zoom-in 并接入与正文图片共用的查看器;查看器改为可滚动的全屏舞台,左键每步放大 1.55 倍(上限 2 步),右键逐步缩小到初始大小,双击复位,滚轮或拖动浏览长图,点背景、关闭按钮或 Esc 退出,Esc 优先关查看器再关其它面板。1.6 的图片取视口宽度的 50%(不超过原图宽度),普通照片仍按视口等比缩放并完整露出,长图不再被压成一条细线。x/n(当前第 x 篇 / 共 n 篇)。拖动时只预览并在滑块下方显示该篇标题,松手才关闭面板并跳转,不会在拖动过程中连续导航;点轨道空白处直接跳转,滑块聚焦后 ↑/→ 走向更新的帖子、↓/← 走向更早的帖子,Home 到最早、End 到最新,Enter 或空格确认,并带 role="slider" 与 aria-valuemin/max/now/text。2–30 条时绘制刻度点,更多时只保留滑块。40,0 表示不限),提示行在填 0 或超过 500 时改为高亮的内存占用警告;写入 heybox-up.readerHistoryLimit.v1 后通过 READER_HISTORY_LIMIT_EVENT 立即按新上限截断已存记录。heybox-up.postTrail.v1)与 id → 标题 的小字典(heybox-up.postHistoryTitles.v1),不缓存正文、图片或接口响应;被裁掉的 ID 会同时删除标题、阅读位置与阅读比例键,游标随裁剪量同步左移,避免孤儿键与内存持续增长。移除固定 40 条的 POST_TRAIL_MAX,上限统一走配置。tests/heybox-up-reader-lightbox.test.ts(长图宽度、普通图片 contain、左键放大、右键缩小、下限复位、背景与 Esc 关闭)与 tests/heybox-up-settings-history-limit.test.ts(默认值、0 不限、非法输入回退、提示文案、即时截断);tests/heybox-up-comments.test.ts 增加图标字体与 img 标记用例,tests/heybox-up-reader-timeline.test.ts 覆盖滑轨拖动与键盘跳转,tests/heybox-up-reader-history.test.ts 覆盖上限裁剪与孤儿键清理。pnpm typecheck、pnpm test(256 项)、pnpm build 与构建产物 node --check;真实登录态页面的渐变高度与长图观感仍待页面复核。@version 与本文版本号更新为 0.4.61。text 同级的 imgs 数组里,旧解析只读 text,图片因此整条丢失。现在 normalizeRailComment 会把 imgs 合并进正文片段,支持对象数组(url 优先,回退 thumb / src)、字符串数组、分号分隔字符串与协议相对地址;javascript:、data: 与含空白的地址被丢弃,正文内联 <img> 与 imgs 里重复的图片只保留一份。display: block、max-width: 100%、限高与圆角,不再挤在文字行内;纯图片评论不会再被当成空评论丢掉,normalizeRailGroup 也会保留只有图片的楼层。[cube_名称],站点同时下发 [heygirl_名称]、data-emoji 与 hb-emoji-<type>_<id> class 三种形态。解析器改为统一的 { pack, id },并按 pack 选择精灵图(cube v34 6×19、heygirl 6×4),未知表情保留原文不再吞内容;表情片段结构带上 pack,评论侧栏、阅读侧栏与表情选择器共用同一套 applyRailEmojiStyle / railEmojiSheetSize。102px 306px 改为 102px 323px;表情选择器的 306 硬编码也改为按 railEmojiSheetSize("cube", 22) 计算,切换精灵图后不会再错位。img.decode() 在部分内嵌 WebView 里不存在,旧代码直接调用会抛异常并让恢复标记卡住;现在缺失时按已解码处理。tests/heybox-up-comments.test.ts 的“comment media”用例组,覆盖 cube / heygirl 双包解析、191 号表情、未知表情回退、DOM 表情形态、精灵图跳过、imgs 合并、三种图片载荷、协议相对与非法地址、去重与纯图片评论;tests/heybox-up-reader-comments.test.ts 新增端到端用例,断言面板里出现 .hbu-reader-comments-image 与两个不同精灵图的表情节点。pnpm typecheck、pnpm test(225 项)、pnpm build 与构建产物 node --check;图案坐标与 sprite 尺寸另用脚本解出 PNG 逐格校验(cube v34 为 360×1140、第 19 行只有第 1 格有像素;heygirl 为 648×432、前两行满格),真实登录态页面未做像素复核。@version 与本文版本号更新为 0.4.60。heybox-up-nav-anim,减少动效媒体查询只匹配没有该类的根元素,用户显式打开的开关优先于系统设置;关闭开关时仍移除动画并换回静态图标,切换开关立即重绘已挂载的图标。tests/heybox-up-reader-history.test.ts 覆盖游标回退、分支丢弃与标题缓存;新增 tests/heybox-up-reader-timeline.test.ts 覆盖默认开启、倒序列表与开关即时移除;tests/heybox-up-style-contract.test.ts 与 tests/heybox-up-navigation.test.ts 同步减少动效选择器与根类断言。pnpm typecheck、pnpm test、pnpm build 与构建产物 node --check;时间轴面板与按钮位置为 CSS 与契约测试断言,未在真实浏览器里做像素复核。@version 与本文版本号更新为 0.4.59。fresh: true, force: true 回源读第一页;站点在评论成功后只把新楼层插进它自己的第一页缓存,脚本若沿用渲染时写入的旧副本就会漏掉这条楼层。.hbu-reader-cover 改为纵向两行,.hbu-reader-cover-stage 承载模糊底色、图片与左右切换按钮,下方新增 32px 的 .hbu-reader-cover-progress 空白条带,只放分页点;顶部压暗渐变随之移到图片区,不再覆盖条带。tests/heybox-up-reader-cover.test.ts,覆盖分页点位于图片区之外、失败封面后分页点重建;新增 tests/heybox-up-reader-comments.test.ts,覆盖预置旧缓存时首次打开仍发出第一页网络请求并显示新楼层;tests/heybox-up-reader-theme.test.ts 增加条带高度、背景与分页点不再绝对定位的断言。pnpm typecheck、pnpm test、pnpm build 与构建产物 node --check;无头 Edge 在 1440x900、1024x768 与 390x844 视口下测得条带高 32px、紧贴图片区下方且分页点不与图片重叠,真实登录态下的评论缓存仍未页面复核。@version 与本文版本号更新为 0.4.58。tests/heybox-up-comments.test.ts 的 @ 前缀回显、id 差集回显、跨楼层与歧义候选用例,以及 tests/heybox-up-reader-theme.test.ts 的“已提交”样式断言。tests/heybox-up-comment-verify.test.ts 固定该节奏。pnpm typecheck、pnpm test(19 个文件、202 条用例)、pnpm build 与构建产物 node --check;真实登录态下站点回显的延迟上限仍待页面复核。@version 与本文版本号更新为 0.4.57。tests/heybox-up-comments.test.ts 的楼层定位、分页合并、本地待同步行、回显匹配与去重用例,以及 tests/heybox-up-reader-theme.test.ts 的收起控件配色与缩进上限断言。pnpm typecheck、pnpm test(18 个文件、189 条用例)、pnpm build 与构建产物 node --check;真实登录态下的楼中楼回复回显时机仍待页面复核。@version 与本文版本号更新为 0.4.56。parent_id、replyid / reply_id,父级缺失、跨组、自指、重复 ID 或成环时把该条提升为楼层直系回复,评论不再丢失;CY 过滤与删除沿整棵子树生效。/app/user/profile/<userId>,楼层与任意层级回复都能就地回复到正确目标。/bbs/app/profile/fav/folder/v2/links 分页扫描,每夹最多 10 页、整轮最多 48 次请求;扫描失败、读不到成员关系或多个收藏夹返回同一列表时标记「待核对」,只允许加入、不会被隐式移除;收藏夹列表为空时不推断全局取消收藏。tests/heybox-up-favour.test.ts,并扩充 tests/heybox-up-comments.test.ts,覆盖嵌套、关系别名、孤儿、循环、重复 ID、孙级查找、回复昵称解析、收藏夹规划与空列表保护。pnpm typecheck、pnpm test(18 个文件、176 条用例)、pnpm build -- --target heybox-up 与构建产物 node --check;真实登录态页面的收藏夹成员过滤、新建收藏夹与多层回复发布仍待确认。@version 与本文版本号更新为 0.4.55。pathLength="1" 的流动描边沿同一几何循环推进(stroke-dasharray: .3 .7、stroke-dashoffset 从 0 到 -1、opacity 起落),不需要悬停或焦点就持续运行;关闭开关或系统启用减少动效时整组退回不带动画钩子的静态图标,流动层 display: none。hbu-nav-ico-breathe,3.8s,transform-origin: 50% 55%),只作用于图标内部,18×18 布局盒与链接位移不变。hbu-nav-ico-draw 悬停绘制关键帧与 hbu-ico-stroke 类;tests/heybox-up-navigation.test.ts 与 tests/heybox-up-style-contract.test.ts 改为断言基础层与流动层成对出现、pathLength 只出现在流动层、无内联样式、常驻动画存在且简写只声明一次,以及静态与减少动效下流动层不参与渲染。pnpm check(类型检查、134 条 jsdom 用例、构建)、构建产物 node --check,以及把打包后的真实 NAV_CSS 渲染到本地页面确认流动描边与呼吸动画持续运行;尚未在登录态真实页面复核。@version 与本文版本号更新为 0.4.54。readRailPageCache 与 writeRailPageCache 都不生效,页面一律回源;原先只清一次缓存、随后又被写回旧响应的路径被堵死。RAIL_PAGE_CACHE_FRESH_MS),反复开关面板或切换楼层时不会读到过期的一页;其余页沿用 2 分钟。comment_id、commentid、id,兼容嵌套的 comment.*,跳过空值与 0、-1 占位),随后最多轮询 4 次、每次间隔 900ms,直到该条出现在第一页;仍未出现时提示“评论已提交,列表仍待站点同步”,而不是静默显示旧列表。expectAbsentId 轮询第一页,直到被删评论真的消失,避免站点回显旧楼层后用户以为删除失败。tests/heybox-up-rail-cache.test.ts:覆盖 maxAgeMs 的 15 秒收紧与上限夹取、冷却期的读屏蔽与写屏蔽及自动过期、空帖子 id 不生效、评论 id 的多种响应形态与占位值拒绝,以及楼层与楼中楼 id 的查找。pnpm typecheck、pnpm test 与 pnpm build,以及构建产物的 node --check;未在登录态真实页面验证站点评论树的同步延迟上限。@version 与本文版本号更新为 0.4.53。POST /bbs/app/comment/delete 并只传 comment_id,与创建评论共用同一套签名参数与 target=heybox_app,但不带评论创建专用的 _rnd。user.userid,兼容 user_id、heybox_id、id,0、-1 与空值视为缺失),只有作者 id 与 resolveHeyboxId() 解析出的账号 id 严格相等才渲染删除按钮;账号 id 尚未解析完成时不显示删除入口,解析后随评论列表一起重绘。删除前再按评论 id 复核一次归属,避免伪造 data-* 触发写请求。--hbu-reader-danger(浅色 #c0364e、夜航与纯黑 #ff8e9a、纸页 #b23a4c、雾青 #b83c50),“删除”默认用次要文字色,悬停转为该危险色;五套预设下对页面底色均不低于 4.5:1,tests/heybox-up-reader-theme.test.ts 的令牌清单与对比度断言同步覆盖。tests/heybox-up-comments.test.ts 用例:作者 id 的四个字段来源、缺失与占位值处理、isOwnRailComment 的空账号/不同账号/相同账号判定,以及 buildDeleteCommentBody 的请求体。/bbs/app/comment/delete,未登录探测返回“非法请求”(签名本身被接受),真实登录态下的返回与是否级联删除楼中楼仍待确认;确认后若服务端未级联,重新加载评论会以服务端结果校准。pnpm typecheck、pnpm test 与 pnpm build,以及构建产物的 node --check;未在登录态真实页面点击验证删除。@version 与本文版本号更新为 0.4.52。#4a678d 链接、纸页 #7b6244、雾青 #40646d、夜航与纯黑沿用浅蓝强调;纸页把次级文字调深到 #726451(对 #f2eadb 为 4.80:1),雾青调到 #567076(对 #eaf2f3 为 4.65:1),正文、次级文字、链接与按钮前景在五套有效预设下均不低于 4.5:1。tests/heybox-up-reader-theme.test.ts:在 jsdom 中合成五套有效预设的令牌解析,逐项检查令牌非空、纸页与雾青不同于夜航、正文/次级文字/链接/按钮的 WCAG 对比度、控件规则引用令牌、阅读器规则内不再出现固定的夜色字面量,并保留布局断言。pnpm typecheck、pnpm test 与 pnpm build,以及构建产物的 node --check;五套主题在真实页面上的视觉效果与截图对比仍待确认。@version 与本文版本号更新为 0.4.51。reply_id 与 root_id,可点“取消回复”或按 Esc 退回文章主评论。失败时保留草稿与回复目标,成功后清空目标并重新拉取第一页。total_floor_num,或缺少总数且本页不足 20 组时停止“加载更多”,不再因占位关系或重复楼层反复请求。#page-bbs-link .link-comment 自身滚动,距底部 240px 时优先点击可见的加载控件,没有按钮时补发 scroll 事件,并带 1.2 秒冷却与高度增长判断。pathLength="1" 与其他动画钩子,只在“动态导航图标”开启时出现,悬停、键盘焦点与按下触发约 0.52 秒的描边动画;关闭开关或系统减少动效时替换为静态图标,并清除变换、过渡、动画与描边虚线偏移。切换只替换图标子树,保留链接地址、文本、标签、激活态与焦点。tests/heybox-up-comments.test.ts、tests/heybox-up-native-comments.test.ts、tests/heybox-up-navigation.test.ts 与 tests/heybox-up-style-contract.test.ts 的 jsdom 用例,以及 pnpm check 与构建产物的 node --check;尚未在登录态真实页面复核评论字段、回复接口与原生加载控件。@version 与本文版本号更新为 0.4.49。heybox-up.navMotion.v1、默认开启、齿轮设置与原有导航路由。(hover: hover) and (pointer: fine) 设备:390×844 触屏点按社区入口后链接仍处于 :hover,但图标 transform 为 none,不再残留 1.14 倍放大;键盘焦点与按下缩放在触屏上继续生效。prefers-reduced-motion 同时清除图标变换、过渡与动画;建议行可用 Tab 聚焦,焦点保留 2px 可见轮廓。tests/heybox-up-style-contract.test.ts 样式契约用例,随 pnpm test 在 jsdom 下执行。@version 与本文版本号更新为 0.4.48;补充导航动效机制、搜索建议覆盖范围与实测数据。role="status" 播报。prefers-reduced-motion 仍可关闭。@version 与本文版本号更新为 0.4.47;同时修正文档里的缓存时长、评论面板与验证方式描述。/bbs/app/comment/create 时传 is_cy: 0、当前 link_id、reply_id: "-1" 与 root_id: "-1",不再要求先点开某条他人评论才能进入回复状态。原生评论抽屉与只读回退面板都提供该输入框;支持 Ctrl+Enter / Command+Enter 发送、1000 字计数、空内容禁用提交,失败时保留原文并显示接口错误,成功后清空输入并同步阅读栏评论数。.image-text__header-image 时从正文图片中挑选面积最大且足够大的一张作封面,跳过头像、图标、表情与小图;正文也没有可用图片时移除封面节点,标题直接进入首屏并垂直居中,不再保留深色空白占位。box-sizing 与禁用按钮过滤,发布后键盘焦点的循环不再落在灰色按钮上。原生评论节点位于隐藏容器时改用自定义回退面板,避免打开空白抽屉。@version 与本文版本号更新为 0.4.46;@description 与数据来源说明补充文章主评论。window.storeV2API(account.heybox_id),Cookie 要等站点自己的 /account/restore_login 返回后才落地;脚本此前只读 heybox_id / user_heybox_id Cookie,在 document-start 或刚进收藏页的瞬间拿不到账号,于是整块按未登录处理。storeV2API 快照(要求 entry.exists === true)→ localStorage / sessionStorage(heybox_id、user_heybox_id、account.heybox_id,兼容裸数字与 JSON 快照)→ 带签名的 GET /account/restore_login(依次读 result.account_detail、result.profile、result)。占位值 None、null、undefined 依旧不算账号。hkey 不能为空、该用户已注销、登录失效)统一提示为「登录状态已失效,请重新登录小黑盒后点击刷新。」。npm test 46 项全部通过。result.links,帖子 ID 改名为 link.linkid,脚本此前只读 result 数组与 link.id。现在依次兼容 result 数组、result.links、result.list 与 result.comment_list,帖子 ID 取 link.linkid、缺省回退 link.id;翻页结束改看 has_next(顶层或 result 内),再回退 no_more,最后才用“本页无条目”判定,避免第一页被当成末尾。.user-favour__list 还没出现时先挂到 #page-user-favour 的内容区末尾,列表渲染出来后再挪到它正下方。heybox_id 为 None、null、undefined 等占位值时回退 user_heybox_id;两者都不可用则照常显示区块并提示未登录,不再往页面根节点之外乱挂,也不会拿占位值发请求。p,段距统一 .72em;页内上下内边距收为 0,跨页处只保留一次段间距,段落之间的空隙回到正常文章的排版节奏。tests/heybox-up-reader-spacing.test.js,覆盖行距上下限与解析、文本页段距与内边距、逐段生成 p 的行为;收藏相关用例补充 linkid、result.links 与 has_next 分页、占位 heybox_id 三个场景。.user-favour__list 下方。aria-label 与 title 同步为 CY <n>。/bbs/app/link/tree 评论层级中带 is_cy 的条目;result.link 没有帖子级 CY 总数,因此只覆盖已加载的第一页,超过 20 楼且 CY 在后续页时会低估,0 表示第一页没有 CY(待确认:登录态下 /bbs/app/link/tree/v2 或 /tree/backend 是否返回帖子级总数)。#page-user-favour。站点原生收藏列表异步渲染完成后会触发重新同步,插眼区块随即挂到 .user-favour__list 下方,不再因为首次同步时列表尚未出现而永久缺失。/app/user/favour/content/ 这类带尾斜杠的地址也能正常挂载插眼区块。/app/user/favour/content 与带尾斜杠的 /app/user/favour/content/ 下,于 #page-user-favour 内异步插入 .user-favour__list,断言 MutationObserver 与延迟同步任务把插眼区块紧跟在原生列表之后挂载。/bbs/app/feeds 的后续页(pull=0、offset 每次递增 30、dw=660),不再局限于进入帖子前已渲染的条目。[ 与 ] 改为由阅读器接管。heybox-up.feedQueue.v1:<heybox_id>、heybox-up.feedCursor.v1:<heybox_id>、heybox-up.feedSeen.v1:<heybox_id>、heybox-up.feedRecent.v1:<heybox_id>;信息流顺序最多保留最近 600 条,关闭标签页即清除,切换账号后读取各自的状态。status 不是 ok。本次验证覆盖纯函数单元测试、语法检查与差异检查。iframe、video、audio、embed 与 object 现在会复制为独立阅读页,缺少正高度时按 16:9 显示。.iframe 包装容器缺少一侧尺寸时,宽与高分别独立回退到子播放器声明值。含文字与播放器的容器(段落、div、section、article)保留为富文本页,文字与播放器一起显示。_rnd 签名,使用本次请求的 nonce 与 _time 计算 HMAC-SHA256,修复输入内容后提示缺少参数的问题。H 也可返回 /app/bbs/home。R 与 Esc 改为只关闭当前文章的阅读器,不再改写全局沉浸阅读偏好;进入其他帖子仍自动开启。[ 与 ] 不再触发外部翻页。DocumentFragment 一次挂载;滚动比例改为 400ms 合并写入,并在退出或页面隐藏时刷新。#app 宽度下限;桌面左右工作栏只在 1200px 以上挂载,并在跨断点缩放时即时清理。MutationObserver 合并为一个共享调度器:所有同步任务按 120ms 窗口合并,站点连续渲染时不再为每个观察器、每一帧重复启动回调。--heybox-up-subtle 色块,标题、正文与底部工具栏重新连成一张纸面。rgb(250, 251, 252) 近白底、浅色文字落在白底上的问题。application/x-www-form-urlencoded;charset=UTF-8 编码;点赞、收藏与 CY 发布不再发送服务端无法解析的 JSON,CY 不再报 link_id 缺失。.page-header__share-btn,改为系统分享或复制帖子链接,并提供可见的成功/失败提示。result.link 的真实状态与计数,收藏支持收藏夹列表与再次点击取消,未登录统一提示;不再依赖隐藏的原生按钮。is_cy=1 的评论,成功后更新评论数并提示;Esc、遮罩与取消按钮均可关闭。#page-bbs-link、.content 与 .list 透明并停止拦截指针,主题背景不再盖住阅读舞台;收起后可再次打开,inert、焦点与抽屉状态正常恢复。contain 完整显示,背后铺同一张图的模糊底色;左右滑动只切封面,末图再左滑进入正文。Tab 循环,Esc 在回复框里也能先关抽屉。helper 目录,验证改为语法检查加真实页面断言。.layout-normal 到舞台之上,遮罩位于舞台与抽屉之间,点遮罩可关闭;评论未加载时给出提示,不再把阅读区卡在 inert。inert,关闭后焦点回到评论按钮,回复编辑器固定在抽屉底部。滚轮、↑ / ↓、j / k、空格、Home / End、C 与 R 均可操作,阅读位置按帖子记忆。.topic-link__panel 后,旧代码仍向 .topic-link__main 插入,insertBefore 因目标不是直接子节点而抛错。现在按筛选行的实际父节点挂载并校验相邻位置;页头不再提供社区名时改读右栏社区卡,恢复具体社区名占位。space 占位条目,旧逻辑用原始条数推进 offset 并判尾页,首屏就显示“已到最后一页”且跳过后一页;现按 link 条数推进,单页重复 ID 去重,返回 0 条 link 时停止。role="status" 与 aria-live="polite" 播报;关闭面板时焦点回到搜索框,“加载更多”加载中或隐藏时也不再把焦点留在按钮上;Esc 只在焦点位于面板或页面空白处时生效,避免误关站点的图片查看器或对话框。/app/search/list)桌面隐藏右侧热搜、二维码、App 链接与备案栏,结果列表占满内容区;夜航主题补齐页面与列表上下固定色条、结果间 4px 分隔条与横向结果列表右侧箭头遮罩,消除顶部、底部与列表中的浅色横带。/app/topic/link/*)夜航主题下残留的浅色分割线:站点 8px sticky 底条与 4px 帖子分隔线原来放在 :is() 内与伪元素组合,选择器无效,主题规则未生效;改为独立伪元素选择器,并分别使用当前主题的 surface / subtle 色。NAV_ICONS.cy,会显示成“undefined 插眼收藏”。插眼补全仍在收藏页内,并保留 #heybox-up-cy 锚点直达。#page-creator-editor)补齐主题覆盖:外层列表、标题栏、正文区、底部工具栏、社区与话题、权限选择、发布栏、右侧预览和帮助面板统一改用主题令牌,深色主题下正文、链接与预览正文恢复可读对比。html 背景与 data-mask 边缘同步跟随主题,消除页面缝隙处的浅色细线。.search__pull-list 留下约 26px 浮层并截获首张帖子卡片点击的问题;仅在建议数据为空时收起浮层,正常搜索发现、热榜与建议列表仍按原样显示。[ / ] 与站内路由切换行为。.link-comment__comment-item::before 同时用于楼层分隔线和悬停高亮,深色规则误把悬停层涂成了不透明边框色。.link-comment__comment-item + .link-comment__comment-item:not(:hover)::before),悬停层恢复站点原有的半透明色,评论文字保持可读。localStorage 无值时不再把 null 当作 0,默认宽度回到 56%。[cube_表情名] 文本,旧解析只接受数字编号,导致所有具名表情都被当成普通文本。data-emoji 节点;未知表情保留原文,不再吞掉内容。background-repeat 回卷正坐标,预览层改为无重复背景后必须使用行列为 十位 − 1 / 个位 − 1 的负坐标,表情不再透明。no-repeat 下落到图片边界外而显示空白的问题。heybox-up-dark-flat、-flat-subtle、-edge、-ink 类,再用主题令牌覆盖,站点新增白色块时无需逐条补选择器。.content 用 1fr | 中栏 | 1fr 三栏栅格,左右两列等分,中栏默认占屏幕 56%,可在主题菜单里选 40% / 48% / 56% / 64% / 72%,偏好写入 heybox-up.feedWidth.v1;中栏上限 1180px,并保证两侧至少留 560px,避免侧栏压到正文。#page-creator-content-management 与 -detail)补齐深色:页头、标签栏、条目悬停底色、分隔线、数据指标卡(.creator__data-indicator)、图表区、草稿页与预览框都改用主题令牌。#page-topic-link)补齐深色:整页底色、上下两条固定色条、面板/页头/筛选行、底部渐隐条、分屏线,以及右栏的社区指标与小程序卡片。data-emoji 的 cube 表情与 [cube_NN] 文本标记都渲染成 17px 精灵图,位置按站点 CSS 的 (7-N%10, 19-floor(N/10)) 换算,不再被当标签剥掉后变成空白。link/<id>。com-* 卡片族的深色适配:9 类卡片容器与 .is-editor-mode、占位卡、::after 描边、奖项表行边框、主次文字、药丸与表头底色、深色实心按钮、图片占位底统一改用主题令牌。.comment-item__writer-like span 药丸底、.children-item__comment-creator 蓝色作者名与 .scroll-list__no-more-desc::before 浅色分隔线一并覆盖。topic_id 内请求帖子,支持时间筛选、加载更多、全站搜索入口与返回社区。localStorage。heybox-up.navMotion.v1。#heybox-up-cy 锚点并滚动到“插眼收藏”区块;从其他页面进入时用 sessionStorage 标记,等区块挂载后再定位。[ 与 ] 快捷键;切换走站内路由,不整页刷新,并滚动回顶部。heybox-up.commentPreview.v1,刷新后保持。.hb-bbs-image-text、.hb-bbs-post、.hb-bbs__video 的 ::after),卡片改用边框与间距分隔。.section-title__content,补齐排序栏被站点全局通配规则覆盖的问题。link/tree 返回的 is_cy 标记楼层并隐藏;按钮显示已屏蔽条数,站点重渲染后由 MutationObserver 重新标记。heybox-up.hideCy.v1 偏好。/bbs/app/link/tree,按 20 条翻页,支持收起按钮与 Esc,进入帖子页或窄屏时隐藏。section 与 main.list 的浅色伪元素、个人主页动态分隔条。html 根元素同步改为深色,消除页面边缘与滚动区域的浅色露底。.link-comment 停靠右栏,排序、回复、点赞与展开楼中楼全部复用站点逻辑。data-heybox-up-dark 布尔标记,夜航与纯黑共享全部深色覆盖,避免新增预设漏掉深色样式。localStorage。localStorage。docs/assets/heybox-up.svg,脚本 @icon 使用内联 data URI。#6f8db3,与整体冷色图标一致。createCard 供收藏页区块继续使用。@description 补全功能、权限与影响披露(以登录态读取本站插眼、本地自算签名、仅写本机缓存、需登录)。@homepageURL、@supportURL 与内联 SVG @icon。MIT License
按平台协议「脚本描述须准确反映功能、权限及可能的影响」逐条说明:
@grant none,无特权 API,无 GM_xmlhttpRequest,无跨域提权。heybox_id / user_heybox_id,回退站点自身的 storeV2API 快照、本机存储的同名键与站点 GET /account/restore_login),并以该登录态请求小黑盒自身接口 /bbs/app/profile/bbs/comment/list(本账号的插眼记录)。信息流评论预览、沉浸阅读自建评论面板的分页与 CY 标记会按需请求站点评论树接口 /bbs/app/link/tree;文章连读会按需请求只读信息流接口 /bbs/app/feeds。点赞、收藏、收藏夹列表、新建收藏夹、收藏夹成员扫描、文章主评论与 CY 发布仅在用户点击对应按钮时调用站点写接口或收藏夹接口。账号 ID 只在内存中缓存 60 秒,不额外落盘。hkey、_time、nonce,评论创建另要求 _rnd。脚本在本地自行计算,不下载、不执行任何外部代码;规则见「三、接口签名」。localStorage(键 heybox-up.cy.v1:<userid>),主题与功能开关写入 heybox-up.theme.v1、heybox-up.commentPreview.v1、heybox-up.navMotion.v1;连读顺序、发现队列、游标、已见帖子与最近作者/话题只写入当前标签页的 sessionStorage。沉浸阅读评论树只在内存中缓存,最多 24 页、2 分钟失效(第一页 15 秒),键为 linkId + accountId + page,写操作后该帖缓存冷却 10 秒,不写入任何存储;排序仍由站点原生组件管理。不向任何第三方服务器发送数据,无统计、无埋点、无追踪。@antifeature:无返佣链接、无广告、无付费、无挖矿、无会员限制、无用户追踪,故未声明。