.env · 2026-07-01| 企业微信 | PC 客户端已装、已登录你自己的销售号、窗口别最小化到托盘(GUI 自动化靠截屏)。 |
| Python 环境 | 云电脑已装 Python + 依赖(pyautogui pygetwindow pyperclip python-dotenv)。没有找 PM 一次性装好。 |
| 目录 | 脚本与 .env 都放 C:\akke-wecom\(含 start-wecom-reply.bat)。 |
AKKE_WECOM_PERSONA 填 | AI 自称 | 性别 | 对应同事 |
|---|---|---|---|
xiaoxia | 小夏 | 男 | 夏夏 |
xiaofan | 小范 | 女 | 饭粒 |
xiaowen | 小文 | 女 | 野荞 |
xiaowu | 小武 | 男 | Gus |
不在这 4 个里(新销售)→ 先找 PM 加一个身份壳,别直接用,否则会回退成默认「小艳」,跟你号对不上。
cd C:\akke-wecom
# 用 curl.exe 下载最新脚本(别用 Invoke-WebRequest:PS5 进度条会卡死下载)
# 下面是 2026-07-01 最新版;以后有更新以 PM 群里发的链接为准
curl.exe -s -o wecom_reply_loop.py https://paste.rs/hJKZi
(Get-Item wecom_reply_loop.py).Length # 校验下全了(约 3.6 万字节)
python -m py_compile wecom_reply_loop.py; if ($?) { "py-OK" }
脚本全员同一份(含读屏「按序抄→取最后一条」、防自回/防误读/防重复三护栏、单条首触、随机 1-3 条气泡、客户连发合并、硬前台等)。最新链接以 PM 群里发的为准(脚本会持续迭代)。
# ===== 每人不同(按自己的号填)===== AKKE_WECOM_PERSONA=xiaowen # 你的销售身份壳,见下表(xiaoxia/xiaofan/xiaowen/xiaowu) AKKE_WECOM_C_INPUT=153,915 # 你这台屏幕的输入框坐标,用下面 Step3 实测 ANTHROPIC_API_KEY=<你自己的 OpenRouter key> # 读屏 VL 用,各自用自己的,别找 PM # ===== 所有人相同 ===== AKKE_OCR_MODEL=qwen/qwen3-vl-30b-a3b-instruct WECOM_CHAT_ENDPOINT=https://akke-worker-prod.fly.dev/wecom/chat/reply WECOM_CHAT_SECRET=<问 PM 要,全员同一把> AKKE_WECOM_DRY_RUN=1 # 先 1 验活;验好了改 0 才真发 AKKE_WECOM_HOURS=9-21 AKKE_WECOM_DAILY_LIMIT=20 AKKE_WECOM_HOURLY_LIMIT=8 AKKE_WECOM_PER_CUSTOMER_DAILY=6 AKKE_WECOM_MIN_INTERVAL=25 AKKE_WECOM_MAX_INTERVAL=70
AKKE_WECOM_PERSONA 按上表填自己;ANTHROPIC_API_KEY 用你自己的 OpenRouter key(各自的,别找 PM);只有 WECOM_CHAT_SECRET 问 PM 要(全员同一把、别外传)。用记事本存成 UTF-8。
cd C:\akke-wecom
# 手动把鼠标放到企微【底部打字输入框正中】,5 秒内别动
python -c "import pyautogui,time; time.sleep(5); x,y=pyautogui.position(); w,h=pyautogui.size(); print(f'AKKE_WECOM_C_INPUT={round(x/w*1000)},{round(y/h*1000)}')"
# 把输出那行的值填进 .env 的 AKKE_WECOM_C_INPUT
不同屏幕分辨率坐标不一样,必须各自量一次,填进 .env 的 AKKE_WECOM_C_INPUT。
cd C:\akke-wecom python wecom_reply_loop.py # 看启动行是否 DRY_RUN=True;有新好友时应打印“新好友…待首触”+“小艳首触:…” # +鼠标移到输入框(不真发)。确认话术/坐标 OK 后 Ctrl+C
确认:能识别新好友、首触自称是你的 persona 名、鼠标落在输入框里。都对再进下一步。
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
$e = Get-Content C:\akke-wecom\.env
function ev($k){ (($e|?{$_-match "^$k="}|Select -Last 1) -replace "^$k=","").Trim() }
$EP=ev "WECOM_CHAT_ENDPOINT"; $SEC=ev "WECOM_CHAT_SECRET"; $P=ev "AKKE_WECOM_PERSONA"
function post($b){ $x=[Text.Encoding]::UTF8.GetBytes(($b|ConvertTo-Json -Compress))
$r=Invoke-WebRequest $EP -Method Post -Headers @{Authorization="Bearer $SEC"} -ContentType "application/json; charset=utf-8" -Body $x -UseBasicParsing
([Text.Encoding]::UTF8.GetString($r.RawContentStream.ToArray())|ConvertFrom-Json) }
"首触:"; 1..2|%{ (post @{action="opener";customerName=("测试首触{0}_{1}" -f $_,(Get-Random));persona=$P}).reply }
"代回:"; @("你们做衣柜吗多少钱","用什么板材环保吗","怎么加你们微信")|%{
" 客户: $_"; " 回: " + (post @{action="generate";customerName=("测试{0}" -f (Get-Random));message=$_;persona=$P}).reply }
核对:首触中性招呼不要微信;代回走 568 口径、问「怎么加微信」时回「已经加上了」而不是抛微信号。
cd C:\akke-wecom # .env 改 AKKE_WECOM_DRY_RUN=0(真发),然后起常驻: .\start-wecom-reply.bat
起来后盯几分钟:新好友通过→自动首触一条;客户回消息→代回。异常随时急停(见下)。
ni C:\akke-wecom\wecom_reply_STOP -Force # 急停 del C:\akke-wecom\wecom_reply_STOP # 恢复后删掉再起
| 每天/重启后 | 云电脑一关机 loop 就没了 → 确认企微登录 + 删 STOP + .\start-wecom-reply.bat 重起。 |
| 连续异常自停 | 脚本连错 3 次会自己写 STOP 停发(防越错越糟)。先看 type wecom_reply_STOP 原因,修好再删。 |
| 登录过期 | 日志一直读不到会话 → 重新登录企微,再重起 loop。 |
| 看状态 | type C:\akke-wecom\wecom_reply_status.json(ts 在更新 + sent_today 有数 = 在干活)。 |
| 现象 | 原因 → 处理 |
|---|---|
| 端点 401 Unauthorized | WECOM_CHAT_SECRET 和服务器不一致 → 找 PM 核对填同值,重起。 |
| 连接超时 10060 | WECOM_CHAT_ENDPOINT 填成 vercel 了 → 必须是 ...fly.dev/wecom/chat/reply。 |
| 缺 ANTHROPIC_API_KEY 退出 | .env 没这行或被编码搞坏 → 补上;改 .env 别用 Get-Content|Set-Content(会毁 UTF-8),用记事本另存 UTF-8。 |
| 鼠标点歪 / 没点到输入框 | 坐标没量准或企微没最大化 → 重做 Step3;确认企微铺满屏在最前。 |
| 字没进输入框 / 乱码 | .env 加 AKKE_WECOM_TYPE_MODE=paste 重起。 |
| 字进了没发出 | .env 加 AKKE_WECOM_SEND_KEY=ctrl+enter 重起。 |
| 首触自称「小艳」不是你 | AKKE_WECOM_PERSONA 没设或拼错 → 按身份表填对,重起。 |
| 改了 .env 没生效 | loop 启动时才读 .env → 必须杀掉重起。 |
原理 / badcase / 优化进展见配套报告:upio.ai/akke/wecom-first-touch-0to1