Files
2026-10-27 17:39:27 +07:00

192 lines
30 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# API 对接验证
日期:2026-10-17。
## 2026-10-22 测试与生产环境配置
本项目增加 `config/test.env`、`config/production.env`,保留独立的开发配置。进程变量优先,其次为对应 `*.local.env`,最后为基础配置;本地覆盖文件忽略提交。接口均沿用 `https://91av-wz.80sygtm.com`,默认端口均为 21021。测试部署使用 `APP_ENV=test` 和 `NODE_ENV=production`,构建目录为 `.next-test/`;生产目录为 `.next/`。开发目录为 `.next-dev/`。SEO 快照随对应目录隔离,同 API 的两个环境也不会共用快照。
`npm run build:test`、`npm run check` 通过,全部 290 项测试通过。新增测试覆盖配置优先级、环境隔离、CLI 参数、错误配置、真实子进程退出状态,以及同上游的 SEO 快照隔离。另通过启动脚本分别启动两套实际 Next.js 服务,使用临时端口和本地模拟上游验证静态资源及 API 代理均返回 200,验证结束后关闭临时服务。未执行远程部署。
## 2026-10-22 slug 路由
本项目(`JHA-1047`)的内容链接、轮播、专题/标签/栏目、搜索、书架卡片、选集、评论分页及解锁后跳转统一优先 slug,缺少时用 ID。支持 slug 地址直接访问与刷新,保留原 ID 地址直接访问;业务写入及仅接受 ID 的读取继续使用真实数字 ID。专题详情按当前文档先从分页专题目录解析 ID,不向接口发送未定义的 slug 参数。
生产构建及全部 283 项测试通过。新增回归覆盖 URL 编码、中文及特殊字符、分页目录解析、目录异常与缺失资源、canonical/JSON-LD 一致性、客户端选集与解锁跳转,以及严格 Swagger 参数约束下的 Next.js 生产响应。当前 Swagger 的 slug 查询参数已只读核对;测试使用本地模拟接口,未提交真实付费解锁、订单或评论。
## 2026-10-21 跳转性能优化
公共数据服务增加短期进程内缓存和并发合并:配置、页脚、导航、分类及标签选项 60 秒,首页 30 秒;按上游及查询参数隔离,返回独立副本并限制条目数量。无效数据、错误响应、认证和私人业务读取不缓存,配置/首页可在刷新失败时使用最近一次有效数据。详情、章节、选集、评论和推荐在响应详情之前并行请求,仍在服务端输出完整 HTML。
浏览器直接复用首屏公开配置及页脚,SDK 配置不序列化。公开页从浏览器前进后退缓存恢复时保留文档,后台按当前 Cookie 恢复身份并补报页面访问;账户、播放、支付及打开弹窗的页面保留重新验证。类型检查、生产构建及全部 258 项测试通过,包括跨请求缓存、并发合并、过期、错误恢复、副本隔离、缓存边界、两个账号隔离、首屏配置白名单、并行请求屏障、后退恢复与埋点。
真实接口及 29 个页面检查通过。本机短期采样中,公共缓存预热后列表约 312ms、专题约 287ms、回家的路约 143ms(首字节中位数,各 3 次);首次游客会话曾超时,另一次交替对比也出现显著上游波动,不能将上述采样当作稳定延迟承诺。未提交真实订单、付费解锁、评论或反馈,未执行浏览器视觉验收。
## 2026-10-21 服务端直接渲染
请求与渲染方式:页面数据在服务端准备,页头、公开列表、搜索、详情/播放、应用目录、回家的路、反馈、个人中心及设置、充值/VIP 的正文随初始 HTML 返回。站内链接、分页和搜索使用原生文档请求,保留当前页面直到新响应到达;不再清空正文显示页面加载占位。浏览器复用首屏快照绑定交互,避免启动时重复读取整页数据。提交成功后重新请求当前页面,轮播、图片解密、实时权限、解锁和支付确认保留。
Proxy 为有效业务页面准备身份,并在本次请求中传递新 Cookie,供服务端读取账户内容;同一 Cookie 同时写回浏览器。客户端复用服务端用户快照,避免再次初始化游客;正式账号失效显示登录入口,服务异常直接提供重试。外部传入的内部身份头先清除,用户、列表、套餐和流水使用明确字段白名单,凭证不写入 HTML;账户响应继续禁止缓存和索引。独立 `/navigation/`、资源、无效地址和尾斜杠重定向不触发该会话流程。
类型检查、生产构建及全部 249 项测试通过,覆盖完整首屏正文、原生跳页保留旧文档、快照绑定不重复取数、两个账号隔离、伪造身份头、正式账号过期与退出、Cookie 传递、套餐及流水、播放器与广告/轮播清理。真实只读接口及 29 个页面检查通过,另确认真实免费与金币章节页面输出完整 HTML。没有创建真实订单、付费解锁、提交评论或反馈;未执行浏览器视觉验收。
## 2026-10-21 动态导航
顶部与侧栏共用 `navigation/header` 的服务端数据,移动抽屉继承同一菜单,底栏按同源数据生成。保留接口名称、顺序、图标和二级条目;过滤底部类型、不安全地址及已移除的独立剧集地址。首屏 HTML 已包含真实链接,原脚本不再插入固定顶部导航或覆盖接口名称。已知 API 的 `/hot` 与空系统入口直接生成本站路径,不新增跳转。
路由高亮由同一纯函数处理首屏及客户端导航:首页精确匹配,列表分页保持选中,排行榜覆盖三个榜单,具体专题及带查询条件的入口按对应地址匹配,顶部不借用详情页的列表高亮。接口空列表不回填静态菜单;异常只提示导航暂不可用,正文仍能加载。构建、类型检查和全部 248 项测试通过,覆盖动态顺序/名称、二级条目、外链、空列表、异常、旧剧集过滤和高亮规则。
## 2026-10-21 移除独立剧集
按后续确认移除桌面顶部、侧栏、移动端的“剧集”导航,以及独立剧集列表、视频详情和对应分页路由;旧地址无论是否带尾斜杠均直接返回 404,不请求内容接口,也不重定向。首页与 JSON-LD 不再展示旧类型的视频栏目。短剧详情、选集、金币解锁和章节播放保留。构建、类型检查与全部 242 项测试通过,包括入口清理、旧地址 404 和原有播放/解锁回归。
## 2026-10-21 当前 Swagger 对接
按 `91av-wz.80sygtm.com` 当前文档与实际只读响应核对页面接口,端点和参数映射见 [页面接口对照](api-contract.md)。修正短剧列表、专题顶层字段、题材筛选、搜索联想与空结果推荐、详情推荐及章节 SEO/统计字段;删除旧接口代理依赖。首页“更多”保留已确认的 moreUrl 优先规则,未配置时只展示真实首页栏目的数据。按用户后续要求移除独立剧集导航和路由,旧地址及分页直接返回 404;短剧章节播放保留。
构建、类型检查及全部 240 项接口合同与回归测试通过。真实服务验证游客身份、列表/三个榜单、专题、标签、配置、应用、套餐、个人列表和余额记录;另核对 29 个原生页面响应与实际有内容的免费/金币章节(`/play/10923/12723/`、`/play/10923/12726/`)。没有创建真实订单、付费解锁、注册账号或提交评论、反馈。未执行新的浏览器视觉验收。
## 2026-10-20 充值确认弹窗
恢复原 HTML 的支付标题/副标题、订单卡片、基础/赠送/合计金币、金额徽标、渠道图标按钮及选中圆点、确认按钮和底部说明,并复用原稿的尺寸、间距、圆角及移动布局。支付宝、微信、USDT 图标使用原始本地素材;渠道仅来自套餐配置,其他渠道保留名称和通用图标。使用隐藏表单值连接样式按钮和原下单参数,金币充值与 VIP 接口保持不变。
`tests/payment.test.mjs` 验证实际金币字段及金额换算、不注入演示赠送或未配置渠道、方法切换后的订单参数、重复提交拦截、VIP 接口、无效支付地址、无支付方式以及旧表单响应隔离。类型检查、生产构建和全部 152 项测试通过,仅使用本地模拟上游,没有创建真实订单或发起真实支付。
## 2026-10-20 详情选集解锁
对照参考项目 `playletser/chapter.go` 的列表权限规则和 `pages/play.js` 的解锁处理,金币集数使用按钮直接打开 `play-episode-lock`,保留原 HTML 的金币图标、余额/消耗摘要、确认和充值入口样式。弹窗先获取目标章节详情,再展示实际价格及余额;仅确认后提交解锁,成功刷新余额并跳转所选真实章节。已可观看和会员章节按最新权限处理,余额不足和登录过期分别进入充值或登录。
新增测试覆盖:列表权限优先级、详情页弹窗不提前跳转/扣费、最新价格覆盖列表旧价格、正确章节 ID、重复点击及确认防重、支付中禁止切换、迟到响应隔离、关闭/离开页面、余额不足、已可观看/VIP、章节信息不匹配、登录失效、失败重试,以及实际 Route Handler 的凭据和解锁参数转发。类型检查、生产构建与全部 147 项测试通过;测试仅连接本地模拟上游,未提交真实金币解锁。
## 2026-10-20 详情页样式调整
区块留白按原稿保留:横幅上下桌面端 26px、手机端 22px,官方链接至评论区 28px。无横幅数据时,选集与官方链接之间仍保留对应间距,不因条件渲染移除广告区而贴合。
对照原 HTML 的 `overviewMarkup`、操作栏、选集和评论 DOM 恢复结构,复用已有桌面/移动样式及原始 SVG 素材;修复 API 按钮属性与原样式选择器不一致的问题。简介支持三行截断与展开/收起,尺寸变化及离开页面时更新和清理;选集分段只横向调整滚动,保持桌面/手机切换前的章节位置。评论使用原稿的头像、正文、时间/操作行和嵌套回复容器,保留接口和独立分页路由。
`tests/detail.test.mjs` 验证动态字段与文本转义、图片解密入口、真实章节链接、配置官方链接和简介展开/尺寸变化/清理;播放测试补充详情页点赞接口、评论回复结构及移动端集数分段。类型检查、生产构建和全部 137 项测试通过。浏览器视觉复核仍受访问工具策略限制,未生成新的浏览器截图。
## 2026-10-20 登录逻辑调整
游客登录 403 当时通过匹配实际 HTTP Host 和协议修复了本地监听地址误判。2026-10-26 正式站点复核发现:空参数登录请求不带 Origin 时返回 400,携带正式域名 Origin 时却被本地检查拦截为 403。因此现已按 `jha-1045-hgdjnet-web` 移除代理层 POST 来源拦截,并以 CDN 域名、内部 Host 和协议变化的真实 HTTP 集成测试替代原来源校验单元测试;上游权限错误仍正常返回。
修复后对用户正在运行的 `http://localhost:3000/api/app/auth/guest` 进行一次正常游客握手,携带浏览器 Origin 和设备标识,真实响应为 HTTP 200 / code 200,返回用户信息及会话 Cookie。未记录或展示登录凭证,未提交正式账号注册、密码或其他业务写操作。
对照参考项目的 `common/auth.js`、登录/绑定弹窗及 `authser` 调整游客初始化、账号切换、绑定、失效恢复和退出。`tests/auth.test.mjs` 验证账号/邮箱和密码校验、密码确认、协议、设备持久化、首次渠道与邀请码、存储不可用、游客请求合并、登录响应顺序、失败保留原身份、旧请求隔离、正式账号过期只提示一次、手动退出,以及实际弹窗事件的防重复提交和密码清理。
HTTP 集成测试另验证真实 Route Handler 的登录与绑定参数、游客 Authorization、可选邮箱补全、设备头与客户端 IP、getInfo 不返回 token 时续用原凭证、正式账号初始化过期不降级、游客 GET/POST 失效最多重试一次、HTTP 401、缺少 token 的异常登录响应、Cookie 清理和退出后一次自动登录跳过。类型检查、生产构建和全部 127 项测试通过。测试只连接本地模拟上游,没有提交真实账号登录、绑定或密码重置。
## 真实接口
通过本地 Next.js 代理验证首页、配置、底部信息、短剧运营列表、热榜、专题、热搜、应用列表、充值套餐和搜索接口,均返回业务码 200。首页使用服务端请求的实际内容,首页筛选项保持移除。
上游 `POST /api/app/auth/guest` 在直接请求和代理请求中均出现超时(最长等待 25 秒)。无有效 token 的章节列表返回业务码 1000。真实登录态下的播放、用户资料、评论、收藏、订单和金币解锁尚未完成端到端联调;没有向真实接口提交评论、支付订单或解锁请求。
## 本地集成测试
`npm test` 启动独立模拟上游和 Next.js 生产服务,检查:
- 服务端渲染使用上游标题和栏目;API 文本转义;首页筛选项未恢复。
- 首页广告列表显式返回 `null`、轮播/栏目/公告为非数组、数组夹有空项时仍返回 200;有效内容继续显示,空内容显示空状态。
- 纯站点地址和带 `/` 的根地址均直接返回首页及 200,无 Location 响应头;首页入口指向根路径,短剧入口单独指向 `/shorts/`。
- 游客 token 仅写 HttpOnly Cookie,不返回到前端脚本;设备头按参考格式发送。
- 公共请求隔离过期 token;兼容二次编码的 JSON data。
- 正式账号会话失效后,写请求不会自动降级为游客重试。
- 接口白名单、请求方法、跨站写入拒绝。
- 保留真实章节 ID、观看权限和单集金币数。
- 退出登录清理会话 Cookie,不调用上游业务写接口。
- 30 个页面路径以 `/` 结尾,直接返回 200 且没有 Location 响应头;不带尾斜杠的地址也直接返回 200;`/shorts/` 刷新返回 200;无效路径返回可见的 404;首页和业务页面链接直接包含尾斜杠。
- `/navigation/` 直接访问与刷新返回 200,独立渲染入口线路、渠道和 App 下载链接,不加载业务页面运行脚本;首页及其余 30 个路径均不包含入口导航弹窗或隐藏页面的等待状态。
- 顶部、悬浮工具和首页底部的下载入口在配置未知时保持隐藏;页面不包含悬浮二维码面板。独立入口页在下载地址为空或无效时不渲染下载按钮。
`tests/routing.test.mjs` 另检查所有路由类型、中文和含斜线的搜索词、hash 地址不转换或替换、站内链接识别,以及 History 导航的事件通知、重复地址和前进后退记录。
全部分页使用 `原页面路径/page/页码/`,第一页链接使用原路径;页码、上一页和下一页均为真实链接。`tests/pagination.test.mjs` 覆盖短剧、剧集、专题/题材/标签/栏目、榜单、搜索、个人收藏/历史/已购、充值和 VIP 余额明细,以及详情/播放页的评论分页,检查页码解析、首尾页、无效页码、中文搜索词、排序保留和会员接口参数。播放器测试检查评论页码与排序、真实分页链接;HTTP 集成测试检查 20 类路径的两种尾斜杠形式均直接返回 200、刷新不重定向,以及非法分页路径返回 404。本次生产构建及全部 109 项测试通过。
排行榜独立使用 `/rank/hot/`、`/rank/new/`、`/rank/follow/`,对应接口 `rankType=1/2/3`。`tests/rank-pages.test.mjs` 检查真实页面路由逻辑、链接与当前页高亮、标题、刷新和翻页后的榜单类型,以及加载中和请求失败时保留导航;HTTP 集成测试检查三条路径两种尾斜杠形式均直接返回 200、独立标题且没有 Location 响应头。原 `/rank/` 仍直接展示热播榜,不重定向。此次生产构建和全部 100 项测试通过。
`tests/download.test.mjs` 检查下载地址优先级和有效性、各下载入口随配置显示/隐藏、动态插入入口,以及桌面端直接打开链接、移动端点击弹窗与组合键保留浏览器默认操作。
`tests/render.test.mjs` 检查广告、首页列表及嵌套栏目中的空值和类型异常,保留有效内容顺序及 HTML 转义;弹窗测试另覆盖广告队列中的空项和非对象项。
`tests/images.test.mjs` 使用参考算法的固定密文验证逐字节解密、100 字节边界、MIME 识别和普通图片兼容,并检查重复请求合并与缓存、并发和优先级、失败重试、超时取消、异步切图、Blob 释放、初始/动态节点和视口懒加载。渲染与 SSR 测试另确认接口图片不直接写入 `src`,视频封面使用 `data-poster`。
2026-10-19 只读抽取真实首页接口的 3 张图片验证,均返回 HTTP 200,按参考密钥解密后识别为 WebP;图片 CDN 返回 `Access-Control-Allow-Origin: *`。未保存原始图片,也未提交业务写请求。
`tests/playback.test.mjs` 覆盖播放地址及签名保留、观看权限优先级与旧字段、正片/预告切换、Safari/Chromium/移动壳浏览器选择、HLS 恢复上限、重试重建、切换路由与异步导入竞态、拒绝自动播放后的重试、预告不计入正片记录、真实章节 ID、解锁确认与防重复提交,以及实际控件脚本的播放/重试/解锁事件。HTTP 集成测试覆盖媒体清单、密钥端点两种尾斜杠形式、原始 AES 字节、凭据隔离、Range 和错误状态。
H.264/H.265 兼容测试另覆盖 MSE/原生 HLS 编码错误回退、签名与播放位置保留、重复错误及重试次数限制、网络错误区别处理、MP4 不误走 HLS,以及回退过程中的路由取消。`tests/codec-manifest.test.mjs` 运行真实 hls.js 1.7.3 完整版的清单解析和 LevelController,在模拟设备能力下验证 H.264 回退、`hvc1`/`hev1` 保留、HEVC 单编码清单接受/拒绝;测试不访问网络,不代表真实浏览器或硬件的解码实播结果。
2026-10-19 只读验证真实免费预告:清单返回 200,保留 `id/t/ticket` 参数后密钥代理返回 200 和 16 字节 AES 密钥,首片成功通过 AES-128-CBC 解密,输出首字节为 MPEG-TS 同步字节 `0x47`。不带签名参数的密钥请求会被上游拒绝。本次未保存密钥/媒体,也未提交真实观看上报、解锁或订单请求;真实账号付费章节和浏览器实播仍需联调。
`tests/startup.test.mjs` 对照参考项目的实际脚本规则验证:会话内首次年龄确认、确认早于配置返回、完整广告队列、刷新恢复进度、相同队列不重复弹出、广告码变化后重置、无效图片与失败图片跳过、全部失败后可重试、存储不可用、过期异步结果隔离,以及图片加载超时和取消。DOM 事件适配测试覆盖年龄弹窗禁止 Esc 关闭、广告 Esc/按钮切换下一条、广告链接与展示/点击事件,以及退出行为。
浏览器访问工具受 URL 策略限制,本次未进行浏览器视觉复核。目录中的桌面、手机截图属于原 HTML 迁移阶段的布局基线,不是当前 API 数据截图。
## 2026-10-22 部署脚本与本地发布包
- `bash deploy_test.sh --package-only` 完成测试环境构建、294 项回归测试和 zip/SHA-256 生成;`bash deploy_prod.sh --package-only` 完成生产构建、299 项回归测试和 Linux x64/glibc 包/MD5 生成。构建包含 TypeScript 检查。
- 两份脚本的 `--dry-run` 通过命令替身验证,不执行构建、SSH 或 SCP;缺失/非法部署目标在构建前拒绝。测试和生产共用构建锁。
- 发布包测试覆盖基础配置隔离、本地覆盖/缓存/旧 dist 排除、符号链接目标保护。Next.js 自动追踪漏带的 Turbopack Route Handler 运行文件已显式包含。
- 最终 `dist.zip`(29.87 MiB)解压到临时目录,使用本机裁剪依赖启动 `node start.mjs`;本地模拟 API 下首页、`/healthz`、Next 静态资源和 public 文件均返回 200,健康检查未触发上游请求。测试 zip 按约定不含依赖,真实 Linux 服务器需执行 `npm ci --omit=dev`。
- 最终 `web_91dj_h5.tar.gz`(44.94 MiB)通过内容、MD5 和目标平台元信息检查;目标 Sharp/libvips 使用 lockfile 固定版本,并通过 Linux x64 ELF 校验,不含 macOS 原生模块。本机未运行 Linux 生产服务。
- `deploy/up_next_h5.sh` 用临时目录和命令替身验证校验失败、安装失败不停止旧服务;健康检查失败恢复旧版本;成功更新保留测试私有覆盖和公开 SEO 缓存。新增部署测试共 8 项通过,已包含在最新生产环境的 299 项回归中。
- 本次仅本地构建和打包,未执行任何真实 SSH/SCP、Supervisor 更新或远端 `running.sh`。部署前需配置本站目标地址,测试 Supervisor 程序及生产跳板机脚本由运维预先配置。
部署配置统一采用本站标识:测试 `root@172.104.181.99:22889` → `/server/web_91dj/h5`;生产 `server@116.212.120.2` → `/home/server/web_91dj/h5/nuxt`,SCP 22889 / SSH 22。包名 `web_91dj_h5.tar.gz`、校验文件和 Supervisor `91dj_next_h5` 使用本站标识;生产仍只通过完整路径调用原有 `running.sh`。部署测试验证当前配置、环境变量覆盖、无效目标提前失败及 dry-run 不连接远端;本次未执行实际上传或部署。
### 部署配置变化后的测试修复
已复现 `tests/deploy.test.mjs:72` 的目录断言失败:测试仍固定期望旧项目的上传目录,实际测试脚本已配置 `/server/web_91dj/h5`。修复后不再将主机、路径、端口或 API 域名作为测试不变量,保留对参数覆盖、命令与帮助输出一致、非法目标提前失败、dry-run 不构建/不连接远端的验证。测试服更新的模拟 Supervisor 使用固定测试服务,避免调用者的 `DEPLOY_PROGRAM` 污染测试。两份脚本的帮助内容统一从当前变量生成,修复当时测试 SSH 配置 21021、帮助文案却写 22889 的不一致;保留修复时的上传路径和端口。
`bash deploy_test.sh --package-only` 已完成测试环境构建、全部 299 项测试和 `dist.zip` 打包;压缩内容及 SHA-256 通过校验。另在设置自定义 `DEPLOY_PROGRAM`、`DEPLOY_DIR`、`DEPLOY_SSH_PORT` 后运行部署专项测试,8 项通过。当前 SSH 端口和应用监听端口分别配置,未连接真实服务器验证 SSH 端口或执行上传/部署。
### 测试部署改用 tar.gz
`deploy_test.sh` 现在生成并上传 `web_91dj_h5.tar.gz`、`web_91dj_h5.tar.gz.sha256` 和 `up_next_h5.sh`,包名可通过 `DEPLOY_PACKAGE_NAME` 覆盖;同时刷新对应 MD5 文件供本地兼容校验。测试包继续排除依赖、本地覆盖、缓存和 macOS 附加文件,包内使用 `.next-test` 与 `config/test.env`。保留当前上传目录和端口,以及用户注释的远端自动更新命令;实际脚本上传完成后结束。
服务器辅助脚本同步使用 tar.gz:先校验 SHA-256、检查成员路径与类型,再解压、安装依赖和切换版本;损坏包、路径越界、链接及特殊文件在停止旧服务前拒绝。测试覆盖真实 tar.gz 上传参数、校验值、自定义包名、自动更新保持禁用,以及安装/健康检查失败的回滚。
完整本地构建和 304 项测试通过;测试部署专项 13 项通过。生成的测试 tar.gz 为 29.78 MiB、414 个文件,内容、SHA-256 和 MD5 均通过校验。解压后使用本机裁剪依赖和本地模拟 API 验证启动、首页、健康检查、Next 静态资源与 public 文件均返回 200。未执行真实上传或服务器更新。
## 2026-10-22 埋点检查与补全
通过项目自带的官方 SDK v1.2.0 复现了内容事件因空 `parent_item_id` 被拒收的问题;此前测试替身未校验字段,所以没有发现。现在回归测试调用真实 SDK 的具名事件方法,仅使用其初始化前缓存和字段校验,不向外发送测试数据。只读获取当前业务接口配置并在本机解析后,确认页面、内容、搜索、广告、弹窗行为、播放事件均在事件允许列表内;未修改服务端配置或打印密文、签名密钥。
| 范围 | 事件与检查结果 |
| --- | --- |
| 页面、分页、后退恢复 | `appPageView/pageClick`,保留真实路径及原有访问去重规则 |
| 导航与下载 | `navigation`,补齐独立入口页渠道、App 下载入口选择器 |
| 首页及列表内容 | `appPageitemExposure/appPageitemClick`,无父级用字符串 `0`,通过真实 SDK 校验 |
| 专题、福利应用 | 补齐专题卡片内容元数据;关联 `advitiseId` 的应用按广告上报,其他应用按内容并携带分类父级 |
| 大图广告 | `adImpression/adClick`,保留原展示、点击触发;独立展示位置及延迟 SDK 队列防止漏报 |
| 宫格广告 | 与首页分开去重,滚动后补报可见项;关闭、遮挡或后台标签页不记曝光,恢复后重新观察 |
| 弹窗行为 | 补齐参考项目的 `advertising`:show/click/close,使用真实广告 ID;关闭不记 adClick,重复关闭不重报 |
| 搜索 | `keywordSearch/keywordClick`,保留真实总数、首轮搜索及分页后的全局位置 |
| 播放、切集、分享、失败 | `dramaEvent/dramaStatusChange`,全部现有行为的载荷通过真实 SDK 校验,预告不作为正片统计 |
| 登录、游客、注册、充值、VIP | 沿用 SDK 原始公共字段透传及 UID 同步,成功业务事件由服务端负责 |
| 点赞、收藏、评论、购买解锁 | 保留 BFF 校验后的事件上下文和请求 ID 透传,前端不重复发送服务端成功事件 |
| 加载、排队、错误 | 配置首读跳过 SDK 等待;脚本失败重试加载;扩大初始化前队列并报告溢出;SDK 拒收和发送失败有脱敏诊断 |
浏览器使用真实页面及未修改的官方 SDK,测试专用包装通过 SDK 支持的单次事件地址参数把请求送入本机接收端,避开官方域名解析器对配置地址的 HTTPS 要求。已验证大图广告展示/点击、宫格展示/点击、页面访问、内容曝光,以及原生页面跳转前的内容点击均实际发出带 `event_sig` 的网络记录。UI 点击和弹窗滚动经浏览器执行,未向正式统计后台发测试事件。未验证正式部署的反向代理和统计后台入库结果。
最终验证:测试环境构建(含 TypeScript)及全部 323 项回归测试通过。最后一轮本机浏览器验证收到 78 条带签名的 SDK 事件,其中 `advertising` 为 show 21、click 2、close 21;大图广告的三种行为均到达,宫格关闭只覆盖实际曝光的广告,关闭未增加 `ad_click`。另外一轮已确认原生页面跳转前的 `app_pageitem_click` 实际到达,内容父级字段为字符串 `0`。所有网络验证仅使用本地模拟业务数据和本地测试签名配置。
## 2026-10-27 移除埋点与客服、切换接口域名
删除 Web SDK 及埋点适配层、`X-SDK-Common`/`X-Tracker-*` 请求头透传、内容与广告的追踪属性和相关环境变量;删除意见反馈页(`/info/feedback/` 返回 404)、`feedback/add` 代理白名单、页脚/侧栏/播放页/充值页的反馈与客服入口及样式。上游接口统一为 `https://webhgcgapi.mfcg.me`;配置和快照都没有永久域名时,canonical 使用 `https://huangguocg.com`。类型检查、生产构建通过;除部署脚本测试因中文目录名被 URL 编码导致找不到 `node_modules` 外,其余测试全部通过。
## 2026-10-27 删除充值、用户中心、登录与付费解锁;品牌与联系方式
删除充值/VIP(`/info/deposit/*`)、个人中心(`/member/*`、`/info/user-center/`、`/info/settings/`)、登录注册/找回密码/退出、头像与资料修改以及付费章节解锁;对应页面返回 404,代理白名单只保留游客会话与浏览、点赞、收藏、评论所需接口。旧版本遗留的已登录 Cookie 失效后自动换成游客,不再提示登录。付费集保留锁定标记和免费预告,播放区提示“本集为付费内容,暂不可观看”。
站点地址(canonical、sitemap、导航页线路与永久入口、回家的路、详情页官方地址)固定为 `https://huangguocg.com`;导航站名固定为“黄果吃瓜”,页面上写死的“91短剧”改为“黄果吃瓜”;logo、favicon、touch icon、App 图标与分享图换成黄果图标。联系方式与其他黄果站点一致,只保留官方 TG `@jbd125`。类型检查、生产构建通过,307 项测试中除部署脚本测试(中文目录名被 URL 编码,环境问题,改动前同样失败)外全部通过。
## 2026-10-27 详情页、播放页、卡片与首页 banner 改版;评论改为推荐视频
为收录及与其他黄果站点区分,短剧卡片、推荐视频条目、首页 banner、详情页和播放页改用独立的 `hg-*` 结构和样式:全部内容由服务端输出,使用 `article`、`h1/h2/h3`、`dl` 信息表、描述性链接 title 与“《剧名》海报”类 alt;首页 banner 以 `<ol>` 输出全部推荐的真实详情链接;详情/播放页增加“剧情简介”“全集列表”“推荐视频”小标题。评论读取、发表、点赞及评论分页全部删除,`/detail|play/.../page/N/` 返回 404,代理不再放行 `comment/*`;评论区换成 `playlet/guess-like/list` 的 12 部推荐。桌面与 390px 手机宽度截图核对;类型检查、生产构建通过,除部署脚本环境问题外测试全部通过。
## 2026-10-27 全部短剧和视频免费观看
前端去掉付费判断:`chapterAccess` 只看接口是否返回有效视频地址,`needUnlock`/`needVip`/`payType`/`canWatch` 不再影响播放、选集链接、SSR 正片地址和索引;选集付费角标、`play-paywalled-content` 及 `isAccessibleForFree:false` 结构化数据删除,帮助中心常见问题改为“全部免费观看”。真实接口核对:付费章节(如 14193 第 2 集起)`chapter/detail` 返回 `videoUrl: ''`,地址由后端签名下发,需后台将章节设为免费后前端即可播放。