🤖
AI审核中

我把“每天打开抖音续火花”做成了一个自动化项目

本站实践 11分钟 1157浏览 2评论

每天打开抖音、进入聊天页面、找到固定好友,再逐个发送消息续火花。

这件事本身并不复杂,但每天重复一次,很容易因为忙碌而忘记。一次遗漏,就可能让积累了很久的聊天火花中断。

于是我开发了一个可以部署在自己服务器上的开源项目:

抖音续火花助手(Douyin Spark Keeper)

项目地址:

https://gitee.com/zou-xiangfa/douyin-spark

当前应用版本为 0.1.17,Docker 镜像版本为 1.0.28

它解决了什么问题?

抖音续火花助手会复用已经登录的抖音会话,通过 Playwright 自动打开聊天页面,依次找到指定好友并发送当天的续火花消息。

好友、登录态、发送时间、任务状态和运行日志都可以在网页后台管理,不需要每天登录服务器执行命令。

image-20260902213153337

目前支持:

  • 同步并维护续火花好友名单
  • 每天自动获取一句诗词或金句
  • 自动避开历史上已经使用过的语录
  • 同一天向所有好友发送相同内容
  • 手动立即发送
  • 干跑测试,不实际提交消息
  • 应用内定时发送
  • systemd 服务器托管发送
  • 查看登录状态、任务进度和历史结果
  • 手动停止正在执行的任务
  • 自动识别登录失效、平台限流和安全验证
  • 严格校验抖音官方消息发送回执
  • 发送结果邮件通知
  • 任务超时后自动回收 Playwright 和 Chromium
  • Windows 登录态及联系人同步工具
  • PC 与移动端自适应后台

每天发送的内容从哪里来?

当前版本不再维护多套私有消息模板,而是统一使用“每日语录”模式。

程序默认通过今日诗词 API实时获取一句诗词或金句,并生成类似下面的消息:

今日语录|“三人行,必有我师焉。”——《论语·述而》 🔥续火花,愿你今天也有好心情。

程序会过滤不适合作为日常问候的内容,并保存所有已经使用过的语录指纹,后续自动避开重复内容。

同一天首次发送时,程序会选定并保存当天语录。无论是正常发送还是失败后的补发,当天使用的内容都会保持一致,避免同一天向不同好友发送不同文案。

如果语录接口超时、返回异常,或者连续获取到重复内容,程序会自动使用内置的 24 条公版经典语录兜底,不会因为第三方接口故障而直接中断任务。

不只是“按下回车就算成功”

自动发送最麻烦的问题,不是如何把文字填进输入框,而是如何确认消息真的发送成功。

如果只检查输入框是否已经清空,可能会把网络异常、登录失效或平台拒绝错误地记录成成功。

因此,最新版本增加了更严格的发送确认机制。

程序发送消息后,会继续监听抖音官方消息发送接口,同时检查:

  • 请求是否对应本次发送操作
  • HTTP 状态是否正常
  • Protobuf 或 JSON 回执能否完整解析
  • 官方状态码是否符合成功条件
  • 消息状态和附加状态是否正常
  • 回执中是否存在有效消息 ID

只有官方回执完整满足成功条件,好友才会进入 delivery_confirmed 确认名单。

如果消息已经提交,但没有收到可以确认的官方回执,程序会将结果标记为 delivery_uncertain,并立即停止剩余好友的发送,避免因为盲目重试而造成重复消息。

如何降低发错人的风险?

自动化脚本最怕把消息发给错误的聊天对象。

为此,程序在点击好友后不会立刻输入消息,而是先检查右侧聊天窗口标题,确认当前打开的会话确实属于目标好友。

如果好友不在最近聊天列表中,程序会尝试通过搜索入口查找。搜索完成后仍然需要再次核对聊天标题,只有目标一致才允许继续发送。

每位好友的查找、会话校验和发送过程都有独立的时间限制。某一步长时间无响应时,任务会安全退出,而不是一直卡在页面上。

登录不需要填写账号密码

项目不会要求用户在服务器后台填写抖音账号和密码。

登录过程在用户自己的 Windows 电脑上完成:

  1. 下载并运行登录态更新工具;
  2. 输入自己的后台地址和访问令牌;
  3. 在弹出的真实抖音页面中使用抖音 App 扫码;
  4. 工具读取登录状态和聊天联系人;
  5. 通过 HTTPS 上传到自己的服务器;
  6. 回到后台执行一次干跑测试。

正常上传成功后,本机不会保留临时的 state.json

需要注意,state.json 虽然不包含账号密码,但它仍然属于敏感的账号会话凭证。不要发送给别人,也不要上传到公开网盘、Issue、聊天记录或代码仓库。

网页后台支持手机访问

后台采用 Vue 3 和 Element Plus 开发,提供概览、好友与语录、定时设置和日志等页面。

桌面端可以集中查看登录状态、运行状态、自动发送方式和最近执行结果;移动端会重新排列卡片、按钮和导航,方便临时检查任务或停止异常发送。

image-20260902213319035

后台主要可以完成:

  • 上传和更新登录态
  • 下载 Windows 登录态更新工具
  • 查看已同步的聊天联系人
  • 勾选或手工补充续火花好友
  • 查看今日语录及语录服务状态
  • 调整好友之间的发送间隔
  • 执行干跑测试或真实发送
  • 停止当前任务
  • 查看成功、失败和不确定投递结果
  • 查看最近运行日志

前端依赖全部保存在项目本地,不依赖公共 CDN。即使服务器无法加载外部前端资源,后台页面仍然可以正常打开。

两种定时运行方式

项目支持应用内定时和服务器托管两种方式。

应用内定时

适合只运行本项目、资源相对充足的服务器。

在后台启用“每日自动发送”后,APScheduler 会按照配置的时间启动任务,并可以在设定的抖动窗口内随机延迟执行。

如果部分好友发送失败,但账号没有掉线,也没有触发平台限流,程序可以在当天安排一次只针对失败好友的有限补发。

服务器托管模式

适合同一台低内存服务器还运行 Java 等其他项目的情况。

开启服务器托管模式后:

  • 应用内部定时会被强制关闭
  • 随机延迟被锁定为零
  • 外部 systemd timer 负责启动任务
  • 网页展示下一次发送时间和预计恢复时间
  • 仍然可以在后台手动测试、停止任务和查看日志

仓库当前提供的低内存夜间编排按 5 位固定好友设计,执行流程为:

23:49  完成预检并暂停 Java 服务
23:50  准时启动抖音续火花任务
发送完成后  恢复 Java 服务并执行健康检查
异常或超时  停止任务、回收浏览器并恢复 Java

每天正式发送前,编排脚本会检查:

  • 抖音服务是否健康
  • 好友数量是否符合预期
  • 好友名单是否存在重复
  • 应用内部定时是否已经关闭
  • 当天是否已经完成过发送

如果当天已经对全部目标好友完成发送,系统会直接跳过,避免定时任务重复执行。

即使夜间任务被中断,ExecStopPost 恢复流程也会尝试回收浏览器并重新启动 Java 服务。

任务失控时会发生什么?

每次联系人同步、干跑和真实发送都会在独立子进程中执行。

项目为不同任务设置了独立超时时间,并针对好友数量动态计算干跑预算。无论任务正常完成、用户手动停止还是运行超时,程序都会尝试:

  1. 停止当前任务;
  2. 终止对应子进程;
  3. 回收 Playwright 和 Chromium;
  4. 保存本次执行结果;
  5. 恢复需要继续运行的服务器服务。

如果页面出现“操作频繁”“安全验证”等提示,本轮发送会立即停止,避免连续操作进一步触发平台风控。

发送完成后自动通知

配置 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

它不适合:

  • 批量营销
  • 多账号运营
  • 广告群发
  • 高频私信
  • 骚扰或其他违规用途

数据安全

项目默认不会把以下内容提交到仓库:

  • .env
  • data/state.json
  • 好友配置
  • 运行记录
  • 日志文件
  • Python 虚拟环境
  • 本地缓存

公开部署时仍建议:

  • 只允许通过 HTTPS 访问后台
  • 使用足够随机的访问令牌
  • 限制服务器数据目录权限
  • 不在截图和日志中泄露 Cookie、令牌及联系人
  • 将代码与运行数据分开管理
  • 升级前备份 .envdata 目录

写在最后

这个项目最初只是为了避免忘记每天续火花。

但要让一次自动发送真正可靠,需要解决的并不只是“找到输入框并按下回车”,还包括好友识别、登录态维护、消息回执确认、重复发送防护、浏览器回收、低内存调度和异常恢复。

目前项目已经完整开源:

https://gitee.com/zou-xiangfa/douyin-spark

如果这个项目对你有帮助,欢迎 Star、Fork 或提交 Issue,也欢迎一起完善它。

风险提示:自动化发送私信可能违反抖音平台规则,并可能触发验证码、限流或封号。项目仅供学习和个人低频自用,请勿用于营销、骚扰、多账号运营或其他违规用途。使用风险由使用者自行承担。

2 条评论
如果你觉得文章对你有帮助,那就请作者喝杯咖啡吧☕
微信
支付宝
  2 条评论
博主夫人   湖南省衡阳市

老公是世界上最牛的duzui

伴我   波兰马佐夫舍省Warsaw

太牛了