每天打开抖音、进入聊天页面、找到固定好友,再逐个发送消息续火花。
这件事本身并不复杂,但每天重复一次,很容易因为忙碌而忘记。一次遗漏,就可能让积累了很久的聊天火花中断。
于是我开发了一个可以部署在自己服务器上的开源项目:
抖音续火花助手(Douyin Spark Keeper)
项目地址:
https://gitee.com/zou-xiangfa/douyin-spark
当前应用版本为 0.1.17,Docker 镜像版本为 1.0.28。
它解决了什么问题?
抖音续火花助手会复用已经登录的抖音会话,通过 Playwright 自动打开聊天页面,依次找到指定好友并发送当天的续火花消息。
好友、登录态、发送时间、任务状态和运行日志都可以在网页后台管理,不需要每天登录服务器执行命令。
![]()
目前支持:
- 同步并维护续火花好友名单
- 每天自动获取一句诗词或金句
- 自动避开历史上已经使用过的语录
- 同一天向所有好友发送相同内容
- 手动立即发送
- 干跑测试,不实际提交消息
- 应用内定时发送
- systemd 服务器托管发送
- 查看登录状态、任务进度和历史结果
- 手动停止正在执行的任务
- 自动识别登录失效、平台限流和安全验证
- 严格校验抖音官方消息发送回执
- 发送结果邮件通知
- 任务超时后自动回收 Playwright 和 Chromium
- Windows 登录态及联系人同步工具
- PC 与移动端自适应后台
每天发送的内容从哪里来?
当前版本不再维护多套私有消息模板,而是统一使用“每日语录”模式。
程序默认通过今日诗词 API实时获取一句诗词或金句,并生成类似下面的消息:
今日语录|“三人行,必有我师焉。”——《论语·述而》 🔥续火花,愿你今天也有好心情。
程序会过滤不适合作为日常问候的内容,并保存所有已经使用过的语录指纹,后续自动避开重复内容。
同一天首次发送时,程序会选定并保存当天语录。无论是正常发送还是失败后的补发,当天使用的内容都会保持一致,避免同一天向不同好友发送不同文案。
如果语录接口超时、返回异常,或者连续获取到重复内容,程序会自动使用内置的 24 条公版经典语录兜底,不会因为第三方接口故障而直接中断任务。
不只是“按下回车就算成功”
自动发送最麻烦的问题,不是如何把文字填进输入框,而是如何确认消息真的发送成功。
如果只检查输入框是否已经清空,可能会把网络异常、登录失效或平台拒绝错误地记录成成功。
因此,最新版本增加了更严格的发送确认机制。
程序发送消息后,会继续监听抖音官方消息发送接口,同时检查:
- 请求是否对应本次发送操作
- HTTP 状态是否正常
- Protobuf 或 JSON 回执能否完整解析
- 官方状态码是否符合成功条件
- 消息状态和附加状态是否正常
- 回执中是否存在有效消息 ID
只有官方回执完整满足成功条件,好友才会进入 delivery_confirmed 确认名单。
如果消息已经提交,但没有收到可以确认的官方回执,程序会将结果标记为 delivery_uncertain,并立即停止剩余好友的发送,避免因为盲目重试而造成重复消息。
如何降低发错人的风险?
自动化脚本最怕把消息发给错误的聊天对象。
为此,程序在点击好友后不会立刻输入消息,而是先检查右侧聊天窗口标题,确认当前打开的会话确实属于目标好友。
如果好友不在最近聊天列表中,程序会尝试通过搜索入口查找。搜索完成后仍然需要再次核对聊天标题,只有目标一致才允许继续发送。
每位好友的查找、会话校验和发送过程都有独立的时间限制。某一步长时间无响应时,任务会安全退出,而不是一直卡在页面上。
登录不需要填写账号密码
项目不会要求用户在服务器后台填写抖音账号和密码。
登录过程在用户自己的 Windows 电脑上完成:
- 下载并运行登录态更新工具;
- 输入自己的后台地址和访问令牌;
- 在弹出的真实抖音页面中使用抖音 App 扫码;
- 工具读取登录状态和聊天联系人;
- 通过 HTTPS 上传到自己的服务器;
- 回到后台执行一次干跑测试。
正常上传成功后,本机不会保留临时的 state.json。
需要注意,state.json 虽然不包含账号密码,但它仍然属于敏感的账号会话凭证。不要发送给别人,也不要上传到公开网盘、Issue、聊天记录或代码仓库。
网页后台支持手机访问
后台采用 Vue 3 和 Element Plus 开发,提供概览、好友与语录、定时设置和日志等页面。
桌面端可以集中查看登录状态、运行状态、自动发送方式和最近执行结果;移动端会重新排列卡片、按钮和导航,方便临时检查任务或停止异常发送。
![]()
后台主要可以完成:
- 上传和更新登录态
- 下载 Windows 登录态更新工具
- 查看已同步的聊天联系人
- 勾选或手工补充续火花好友
- 查看今日语录及语录服务状态
- 调整好友之间的发送间隔
- 执行干跑测试或真实发送
- 停止当前任务
- 查看成功、失败和不确定投递结果
- 查看最近运行日志
前端依赖全部保存在项目本地,不依赖公共 CDN。即使服务器无法加载外部前端资源,后台页面仍然可以正常打开。
两种定时运行方式
项目支持应用内定时和服务器托管两种方式。
应用内定时
适合只运行本项目、资源相对充足的服务器。
在后台启用“每日自动发送”后,APScheduler 会按照配置的时间启动任务,并可以在设定的抖动窗口内随机延迟执行。
如果部分好友发送失败,但账号没有掉线,也没有触发平台限流,程序可以在当天安排一次只针对失败好友的有限补发。
服务器托管模式
适合同一台低内存服务器还运行 Java 等其他项目的情况。
开启服务器托管模式后:
- 应用内部定时会被强制关闭
- 随机延迟被锁定为零
- 外部 systemd timer 负责启动任务
- 网页展示下一次发送时间和预计恢复时间
- 仍然可以在后台手动测试、停止任务和查看日志
仓库当前提供的低内存夜间编排按 5 位固定好友设计,执行流程为:
23:49 完成预检并暂停 Java 服务
23:50 准时启动抖音续火花任务
发送完成后 恢复 Java 服务并执行健康检查
异常或超时 停止任务、回收浏览器并恢复 Java
每天正式发送前,编排脚本会检查:
- 抖音服务是否健康
- 好友数量是否符合预期
- 好友名单是否存在重复
- 应用内部定时是否已经关闭
- 当天是否已经完成过发送
如果当天已经对全部目标好友完成发送,系统会直接跳过,避免定时任务重复执行。
即使夜间任务被中断,ExecStopPost 恢复流程也会尝试回收浏览器并重新启动 Java 服务。
任务失控时会发生什么?
每次联系人同步、干跑和真实发送都会在独立子进程中执行。
项目为不同任务设置了独立超时时间,并针对好友数量动态计算干跑预算。无论任务正常完成、用户手动停止还是运行超时,程序都会尝试:
- 停止当前任务;
- 终止对应子进程;
- 回收 Playwright 和 Chromium;
- 保存本次执行结果;
- 恢复需要继续运行的服务器服务。
如果页面出现“操作频繁”“安全验证”等提示,本轮发送会立即停止,避免连续操作进一步触发平台风控。
发送完成后自动通知
配置 SMTP 后,每次真实发送完成,系统都会发送一封 HTML 结果邮件。
邮件中会展示:
- 任务是否成功
- 成功好友数量
- 失败好友数量
- 是否登录失效
- 是否触发限流
- 是否发生超时或投递状态不确定
- 是否需要人工检查
邮件通知失败不会改变原本的任务结果,也不会把已经成功的发送标记为失败。
SMTP 密码只保存在服务器 .env 中,不会提交到代码仓库。
部署方式
项目支持:
- Debian、Ubuntu 原生 Python 部署
- CentOS 7 Docker 部署
- Nginx 根路径或子路径反向代理
- systemd 服务与夜间定时编排
拉取代码:
git clone https://gitee.com/zou-xiangfa/douyin-spark.git
cd douyin-spark
Debian或Ubuntu:
sudo bash deploy/deploy.sh
CentOS 7 Docker:
sudo bash deploy/install-centos7-docker.sh
如果需要安装低内存夜间编排:
sudo bash deploy/install-nightly-orchestration.sh
Docker 部署默认采用以下限制:
- CPU:1 核
- 内存:1024 MB
- 内存加 Swap:2048 MB
- PID 上限:128
- 容器根文件系统只读
- 仅将
data目录挂载为可写 - 服务只监听
127.0.0.1:8000 - 建议通过 HTTPS 和 Nginx 对外访问
部署完成后,建议先上传登录态并执行干跑测试,确认好友识别、聊天切换和登录状态正常,再启用每日真实发送。
技术栈
项目主要使用:
- Python
- FastAPI
- Playwright
- APScheduler
- Vue 3
- Element Plus
- Docker
- systemd
- Nginx
虽然项目解决的是一个很小的日常问题,但其中涉及浏览器自动化、任务隔离、官方回执解析、幂等控制、低内存调度、故障恢复和移动端适配等多个实际工程问题。
适合哪些人?
这个项目更适合:
- 使用一个自用抖音账号
- 每天只给少量固定好友发送一次消息
- 拥有自己的 Linux 服务器
- 能接受登录态需要定期扫码更新
- 希望通过网页查看执行状态
- 想学习 FastAPI、Playwright、Docker 和 systemd
它不适合:
- 批量营销
- 多账号运营
- 广告群发
- 高频私信
- 骚扰或其他违规用途
数据安全
项目默认不会把以下内容提交到仓库:
.envdata/state.json- 好友配置
- 运行记录
- 日志文件
- Python 虚拟环境
- 本地缓存
公开部署时仍建议:
- 只允许通过 HTTPS 访问后台
- 使用足够随机的访问令牌
- 限制服务器数据目录权限
- 不在截图和日志中泄露 Cookie、令牌及联系人
- 将代码与运行数据分开管理
- 升级前备份
.env和data目录
写在最后
这个项目最初只是为了避免忘记每天续火花。
但要让一次自动发送真正可靠,需要解决的并不只是“找到输入框并按下回车”,还包括好友识别、登录态维护、消息回执确认、重复发送防护、浏览器回收、低内存调度和异常恢复。
目前项目已经完整开源:
https://gitee.com/zou-xiangfa/douyin-spark
如果这个项目对你有帮助,欢迎 Star、Fork 或提交 Issue,也欢迎一起完善它。
风险提示:自动化发送私信可能违反抖音平台规则,并可能触发验证码、限流或封号。项目仅供学习和个人低频自用,请勿用于营销、骚扰、多账号运营或其他违规用途。使用风险由使用者自行承担。

老公是世界上最牛的
太牛了