星火燎原 · 抖音自动续火花

一个 LSPosed 模块:注入抖音进程,自动给「今天还没互动」的会话续火花 —— 发一条你自己写的文案。 文案是一段 JavaScript,由「模板 + 两层变量 + 宏 + 自定义函数」组合出来,目标是「每天自动续,但话说得像真人说的」。

作用域:com.ss.android.ugc.aweme(抖音)

源码:https://gitee.com/WorldMargin/SparkFlame(主)· https://github.com/WorldMargin/SparkFlame(镜像) 问题反馈:https://gitee.com/WorldMargin/SparkFlame/issues 许可证:Apache-2.0


它做什么

抖音的火花需要双方每天有互动。模块会在抖音启动 / 回到前台 / 跨天时扫一遍会话,把「今天还没互动」的挑出来, 按你配置的脚本生成文案发过去;每个会话每天最多发一条。

  • 待发:今天还没发过 → 会发
  • 待对方回复:今天已经发过、火花还是灰的(对方还没回) → 不重复发
  • 今日已续:今天已经互动过 → 跳过
  • 待重燃:火花断在恢复期 → 按抖音判定处理

打开抖音、跨天补跑、手动发送之后,模块会把会话快照自动写回管理界面,不用打开 App 也能看到最新状态。

功能

  • 模板:内置模板(空白 / 续火花 / [续火花吧] / 按时问候 / 火花天数打卡 / 简短提醒)+ 自定义模板
  • 变量(两层):模板一套、会话一套;同名覆盖、空值回落、顺序求值、出错不中断
  • 宏:挂在模板 / 会话上的后置脚本,可动态挂载 / 卸载,预览时跳过
  • 标签:多对多,只用于整理与筛选(不改变发送资格);支持多选并集、来源单选与 AND 组合
  • 脚本:ctx.result 只表达内容,空列表 = 不发;getAllConversation 支持字段筛选与 tags.include/except
  • 编辑器:CodeMirror,内置 ctx.* 补全、一键格式化、粘贴还原、原生长按
  • 可观测:预览、试算、宿主状态、发送结果三态回执(Succeed / Skipped / Failed)
  • 新手引导:右下角可拖动的悬浮胶囊,基础 / 进阶两条路线按顺序解锁,目标控件蓝色描边轮流高亮

安装

  1. 安装 APK,在 LSPosed 里启用模块并勾选作用域「抖音」
  2. 强制停止抖音后重新打开
  3. 打开一次模块 App:确认「设置 → 宿主状态」有内容,说明已注入
  4. 在「续火花」页选目标、写模板,点「发送」或等自动发送

升级前建议先在「设置 → 配置」导出备份。

v1.5.7 更新

  • 修复导出到文件忽略勾选、总是全量导出
  • 修复导入时会话标签覆盖本地已有标签(改为并集合并)
  • 新增 ctx.system.getMacros(),可按名字反查宏 id 后再挂载 / 卸载

v1.5.6 更新

  • 回到抖音前台会扫一轮并提示待发数量;界面内切换只刷快照
  • 只有确认模块 App 被系统停用才提示「打开一次」,每天最多一次
  • 回前台刷新心跳,不再误判「抖音没在运行」

v1.5.5 更新(紧急修复)

  • 修复 v1.5.4 误删 launcher 声明导致桌面图标消失、管理界面打不开的问题
  • 其余同 v1.5.4:回前台不再弹跳转窗、凌晨不再重复发送

v1.5.4 更新

  • 修复抖音回到前台时弹「是否跳转到星火燎原」:去掉后台拉起模块 Activity 的兜底
  • 修复凌晨一次发两条:启动补跑与前台补跑共用发送锁,发送前重读今日已发,同一轮会话去重
  • 「今天已自动跑过」改为发送成功后才记录,失败当天还能重试
  • 覆盖安装 / 强制停止后需手动打开一次模块 App,之后不会再有任何跳转提示

v1.5.3 更新

  • 配置导入 / 导出支持标签:标签定义与归属一起走;勾选会话会自动带上它的标签,并置灰不可取消
  • 导出 / 导入页:会话显示头像、标签显示颜色,支持搜索与单聊 / 群聊筛选
  • 标签行 / 模板行右侧「一键选中」:一键勾选该标签下或继承该模板的全部会话
  • 勾选会话只就地刷新标签状态,不再整页重绘

v1.5.2 更新

  • 新手引导改为悬浮胶囊:可拖动、顺序解锁、描边轮流高亮、最小化,隐藏入口收进设置
  • 选会话继承:单聊 / 群聊分组卡片折叠、已选目标筛选、排序稳定、支持群聊
  • 新增内置模板「续火花」「[续火花吧]」
  • 文档:标签与 AI 提示词补全,修 ES5 / 中文变量 / 内置模板动作 / FAQ 矛盾
  • 清理(破坏性):移除 $spark_result$、ctx.registCallback、conversationId 旧名、defaultGroupId 与旧函数体包装

说明

  • 本模块只在你自己的设备上、对你自己的账号工作;请遵守平台规则,风险自负
  • 只支持已 Root + LSPosed 的环境

Releases

v1.5.7

Stable

11/10/2026, 5:16:11 PM

v1.5.7

修复

  • 导出到文件忽略勾选、总是全量导出:exportConfig 没有使用按勾选裁出来的子集,重新构建 JSON 时又读了一次完整配置
  • 导入会覆盖本地标签:导入某个会话时,标签归属用文件里的记录整体替换,本地多出来的标签会被抹掉;现在改成并集合并,文件里没有该会话记录时不动本地

导出内容

  • 条目只保留勾选的模板 / 会话 / 宏 / 函数 / 标签 / 沙盒变量
  • 顶层空字段不再写入(空数组、空对象、空串、0、false),导出文件只剩有内容的部分
  • subsetOf 改为白名单构造,以后新增运行时字段默认不会带进导出

新增

  • ctx.system.getMacros():返回所有宏的数组 { id, name, appliesTo, templateOnly }
    • 之前挂载 / 卸载宏只能靠 id,脚本里只有 ctx.macro.id
    • 现在可以按名字反查 id,再传给 mountMacro / unmountMacro

文档

  • 6.3 接口表加 getMacros()
  • 5.1 补充「宏 id 怎么拿」
  • AI 提示词函数列表同步

Assets

1

v1.5.6

Stable

10/21/2026, 3:11:44 PM

v1.5.6

扫描时机

  • 回到抖音前台会扫一轮:刷新快照并提示「待发 N 个 · 待对方回复 M 个」
  • 界面内切换(不同页面之间)只刷新快照,不重复扫描
  • 回前台扫描 10 秒限流;自动任务刚跑完 60 秒内不重复
  • 冷启动、跨天、手动刷新 / 发送仍然各扫一轮

停用提示

  • 只有确认模块 App 被系统停用(ApplicationInfo.FLAG_STOPPED)时才提示「请打开一次」
  • 进程忙、IM 未就绪、provider 偶发失败等其它原因不再误报
  • 提示每天最多一次;今天已经自动跑过则完全不提示

其它

  • 回前台顺带刷新 hostAliveAt,模块 App 不再误判「抖音没在运行」
  • 配置仍然只有一份(ContentResolver 读写),没有镜像或缓存副本
  • 文档补充「什么时候会扫描」的说明

Assets

1

v1.5.5

Stable

10/21/2026, 11:52:14 AM

v1.5.5(v1.5.4 的紧急修复)

  • 修复 v1.5.4 误删 SparkSettingsActivity 的 launcher 声明:桌面图标消失、从桌面打不开管理界面
  • 其余与 v1.5.4 相同:抖音回前台不再弹「是否跳转」、修复凌晨重复发送

已装 v1.5.4 的用户请直接覆盖升级 v1.5.5。

Assets

1

v1.5.3

Stable

10/21/2026, 5:03:13 AM

v1.5.3

配置导入 / 导出

  • 标签正式进入导入 / 导出:标签定义与「哪个会话带哪个标签」都会随配置一起走
  • 导出页、导入页逐项勾选:模板 / 会话文案 / 宏 / 函数 / 标签,快照与已发记录是整类开关
  • 勾选会话会自动带上它引用的标签;这些标签在页面上显示颜色、自动勾选并置灰,不能取消
  • 取消勾选会话后,标签恢复可操作

导出 / 导入页体验

  • 会话行显示头像(优先用导入文件里的快照,其次当前配置)
  • 标签行显示颜色圆点与彩色标签名
  • 会话列表支持搜索(昵称 / 备注)与「全部 / 单聊 / 群聊」筛选
  • 标签行、模板行右侧 「一键选中」:一键勾选该标签下 / 继承该模板的全部会话
  • 勾选会话只就地刷新标签状态,不再整页重绘(滚动位置与输入焦点保持)

文档

  • 2.5 设置:补充标签导入导出、搜索筛选、一键选中说明

Assets

1

v1.5.2

Stable

10/20/2026, 2:26:52 PM

v1.5.2

新手引导

  • 右下角「引导」胶囊改为悬浮,不占页面布局,可拖动到任意位置
  • 基础 / 进阶两条路线,必须按顺序解锁;基础没走完点不进进阶
  • 跳到目标页后,要点的控件被蓝色描边圈住并持续呼吸,直到点击才停
  • 同一页多个目标时一次只圈一个、轮流切换;内置模板按行轮换,展开后只圈「选会话继承」
  • 浮层右上角「最小化」;隐藏入口收进 设置 → 新手引导,避免误触

选会话继承

  • 按 单聊 / 群聊 分组,每组一张卡片,点标题折叠 / 展开(带高度过渡)
  • 新增 全部 / 已选目标 / 未选目标 筛选(指续火花页的已选目标,不是勾选框)
  • 组内排序:已选目标优先 → 标签命中多 → 火花天数 → 名称;勾选不再触发重排
  • 放开群聊:选会话继承也能选群聊

内置模板

  • 新增 「续火花」(固定发一句「续火花」)
  • 新增 「[续火花吧]」(固定发抖音续火花表情包)

文档

  • 标签系统补全:标签顺序、标签 + 来源为 AND、标签不影响发送资格的措辞
  • AI 提示词补上标签字段与 tags.include/except 语法
  • 修 ES5 / 中文变量名 / 内置模板动作 / FAQ 总开关 的矛盾
  • 界面章节按底部标签顺序重排

清理(破坏性)

  • 移除 $spark_result$、ctx.registCallback、conversationId 旧名
  • 移除 defaultGroupId 与旧函数体自动包装;旧脚本 / 旧函数需要按新格式改

升级前建议先在「设置 → 配置」导出备份。

Assets

1

v1.5.1

Stable

10/20/2026, 6:12:22 AM

v1.5.1

新增:会话标签

  • 底部新增「标签」页(与模板同级):新增 / 改名 / 换色 / 删除;点标签卡片配置它包含哪些会话,确定即替换归属
  • 会话编辑页:标签小药丸直接点开 / 关,不弹窗、点了就存
  • 会话列表显示标签色块;搜索框只搜昵称 / 备注
  • 续火花页「标签 / 来源」两排标记:标签可多选(并集,选中背景变色,命中越多越靠前),来源单选;
    行内色块与「继承:X」也能直接点
  • 会话选择页独立成页:搜索 + 标签(多选)/ 来源筛选 + 多选,替换原来的多选弹窗

脚本 API

  • 会话对象新增 tags: [{ id, name }]
  • getAllConversation 支持标签两级条件 { tags: { include, except } }:
    内层数组 = 交集、外层数组 = 并集,元素可用标签 id 或名字;tags 直接写数组等于单个交集组
  • 统一 ctx.io 与会话对象字段:id / nickname / remark / name(显示名)/ peerUid /
    days / state / stateText;会话对象另带 isGroup / selected / sentToday /
    manualSend / autoSend / willSend
  • 兼容旧名:ctx.io.conversationId、回调里的 conversationId 保留,等同 id
  • getConversation(id) 文档补全完整返回结构(基础字段 + template / parent / macros)

界面

  • 标签 / 宏 / 函数页改为卡片列表,去掉折叠与横线分隔
  • 标签图标改用 codicon 的 tag

文档

  • 使用文档、README 补齐标签、getAllConversation 逐字段筛选表与 getConversation 完整用法

Assets

1

v1.5.0

Stable

10/19/2026, 12:04:28 PM

⚠️ 升级警告:本版本是一次大重构,请仔细斟酌后再升级

这次更新重写了脚本输出方式(ctx.result)、会话快照的数据结构与生命周期、编辑器内核(CodeMirror 6)以及多处界面交互,与旧版差异很大,不是小修小补。

  • 旧脚本可能要改:ctx.sandbox.* 已改名 ctx.macro.*;ctx.template.变量名 改为 ctx.template.vars.变量名;
    $spark_result$ 仍然兼容,但新写法是 ctx.result。
  • 界面变化:会话列表新增「被隐藏」分组;宏 / 函数 / 沙盒变量改成可折叠分组卡片。
  • 数据变化:快照改为合并写入(IM 分批加载不会再清空会话);连续 3 次没出现的会话会隐藏、30 天后连快照一起删除。

升级前请先「设置 → 配置」导出备份;升级后先核对脚本、已选目标与模板。不确定就先别升级。

修复

  • 会话丢失:IM 冷启动会先给 0 条、再分批补全,旧逻辑把它当完整列表整份覆盖,导致 App 里的会话被清空。
    现在扫描结果为 0 时不写;非空结果与已有快照合并写入(昵称 / 备注 / 头像空值不覆盖旧值)。
  • 会话列表为空时不再误判为「今日无需发送」,避免当天不再重试。

快照生命周期

  • 连续 3 次扫描没在抖音出现 → 从列表隐藏;连续 30 天没出现 → 连快照一起删除(手动归属一并清理)。
  • 「续火花」页底部新增 「被隐藏」折叠卡片:可恢复显示、把手动归属移出已选目标、点整行进会话编辑页。

脚本 API

  • 新增 ctx.result 作为输出列表(与 $spark_result$ 同一数组,宏执行前自动同步,老脚本不用改)。
  • 新增 ctx.registerCallback(fn):发送结束回调 { conversationId, result: "Succeed" | "Skipped" | "Failed", reason? };
    脚本产出为空按「跳过」处理,不再算失败。
  • ctx.system.getAllConversation(filter?) 支持筛选:对象逐项相等 / 数组表示其中之一 / 函数自定义判断。
  • 会话结构新增 manualSend / autoSend / willSend,用于按「手动 / 自动 / 本轮实际」口径精确筛选。
  • ctx.registerCallback 为主名,旧拼写 ctx.registCallback 保留兼容。

编辑器

  • 实现格式化:清理零宽字符、不换行空格、智能引号、Markdown 代码围栏,并按花括号层级重排缩进(4 空格)。
  • 长按交回系统原生选区:删除自绘的长按工具条,复制 / 全选走系统菜单。
  • 撤掉失效的「补全」按钮(输入时的自动补全保留);动作条新增「粘贴」。
  • 宏 / 函数 / 沙盒变量列表改为可折叠分组卡片。

文档

  • 重写使用文档与 README:去掉重复的 API 总表、两套 AI 提示词和重复的「给 AI 的模块说明书」;
    修正 Monaco / 启动扫描时机 / 配置路径等过时描述;补齐新 API、筛选、回调、被隐藏列表。

Assets

1

v1.4.4

Stable

10/18/2026, 3:45:34 PM

v1.4.4

编辑器换内核(移动端适配)

  • Monaco 换成 CodeMirror 6(离线打包),修复滑动收键盘、长按选区、系统剪贴板
  • 删除 Monaco 资源(约 4.5 MB)与原生 sora-editor 实现及其依赖
  • 高亮:关键字 / 字符串 / 注释 / 数字 / 变量 / 属性 / 函数 / 类型,含选区与当前行
  • 补全:运行期接入 TypeScript 语言服务(懒加载,标准库裁剪到 es2020 闭包),ctx.* 与原生 JS 均为真实类型推断

结构

  • 宿主侧(host/)与 APP 侧(app/)分离,ui 按 settings / template / conversation / macro / variable / function / common 分类
  • 清理上游遗留空目录、图标与命名

修复

  • 脚本结尾无分号被 ASI 粘成连续调用(3.0 is not a function)
  • unmountAll 不再被丢弃;挂载类接口按宏 id 校验
  • 预览只读、只带当前会话,ctx.macro.name / id 可用
  • 会话新增 selected / sentToday / willSend(手动点名 / 强制发送 / 自动轮三口径)
  • 勾选会话后发送目标改为点击时现算

体积

  • release APK:3.39 MB → 1.80 MB

Assets

1

v1.4.3

Stable

10/18/2026, 8:32:19 AM

v1.4.3

预览:数据齐全,但不写数据

  • 预览的「本轮」= 只有正在预览的那个会话:ctx.system.getAllConversation() 返回单元素数组,
    getConversation / getTemplate / getMacro 在预览里也能查到
  • 预览里 willSend 恒为 true(本轮就它自己)
  • 仍然只读:setvar / deletevar / mountMacro / unmountMacro / unmountAll 在预览时跳过

会话数据:新增三个状态字段

getAllConversation() 与 getConversation(id) 的每个会话都带:

字段 含义
selected 在「已选目标」里
sentToday 今天已经发过
willSend 本轮会发:手动点名 → true;强制发送(手动发送)→ true;自动轮 → selected && !sentToday && !isGroup

筛选写法:ctx.system.getAllConversation().filter(c => c.willSend)

修复

  • 勾选会话后仍会发给全部:发送目标原来在页面构建时就算好了,之后勾选复选框不会更新;
    现在改成点击时现算

安装

  • 覆盖安装即可(versionCode 10800),配置与登录态都不丢

Assets

1

v1.4.2

Stable

10/18/2026, 7:40:55 AM

v1.4.2

修复

  • 脚本最后一句没写分号时会崩(3.0 is not a function):引擎拼的程序是「脚本 + 换行 + (typeof …) ? … : $spark_result$」,
    以 ) / ] 结尾又不写分号时会被 JS 的自动分号规则粘成 push(...)(...),而 push 返回数字。
    现在在尾巴前插了一个独立分号,模板与宏都覆盖
  • 预览里 ctx.macro.name 是空串:预览走的是只读重载,没带「宏 id → 名字」映射;现在四个预览入口都会带上

接口:挂载类改走 id 通道

  • ctx.system.mountMacro(id, target?) / unmountMacro(id, target?) 改为按宏 id(原来按名字)
  • 新增 ctx.macro.id(当前宏 id,模板段为空串)
  • 删除 ctx.macro.getAllMountedTemplate() / getAllMountedConversation(),
    改用 ctx.system.getMacro(ctx.macro.id) 拿 templates / conversations

文档

  • 使用文档:挂载示例改成 id 传参、补「最后一句不写分号也行」的说明

安装

  • 覆盖安装即可(versionCode 10700),配置与登录态都不丢

Assets

1

v1.4.0

Stable

10/18/2026, 5:23:13 AM

v1.4.0

上下文按来源分命名空间(破坏性变更)

  • ctx.builtin:内置变量(date / time / weekday / timestamp)与内置函数(pick / pad / repeat / random / shuffle / countdown / nextNewYear / untilNewYear / formatDate)
  • ctx.io:抖音给的会话数据(nickname / remark / name / days / state / stateText / peerUid / conversationId)
  • ctx.template.vars:模板 / 会话变量(变量统一挂在这里)
  • ctx.template:模板信息固定键 template / parent_template / thisid / parent.id / parent.childs
  • ctx.macro:宏自己的变量(getvar / setvar / deletevar)与挂载查询(getAllMountedTemplate / getAllMountedConversation)
  • ctx.system:getAllConversation()、mountMacro(name, target?)、unmountMacro(name, target?)、unmountAll(target?)
  • ctx.functions:自定义函数(不变)
  • 旧写法(ctx.name、ctx.pick(...)、ctx.template.变量、ctx.sandbox)不再可用

新增

  • 宏的变量:值以 JSON 存进配置、跨次运行保留;归属就是宏自己,模板读不到;
    宏编辑页有独立入口可改名 / 改值 / 删除 / 新增
  • 宏挂载支持目标:挂到指定会话,或挂到模板(inherit: false = 仅模板、不往派生会话传播)
  • 续火花列表长按派生项:新增「复制会话 ID」

修复

  • ctx.macro 之前只在宏段创建,导致所有脚本渲染失败(Cannot set property ... of undefined);
    现在始终存在,宏段之外读写会明确报错
  • d.ts 里 SparkVars 被嵌套进 SparkBuiltin 导致 ctx.builtin.* 全部标红
  • 沙盒 / 宏挂载落盘改用最新配置,避免覆盖「今日已发」
  • 应用 ID 改为 io.github.worldmargin.sparkflame(Xposed 模块仓库要求),provider authority 同步

安装

  • 需要 LSPosed,作用域勾选「抖音」
  • 与旧包 com.worldmargin.autospark 是两个独立 App;升级后记得在 LSPosed 里给新包勾作用域

Assets

1