主播导量 · 抖音账号风控应对策略

目标:降低验证码弹出频率 + 弹出后减少人工介入 2026-06-17

这份方案要解决的事

一、回顾导量项目已知的风控触发点

⚠️ 导量项目过往经验的局限 —— 决定本方案的设计边界:

因此本方案的设计前提是「无法绕过的验证,就靠快速识别 + 自动停号 + 即时通知本人」—— 任务 1 做停号、任务 3 做 modal 检测 + Lark 红牌通知,不试图自动通过 SMS / 人脸;任务 2 的 OCR 只覆盖图形验证那一小块。

风控触发点 等级 具体表现 / 阈值 应对方法
登录前 3 天高频拉登录 初次扫码登录 + 后续 3 天可能反复掉线,需要扫码 + 短信验证码 3 天养号期由运营本人手动过;第 4 天开始才能进自驱
软封禁 · 关注无效 点了关注按钮,UI 显示已关注,但关注列表里没这人 该号停 1 天,期间只发作品养号,不做任何主动操作
软封禁 · 消息送不到 UI 显示"已发送",对方没收到(或触碰风控词:直播平台/微信号) 该号停 1 天;话术先脱敏(不出"微信""直播""+v"等字眼)
私信日上限 30-40 条/号/天触发日上限 云电脑日限封顶 25-30 条(保留 10 条余量)
私信小时上限 10 条/号/小时触发小时上限(要等下个小时才能继续) 小时门 8 条(保留 2 条余量),均匀打散到 60 分钟
作品浏览数个位数 作品发布后浏览数只有个位数 = 账号已软封禁(限流) 立刻停号 1 天养号,期间只发作品 + 浏览 feed
未到 30 条就异常 发送消息不到 30 条上限就出错 = 账号已被监控封禁(比软封更狠) 立刻停号 1 天 + 第二天观察;若仍异常需重新养号 + 换设备指纹
短信 step-up 验证 关注/点赞/发消息时弹"请输入本人持有手机号" 运营本人接短信 + 输入;本号当天停发
滑块拼图验证 SMS 升级版:"请完成下列验证后继续",需要拖滑块 能自动 OCR 识别拖(见任务 3);不行的冷却 1-2 天
人脸活检 升级到最高级:让你眨眼/转头过脸 必须人工,靠 Hermes 推 Lark 通知本人秒响应(见任务 4)
异地登录踢号 本人手机同时登 ➜ 云电脑被挤掉 自驱时段(10-18 点)本人手机别登;启动前核 AKKE_ACCOUNT_ID

这些触发点的共性 ➜ 推出方案方向

二、四个任务方案

任务 1 · 恢复

已触风控账号的 1 天休息策略 · 已落地

✅ P0 已落地 PR #389 / #390 / #394 / #395 / #397 / #405 / #407
为什么先做这个:风控触发后继续动 = 升级到下一关——SMS → 滑块 → 人脸 → 封号。给账号休息 1 天(24h 后自动恢复)+ 期间养号操作,能让 60-70% 的软封号恢复正常状态;恢复后第二天观察,如果还异常再延一天。
关键发现:项目里其实已经有 80% 的基建——status='cooling' 字段 / cooling_since 时间戳 / mark_account_failure() RPC 都在,getCloudPcAccounts() 派单时也已经过滤掉 cooling 状态。缺的只有 3 件事:自动解除 cron / Lark 通知 / 派单 guard 的明确日志。

触发风控的自动识别

信号 判定条件(代码自动检测) 处置时长
关注无效关注后查关注列表,3 分钟后未出现该 user休息 1 天
消息送不到气泡核对显示已发,但对话框系统提示"发送失败 / 操作太频繁"休息 1 天
作品低浏览作品发布 24h 后浏览数 < 50(个位数+小两位数)休息 1 天 + 养号
未到 30 条就异常日发量 < 30 但已撞 7911 / 22102 多次休息 1 天 + 第二天观察,仍异常再续
SMS / 滑块 / 人脸关键词命中(任务 3 / 4 提供)当天停 + 次日观察

休息期间能做什么 / 不能做什么

✓ 允许的"养号"动作
  • 本人正常刷 feed 30 分钟
  • 发 1-2 条原创作品(每天)
  • 对作品评论区正常互动(点赞/回复)
  • 关注 ≤3 个号(极少量、模仿正常用户)
✗ 禁止的"主动"动作
  • 所有自驱 DM 发送
  • 所有反评 / 评论触达
  • 大量关注(>5 个/天)
  • 云电脑 agent 任何操作

✅ 已落地 · 什么场景会触发什么提示

触发场景 提示 推到哪个群 卡片内容(举例)
抖音对单个号速率风控(7911 / 22102)
→ 一次触发立刻停号
🟠 橙牌 云电脑监控群 "野荞这个号被风控了,明天 18:30 自动恢复"
同一个号「气泡没出来 / 系统提示发送失败」累计满 3 次
→ 自动停号(中间发出去过就清零)
🟠 橙牌 云电脑监控群 "零星这个号连续 3 次失败自动 cool(cloud_pc_dm/unverified)"
24 小时之后号自动恢复 🟢 绿牌 云电脑监控群 "3 个号已自动恢复(24h 休息满):野荞、零星、夏夏"

🎯 已落地 · 运营要做的事

⏳ 还没生效的部分

任务 2 · OCR

简单图形验证码 OCR 自动识别 + 填写

P1 优先 ~2-3 人天
目标:把"代码看见图形验证码 ➜ 自动识别字符 ➜ 自动填写输入框"做成全自动闭环。对简单类型(4-6 位字符识别)可做到 85%+ 成功率;滑块拼图另算(见任务 4 关于滑块的部分)。

能搞定的验证码类型

类型 识别方法 成功率 成本
4-6 位字符
(abc123 / 数字混字母)
ddddocr 开源库(本地推理,无外网) 85-95% 免费
中文字符
(请选择"汽车"图)
百度 OCR / 腾讯 OCR API 70-80% 0.01 元/次
简单滑块
(缺口拼图)
opencv 边缘检测 + 模拟拖拽 50-70% 免费,但抖音命中率较低
点选验证
(按顺序点击图中文字)
打码平台超级鹰(人工识别) 90%+ ~0.02 元/次

技术方案

1. 检测:UIA 找到验证码弹窗节点 (关键词匹配)
2. 截图:定位验证码图片区域,保存为 PNG
3. 识别:
   - 简单字符走 ddddocr(本地)
   - 复杂场景走打码 API
4. 填写:SendInput 写入输入框
5. 确认:点提交按钮
6. 重试:失败 3 次后 HALT 走人工兜底

核心代码骨架

import ddddocr
from PIL import Image

async def auto_solve_captcha(page):
    # 1. 检测
    captcha_box = await page.query_selector('.captcha-img')
    if not captcha_box:
        return False

    # 2. 截图
    img_bytes = await captcha_box.screenshot()

    # 3. 识别
    ocr = ddddocr.DdddOcr(show_ad=False)
    code = ocr.classification(img_bytes)
    print(f"[captcha] OCR 识别: {code}")

    # 4. 填写
    input_field = await page.query_selector('input.captcha-input')
    await input_field.fill(code)

    # 5. 提交
    await page.click('button.captcha-submit')

    # 6. 等 2s 看是否过关
    await page.wait_for_timeout(2000)
    if await page.query_selector('.captcha-img'):
        return False  # 还在,说明识别错了
    return True

⛔ 卡点:最好有一个会跳验证码的号来解决

  • 最理想:有一个"必跳"验证码的号(连续撞验证、可以反复测试)—— 这样开发时能立刻验证 OCR 识别率,不用等运气
  • 次理想:真实出现验证码的账号 + 截图样本(至少 50-100 张),靠任务 3 modal 检测命中时自动截图存档captcha_alerts.metadata.screenshot_url 积累 1 周
  • 为什么必须:抖音验证码形态多变(4-6 位字符 / 中文点选 / 简单滑块 / 行为指纹)。不知道云电脑场景里实际撞的是哪种类型,就无法决定走 ddddocr(字符)/ opencv(滑块)/ 打码平台(点选)哪条路
  • 怎么搞一个"必跳号":
    • 从任务 1 的 cooldown 历史里挑——被 cool 过 2-3 次的号天然是高触发样本
    • 故意短时间高频发(一天发 30+ 条)人工催熟一个"撞墙号"专门做测试
    • 找一个本来就被运营观察到经常撞 SMS 的号专门给开发用

⏳ 待落地 · 拿到样本后要做的事

任务 3 · 告警

监督 cron 统一调度 · MVP 已落地

✅ P1 MVP 已落地 PR #395 / #399 / #402 / #405 / #407
对人脸活检这种没法绕的,目标不是"自动过",而是"让运营在 1 分钟内看到 + 立即响应"。
MVP 实现:用一个每分钟跑一次的 cron(监督 cron)扫账号健康表,发现异常就推 Lark。后续可升级到 Claude Agent SDK long-running 进程做更深的 LLM 分类,本阶段先用规则 + SQL 聚合做基础闭环。

✅ 已落地 · 什么场景会触发什么提示

触发场景 提示 推到哪个群 响应要求
单个号刚被自动 cool 进休息期
→ 任务 1 触发任何 cool 都会同步推这张
🟠 橙牌 云电脑监控群 看一眼即可,号会自动 24h 后恢复
多个号一起出事:5 分钟内 ≥3 个不同号被 cool
→ 怀疑 IP 段 / 时段策略问题,不是单号
🚨 红牌 云电脑监控群 立刻所有人停手 + 排查近期变更(IP / cron 时间 / 同号多端登录)

🎯 红牌出现时的处理流程

  1. 立刻停手:暂停所有云电脑发送(运营在云电脑里 Ctrl+C 杀 agent 或运维侧 dispatch 关闸)
  2. 排查 3 件事:
    • 最近 1 小时内有没有改过 cron 时间表?
    • 云电脑 IP 段是不是变了?(无影侧 IP 偶尔会调度变更)
    • 有没有运营本人手机也在登同号?(同号多端冲突高发诱因)
  3. 冷却:所有号停 1-2 小时,等告警群安静后再恢复发送

✅ 已补落地(PR #405 / #407 · 2026-06-17 下午)

⏳ 还没生效的部分(留给后续 PR)

任务 4 · 实验

"关闭页面停 1 小时再开"避验证码策略测试

P2 实验 ~1 人天
假设:抖音风控对账号的"行为打分"有一个滑动窗口——如果窗口内动作太密会触发验证码。如果关闭页面 + 停顿足够久,分数会自然衰减,下次再开时回到"安全等级",避免触发验证码
需要验证:1 小时够吗?停顿期间是关页面 / 关 App / 关云电脑哪种最有效?验证码触发率能降多少?

实验设计(A/B 对照)

分组 实验条件 预期触发率
对照组 A 连续发 25 条(约 1.5 小时),中间不停 ~30% 撞验证码(当前基线)
实验组 B1 发 10 条 ➜ 关浏览器页面停 30 分钟 ➜ 再发 10 条 ➜ 停 30 分钟 ➜ 发 5 条 验证:停顿 30 分钟够不够
实验组 B2 发 10 条 ➜ 关浏览器页面停 1 小时 ➜ 再发 10 条 ➜ 停 1 小时 ➜ 发 5 条 验证:停顿 1 小时效果
实验组 B3 发 10 条 ➜ 整个云电脑休眠 1 小时 ➜ 再发 10 条 ➜ 休眠 1 小时 ➜ 发 5 条 验证:休眠 vs 关页面哪个更有效

实验周期与样本量

实验脚本设计

scripts/_experiment-pause-strategy.ts
- --group A|B1|B2|B3 选实验组
- --account <id> 跑哪个号
- 自动按设定节奏调度,中间用 RPA 关闭抖音 PC 客户端
- 实验数据写 experiment_pause_strategy 表
- 收尾跑 _analyze-pause-experiment.ts 出对比报告

预期产出(实验后第 6 天)

⛔ 卡点:需要"已经会撞验证"的号才能跑实验

  • 需要的素材:3 个正常发送时会自然撞到验证的测试号(手头要有这种号才能跑 A/B 对照)
  • 为什么必须:实验的核心指标是「停顿能不能降低验证码触发率」。如果选的测试号根本不会撞验证(比如刚养好的全新号),A/B 两组都 0 次触发 → 数据无效
  • 怎么找:等任务 1 的 cooldown 系统跑一段时间,从被 cool 过的号里挑——这些号本身就是高触发概率账号,是天然的实验对象
  • 跟任务 2 同源:都依赖"实际撞过验证的号 / 截图",所以两个任务很可能同时获得启动条件——等任务 3 的截图采样积累 1 周后一起启动

⏳ 待启动 · 拿到测试号后要做的事