浏览器 DOM 版私信 · 从零部署指南

首触发 DM + 自动捕获客户回复 + 自动回复,全跑在一个调试版 Edge 里 · 无影云电脑 · 照着做即可,不需要问任何人拿材料
零坐标 · 零校准 · 零截图AI 2026-07-03 2026-07-06 更新
2026-07-06 更新了什么:① douyin_dm_web_grounded.py 修了 web 版自动回复恒判 rejected 的 bug(_check_rejected 返回 4 元组没拆包,导致每条都被当拒收)——字节数从 24901 变 26195,核对表已同步;② 其余 8 个脚本无变化,已部署的号只需按⑧「更新脚本」重下一遍即可。

这套是什么(3 分钟看懂再动手)

一台无影云电脑 = 一个抖音号。机器上跑两个东西:

:服务端派单 agent 领单 DOM 进对方主页 关注 + 第一个作品点赞 点「私信」打字 → 发送 → 验气泡
:DOM 读会话列表 红点 = 客户回了 写回库 → 秒级起草回复 过审后 DOM 自动回过去

发多少、发给谁、话术内容全部由服务端控制(每分钟最多 1 条、每小时满 10 停 1 小时、每日封顶)——这台机只是手。相比老的「抖音 PC 客户端 + 截图 AI 视觉」方案:不用量坐标、不用校准模板、不用切输入法、昵称读取精确到 emoji、读列表不烧一分钱 AI。

自动回复绝对优先(正在聊的客户 > 新客首触):只要有已审批待发的回复,agent 会①不等扫描间隔立即插队发回复;②回复没清完,本轮不发首触;③首触批发到一半来了新回复,中断剩余首触让位——被中断的单子自动回池、之后重发,不会丢。这些全自动,不用任何操作。

前置条件(缺哪个先补哪个)

条件怎么确认 / 怎么补
无影 Windows 云电脑阿里无影客户端能进桌面即可
Edge 浏览器Windows 自带,开始菜单能搜到 Edge 即可
本机抖音号的手机在手边登录抖音网页版要扫码
Python 3.10+PowerShell 跑 py --version;报错就用下面命令装
没有 Python 时(国内镜像装 3.12,直连 python.org 会卡死)
$ProgressPreference='SilentlyContinue'
[Net.ServicePointManager]::SecurityProtocol='Tls12'
curl.exe -fsSL -o py312.exe https://registry.npmmirror.com/-/binary/python/3.12.7/python-3.12.7-amd64.exe
.\py312.exe /quiet InstallAllUsers=1 PrependPath=1 Include_launcher=1

装完关掉 PowerShell 重开一个,再 py --version 确认。

粘贴命令的三条铁律(无影远程桌面的坑,踩了会莫名其妙失败):
① 别把网页里代码框外面的东西一起复制(尤其 ``` 这种符号行);
② 长命令一行一行粘,别一大坨全糊进去;
③ 粘完卡住 / 提示符变成 >> 出不来 → 直接关窗重开最省事。

下载脚本(9 个文件,公开镜像直接拉)

1建目录 + 探一次镜像是否可达(回显必须是 200 才继续)
mkdir C:\akke-wuying\wuying-dm -Force
cd C:\akke-wuying\wuying-dm
$b='https://raw.githubusercontent.com/upioai/wiki/main/public/akke/wuying-dm'
curl.exe -s -o NUL -w "%{http_code}" "$b/wuying_poll_agent.py"
2下载全部 9 个(-f 保证 404 时报错而不是把错误页写进文件)
$files='wuying_poll_agent.py','douyin_dm_autoreply.py','douyin_dm_web_capture_dom.py','douyin_dm_web_send_dom.py','douyin_dm_web_capture.py','douyin_dm_web_reply.py','douyin_dm_web_grounded.py','douyin_inbox_uia.py','douyin_dm_grounded.py'
foreach($f in $files){ curl.exe -fsS -o $f "$b/$f"; "{0}  {1}" -f (Get-Item $f).Length,$f }

逐个核对字节数(对不上 = 下载不全,重跑那一个):

文件字节数干什么的
wuying_poll_agent.py54601主循环(领单 + 调度收发,自动回复绝对优先)
douyin_dm_autoreply.py12279自动回复编排(捕获 + 回发)
douyin_dm_web_capture_dom.py13137DOM 读会话列表(收)
douyin_dm_web_send_dom.py18327DOM 发私信(发前关注+点赞,批中给回复让位)
douyin_dm_web_capture.py20386被上面复用的过滤链
douyin_dm_web_reply.py2611回复发送入口
douyin_dm_web_grounded.py26195web 兜底发送(2026-07-06 修 rejected 误判)
douyin_inbox_uia.py19098已发名单加载 + 噪声过滤
douyin_dm_grounded.py69587公共函数库(被 import)
字节数只有十几字节?那是把「404: Not Found」下载进了文件(文件非空但是垃圾)。删掉重下,先跑第 1 步确认 200。
3装依赖(国内镜像)
py -m pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
py -m pip install playwright uiautomation pyautogui pyperclip pillow python-dotenv pygetwindow opencv-python

playwright 只需要库本身(接管现成 Edge),不用playwright install 下载浏览器。

写 .env(全部配置就这一个文件)

C:\akke-wuying\wuying-dm\ 下建 .env(记事本:notepad C:\akke-wuying\wuying-dm\.env,保存类型选「所有文件」别存成 .txt)。完整模板照抄,只有 4 处要填值:

# ── A. 连库(3 把钥匙全公司同值,见下方「钥匙哪里来」)──────────
SUPABASE_URL=https://nytlptpfqfnrpqemrtpr.supabase.co
SUPABASE_SERVICE_ROLE_KEY=【填钥匙①】
OPENROUTER_API_KEY=【填钥匙②】

# ── B. 本机身份(查下方账号表,必须=这台机登录的那个抖音号!)──
AKKE_ACCOUNT_ID=【填你的账号 UUID】

# ── C. 节奏(照抄不改)─────────────────────────────
AKKE_POLL_INTERVAL=15
AKKE_CLAIM_LIMIT=2
AKKE_DM_AUTOREPLY_INTERVAL=15

# ── D. DOM 通道开关(照抄不改,5 行一个都不能少)────────────
AKKE_DM_SCRIPT=douyin_dm_web_send_dom.py
AKKE_DM_AUTOREPLY_CAPTURE=1
AKKE_DM_AUTOREPLY_MODE=both
AKKE_WEB_DM_USE_DOM=1
AKKE_WEB_DM_DOM_COMMIT=1

# ── E. 秒级起草(客户回复后几十秒内出草稿;不配则退 5 分钟一轮)──
AKKE_DM_DRAFT_ENDPOINT=https://akke-worker-prod.fly.dev/dm-reply/draft-one
AKKE_DM_DRAFT_SECRET=【填钥匙③】

钥匙哪里来(不用找 PM)

3 把钥匙全公司所有云电脑同值。任何一台已经在跑 DM 的云电脑(饭粒 / 零星 / 小文 / 文哥 / 小胡 / 有大有小 任一台),打开它的 C:\akke-wuying\wuying-dm\.env(有的老机在 C:\akke-wuying\.env),把 SUPABASE_SERVICE_ROLE_KEY / OPENROUTER_API_KEY / AKKE_DM_DRAFT_SECRET 三行的值抄过来。

钥匙红线:这几把钥匙不许截图发群、不许发微信/Lark、不许贴 paste.rs。两台云电脑之间传,用无影自带的文件传输或 U 盘映射;实在要走网络就抄在纸上手敲(service_role 那把约 219 字符,认真核对)。
长钥匙粘贴坑:无影远程桌面粘长文本会从中间折行、行首加空格,钥匙就废了。稳妥做法:粘完在记事本里确认那一行没有断行、行首没空格;或者用 PowerShell 写入后核长度:(Select-String -Path .env -Pattern "SERVICE_ROLE").Line.Length(应 ≈ 245)。

账号表(AKKE_ACCOUNT_ID 从这里查)

抖音号(accounts.name)AKKE_ACCOUNT_ID
饭粒(一筑·全屋定制)c5d236e1-fd80-4cff-b349-506dfd09699b
零星8af08f10-6db5-4d83-8942-b908349efbda
小文(野荞)81cc9678-9b53-413b-9f40-7964341f4af1
文哥e7d50b4c-24f9-4cb2-b8fe-cb47c2682ab0
有大有小9535e31c-bced-4cf6-93d1-0f8699df4cb0
小胡804a8ab8-167b-4485-b9b9-7f3692404847
小武3e509c70-428a-4473-bafc-7adb4704dc79
Whiplash16621567-618e-4b26-80d2-8b044c45483d
Gloomberg(cloud_pc)ab7ed109-3594-40c5-949f-35396108e0d9
UUID 填错 = 最隐蔽的故障:捕获到的回复对不上号(0 匹配)、发出去的 DM 记到别人头上。必须填「这台机上登录的那个抖音号」对应的行,不是你自己名字对应的行

打开调试版 Edge + 登录抖音网页版(Cookie 撑 15–30 天)

1打开调试版 Edge(普通可见窗口,就是多了个调试端口)
$edge="C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe"
if(!(Test-Path $edge)){$edge="C:\Program Files\Microsoft\Edge\Application\msedge.exe"}
Start-Process $edge -ArgumentList '--remote-debugging-port=9222','--user-data-dir=C:\akke-edge-debug','https://www.douyin.com'
2在弹出的 Edge 里:扫码登录本机抖音号 → 登录后点开一次私信(右上角消息图标,确认能看到会话列表)→ 把窗口最小化放着

⚠️ 扫码用这台机对应的那个抖音号的手机扫,别扫成自己手机上登着的其他号。

这个 Edge 窗口的三条规矩:①别关(关了 = 收发全停,最小化没事);②别在里面乱点、别导航离开抖音;③桌面别再开第二个登抖音的 Edge。
想彻底看不见也可以:关掉它后加 '--headless=new', 参数重起(隐形模式,登录态自动带着)。功能完全一样,纯看个人习惯。
3验证 Edge 通 + 能读私信
cd C:\akke-wuying\wuying-dm
py douyin_dm_web_capture_dom.py
=== web capture[DOM] (COMMIT 写回) ===
  conversation-item 12 个
=== 完成: 命中客户回复 0 条 / 有红点 0 个 / 扫 12 人 ===

conversation-item N 个(N>0)= 通了。持续 0 = 私信面板没点开过或没登上 → 回第 1 步用可见窗口检查。全新账号从没发过 DM 的话 by_name 0 人 是正常的。

启动 poll agent

1先杀残留旧进程(保证全机只有一个 agent),再启动
Get-CimInstance Win32_Process | Where-Object {$_.CommandLine -like '*wuying_poll_agent*'} | ForEach-Object { Stop-Process -Id $_.ProcessId -Force }
cd C:\akke-wuying\wuying-dm
py -u wuying_poll_agent.py

启动横幅应长这样(必须有 v=,没有 = 脚本是老版本,回第③步重下):

=== wuying_poll_agent v=2026-07-03+reply-priority account=xxxxxxxx… every 15s claim=2 second_touch=off rc=off ===

这个黑窗保持开着别关。⚠️ 黑窗被鼠标点过会进「选择模式」冻结输出(看着像卡死)——按一下回车就恢复。

2(可选)开机自启:登录后自动拉 agent
$s="$env:APPDATA\Microsoft\Windows\Start Menu\Programs\Startup\akke_wuying_agent.bat"
Set-Content -Path $s -Encoding ascii -Value @('@echo off','cd /d C:\akke-wuying\wuying-dm','timeout /t 30 /nobreak >nul','py -u wuying_poll_agent.py >> agent.log 2>&1')

注意调试版 Edge 不会自启——重启后仍要手动跑一遍第⑤步第 1 条命令(见下方「日常运维」)。

验活(4 项对完才算部署完成)

#验什么怎么验 / 预期
1捕获在跑黑窗每轮出 web capture[DOM] … conversation-item N 个(不是 ECONNREFUSED、不是 0)
2真回复抓得到 + 优先回用测试号给本机账号发条私信(产生红点),下一轮日志出 [红点] 昵称: 内容 + [inbound] 昵称: 内容;回复草稿过审后日志出 待发回复=N(插队)(不等间隔立即发),期间若跳过首触会打 本轮让位, 跳过一触/二触/RC——都是设计行为
3首触发得出等服务端派单(自动的),黑窗出 === DOM 批量发送: N 条 ===,每条先 [engage] follow=followed like=liked(发前自动关注+点赞,对方没作品显示 no_works 正常)再 [sent] 昵称: 文案;肉眼开抖音网页版私信列表确认真有气泡
4回写落库把 2、3 的日志整段发给 PM / 在群里说一声,让有库权限的人查一眼 messages/dispatch_queue 对上(部署期一次即可)
黑窗一直「无 approved 待发」「没领到单」= 不是坏了。派不派单由服务端控制:每小时发满 10 条会停约 1 小时、每日有封顶、你这个号有没有开派单由数据库配置决定。判断标准只有一条:有单来的时候发得出去

日常运维(云电脑重启后 / Cookie 过期 / 更新脚本)

云电脑每次开机 / 重启后(2 分钟)

两条命令拉起 Edge + agent(没配自启就都要手动)
# 1) 调试版 Edge(起来后最小化放着;想隐形就在参数最前加 '--headless=new',)
$edge="C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe"
if(!(Test-Path $edge)){$edge="C:\Program Files\Microsoft\Edge\Application\msedge.exe"}
Start-Process $edge -ArgumentList '--remote-debugging-port=9222','--user-data-dir=C:\akke-edge-debug','https://www.douyin.com'
# 2) poll agent(配了自启则跳过,注意别起两个)
cd C:\akke-wuying\wuying-dm
py -u wuying_poll_agent.py

Cookie 过期(15–30 天一次,症状 = 捕获持续 conversation-item 0)

关掉 Edge(Get-Process msedge | Stop-Process -Force)→ 回第⑤步:重新拉起调试版 Edge → 扫码登录 → 点开一次私信 → 最小化放着。

更新脚本(PM 说「升级到最新版」时)

先杀旧 agent,再重下,再起一个新的(顺序不能反)
Get-CimInstance Win32_Process | Where-Object {$_.CommandLine -like '*wuying_poll_agent*'} | ForEach-Object { Stop-Process -Id $_.ProcessId -Force }
cd C:\akke-wuying\wuying-dm
$b='https://raw.githubusercontent.com/upioai/wiki/main/public/akke/wuying-dm'
foreach($f in $files){ Copy-Item $f "$f.bak" -Force -EA 0; curl.exe -fsS -o $f "$b/$f" }
py -u wuying_poll_agent.py

不先杀旧进程的话,后台旧 agent 还按旧代码抢单,新窗口看着零日志——经典假故障。回滚 = 把 .bak 改回原名。

排查表(先查这里再喊人)

现象原因 / 处理
❌ 连不上调试版 Edge …ECONNREFUSED 127.0.0.1:9222调试版 Edge 没起 / 被关了 → 跑第⑧步第 1 条命令;浏览器开 http://127.0.0.1:9222/json/version 有 JSON = 通
conversation-item 0 持续每轮没登录 / 私信面板从没点开过 → 第⑤步可见窗口重登 + 点开私信
派单连串 failed,秒失败 no entry in sent_logEdge 没起时领了单必崩 → 拉起 Edge 即愈;已 failed 的单不重试,lead 约 4 小时后自动回池重派
[no_secuid] / [dm_panel_failed] 个别条正常:缺主页 ID / 对方私信框打不开,自动跳过或回池,不用管
[unverified]点了发送但没等到气泡确认 → 不算成功、自动回池可重发;偶发不用管
改了 .env 没生效.env 只在启动时读一次 → 重启 poll agent(第⑥步第 1 条)
日志是 web capture[红点像素检测] 不是 [DOM]AKKE_WEB_DM_USE_DOM=1 没写 / 写错 → 查④-D 段 + 重启
横幅没有 v=脚本是老版本 → 第⑧步「更新脚本」
黑窗没输出像卡死鼠标点过进了选择模式 → 按回车解冻
下载的文件只有十几字节404 页被写进文件 → 删掉,确认镜像 200 后重下
日志 本轮让位, 跳过一触/二触/RC / 首触批中 让位: 剩余 N 条 aborted 回池正常:自动回复绝对优先,被让位的首触单自动回池、之后重发,不用管
!! 自动回复让位已连续 N 轮 告警某条已审批回复一直发不出去、卡住了首触 → 把日志发群里@开发查 dm_reply_drafts;临时绕过:.envAKKE_DM_YIELD_TO_REPLY=0 + 重启 agent(只关批中让位)
有红点却没抓到 / 抓错把那轮日志 + 会话截图发群里@开发,别自己改脚本

回退

DOM 出问题想临时回旧方案(改 .env + 重启 agent)
# 首触回 pyautogui 网页版:  AKKE_DM_SCRIPT=douyin_dm_web_grounded.py
# 捕获回旧像素/VL 版:       删掉或改 0: AKKE_WEB_DM_USE_DOM
一台机一个号的铁律:同一个抖音号别同时在手机(ADB/WDA)和云电脑两边发 DM——会重复打扰客户。这台机部署完,这个号的发送就以云电脑为准。
从 PC 客户端模式迁过来的号(如小文,之前跑过抖音 PC 版就地回复)务必先断旧再起新
① 停掉旧的 PC 版进程 + 旧 wuying_poll_agentGet-CimInstance Win32_Process | ? {$_.CommandLine -like '*wuying_poll_agent*'} | % { Stop-Process -Id $_.ProcessId -Force },PC 客户端窗口也退掉);
② 确认 .envAKKE_DM_SCRIPT=douyin_dm_web_send_dom.py + AKKE_WEB_DM_USE_DOM=1(④-D 段,别残留 PC 版的 douyin_dm_reply_inbox.py 之类);
③ 再按本页从第⑤步(调试版 Edge 登网页版)走。同机同号 PC 版和浏览器 DOM 版别并跑,否则重复发 + 抢窗口。