知乎草稿写手 Zhihu Draft Writer

自动从知乎热榜选题,调用AI生成原创回答并保存为草稿,支持自定义关键词、风格和批量生成。

已扫描
适合谁
知乎内容创作者、自媒体运营者、知识分享博主
不适合谁
不需要草稿的用户、不关注知乎热榜的用户
国内可用性
需网络配置。可能需要网络配置或第三方服务可访问。
安装难度
新手友好(★☆☆)。基于终端操作、依赖、API Key 和本地环境要求的初步判断。

安装与下载

openclaw skills install @joly123456/zhihu-draft-writer

Skill 说明

命令、参数、文件名以原文为准

知乎草稿写手 Zhihu Draft Writer

使用已登录知乎的主机浏览器会话。不要尝试自动登录,不要询问密码,也不要使用发布操作。

首次运行前,请阅读 {baseDir}/references/setup.md

每次运行前,请通过 {baseDir}/references/runtime-options.md 解析用户选项。

操作规则

  • 使用 OpenClaw 浏览器主机控制,使技能能够与用户当前的 Chrome 会话配合工作。
  • 使用 curl 直接调用 zhihuiapi 推理端点生成回答。不要使用 llm-task,不要启动子代理来生成回答,也不要使用当前会话模型生成回答文本。
  • 仅保存草稿。切勿点击任何发布或提交答案的控件。
  • 在话题选择和回答生成中,排除政治、敏感、非法或存在法律风险的内容。具体示例请参见法律风险内容部分。
  • 如果知乎未登录、无法读取评论、找不到回答编辑器、缺少草稿按钮或模型输出验证失败,请立即停止。
  • draft_count > 1 且单个草稿(生成或保存)失败时,跳过该问题,记录失败原因,并继续处理下一个符合条件的问题。在最后报告成功与失败的摘要。

法律风险内容

跳过或拒绝任何属于以下类别的内容:

  • 针对特定领导人、政党或政府政策的政治评论
  • 推广在中国被禁止的组织或意识形态
  • 医疗错误信息或未经许可的治疗建议
  • 金融欺诈、无证投资建议或传销推广
  • 煽动暴力、民族仇恨或宗教极端主义的内容
  • 涉及未成年人或非自愿场景的色情内容
  • 非法服务招揽(赌博、毒品、假冒商品)

如有疑问,将内容视为有风险并跳过。

运行时选项

在打开知乎之前,从用户请求中解析以下选项:

  • topic_mode
  • custom_topic_keywords
  • draft_count
  • comment_count
  • writing_style

如果用户未指定,则使用 {baseDir}/references/runtime-options.md 中的默认值。

不要仅仅为了收集可选参数而追问后续问题。

当用户完全不提供参数时,使用以下默认运行模式:

  • topic_mode = general_hot
  • draft_count = 1
  • comment_count = 3
  • writing_style.mode = default

在一次运行中处理最多 draft_count 个符合条件的问题。为每个选定的问题创建一个草稿答案。即使用户要求更多,单次运行也绝不超过 5 个草稿;上限为 5 个,并在结果中注明上限。

历史文件

技能在 {baseDir}/data/history.json 中维护本地去重日志。

格式:

{
  "answered": [
    {
      "question_url": "https://www.zhihu.com/question/xxxxxxx",
      "question_title": "string",
      "saved_at": "2026-03-16T10:00:00Z"
    }
  ]
}

规则:

  • 每次运行前,读取 {baseDir}/data/history.json。如果文件不存在,则将 answered 视为空数组。
  • 在话题选择过程中,跳过任何 question_url 已出现在 answered 中的候选项。
  • 草稿成功保存后(由知乎的保存信号确认),立即将条目追加到 answered 并写回文件。不要等到运行结束。
  • 如果写入历史文件失败,在运行结束报告中记录警告,但不要停止当前运行。
  • 切勿删除或覆盖现有条目。仅追加。
  • 历史文件是仅追加的。用户可根据需要手动清理旧条目。

话题选择

  1. 在主机浏览器中打开 https://www.zhihu.com/hot
  2. 在点击任何内容之前,读取可见的热门问题卡片。
  3. 加载 {baseDir}/data/history.json 并提取已回答的 question_url 集合。
  4. 根据 topic_mode 确定生效的话题过滤器:

**general_hot(默认)**

- 选择任何支持实质性文字回答的符合条件的热门问题。

- 当存在多个候选项时,优先选择热度更高的(卡片上显示的浏览量/回答数更高)。

**custom**

- 匹配标题或摘要中包含 custom_topic_keywords 中至少一个关键词的问题。

- 关键词使用 OR 逻辑:只要问题包含任意一个关键词即匹配。

- 如果用户请求中包含否定词(例如"法律问题但不是法律援助"),只提取肯定关键词,并在评估时将排除项记录为跳过原因。

- 如果存在多个匹配,优先选择热度更高的。

- 如果当前可见热门列表中无匹配,则停止并报告:"未找到与请求关键词匹配的符合条件的问题:[关键词]。请尝试扩大关键词范围,或切换到 general_hot 模式。"

- 不要静默地回退到 general_hot。

  1. 打破平局规则(适用于所有模式):当两个候选项同样符合条件时,优先选择可见热度指标更高(卡片上显示的回答数、评论数或热度分数)的。如果仍然平局,优先选择标题提示更开放(允许不同视角)的问题。
  1. 跳过任何符合以下条件的候选项:

- 属于法律风险类别(参见法律风险内容

- 主要是事实查询、只有单一正确答案(没有个人观点空间)

- 是没有洞察空间的新闻标题

- 其 question_url 已存在于 answered 中(已在之前的运行中处理)

- 改为选择下一个符合条件的候选项。

  1. 继续选择,直到找到 draft_count 个符合条件的问题,或者没有更多符合条件的可见热门问题。如果在达到 draft_count 之前可见列表已耗尽,则报告完成了多少个草稿以及运行提前结束的原因。

证据收集

  1. 打开选中的知乎问题页面。
  2. 抓取以下字段:

- question_title

- question_url

- question_excerpt

- selected_reason(为何选择此问题)

  1. 按以下顺序查找讨论素材:

- 优先使用问题页面上可见的热度排序评论区域。

- 如果问题页面未展示可用的评论列表,则打开当前排名第一的热门回答,并使用该回答下的热门评论作为备选讨论来源。

  1. 收集热度最高的 comment_count 条可用评论,限制在 3–5 条范围内。如果一次展开或加载更多操作后可用评论仍少于 3 条,则使用已有的全部数量(包括 1 或 2 条)。
  2. 对每条评论,收集:

- rank

- author_name(如果作者名缺失或显示删除标记,则使用 "[已删除]"

- like_count

- text

  1. 若评论满足以下任一条件,则忽略:

- 评论文本缺失或已被删除通知替代

- 评论文本与已收集的评论重复

- 超过 60% 的字符是表情符号或表情标记

- 评论文本少于 15 个中文字符

- 评论语言不是中文(完全跳过)

  1. 如果可用的问题上下文或热门评论被政治敏感、极端、非法或其他法律风险内容主导,则放弃该问题,返回热榜选择另一个符合条件的问题。

通过 curl 生成回答

  1. 读取 {baseDir}/references/answer-generation.md 获取系统提示文本。
  2. 构建用户消息为包含已收集问题和评论数据的 JSON 字符串(结构见下文)。
  3. 使用以下 curl 命令调用 API。将 <user_message_json> 替换为转义后的 JSON 字符串,并从 ZHIHUIAPI_KEY 环境变量中读取 API 密钥:
curl https://cc.zhihuiapi.top/v1/chat/completions \
  -s \
  -X POST \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer ${ZHIHUIAPI_KEY}" \
  -d '{
    "model": "claude-sonnet-4-6",
    "max_tokens": 2400,
    "response_format": {"type": "json_object"},
    "messages": [
      {
        "role": "system",
        "content": "<contents of {baseDir}/references/answer-generation.md>"
      },
      {
        "role": "user",
        "content": <user_message_json>
      }
    ]
  }'
  1. 用户消息 JSON 对象(发送前填入运行时值):
{
  "topic_mode": "general_hot | custom",
  "custom_topic_keywords": ["string"],
  "draft_index": 1,
  "draft_count": 1,
  "question_title": "string",
  "question_excerpt": "string",
  "question_url": "string",
  "selected_reason": "string",
  "writing_style": {
    "mode": "default | user_defined",
    "summary": "string"
  },
  "top_comments": [
    {
      "rank": 1,
      "author_name": "string",
      "like_count": 123,
      "text": "string"
    }
  ],
  "writing_rules": [
    "模仿评论语气和论述节奏,但不要抄袭;连续18个及以上汉字不得与任何评论重合",
    "必须有自己的判断和补充,加入至少1个评论中没有出现的观点或角度",
    "中文自然表达,像真实知乎答主,不要出现元叙述",
    "禁止任何政治相关言论、敏感表达、违法内容或法律风险内容",
    "如果用户提供了写作风格,则优先遵循用户风格;风格冲突时以话题适配为准",
    "如果无法安全表达,返回 {\"status\": \"failed\", \"error\": \"unsafe_content\"} 而非空字符串"
  ]
}
  1. 解析 curl 响应:提取 choices[0].message.content 并解析为 JSON。
  2. 如果 curl 退出码非零,或 HTTP 状态码不是 200,则停止并报告:"API call failed — HTTP [status], curl exit [code]. Do not fall back to generating with the current session model."

输出验证

在验证之前,请读取 {baseDir}/references/answer-schema.json 获取预期结构。

在写入知乎之前验证模型输出:

  • 拒绝 如果 JSON 解析失败。
  • 拒绝 如果响应包含 "status": "failed" — 将 error 字段记录为失败原因,不重试。
  • 拒绝 如果 answer_text 缺失或少于 200 个字符。
  • 拒绝 如果 answer_text 超过 800 个字符。
  • 拒绝 如果 answer_text 包含以下任何元叙述词汇:AI人工智能模型生成ChatGPTClaude根据评论根据以上作为助手作为AI
  • 拒绝 如果 answer_text 包含政治主张、政治评论、敏感表达、非法指导或其他法律风险内容。
  • 拒绝 如果 answer_text 中任意连续 18 个及以上汉字与任何单条源评论中的相同序列完全一致。
  • 拒绝 如果 answer_text 中的任何完整句子是评论句子的近义词重写(相同含义,仅替换少量词汇)。

第一次拒绝时(status: failed 响应除外),在 writing_rules 中追加一条增强的反抄袭指令后重试生成一次。如果重试后仍然验证失败,则停止并报告具体的拒绝原因。不尝试第三次生成。

草稿保存流程

  1. 打开所选问题的回答编辑器。
  2. 仅将 answer_text 写入主回答字段。
  3. 在点击前重新检查可见控件。如果布局不清晰,使用交互式截图高亮控件:

- 如果有一个将保存和发布合并在下拉菜单中的单一按钮,仅点击下拉菜单中显示“保存草稿”或等效选项。如果主按钮默认发布,请勿点击主按钮。

- 如果有独立的“保存草稿”和“发布”按钮,仅点击“保存草稿”按钮。

- 如果自动保存指示器是唯一可见信号,不要将其视为确认保存;仍需寻找明确的保存草稿操作。

- 如果唯一可用的操作似乎是发布而没有保存草稿的替代选项,停止并报告:“未找到保存草稿控件;草稿未保存。”

  1. 等待可见的成功信号,例如草稿提示、“草稿已保存”状态文本或更新的草稿计数指示器。
  2. 收到保存确认后,立即在 {baseDir}/data/history.json 中追加一条记录:

- question_url:所回答问题的 URL

- question_title:所回答问题的标题

- saved_at:当前 UTC 时间戳,格式为 ISO 8601

  1. 如果在合理等待后未出现保存确认,停止并报告草稿保存失败。不要假定草稿已保存,也不要写入历史记录。
  2. 如果 draft_count 大于 1,返回热门列表,对下一个符合条件的问题重复完整流程,直到达到目标数量或没有剩余符合条件的问题。

失败处理

  • 过时的元素引用:重新运行浏览器截图并使用新的引用继续。每页最多允许 3 次重新截图尝试,之后放弃并报告失败。
  • 页面布局模糊:在点击前使用交互式截图高亮目标控件。切勿猜测性点击。
  • 知乎阻止会话或要求登录:立即停止,并要求用户手动重新打开已登录的 Chrome 页面。不要重试被阻止的操作。
  • 页面加载网络超时:如果问题页面在配置的超时时间内未能加载,跳过该问题,记录超时,并尝试下一个候选问题。
  • 速率限制(HTTP 429 或等效):停止运行,报告已完成多少草稿,并建议用户等待后重试。
  • 切勿进行破坏性清理。流程停止时保持页面当前状态。

运行结束报告

完成所有草稿(或提前停止)后,输出简要摘要:

完成草稿:X / Y
成功:[问题标题列表]
跳过/失败:[问题标题 + 原因]
已跳过(历史重复):[问题标题列表]
历史记录:已写入 {baseDir}/data/history.json(当前共 N 条)

手动验证

对工作流或提示合约进行更改后,使用 {baseDir}/references/manual-test-checklist.md 进行验证。

J
@joly123456

已收录 1 个 Skill

相关推荐