satori-qq

本机 QQ 的 Satori v1 实现端,供 Koishi adapter-satori 连接。

当前按 QQ 9.3.60.40970(NT)核验。

使用

  1. 在 vector 启用本模块,作用域勾选 QQ(com.tencent.mobileqq)。
  2. 安装后重启 QQ。
  3. Koishi 配置 adapter-satoriendpoint 指向 http://127.0.0.1:3001

源码

https://github.com/araea/satori-qq

Releases

0.8.9.21

Stable

9/7/2026, 8:48:59 AM

0.8.9.21

  • 新增常驻状态通知:Satori 服务运行时,在 QQ 通知栏常驻一条静默(IMPORTANCE_LOW)通知,随内核状态实时切换「运行中 / 等待登录 / 服务异常」,并显示账号、本地端口、事件连接数与在线时长,作为「机器人是否还活着」的直观指示。以 QQ 自身 Context 与通知权限发出,模块不声明任何权限;它不是前台服务、不提供保活权重。可用配置 status_notification: false 关闭。因随 QQ 身份发出,需 QQ 具备通知权限(Android 13+ 的 POST_NOTIFICATIONS,默认已授予;若手动关闭了 QQ 通知则不显示)。
  • 新增 GET /healthz(本地免鉴权)健康探针:直接返回 online/listening/self_id/在线时长,把「真在线」与「端口在听但内核离线」分开——补齐既有「端口在听却隐性离线」盲区,机器可读,与通知栏状态同源。
  • docs/ARCHITECTURE.md 新增「可观测性」说明:进程内不做保活,只做 HTTP 自愈(accept 循环 3s 重绑)与状态上报(healthz + 通知)。
  • 在 QQ 9.3.60 真机复核:HTTP、登录态、发送与事件接收正常,通知栏常驻通知随重启/登录态正确刷新;反检测栈、签名、maps 隐藏与封包上报路径均未改动。

⚠️ 本版签名密钥变更,无法覆盖安装。升级前请先卸载旧版模块,再安装本版 APK,
然后在 vector/LSPosed 中重新启用模块并勾选 QQ 作用域,最后重启 QQ。

Assets

1

0.8.9.20

Stable

9/5/2026, 7:07:54 AM

0.8.9.20

  • 修复「QQ 显示在线、Satori 连接成功、却无法发送」的隐性离线:会话仅由构造函数 hook 捕获,一旦内核会话在 hook 安装前已建立(模块热重载、或 QQ 客户端升级后的时序竞争),构造函数不再触发,session 长期为空,所有发送以 kernel offline or not ready 失败,而 HTTP 端口与 QQ 前台状态均无从区分该情形。
  • 新增会话兜底捕获:额外 hook 会话 CppProxy 的常用无参 getter(getMsgService/getGroupService),QQ 正常运行时会频繁调用它们,据此捕获活动会话对象,数秒内自愈且无需重启 QQ;已捕获时经无锁身份校验短路,热路径零额外开销。
  • 在 QQ 9.3.60(versionCode 16030)真机复核:HTTP、登录态、发送与事件接收正常;反检测栈、签名、maps 隐藏与封包上报路径均未改动。

Assets

1

0.8.9.19

Stable

9/4/2026, 5:43:20 AM

0.8.9.19

  • 适配 QQ 9.3.60.40970:兼容 MsgRecord.senderRoleTypeRevokeElement.senderUid 被移除,缺失的可选字段不再导致入站消息或撤回事件丢失;改从群成员缓存解析群主/管理员角色。
  • 新增可选 JNI 字段读取回归测试,并在 QQ 9.3.60 真机复核 HTTP、WebSocket、登录态、消息历史与事件转换。

Assets

1

0.8.9.18

Stable

9/2/2026, 11:16:08 PM

0.8.9.18

  • 反检测增强(对齐 Duck Detector LSPosedPackageProbe 的实测命中路径):构建新增隐身变体 build/SatoriQQ.stealth.apk,清单不含任何 xposed* meta-data,消除跨应用包扫描(getInstalledApplications(GET_META_DATA))对本模块的唯一可见命中。
  • 引导 APK(SatoriQQ.apk)保持原样:vector/LSPosed 首次列模块与注册仍需 meta-data;守护进程对已启用模块只认 assets/xposed_initPACKAGE_REPLACED 不触发再校验,因此「先启用、再 pm install -r 隐身包」可长期共存,升级版本照常。
  • ./build.sh 第 7 步用 aapt dump xmltree 断言双 APK 的 meta-data 面(引导 ≥4 条、隐身 =0),防止回归;新增 ManifestStealthTest 校验双清单的包名/版本/标签同步契约。

Assets

1

0.8.9.17

Stable

9/2/2026, 9:11:43 AM

0.8.9.17

  • 合并转发支持策略配置,新增 forward_modeauto(原生优先,fake 兜底)/ native(自聊脚手架)/ fake(SsoSendLongMsg 卡片)。QQNT 9.3.55 实测只有原生卡片能正常点开。
  • 原生合并转发卡片发送后返回真实 QQ msgId,可被 message.delete 撤回;卡片自动入本地存档,可按 QQ msgId 回查与快照。
  • 修正 CQ 码解析:整段 [CQ:json] / [CQ:lightapp] 卡片不再因载荷含逗号或括号而截断,reply/forward 等段类型补齐。
  • CQ 码参数仅在 key= 边界分割,值内含逗号不再误切。
  • 发送合并转发时按「目的会话已有消息即早于卡片」的基线复用 message.list 查询,保证新发卡片可靠可见、可管理。

Assets

1

0.8.9.16

Stable

9/1/2026, 9:08:50 PM

0.8.9.16

  • 新增内部只读动作 message_search:在单个会话的近期 QQ 本地历史中按关键词、发送者与时间范围搜索,扫描范围有硬上限并支持续查。
  • 新增内部只读动作 group_anniversary:提供近期入群周年日历、周年数和倒计时,正确处理设备时区与 2 月 29 日。
  • 新增内部只读动作 random_team:按指定成员、角色或近期活跃度生成安全随机且人数均衡的分队结果。
  • 修正引用消息 ID:优先使用 QQ NT msgId,并兼容旧版本曾发出的 msgSeq 引用。
  • 反检测不扩大拦截范围;新增主进程 / MSF 安装覆盖快照,并将环境报告统计落盘节流到最多每 5 秒一次。
  • internal/status 在总反检测开关关闭时不再错误报告子功能为启用。

Assets

1

0.8.9.15

Stable

9/1/2026, 3:41:38 PM

0.8.9.15

  • 新增内部只读动作 group_active:按最后发言时间给出群「潜水榜 / 活跃榜」,支持 orderdaysrolelimit,并统计从未发言人数。
  • 新增内部只读动作 member_info:一次取回单个群成员的角色、群名片、头衔、等级、入群与最后发言时间,免去遍历成员列表。
  • 新增内部只读动作 random_member:群随机点名 / 抽奖,支持 count、排除自己 / 管理、限定近 N 天活跃,采用无重复的 Fisher–Yates 抽取。
  • internal/capabilities 与文档同步登记上述动作。
  • 反检测栈维持 0.8.9 定稿不变;本次仅扩展 Satori 内部只读能力,未触碰签名、maps 隐藏或封包上报路径。

Assets

1

0.8.9.14

Stable

8/31/2026, 1:51:53 PM

0.8.9.14

  • QQ 客户端手发消息改为可解析即实时投递,仅对内核空壳记录做补偿查询
  • API 发送回声改为进入 QQ 内核前按精确 msgId 去重,避免 Bot 回复期间误吞客户端连发消息
  • 空壳补偿采用每条消息单独重试,避免连发时堵塞在单线程轮询队列
  • WebSocket 断线重放容量提升至 4096 条,不影响在线事件的即时广播

Assets

1

0.8.9.13

Stable

8/31/2026, 7:12:19 AM

0.8.9.13

  • QQ 客户端手发消息以 qq-client:{QQ号} 虚拟身份投递到 Koishi,避免 Core 忽略 self 消息
  • 改进 API 发送回声去重与 onAddSendMsg 入站处理
  • 修复 C2C 私聊 peer_id 路由

Assets

1