douyin_dm_web_grounded.py 修了 web 版自动回复恒判 rejected 的 bug(_check_rejected 返回 4 元组没拆包,导致每条都被当拒收)——字节数从 24901 变 26195,核对表已同步;② 其余 8 个脚本无变化,已部署的号只需按⑧「更新脚本」重下一遍即可。一台无影云电脑 = 一个抖音号。机器上跑两个东西:
发多少、发给谁、话术内容全部由服务端控制(每分钟最多 1 条、每小时满 10 停 1 小时、每日封顶)——这台机只是手。相比老的「抖音 PC 客户端 + 截图 AI 视觉」方案:不用量坐标、不用校准模板、不用切输入法、昵称读取精确到 emoji、读列表不烧一分钱 AI。
| 条件 | 怎么确认 / 怎么补 |
|---|---|
| 无影 Windows 云电脑 | 阿里无影客户端能进桌面即可 |
| Edge 浏览器 | Windows 自带,开始菜单能搜到 Edge 即可 |
| 本机抖音号的手机在手边 | 登录抖音网页版要扫码 |
| Python 3.10+ | PowerShell 跑 py --version;报错就用下面命令装 |
$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 确认。
``` 这种符号行);>> 出不来 → 直接关窗重开最省事。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"
-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.py | 54601 | 主循环(领单 + 调度收发,自动回复绝对优先) |
douyin_dm_autoreply.py | 12279 | 自动回复编排(捕获 + 回发) |
douyin_dm_web_capture_dom.py | 13137 | DOM 读会话列表(收) |
douyin_dm_web_send_dom.py | 18327 | DOM 发私信(发前关注+点赞,批中给回复让位) |
douyin_dm_web_capture.py | 20386 | 被上面复用的过滤链 |
douyin_dm_web_reply.py | 2611 | 回复发送入口 |
douyin_dm_web_grounded.py | 26195 | web 兜底发送(2026-07-06 修 rejected 误判) |
douyin_inbox_uia.py | 19098 | 已发名单加载 + 噪声过滤 |
douyin_dm_grounded.py | 69587 | 公共函数库(被 import) |
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 下载浏览器。
在 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=【填钥匙③】
3 把钥匙全公司所有云电脑同值。任何一台已经在跑 DM 的云电脑(饭粒 / 零星 / 小文 / 文哥 / 小胡 / 有大有小 任一台),打开它的 C:\akke-wuying\wuying-dm\.env(有的老机在 C:\akke-wuying\.env),把 SUPABASE_SERVICE_ROLE_KEY / OPENROUTER_API_KEY / AKKE_DM_DRAFT_SECRET 三行的值抄过来。
(Select-String -Path .env -Pattern "SERVICE_ROLE").Line.Length(应 ≈ 245)。| 抖音号(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 |
| Whiplash | 16621567-618e-4b26-80d2-8b044c45483d |
| Gloomberg(cloud_pc) | ab7ed109-3594-40c5-949f-35396108e0d9 |
$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'
⚠️ 扫码用这台机对应的那个抖音号的手机扫,别扫成自己手机上登着的其他号。
'--headless=new', 参数重起(隐形模式,登录态自动带着)。功能完全一样,纯看个人习惯。cd C:\akke-wuying\wuying-dm py douyin_dm_web_capture_dom.py
conversation-item N 个(N>0)= 通了。持续 0 = 私信面板没点开过或没登上 → 回第 1 步用可见窗口检查。全新账号从没发过 DM 的话 by_name 0 人 是正常的。
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=,没有 = 脚本是老版本,回第③步重下):
这个黑窗保持开着别关。⚠️ 黑窗被鼠标点过会进「选择模式」冻结输出(看着像卡死)——按一下回车就恢复。
$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 条命令(见下方「日常运维」)。
| # | 验什么 | 怎么验 / 预期 |
|---|---|---|
| 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 对上(部署期一次即可) |
# 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
关掉 Edge(Get-Process msedge | Stop-Process -Force)→ 回第⑤步:重新拉起调试版 Edge → 扫码登录 → 点开一次私信 → 最小化放着。
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_log | Edge 没起时领了单必崩 → 拉起 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;临时绕过:.env 加 AKKE_DM_YIELD_TO_REPLY=0 + 重启 agent(只关批中让位) |
| 有红点却没抓到 / 抓错 | 把那轮日志 + 会话截图发群里@开发,别自己改脚本 |
# 首触回 pyautogui 网页版: AKKE_DM_SCRIPT=douyin_dm_web_grounded.py # 捕获回旧像素/VL 版: 删掉或改 0: AKKE_WEB_DM_USE_DOM
wuying_poll_agent(Get-CimInstance Win32_Process | ? {$_.CommandLine -like '*wuying_poll_agent*'} | % { Stop-Process -Id $_.ProcessId -Force },PC 客户端窗口也退掉);.env 里 AKKE_DM_SCRIPT=douyin_dm_web_send_dom.py + AKKE_WEB_DM_USE_DOM=1(④-D 段,别残留 PC 版的 douyin_dm_reply_inbox.py 之类);