بنقرة واحدة
zhihu-reproduce
当用户要求复刻知乎网页版的功能、交互、接口行为或视觉细节时,使用此技能采集真实网页证据、分析 API 与 UI 结构,并落地到 Zhihu++ Android 代码。
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
القائمة
当用户要求复刻知乎网页版的功能、交互、接口行为或视觉细节时,使用此技能采集真实网页证据、分析 API 与 UI 结构,并落地到 Zhihu++ Android 代码。
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
استنادا إلى تصنيف SOC المهني
Release the LaTeX fork used by Zhihu++. Use when merging the latest huarangmeng/latex release into zly2006/latex, preserving approved fork deltas, publishing Maven Central artifacts, updating Zhihu's vendored third_party/markdown and direct LaTeX dependencies, and verifying the app.
Build, install, and launch the Zhihu++ Android app on a connected device using ADB. Includes comprehensive troubleshooting for common issues like missing devices, installation failures, signature mismatches, and app crashes. Use when deploying debug builds to physical devices or emulators.
Manage screenshots and other visual assets for GitHub pull requests. Use when a PR body needs real screenshots, when local /tmp paths must be replaced with durable links, when deciding whether GitHub web drag-and-drop uploads can be reproduced with gh api, or when updating a PR without disturbing the user's browser tabs.
Use for Zhihu++ maintenance work that scans Kotlin main sources for low-call functions, structurally similar function bodies, dead code, pure forwarding wrappers, pointless abstractions, repeated helpers, and cross-platform duplicate glue before refactoring or PR cleanup. Trigger when the user asks to clean AI slop, remove low-call wrappers, find similar or duplicated code, review duplicated helper functions, or audit functions with call count at most 2 in /Users/zhaoliyan/IdeaProjects/Zhihu.
Coordinate Zhihu++ issue and PR implementation through subagents with isolated git worktrees, off-host Android AVD validation, real screenshots, Chinese PR creation, and main-agent-only review/coordination. Use when the user asks to fan out issues, maximize parallel subagent work, implement multiple Zhihu++ features or fixes, validate on `$off-android-avd-ci-debug`, or automatically open PRs from worker branches.
Zhihu++ LLM 自动化 UI 测试。使用 testTag 系统精准定位 Compose 元素并交互,替代硬编码坐标的 adb tap。提供已知 tag 列表、文字内容点击、截图验证等能力。适用于:功能验证、UI 回归测试、自动化交互流程。
| 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 / 设计记录,至少包含:
文档面向后续维护者,不要写成泛泛教程。
复刻流程中如果用户只是在纠正工具名、技能名或术语拼写,不能把这类短句当成新的独立任务并停止当前工作。应把纠正立即应用到正在进行的复刻、验证、提交或 PR 流程里,然后继续完成原任务。例子:用户把一个写错的技能名纠正为正确技能名时,应该继续使用该技能处理剩余的实现或收尾步骤,而不是只回复“已记住”后中断。
用 DevTools 采集知乎网页证据前,必须先判断这个浏览器实例是不是用户正在工作的前台窗口。不能为了切到目标页面而直接 select_page 并 bringToFront,也不能在用户未授权时点击、滚动或导航已有标签页;这会打断用户当前工作。同时,复刻任务里的接口、字段和行为仍然必须真实请求验证,不能因为不能动标签页就靠猜。正确做法是优先使用后台真实请求、已打开页面的只读网络/DOM 信息,或新建/选择不会影响用户操作的调试页面;如果必须前台操作,先征得用户明确同意。例子:用户给了目标回答链接时,可以后台 fetch 回答 API 和赞同者 API,再读本地代码落实现;不能把用户正在使用的 Edge 标签页强行切到目标回答并继续点击 social credit,也不能不请求接口就凭字段名想象实现。
复刻“某某、某某 等 N 人赞同了该回答”这类 social credit 时,不能把赞同者列表第一页的前两个人直接当成官方预览名字。列表接口负责查看完整赞同者,social credit 文案可能来自回答详情、页面初始数据或专门的社交关系字段,顺序和个性化规则都可能不同。必须先用真实网页或真实接口确认可见文案的字段来源,再决定 Android 展示逻辑;如果只找到了列表接口,也只能用于点击后的列表,不能反推顶部文案。例子:回答详情顶部文案应显示官方给出的两个预览名字,而不是把 /voters?offset=0 第一页第一、第二个用户拼进去。
当前会话可能没有热加载新 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。