بنقرة واحدة
zhihu-reproduce
// 当用户要求复刻知乎网页版的功能、交互、接口行为或视觉细节时,使用此技能采集真实网页证据、分析 API 与 UI 结构,并落地到 Zhihu++ Android 代码。
// 当用户要求复刻知乎网页版的功能、交互、接口行为或视觉细节时,使用此技能采集真实网页证据、分析 API 与 UI 结构,并落地到 Zhihu++ Android 代码。
Release the local Markdown fork used by Zhihu++. Use when you need to merge upstream huarangmeng/Markdown into the zly2006 fork master, preserve only approved fork deltas, publish a new Maven Central alpha, update Zhihu's Android dependency versions, and verify the build. Applies specifically to /Users/zhaoliyan/IdeaProjects/Zhihu and its .tmp/Markdown-zly2006 fork checkout.
以 subagent 启动的 UI 挑剔用户评审。Use when the user, AGENTS, or the current task requires “挑剔的用户”. 该 skill 会分别扮演新用户与老用户,对界面的 self explain、明确性、直觉性、效率、布局和操作习惯提出高标准意见;默认给出 5-10 条有效建议,必要时结合 ui-test 与截图检查,并把意见记入 .memory/YYYY-MM-DD/picky-user。
Zhihu++ LLM 自动化 UI 测试。使用 testTag 系统精准定位 Compose 元素并交互,替代硬编码坐标的 adb tap。提供已知 tag 列表、文字内容点击、截图验证等能力。适用于:功能验证、UI 回归测试、自动化交互流程。
以 subagent 启动的 UI 漫游与异常发现技能。Use when the user, AGENTS, or the current task requires “UI漫游者”. 该 skill 负责系统性地把目标页面能点的都点一遍、把上下左右能滑的都滑一遍,重点发现空白页、越界、裁切、错位、布局失衡、状态切换异常等问题;必要时结合 ui-test 与截图检查,并把意见记入 .memory/YYYY-MM-DD/ui-volayor。
Release the local LaTeX fork used by Zhihu++. Use when you need to merge upstream huarangmeng/latex into the zly2006 fork, preserve only approved fork deltas (font removal), publish a new Maven Central release, update Markdown's latex dependency, and verify the build. Applies specifically to /Users/zhaoliyan/IdeaProjects/latex as the fork checkout.
| name | zhihu-reproduce |
| description | 当用户要求复刻知乎网页版的功能、交互、接口行为或视觉细节时,使用此技能采集真实网页证据、分析 API 与 UI 结构,并落地到 Zhihu++ Android 代码。 |
| license | CC BY-NC-SA 4.0 |
本技能用于把知乎网页版上的真实功能复刻到 Zhihu++ Android 客户端。核心原则是:先用已登录浏览器观察真实页面和接口,再根据证据设计数据模型、UI、交互与验证方案,不凭印象猜字段或样式。
适用范围包括但不限于:
必须使用有知乎登录状态的浏览器。未登录时只能观察公开页面,不能据此推断用户专属功能。
假如你是Claude,在.mcp.json已经设置好了mcp server。
假如你是codex,执行以下命令添加MCP server,然后请用户重启对话:
先确认当前 Codex 会话是否已经可用 chrome-devtools。如果工具不可用,按下面顺序检查,而不是只看仓库里的 .mcp.json:
codex mcp list
codex mcp get chrome-devtools
curl -s http://127.0.0.1:9222/json/version
127.0.0.1:9222/json/version 必须返回合法 CDP 信息。Edge 和 Chrome 都可以,只要 CDP 端点有效并且是用户实际登录知乎的浏览器实例。
如果还没有注册 DevTools MCP,在 Codex 中使用:
codex mcp add chrome-devtools -- npx -y chrome-devtools-mcp@latest --browserUrl http://127.0.0.1:9222
注册后通常需要重启或重新进入对话,当前会话不一定会热加载新 MCP。重启后再确认工具真的可用。
如果 9222 没有可用浏览器实例,询问用户使用 Edge 还是 Chrome,再给出对应的远程调试启动命令。不要擅自假设浏览器类型或登录状态。
用已连接浏览器访问或请求:
https://www.zhihu.com/api/v4/me
确认返回的是已登录用户信息,而不是登录页、错误页或匿名状态。只有登录状态确认后,才继续采集需要账号权限的功能。
在动代码前先把用户要复刻的范围说清楚。至少确认这些边界:
如果用户只要求分析,先产出分析结论,不要直接写代码。如果用户要求实现,按项目既有架构落地,避免把相邻概念合并。
用 DevTools 模仿真实用户操作,采集三类证据:
采集时遵守这些规则:
常见入口示例:
https://www.zhihu.com/api/v3/feed/topstory/recommend?desktop=true&limit=20
https://www.zhihu.com/api/v4/answers/{answerId}
https://www.zhihu.com/api/v4/questions/{questionId}/answers
https://www.zhihu.com/api/v4/articles/{articleId}
https://www.zhihu.com/api/v4/comment_v5/{contentType}/{contentId}/root_comment
具体接口以 DevTools 实际捕获为准,不要把上面的示例当成固定答案。
落数据模型前,先写清楚字段来源:
实现时遵守项目约定:
snake_case,DataHolder 和 Kotlin data class 使用 camelCase。AccountData.fetch*() 和 decodeJson() 已经处理 snake_case2camelCase(),不要手写重复转换。signFetchRequest(context);Android API 使用 AccountData.ANDROID_HEADERS 和 ANDROID_USER_AGENT。如果发现网页字段和现有存储模型不匹配,先说明差异和迁移影响,再决定是否改 Room、Repository 或只做内存态展示。
做 UI 前先判断原版设计服务的产品语义,而不是机械照搬像素:
修改范围要精确:
LaunchedEffect 处理副作用,并设置正确 key。collectAsState() 观察 Flow/StateFlow。NavDestination.kt。如果原版依赖 hover、复杂 DOM 或桌面布局,应转换成 Android 上自然的交互,例如 bottom sheet、菜单、长按、可点击行或显式按钮。
复刻知乎官方认证、优秀答主、社区成就等 badge 时,不能只从 badge_v2.title / description 推断成文字 chip。必须先在 Web 端同时采集:
badge_v2.icon 渲染一个约 18px × 18px 的图片 icon,aria-label / data-tooltip 承载具体说明。detailBadges 展开成“认证与成就”,例如“社区成就:知势榜教育校园领域影响力榜答主”“认证信息:华东师范大学 理学硕士”。#js-initialData 或接口响应里的 badgeV2:区分顶层 icon/nightIcon、mergedBadges 和 detailBadges。用户名旁的主 icon 可能来自顶层 badgeV2.icon,而明细列表应优先使用 detailBadges[*].icon/nightIcon。mergedBadges[*].icon 可能为空,但 detailBadges[*].icon 或顶层 badgeV2.icon 有值;badgeStatus / badge_status 需要兼容,只展示 passed 或无状态的 badge。本技能的失败经验:如果只实现 title/description 的 Compose 文字胶囊,会明显偏离官方样式;正确方向是“列表/详情用户名旁用官方 icon,PeopleScreen 展开具体认证/成就信息”。做完后应增加解析测试覆盖顶层 icon、detail badge icon、identity 与 reward/community badge 的优先级。
优先用真实采集到的内容 ID 做回归测试。测试输入只保留必要 ID,不把整份真实响应硬编码进测试,除非测试目标就是解析兼容性。
最低验证要求:
如果改动涉及用户可见 UI,按项目 AGENTS.md 的 UI 调试与双代理复检流程执行。
实现复杂功能时,同步补一份简短 API / 设计记录,至少包含:
文档面向后续维护者,不要写成泛泛教程。
当前会话可能没有热加载新 MCP。先确认:
codex mcp list
curl -s http://127.0.0.1:9222/json/version
如果两者都正常但工具仍不可用,要求重启对话后再继续。
先查 logcat,重点看:
JsonDecodingException常见原因是网页返回了 0/1、字符串数字、null 或空数组,而模型写成了过窄类型。
回到 DevTools 复现原版操作,记录操作前后:
不要只根据最终视觉状态补 Android 逻辑。
ui-test / uiautomator 不一定能暴露所有富文本或 WebView 内部节点。处理顺序:
dump 确认页面和主要文本存在。dump 或截图验证结果。个人主页徽章不要只看 https://www.zhihu.com/api/v4/members/{id}。实测同一作者在这个接口里可能返回 badge_v2: null,但 https://api.zhihu.com/people/{urlToken}?include=badge_v2,... 会返回网页展示所需的 badge_v2.detail_badges 和官方图标。遇到 PeopleScreen 徽章缺失时,先用当前登录态分别请求两个接口对比字段,再决定 Android 数据源。
不要并行跑 assemble 和 test。Kotlin 增量缓存可能互相影响,表现成一串与当前改动无关的 Unresolved reference。处理方式:
./gradlew --stop
./gradlew assembleLiteDebug
./gradlew testLiteDebugUnitTest --tests your.test.Name
这是正文划线功能的历史案例,不是本技能的通用流程。主要特点是字段同时出现在 feed 和回答详情,Web DOM 与 API 字段需要按 pid + start/end 对齐后才能复刻到 Android。
主要踩坑:
allow_segment_interaction 可能返回 0/1,不能直接建模为裸 Boolean。segment_infos 可能为空数组,同一段内也可能有多个 seg_ids。marks[*].start_index/end_index 是范围切片,不能把整段文本合并成一个点击区域。完整采集接口、字段结构、DOM 特征和回归样本见 references/segment_infos.md。