--- title: 抖音评论自动化双路径技术 tags: [douyin, comment, automation, draft.js, keyboard] created: 2026-05-29 updated: 2026-05-29 nature: method collected: true collected_date: 2026-06-09 --- ## 概述 抖音评论系统基于 Draft.js 富文本编辑器,具有严格的输入验证。通过两条独立路径实现评论自动化。 ## 双路径架构 | 路径 | 场景 | 入口操作 | 发送操作 | |:-----|:-----|:---------|:---------| | **Path A**: 弹窗覆盖层 | 养号流程中 | KeyX 打开评论区 | Enter 发送 | | **Path B**: 全屏视频页 | 指定视频链接 | scrollIntoView 定位输入框 | Enter 发送 | ## 输入方式 **唯一可靠方式**:`pbcopy` + `Meta+V`(系统剪贴板粘贴) Draft.js 富文本编辑器特点: - 只认系统级键盘事件 - CDP(Chrome DevTools Protocol)注入的键盘事件一律忽略 - `page.fill()` / `page.type()` / `elementHandle.type()` 均不可靠 - 必须通过剪贴板 + 系统快捷键触发输入 ```python # 标准输入流程 import subprocess subprocess.run(["pbcopy"], input=comment_text.encode(), check=True) await page.keyboard.press("Meta+v") # 或 Cmd+V await asyncio.sleep(0.3) # 等待粘贴完成 await page.keyboard.press("Enter") # 发送 ``` ## 状态机 ``` closed → panel_open → input_focused → text_entered → sent / verify_code ``` | 状态 | 说明 | 验证方法 | |------|------|----------| | closed | 评论区关闭 | 评论面板不可见 | | panel_open | 评论区已打开 | 评论列表 DOM 可见 | | input_focused | 输入框已聚焦 | `document.activeElement` 指向编辑器 | | text_entered | 文字已粘贴 | 输入框内容非空 | | sent | 发送成功 | 新评论出现在列表顶部 | | verify_code | 触发验证码 | 验证码弹窗出现,需人工处理 | ## Draft.js 空格刷新技巧 粘贴文本后,Draft.js 可能不立即更新 React 状态。解决方法: ```python # 粘贴后按空格刷新 React 状态 await page.keyboard.press("Space") await asyncio.sleep(0.1) await page.keyboard.press("Backspace") # 删除多余空格 ``` ## 视频页评论区定位(Path B 专项) **问题**:评论区输入框可能在视口外(y ~2212px) **解决**: 1. `scrollIntoView()` 将输入框滚动到可视区域 2. 等待 DraftEditor 懒加载初始化(关键步骤,不能跳过) 3. 点击容器元素触发编辑器激活 4. 然后才能聚焦、粘贴 ```python input_container = await page.query_selector("评论输入框容器选择器") await input_container.scroll_into_view_if_needed() await asyncio.sleep(0.5) # 等待 DraftEditor 懒加载 await input_container.click() # 触发编辑器激活 await asyncio.sleep(0.3) # 现在可以粘贴了 ``` ## 抖音快捷键参考 | 快捷键 | 功能 | |--------|------| | KeyZ | 点赞 | | KeyX | 打开/关闭评论 | | KeyG | 关注 | | KeyP | 连播切换 | | KeyM | 静音切换 | | KeyJ | 清屏/弹幕切换 | ## 评论内容生成 ### AI 评论(可选) ```python from matrix_modules.comment.ai_generator import AICommentGenerator ig = AICommentGenerator() note_info = await page.evaluate(""" () => { const t = document.querySelector('.title, h1'); const c = document.querySelector('.content, .desc'); return { title: t?.textContent?.trim(), content: c?.textContent?.trim() }; } """) comment_text = ig.generate_with_context( note_title=note_info.get("title", ""), note_content=note_info.get("content", ""), ) ``` ### 随机评论池 预置评论列表,`random.choice()` 选取。评论频率建议每 3 轮 1 次,避免被检测。 ## 错误处理 | 错误 | 原因 | 处理 | |------|------|------| | 粘贴无效 | 系统剪贴板被占用 | 重试 pbcopy | | Enter 无响应 | 输入框未聚焦 | scrollIntoView + click 重新聚焦 | | 验证码弹窗 | 频繁操作触发 | 截图保存,跳过本轮 | | 评论发送失败 | 网络或限流 | 等待后重试,计入 consecutive_failures |