无影云电脑 · 无人值守发私信 · 部署指南

把一台无影配成「自己领单 → GUI 自动发抖音私信 → 自动回写去重」,人零操作。 下面两种方式:A 镜像克隆(推荐,最省事) / B 手动从零
面向 运营 / PM 源文档 docs/runbooks/wuying-selfdrive-deploy.md 原理 wuying-dm-selfdrive-0to1.html

0 一句话架构

① Vercel cron
服务端出文案 + 入队
② Supabase 队列
dispatch_queue / 去重
③ 无影 agent
每 60s 领单
④ GUI 自动发
搜人→身份门→私信
⑤ 回写去重
complete_dispatch

整条链全在云上,不碰任何人的本机。每台无影只要:① 抖音登录对应账号 ② .env 配好 ③ 账号 channel_pref=cloud_pc,就自动跑。

1 选哪种方式

✅ 推荐

A · 镜像克隆

已有一台配好的(野荞这台)→ 烤成自定义镜像 → 新机克隆。零重装、零装依赖、同分辨率零校准,每台只改 3 处。最省事。

备用

B · 手动从零

新机无镜像可用时:装 Python → 传脚本 → 装依赖 → 配 .env → 设自启 →(必要时)校准。每步都有现成命令。

A 镜像克隆(推荐)

前提:已有一台配好的无影(Python+依赖+脚本+模板+自启全齐)。

  1. 把配好的那台烤成自定义镜像(PM 做一次)
    阿里无影控制台 → 选中实例 → 创建自定义镜像。镜像内已含:Python 3.12 + 依赖、C:\akke-wuying\wuying-dm\(脚本 + templates/ 模板图)、开机自启 akke_wuying_agent.bat
    🔑 烤好后 PM 记下镜像码(镜像 ID,形如 m-xxxxxxxxxxxx),发给团队 —— 大家克隆新机时要用它。
  2. 新机用这个镜像开 / 重装
    先找 PM 要镜像码(上一步的 m-xxxx);新建无影实例时在「镜像」处选「自定义镜像」→ 填这个码 → 克隆出来零重装、零装依赖。
    ⚠️ 分辨率必须和源机一致(本套 2560×1600)。一致 → 模板/坐标直接复用、零校准(实测发送键模板匹配 1.000)。不一致 → 走 B6 校准重采一次。
  3. 每台只改 3 处(因为是不同抖音账号)
    ① 抖音登录:打开抖音 PC → 扫码登录这台要绑的账号 → 窗口最大化输入法切英文(Win+空格)。
    ② 改 .env:把 AKKE_ACCOUNT_ID 换成这台账号的 id(PM 下发)。受控 key 全队可共用一把。
    ③ 开 DB 开关:PM 把该账号 accounts.channel_pref 设成 cloud_pc + 设节奏(见运维)。
  4. 重启一次 → 完成
    重启无影 → 登录后开机自启 agent 自动跑。验证见下方「验证」。

B 手动从零(新机无镜像时)

  1. 装 Python(华为云镜像,大陆快)
    cd C:\akke-wuying
    $u = "https://mirrors.huaweicloud.com/python/3.12.7/python-3.12.7-amd64.exe"
    iwr $u -OutFile py-setup.exe -UseBasicParsing
    $a = "/quiet InstallAllUsers=0 PrependPath=1 Include_pip=1 Include_tcltk=1"
    Start-Process .\py-setup.exe -ArgumentList $a -Wait
    $env:Path = "$env:LOCALAPPDATA\Programs\Python\Python312;" + $env:Path
    python --version   # 应 Python 3.12.7
  2. 放脚本到 C:\akke-wuying\wuying-dm\
    需要:wuying_poll_agent.py douyin_dm_grounded.py measure_nav.py probe_templates.py + templates/(模板图)。走 paste.rs 中转(URL 由 PM 提供,过期就重传):
    mkdir C:\akke-wuying\wuying-dm -Force
    cd C:\akke-wuying\wuying-dm
    iwr https://paste.rs/XXXXX -OutFile dm.tar.gz -UseBasicParsing
    tar -xzf dm.tar.gz
    传输坑:paste.rs 过期快、404 就重传;PowerShell 长命令会被终端折行拆断,每行尽量短
  3. 装 Python 依赖(阿里云镜像)
    $m = "https://mirrors.aliyun.com/pypi/simple/"
    $p = "pyautogui","pyperclip","pillow","opencv-python","pygetwindow","python-dotenv"
    python -m pip install -i $m $p
  4. .env(在脚本目录,见下方模板)
    脚本读的是脚本目录下的 .env(不是仓库根)。
  5. 设开机自启
    $bat = Join-Path ([Environment]::GetFolderPath("Startup")) "akke_wuying_agent.bat"
    Set-Content $bat "@echo off" -Encoding ASCII
    Add-Content $bat "chcp 65001 >nul"
    Add-Content $bat "cd /d C:\akke-wuying\wuying-dm"
    Add-Content $bat "timeout /t 30 /nobreak >nul"
    Add-Content $bat "python -u wuying_poll_agent.py > agent.log 2>&1"
    python -u 才有实时 agent.log;漏了会被缓冲、看着像没动。
  6. 校准(仅分辨率与源机不同时,否则跳过)
    抖音登录最大化、手动开一个私信聊天窗口,然后:
    # 按提示把鼠标依次停在 搜索框/用户tab/私信键/红色↑发送键/输入框 上、回车采集
    python douyin_dm_grounded.py --capture
    # 看匹配分数,send_arrow ≥0.85 即稳
    python probe_templates.py
  7. 抖音登录 + 开 DB 开关 + 重启
    同方式 A 第 3 步的 ① 和 ③ + 重启。

2 .env 模板

C:\akke-wuying\wuying-dm\.env —— 各账号的值由 PM 下发。

# Supabase
SUPABASE_URL=https://<项目>.supabase.co
NEXT_PUBLIC_SUPABASE_URL=https://<项目>.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=<anon key>
# 受控角色 key(全队可共用同一把;角色 key 不绑账号)
SUPABASE_SCOPED_JWT=<role=wuying_worker 的自签 JWT>
# 这台绑的账号(每台不同,PM 下发)
AKKE_ACCOUNT_ID=<accounts.id>
# 视觉定位用 —— 务必用设了额度封顶的 key,共享机别放无上限的生产 key
OPENROUTER_API_KEY=<sk-or-... 封顶 key>
# 轮询(默认即可)
AKKE_POLL_INTERVAL=60
AKKE_CLAIM_LIMIT=3
没有受控 key 时可回退用 SUPABASE_SERVICE_ROLE_KEY(agent 自动识别),但共享机强烈建议用受控 key(读全库、只能跑领单/回写,不能乱写)。

3 验证

Get-Content C:\akke-wuying\wuying-dm\agent.log -Tail 8

看到 === wuying_poll_agent account=... every 60s === = agent 在跑。有 pending 时逐条打印 claimed N → 搜人 → [OCR] match=True✅ 已点发送completed → sent

⚠️ 发前必查:抖音登录对的账号 + 窗口最大化前台 + 输入法英文。发完肉眼看私信列表气泡真到了(系统不保证 100% 送达)。

4 日常运维

节奏(防封号)
DB 设 min_send_interval_seconds(批内间隔)+ daily_limit(当日上限);代码侧滚动 1h 上限默认 10。规格 = 每分钟 1 条·满 10 停约 1h·当日 20,只数真成功
日预算跨通道合并
同账号人工(手机/WDA)+ 云电脑共用同一 24h 预算,防叠加触发风控。当天人工发多了,云电脑当天就少发。
开 / 关
channel_pref=cloud_pc 开;改回 manual 关。无影关机=暂停(队列留 1 条 pending),开机自启自动续。
OpenRouter key 务必封顶
vision 每发一条都烧、又在共享机上 → 后台给 key 设 Credit limit(如 $30),烧超即停、不碰生产额度。
加机器扩产能
每台一个账号、产能 = 该账号 daily_limit;镜像克隆即可线性扩。
不碰本机
整链全云端(Vercel+Supabase+无影),运营本机 Mac 关不关都不影响。

5 排错速查

现象原因 / 处理
agent 起来但不发多半当日 20 满(含人工通道)→ 等滚动窗口腾槽自动续;或该账号没 channel_pref=cloud_pc
搜错人 / 身份门跳过输入法不是英文(抢搜索词首字);或同名撞大号(身份门跳过 = 安全)
文字没进输入框 → 不发分辨率变了 AKKE_INPUT_OFFSET/坐标偏 → 重跑 --capture
agent.log自启缺 python -u(缓冲);或还在 30s 倒计时
连库报错 401把自定义角色 JWT 当 apikey 了;确认 SUPABASE_SCOPED_JWT + NEXT_PUBLIC_SUPABASE_ANON_KEY 都配了(agent 用 anon 当 apikey)
python 找不到PATH 没带 Python 目录(本会话临时设,或重装时勾 Add to PATH)

配好后:抖音登对号、.env 配好、DB 开 cloud_pc,重启 → 自己跑。