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

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

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


它做什么

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

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

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

功能

  • 模板:内置模板(空白 / 按时问候 / 火花天数打卡 / 简短提醒)+ 自定义模板;一级模板可展开看派生模板(跟随它的会话)
  • 空白模板 = 不用模板、自己写:照常发送,只是父模板内容是空的
  • 变量(两层):模板一套、每个会话还能有自己一套;同名覆盖、空值回落到父模板、都没有就是 null; 变量值是 JS 表达式,能读 ctx、能引用排在前面的变量;标题栏「试算」可以看整套变量的当前结果
  • 宏:挂在模板或会话上的小脚本,在模板之后执行;适合节日倒计时这类临时代码,用完删掉不影响模板
  • 自定义函数:全局定义,执行前注入成 ctx.functions.<名字>
  • 沙盒变量(只给宏):ctx.sandbox.getvar / setvar / deletevar,值以 JSON 存进配置、跨次运行保留; 归属就是宏自己,模板读不到也写不了,删宏时它的键一起清掉
  • 系统接口:ctx.system.getAllConversation() 拿本轮会话列表;ctx.system.mountMacro / unmountMacro 动态挂载 / 摘离宏
  • 编辑器:Monaco(VSCode 同款,离线内置),ctx.* 与 JS 内置成员的补全、类型检查、悬浮文档、格式化、双指缩放; 长按弹悬浮图标条(全选 / 复制 / 粘贴 / 撤销);也可以切回原生编辑器
  • 预览:用真实会话快照渲染一遍,与实际发送走同一套组装
  • 配置按项导出 / 导入:勾模板会自动带上父模板、宏、脚本里用到的函数;导入是合并
  • 使用文档:App 内可看 / 可导出,最后一节是「给 AI 的模块说明书」(把整篇丢给 AI,它就能照着设计写模板)

脚本 API 速查

// 内置能力
ctx.builtin.date / time / weekday / timestamp
ctx.builtin.pick(list) / pad / repeat / random / shuffle / countdown / nextNewYear / untilNewYear / formatDate

// 宿主数据
ctx.io.nickname / remark / name / days / state / stateText / peerUid / conversationId

// 模板变量(含两个固定键)
ctx.template.称呼、ctx.template.template、ctx.template.parent_template

// 自定义函数 / 沙盒 / 系统
ctx.functions.名字(...)
ctx.sandbox.getvar(name) / setvar(name, value) / deletevar(name)
ctx.system.getAllConversation() / mountMacro(name) / unmountMacro(name)

// 输出:往列表里 push,多行会被拼成一条消息;空列表 = 这条不发
$spark_result$.push("早上好,第 " + ctx.io.days + " 天的火花啦 🔥");

沙盒示例(宏里记录跑过几次):

var n = (ctx.sandbox.getvar("runs") || 0) + 1;
ctx.sandbox.setvar("runs", n);
$spark_result$.push("(第 " + n + " 次加这句)");

安装

  1. 安装 APK,在 LSPosed 里启用模块,作用域勾选「抖音」,重启抖音
  2. 打开模块界面(桌面图标,或 抖音 → 我 → 设置 → 续火花)
  3. 设置里打开总开关 → 点一次「刷新会话」
  4. 模板页给会话选模板;变量在模板 / 会话的「变量」入口里加;宏与函数在「宏/函数」页里加

说明

  • 只在抖音进程内工作,不联网上传任何数据;配置保存在模块 App 自己的私有目录
  • 每个会话每天最多发一条,发送记录按天保存
  • 群聊默认不参与自动发送(手动移进「已选目标」才发)
  • 升级到 v1.4.0 起:ctx 按来源分成 ctx.builtin / ctx.io / ctx.template / ctx.functions, 旧写法(ctx.name、ctx.pick(...))不再可用

许可与致谢

  • 许可:Apache License 2.0
  • 思路来源:yfishyon/doumcp(抖音逆向与注入基础)、 WorldMargin 的模板 / 宏 / 函数组合思路与 DouYinSpark 油猴脚本原作

Releases

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