做了一个抖音白名单好友 AI 自动回复机器人:身份核验、家庭代理和上线踩坑
最近把一个跑在 Linux 服务器上的小项目整理成了可长期维护的形态:抖音白名单好友 AI 自动回复机器人。它操作的是抖音网页版私信,不是群发工具,也不处理陌生人;只有预先配置、且每次都能通过身份核验的好友,才会进入回复流程。
项目已经开源在 GitHub。这篇不讲“怎么无限自动化”,主要记录我在安全边界、登录环境和部署细节上做了哪些取舍。
一、先定边界:只回复明确允许的人
一开始最担心的不是“AI 回得够不够像人”,而是会不会回错人。抖音聊天页里昵称会改、备注会重名;如果只按会话标题匹配,机器人一旦点错会话,后果比不回复严重得多。
所以现在的白名单不是只有一个昵称,而是三层绑定:
- 会话列表中显示的
name必须相同; - 会话行关联的
sec_uid必须与白名单相同; - 打开会话后读到的公开抖音号
douyin_id也必须相同。
三项有任意一项缺失、读取失败或不一致,程序就直接跳过:不读消息、不调用 AI、更不会发送内容。sec_uid 是抖音用于会话绑定的长身份标识,公开抖音号可以改,二者组合起来会稳定很多。
我还填了自己的抖音号。原因有点反直觉:网页偶尔会把本人身份误返回为会话对方,如果不排除自己,机器人理论上可能给自己回消息。现在一旦识别到对方是自己,流程会中止并记录原因。
二、新增好友也不能靠手填
严格核验带来的问题是:想加新好友时,sec_uid 从哪里来?
项目里单独做了一个只读脚本 scripts/discover_friends.sh。让对方先发一条消息、使会话出现在聊天列表后,运行脚本即可逐个读取最近会话,并输出可以直接复制到配置文件的条目:
1 | { |
这个脚本不会调用 AI,也不会发送任何消息。信息不完整时不会“猜一个”,而是拒绝输出可用白名单项——我觉得这里宁可麻烦一点,也不要给误发留下空间。
三、家庭网络代理不是装饰品
这个项目最明显的一次踩坑,是用普通数据中心出口跑抖音网页。实际表现并不稳定:有时私信面板打不开,有时消息无法发送,还有一段时间 Cookie 很快失效、反复要求重新登录。
后来改为让浏览器长期走固定的家庭/运营商网络出口,登录状态明显稳定了。但这不是“用了代理就不会掉线”的保证。网页风控通常同时看网络环境、浏览器 profile、Cookie 连续性和操作频率;中途切换出口,或者把同一份浏览器资料多人共用,反而容易制造异常。
当前的设计是:Playwright 启动 Firefox 持久化上下文时读取 account.proxy_server,抖音网页、聊天页和发送动作都走这一出口;AI 接口由 Python 单独请求,不复用浏览器代理。代理地址、账号和密码只留在服务器私有配置里,不写入 README、日志或公开仓库。
如果日志出现 NS_ERROR_PROXY_CONNECTION_REFUSED,我会先停掉正式回复,检查本地代理服务和上游出口,再执行登录检查。代理恢复不等于 Cookie 仍可用,先验证再运行比硬撑着循环更稳妥。
四、不是收到消息就立刻发
回复模块也加了几道保险:
- 已处理消息指纹,避免同一条消息重复回复;
- 每个好友按小时、按天的回复上限;
- 随机轮询间隔和输入前等待;
- 长回复按概率拆成几段,而不是总是整齐地一次性发完;
- 图片可走视觉模型,语音、卡片等无法可靠读取的非文本消息默认跳过。
首次部署不应直接开启实际发送。我会先跑一次:
1 | .venv/bin/python src/main.py --config config/config.json --dry-run --once |
它会走读取、核验和生成逻辑,但不会发送。确认日志里出现“身份核验通过”后,才考虑执行正式的一轮或交给 systemd 常驻。
五、日志既要能排障,也不能泄露身份
项目分成两类日志:运行日志帮助看浏览器、代理与登录问题;JSONL 审计日志记录一次回复为什么发生、是否通过身份核验、回复是否发出。
不过审计并不等于把所有东西照抄进去。日志里只记录 sec_uid 是否核验通过,不输出完整字符串;Cookie、代理凭据和真实配置同样不会进入仓库。浏览器故障时虽然会保存截图和 HTML 现场,但它们只保留在服务器的 logs/ 中,方便排查后自行清理。
六、从服务器项目到公开仓库
开源前我重新整理了一遍目录,只提交真正可复现的内容:源码、部署脚本、systemd 服务模板、依赖清单和带注释的 config.example.json。
下面这些都被 .gitignore 排除:
- 真实
config/config.json; - Cookie、浏览器 profile 和消息处理状态;
- 运行与审计日志、故障截图;
- Playwright 下载的浏览器运行时、Python 虚拟环境和缓存。
这样别人克隆后运行 scripts/setup_linux.sh 就能准备所需环境,而不会拿到我的登录状态或任何私密配置。示例配置里每个重要区块都有中文说明,包括家庭网络代理、白名单的三个身份字段、频率限制和风控阈值。
最后
这个项目仍然依赖网页行为,平台改版、网络异常或登录校验都可能让它暂停工作。所以我把它定位为一个低频、可审计、只服务于知情好友的个人工具,而不是追求全自动和无限扩张的机器人。
比起“能自动发消息”,我更在意它在异常时能停下来、能说清为什么跳过、也不会把不该公开的数据带进代码仓库。能稳定地少做错事,才是这类自动化真正有价值的地方。
