钉住消息和隐私
面向钉钉的第三方 Xposed 模块 · libxposed API 102 · Material Design 3
| 功能 | 说明 |
|---|---|
| 消息防撤回 | 尝试保留本机已经收到、仍可读取的他人普通聊天消息,并在气泡下方显示撤回标签。 |
| 禁止已读上报 | 拦截本机普通聊天的已读回执,同时更新本地阅读状态。 |
| 隐藏输入状态 | 拦截本机发送的“正在输入”状态,正常文字发送照常。 |
| 关键词提醒 | 单聊、群聊等普通会话的实时及离线补收未读新消息命中关键词时提醒,可选“发送者+命中关键词”或正常消息通知;排除历史拉取和重复提醒,身份可识别时忽略本人消息。 |
| 关键词高级设置 | 支持会话范围、免打扰时段及 RE2/J 安全正则;旧正则需确认迁移后生效。 |
| 自动回复 | 支持默认内容或按 AA-BB 规则匹配回复;同会话间隔可拖动设置为0~30分钟。账号和登录代次变化会取消未提交任务。 |
| 配置备份 | 通过系统文件选择器导出/导入配置;支持旧版备份迁移,保存后读取框架值确认结果。 |
| 发送前确认 | 超过阈值(默认 20 字,可调)或带附件的消息发送前弹窗确认;点「取消」时输入框中的文字与插入的图片原样保留,可直接继续编辑或再次发送。 |
| 右滑回复 | 补启钉钉 9.0.5 被服务端关闭的原生气泡引用回复手势链,从左往右滑消息直接进入原生引用回复;默认关闭。 |
| 禁止 DING 自动确认 | 拦截聊天卡片、详情页与顶部悬浮卡片的自动确认,并在悬浮卡片上注入手动「确认」按钮,确认时机完全由用户掌控;默认关闭。 |
| 拦截播放与点击上报 | 语音、图片、视频和普通网页链接不再向服务端上报“已播放/已点击”,本机界面状态保持正常;默认关闭。 |
| 原图发送偏好 | 普通聊天选择照片时,可默认勾选原图,或按账号记住上次原图选择;默认关闭,每次仍可手动更改。 |
| 语音转发 | 长按语音消息出现「转发」,走钉钉原生选会话流程,由模块重建真实语音发送(原生管道会把语音降级为文本);默认关闭,语音未缓存时可能失败。仅支持单条长按转发,多选逐条转发暂不支持。 |
| 跳过开屏广告 | 直接关闭启动时的广告开屏页(含视频开屏)。 |
| 平板模式 | 模拟平板登录,尝试让两台手机同时登录同一钉钉账号;默认关闭,开启后需重启并重新登录。 |
| 兼容性明细 | 设置页展示已安装的钉钉版本与 Android 适配范围,版本不匹配时提示。 |
| 独立开关 | 各功能分别设置;保存后重启钉钉生效。 |
| 撤回记录管理 | 查看当前账号记录数和模块数据库总占用;手动清理或选择永久/30 天/90 天保留,默认永久。 |
禁止已读上报针对普通聊天,不覆盖 DING、审批、文档查看等独立业务状态;其他设备产生的回执仍会生效。
| 项目 | 当前适配目标 |
|---|---|
| Android | Android 13~17(API 33~37) |
| 钉钉 | 9.0.5,versionCode 1280(已验证;其他版本会在设置页标注“不在适配范围”) |
| 框架 | 支持 libxposed API 102 的 LSPosed 框架;免ROOT框架 NPatch / FPA 亦可加载 |
上述范围是适配目标,不代表已完成所有设备、系统和聊天场景的验证。
- 从 Releases 获取已发布的 APK 并安装。
- 在 LSPosed 中启用 Ding,勾选 钉钉 作用域。
- 打开 Ding,确认框架连接状态,按需要设置功能开关。
- 强行停止钉钉,再重新打开,使模块和新设置生效。
免ROOT(NPatch / FPA)用户请参见下方免ROOT框架章节。
更新模块或修改开关后同样需要重启钉钉。设置页的框架连接状态不等于聊天功能已经生效,建议先用测试账号验证。
当前兼容性卡展示已安装的钉钉版本和 Android 适配范围;框架卡展示连接与作用域状态。这些信息不能代替实际 Hook 加载结果。更新模块或保存设置后,应强行停止钉钉再重新打开;运行错误可通过模块日志和内部控制通道排查。
关键词提醒需要钉钉的系统通知及对应通知渠道开启。临时投递错误会有限重试;身份暂不可识别时采用会话内去重。正常发送确认仍在无法显示窗口时自动放行;确认期间账号、目标或内容发生变化时,该过期请求会取消并提示重新发送。
关键词可以用中文逗号 ,、英文逗号 , 或换行分隔。点击关键词卡片可选择提醒方式:“关键词提示”显示“发送者-消息触发关键词:关键词”;“消息通知”显示发送者和消息内容,并可点击进入对应会话。修改后强行停止钉钉并重新打开,使新设置生效。
关键词铃声保留默认铃声、静音和自选系统铃声。点击“浏览”打开系统铃声选择器,页面显示铃声名称,点击保存并经框架读回确认后生效;取消选择或退出未保存不会修改配置。不提供手填 URI、本地音频浏览或应用内振动设置,也不会修改手机的系统默认铃声。振动由系统通知设置控制;旧备份的振动字段兼容忽略。
正则使用 RE2/J 1.8,一行一条,最多 50 条、每条 100 字;普通关键词继续使用原有逗号、分号和换行分隔。正则按精确文本去重,\S 与 \s、含逗号的量词不会被合并或拆分。匹配在有界后台队列执行,不在宿主消息插入线程运行;过载时该次提醒可能被跳过并记录错误。
安全正则不支持前后查找、反向引用、字符类交集和嵌套有界重复,并限制分组深度、编译展开及匹配文本长度。\w、\d、\s 和单词边界采用 RE2/J 的 ASCII 规则,Unicode 大小写行为也可能与旧引擎不同。所有旧引擎正则会先暂停、保留原文;在关键词或高级设置中阅读说明、勾选确认并保存,通过校验后才生效。不兼容条目会列出原因,不会退回旧正则引擎。
备份输出格式为 v2,兼容读取 v1。旧规则列表仅按旧分词规则迁移一次;不会猜测拼回旧版本已经拆坏的表达式。旧正则随备份恢复后仍处于待确认状态,其他合法配置正常恢复。导入上限为 1 MiB,未知字段、重复字段、非法值、损坏 JSON 和尾随垃圾会拒绝;空字符串可以恢复无关键词和默认铃声。导入成功以框架权威读回为准,取消已提交操作不代表回滚。
自动回复只处理可确认账号的实时新消息,不处理历史拉取、离线补收和重连批次。默认回复模式继续使用关键词、非工作时间、所有新消息等触发条件(任意命中),时间段使用手机时区;匹配回复模式只使用用户维护的规则,固定模式的内容会折叠并保留。
匹配规则一行一条,格式 AA-BB:消息包含 AA 时回复 BB,忽略触发词大小写。按第一个半角减号分隔,回复允许包含减号;最多50条,触发词100字、回复200字,重复触发词会拒绝保存。多条同时命中时只使用最上面一条,规则模式不会因固定模式的“所有新消息”等开关而回复未命中的消息。
同一会话回复间隔可拖动设置为0~30分钟,旧配置默认5分钟。0表示取消时间间隔限制,每条符合模式和范围的新消息均可回复;本人、历史、重复消息及回复回显保护仍然保留。会话范围对两种模式共用。群聊 @ 范围需要 SDK 确认提及当前账号,且完整正文含当前昵称;纯文本伪 @、转发和仅 @ 全员不触发。
登录、退出、被踢下线以及发送前身份变化会取消未提交任务;真正发送使用当前账号的会话和宿主消息工厂。保护范围到模块交给原生 SDK 的边界,SDK 接管后的网络发送不能由模块事务撤销。
在设置页开启「原图发送偏好」,点击卡片选择模式:
- 默认原图:每次从普通聊天打开照片选择器时,默认勾选“原图”;本次仍可手动取消。
- 记住上次选择:使用当前钉钉账号上次在选图器确认提交图片时的“原图”选项;第一次没有记录时默认不勾选。取消选图、空结果、仅视频和选图期间切换账号不会更新记忆。
模块仅调整选择器初始选项,不修改照片或强制改变最终发送质量。记忆在选图结果有效返回时保存,不以图片最终上传成功为条件;之后取消发送确认不会撤销这次选图偏好。
功能默认关闭,关闭时使用钉钉原有行为。保存模块设置后需强行停止钉钉并重新打开;日常选图产生的记忆无需重启。只记录按账号隔离的原图布尔选项,不记录图片内容或路径;清除钉钉应用数据也会清除记忆。当前适配普通聊天的新旧选图入口,文件助手、头像、独立拍摄和转发入口不在本功能范围。
钉钉相册的“原图”是原生共享选项:同一相册内选择视频时,也会按钉钉原生规则影响视频清晰度,实际行为取决于宿主支持情况。仅视频选择不会更新模块记忆;包含照片的混合选择会记住该次选项。
只在其中一台手机开启「平板模式」,让该手机以平板身份登录,另一台保持普通手机模式。设置页点击卡片可查看使用方法。
保存后,强行停止钉钉并重新打开,再重新登录同一账号。已有登录会话不会自动切换身份;关闭平板模式后也需重启并重新登录,以恢复手机身份。
本功能默认关闭,当前适配钉钉 9.0.5(1280)。双设备能否同时在线取决于钉钉服务端的账号与设备限制;本说明不代表已经完成两台手机同时登录的实测。
设置页提供「隐藏桌面图标」开关,开启后可隐藏桌面图标,模块功能不受影响。之后回到设置页的方式:
- 打开 LSPosed → 模块 → 长按 Ding → 打开;
- 或连接电脑执行
adb shell am start -n io.github.comewhy.ding/.MainActivity; - 免ROOT框架用户可从框架管理器的模块列表直接打开。
在设置页关闭该开关即可恢复图标。覆盖安装更新会保留隐藏状态;全新安装默认显示图标。
若隐藏后桌面仍显示 Ding 图标,请关闭 LSPosed → 设置 →“强制显示桌面图标”,然后重新切换隐藏开关。
标签独立显示在消息气泡下方,不拼接到原消息正文中。
| 标签 | 含义 |
|---|---|
| 已被撤回 · 本机已保留 | 原文本或完整本地附件已确认可用。 |
| 已被撤回 · 撤回时已保留 | 撤回时已确认本机保留,但现在无法重新验证(原内容不可访问)。 |
| 已被撤回 · 仅保留预览 | 图片只有本地预览,无法确认完整原图。 |
| 已被撤回 · 附件未缓存 | 图片或语音的本地附件无法确认可用。 |
| 已被撤回 | 混合富文本仅确认撤回事件,不宣称其全部附件已保留。 |
- 防撤回无法恢复模块运行前已经被清除的正文。
- 模块不额外下载或永久备份附件;缓存被清理后,附件可能无法显示。
- 关闭防撤回并重启钉钉后,历史标签暂时隐藏;再次开启后恢复。
- 撤回元数据按账号、会话及消息 ID 隔离,保存在钉钉的专用私有数据库中。清除钉钉应用数据会清除这些记录。
- 标签统一使用“已被撤回”,不据此推断撤回执行者;群管理员也可能撤回消息。
管理操作需钉钉主进程运行、账号可识别。统计中的记录数量属于当前账号,数据库总占用包含其他账号及可复用空间。
默认永久保留。选择 30 天或 90 天时,确认后按首次观察时间清理当前账号的过期记录;手动清理也只作用于当前账号的模块元数据。清理不会删除原聊天消息或附件,但相应历史撤回标签无法恢复。删除记录后数据库文件未立即缩小属于正常空间复用。
数据升级至 v3 时保留历史记录及旧字段。回滚构建应保留 v3 兼容的存储层,避免旧存储实现拒绝读取升级后的数据库。
Ding 支持通过免ROOT框架(NPatch、FPA)加载运行,无需 root 和 LSPosed。
除上述两个框架外,使用其他免ROOT框架时需自行测试是否兼容——模块基于标准 libxposed API 102,理论上可被任何支持该 API 的框架加载,但未经验证。
| 模式 | 说明 | 设置页 |
|---|---|---|
| 远程加载(推荐) | Ding 模块 APK 单独安装到手机;框架修补钉钉时从已安装的模块 APK 路径加载代码,模块与框架通过 XposedService 通信 | 桌面有 Ding 图标,点开即设置页,功能开关正常保存 |
| 嵌入模式(仅 NPatch) | 模块代码在修补时打包进钉钉 APK 内部(assets/npatch/modules/),桌面无独立 Ding 图标 |
设置页无法从桌面打开,也无法查看或更改功能开关;需自定义设置请改用远程加载模式 |
嵌入模式下没有设置页,模块自动启用以下三个功能,其余全部关闭:
- 消息防撤回 ✅
- 禁止已读上报 ✅
- 隐藏输入状态 ✅
关键词提醒、自动回复、语音转发等高级功能在嵌入模式下不可用。如需启用这些功能,请改用远程加载模式安装 Ding 模块 APK。
- 安装 Ding 模块 APK 到手机(跟普通 App 一样安装)
- 安装 NPatch Manager 或 FPA 到手机
- 使用框架管理器修补钉钉 APK,加载模式选择远程加载
- 在框架管理器中启用 Ding 模块、勾选钉钉作用域
- 安装修补后的钉钉 APK
- 强行停止钉钉(如已运行)并重新打开
桌面点击 Ding 图标即可进入设置页,体验与 LSPosed 一致。
- 模块使用标准 libxposed API 102(java_init.list + module.prop),两个框架均能直接加载
- 所有 Hook 功能(防撤回、已读拦截、关键词提醒等)在免ROOT下正常工作
- 设置页需要框架提供 XposedService;NPatch 和 FPA 均已声明支持
- 语音转发仅支持单条长按操作,多选逐条转发在免ROOT下暂不支持
- 配置备份使用系统文件选择器,正常可用