|
@@ -234,10 +234,95 @@ curl -X POST https://apihub.agnes-ai.com/v1/images/generations \
|
|
|
## 10. 发布后复盘
|
|
## 10. 发布后复盘
|
|
|
|
|
|
|
|
每篇发布后按 `运营文案\发布数据复盘清单.md` 执行:
|
|
每篇发布后按 `运营文案\发布数据复盘清单.md` 执行:
|
|
|
-- **T+3h**:回复前 5 条评论并点赞(提升互动权重)
|
|
|
|
|
|
|
+- **T+3h**:回复前5条评论并点赞(提升互动权重)
|
|
|
- **T+24h**:记录赞藏评数据,赞>20 进投稿池
|
|
- **T+24h**:记录赞藏评数据,赞>20 进投稿池
|
|
|
- **T+7d**:记录长尾数据,写复盘小结
|
|
- **T+7d**:记录长尾数据,写复盘小结
|
|
|
|
|
|
|
|
|
|
+### 10.1 评论自动回复工具
|
|
|
|
|
+
|
|
|
|
|
+> 脚本位置:`_过程脚本\comment_reply.py`
|
|
|
|
|
+> 前提:Chrome 已以 `--remote-debugging-port=9222` 启动,且已登录小红书(§3)
|
|
|
|
|
+
|
|
|
|
|
+**核心功能**:
|
|
|
|
|
+- 连接已打开的笔记详情页(通过 WebSocket CDP)
|
|
|
|
|
+- 提取所有评论及子回复,识别未被作者回复的评论
|
|
|
|
|
+- 自动匹配"引发讨论"风格的回复(以提问结尾,引导用户继续讨论)
|
|
|
|
|
+- 使用 CDP `Input.insertText` 模拟真实键盘输入,确保发送按钮可用
|
|
|
|
|
+
|
|
|
|
|
+**CLI 用法**:
|
|
|
|
|
+
|
|
|
|
|
+```bash
|
|
|
|
|
+# 仅提取评论(查看状态,不回复)
|
|
|
|
|
+python _过程脚本\comment_reply.py --ws ws://127.0.0.1:9222/devtools/page/<PAGE_ID> --extract-only
|
|
|
|
|
+
|
|
|
|
|
+# 自动回复所有未回复评论(按内容自动匹配模板)
|
|
|
|
|
+python _过程脚本\comment_reply.py --ws ws://127.0.0.1:9222/devtools/page/<PAGE_ID>
|
|
|
|
|
+
|
|
|
|
|
+# 自定义回复文本(所有未回复评论用同一文本)
|
|
|
|
|
+python _过程脚本\comment_reply.py --ws ws://127.0.0.1:9222/devtools/page/<PAGE_ID> --text "能展开说说你的想法吗?"
|
|
|
|
|
+
|
|
|
|
|
+# 输出到文件(避免 GBK 编码问题)
|
|
|
|
|
+python _过程脚本\comment_reply.py --ws ws://127.0.0.1:9222/devtools/page/<PAGE_ID> --extract-only --output result.txt
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+**库式调用**:
|
|
|
|
|
+
|
|
|
|
|
+```python
|
|
|
|
|
+from _过程脚本.comment_reply import CommentReplyBot
|
|
|
|
|
+import asyncio
|
|
|
|
|
+
|
|
|
|
|
+async def main():
|
|
|
|
|
+ bot = CommentReplyBot("ws://127.0.0.1:9222/devtools/page/<PAGE_ID>")
|
|
|
|
|
+ await bot.connect()
|
|
|
|
|
+ await bot.scroll_to_comments()
|
|
|
|
|
+
|
|
|
|
|
+ # 仅提取
|
|
|
|
|
+ comments = await bot.extract_comments()
|
|
|
|
|
+ for c in comments:
|
|
|
|
|
+ print(f" {c['author']}: {c['content']} (已回复={c['hasAuthorReply']})")
|
|
|
|
|
+
|
|
|
|
|
+ # 回复所有未回复评论
|
|
|
|
|
+ result = await bot.reply_all()
|
|
|
|
|
+ print(f"Replied: {result}")
|
|
|
|
|
+
|
|
|
|
|
+asyncio.run(main())
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+**讨论型回复模板**(按评论关键词自动匹配):
|
|
|
|
|
+
|
|
|
|
|
+| 评论关键词 | 回复内容 |
|
|
|
|
|
+|-----------|---------|
|
|
|
|
|
+| 晚一年上学 | 晚一年确实有很多好处,能分享一下你们家是怎么考虑这件事的吗? |
|
|
|
|
|
+| 不生二胎 | 是啊,精力集中养一个也挺好的。你们家孩子多大了? |
|
|
|
|
|
+| 不把他帶來世上遭罪 | 这个想法很深刻,能多聊聊你是怎么想的吗? |
|
|
|
|
|
+| 让他是独生子 | 独生子女也有独生子女的好处,你平时会担心他孤单吗? |
|
|
|
|
|
+| 默认 | 说得对,能再展开说说你的想法吗? |
|
|
|
|
|
+
|
|
|
|
|
+**回复设计原则**:所有回复以**提问结尾**,引导用户继续讨论 → 提升互动权重 → 算法推荐更多曝光。
|
|
|
|
|
+
|
|
|
|
|
+**关键 DOM 选择器**:
|
|
|
|
|
+
|
|
|
|
|
+| 元素 | 选择器 | 说明 |
|
|
|
|
|
+|------|--------|------|
|
|
|
|
|
+| 评论输入框 | `#content-textarea` | contenteditable 的 `<p>` 元素 |
|
|
|
|
|
+| 发送按钮 | `.btn.submit` | 文字"发送";disabled 时不可用 |
|
|
|
|
|
+| 回复按钮 | `.reply.icon-container` | 文字"回复" |
|
|
|
|
|
+| 评论容器 | `.parent-comment` | 每条顶级评论 |
|
|
|
|
|
+| 作者回复标识 | `.tag`(文本含"作者") | 子回复中的标识 |
|
|
|
|
|
+| 子回复 | `.comment-item-sub` | 展开的回复列表 |
|
|
|
|
|
+
|
|
|
|
|
+**关键实现细节**:
|
|
|
|
|
+- 发送按钮 `.btn.submit` 初始为 `disabled`,必须通过 CDP `Input.insertText` 模拟真实键盘输入才能 enable
|
|
|
|
|
+- 用 `contenteditable.innerHTML` 或 `textContent` 赋值不会触发 React 的 enable 逻辑
|
|
|
|
|
+- 点击"回复"按钮**必须用原生 `.click()`**,不能用 `dispatchEvent(new MouseEvent('click', {bubbles: true}))`——实测 dispatchEvent 合成事件无法让 Vue 识别回复目标,输入框会回退到全局评论区,导致回复被发送成**独立评论**而非嵌套回复
|
|
|
|
|
+
|
|
|
|
|
+**典型工作流**:
|
|
|
|
|
+1. 从创作者中心笔记列表获取笔记 ID 和评论数(`content-data` 命令)
|
|
|
|
|
+2. 构造详情页 URL:`https://www.xiaohongshu.com/explore/{noteId}?xsec_token={token}&xsec_source=pc_creatormng`
|
|
|
|
|
+3. 在 Chrome 中打开该 URL(xsec_token 可跨笔记复用)
|
|
|
|
|
+4. 运行 `python _过程脚本\comment_reply.py --ws ws://... --extract-only` 查看评论状态
|
|
|
|
|
+5. 运行 `python _过程脚本\comment_reply.py --ws ws://...` 自动回复
|
|
|
|
|
+
|
|
|
---
|
|
---
|
|
|
|
|
|
|
|
## 11. 关键文件索引
|
|
## 11. 关键文件索引
|