TgWitness / 文档

参考 / 安全与项目

架构

收集器、控制面板、日志、工作进程和见证程序的组成部分,以及数据在它们之间如何流动。

一个 Python 进程托管 FastAPI 控制面板和任意数量的隔离工作区, 每个工作区都配有一个 Telethon 用户账户客户端。 SQLite 存储着一个仅支持追加的、经过签名的事件日志以及可变的操作设置。 加密保险库中存储着 API 凭据、StringSession 以及签名密钥。 前端采用打包的纯 HTML/CSS/JavaScript 形式:无需 Node 构建、CDN 或运行时 前端下载。

模块 责任声明
collector.py 授权、对话选择、更新、快照、媒体队列、连接监控
interactions.py / telegram_client.py 明确的面板操作、带签名的收据、持久的请求 ID 以及针对特定任务的回调/加入重试策略
message_content.py 可视化消息对比,不包含传输访问元数据
workers.py 在取消操作前,请等待导出文件处理程序完成
store.py WAL 事务、有序事件链、查询过滤器、运行设置
security.py 私有文件的创建、加密存储库、Ed25519 签名、单进程锁定
evidence.py 完整日志导出、衍生日志、检查点、附件验证
verify.py 独立的只读验证器(标准库 + 加密技术):存档、覆盖范围、证据日志和频道帖子、个人资料文件
app.py 经过身份验证的 API、生命周期、请求验证、静态面板
profiles.py 多账户收集器、共享访问控制器、按工作区管理的生命周期
access.py 范围限定授权、权限检查、IP 限制、会话限制及管理员控制台
proxy_catalog.py 公共信息流快照、传输检查、共享代理池及基于健康状况的筛选
provenance.py 带签名的获取运行身份、代码及依赖项测量
network.py 按工作区验证的传输路径;状态和证据的遮蔽处理;Telethon 传输选项
sessions.py 对已审核的 Telethon SQLite 模式进行离线只读转换
account_import.py 对受支持的账户文件和 JSON 进行内存检测和标准化处理
tdata.py 功能有限的现代 TData ZIP 读取器,支持校验和/解密验证,不进行文件提取
doctor.py 无需数据收集、登录或安装软件包的本地就绪性检查
download.py 经过身份验证的流式导出下载,支持限定读取且不会覆盖原有数据
monitoring.py 经过验证的按工作区设置的事件策略和按类型设置的附件规则,由处理程序共享,并附带状态和签名收据
scope.py 监控范围(指定聊天、Telegram文件夹、整个账户)、数据源类型、排除项、复核层级
dossier.py 基于保存记录构建的每条聊天中的用户档案:包含记录引用的事实信息、头像的 SHA-256/pHash 值,以及提及内容提取
witness_api.py 只读见证令牌及其可获取的签名日志头
witness.py 独立见证流程:自有密钥和日志、头部校验、带签名的频道帖子、导出
alerts.py Apprise 通知及面板的通知列表
logging_config.py 无窗口启动时的控制台日志记录和轮换式服务器诊断
static/ 响应式界面、本地访问门、过滤器、详细信息、导出功能、账户设置
demo.py 明确标注为合成日志,与实际采集数据隔离

观察处理程序在连接前即已注册。实时采集受以下因素控制: 活跃客户端身份、显式运行状态、已启用的数据源或观察 范围(文件夹或整个账户模式会在首次更新时将新聊天添加为数据源),以及事件 策略。被拒绝或被替换的客户端无法提供实时更新。 原始反应和成员资格更新 均遵循可见性限制。传入消息内容及其持久化媒体任务将 一并提交。任务保留原始时间线描述符,并将该描述符的哈希值绑定至 已签名的消息观察记录。发送者/编辑者/删除者的语义相互独立。

每个工作区仅支持一个账户,并拥有独立的目录和签名身份。 主工作区出于兼容性考虑仍位于根目录下;其他工作区位于 profiles/<id>/ 目录中。一个承载令牌控制整个安装环境;工作区并非 独立的授权租户。 进程锁保护目录;数据库锁 对事件插入进行序列化。每次追加操作均以FULL同步模式 同步提交至SQLite WAL。事件更新/删除触发器可防止 普通应用程序进行编辑;文件系统管理员始终处于信任边界之内。

API 授权采用承载令牌(bearer token)机制。登录操作经过序列化处理,并受时间限制。 账户上传采用专用的 12 MiB 编码正文限制和 8 MiB 解码文件 限制;普通 API 请求仍保留 16 KiB 的限制。 转换在工作 线程中运行,将上传数据保存在内存中,并将规范化的输入返回给经过身份验证的 浏览器。二维码登录具有每个工作区的候选项、短效标识符、等待任务 以及显式取消机制。仅被接受的授权才会成为活动客户端。 Telegram FloodWait 会返回 Retry-After 值;凭据和原始 RPC 错误消息不会在 API 错误中暴露。导出操作在异步事件 循环之外运行,并按工作区进行序列化。它们流式传输稳定的读取快照,并可 与持续进行的 WAL 写入共存。 工作区收集器共享同一进程/事件循环。

当前的历史快照与实时更新可能存在重叠。两者均为独立的观察记录, 并按来源进行标注;重复内容不会被自动合并。系统不会根据缺失的 ID、伪造的已删除文本、强制成员枚举或自动加入群组 等情况进行推断。

有关面向操作人员的说明,请参阅“数据采集原理” 以及“账户与会话格式”。

网络配置存储在加密保险库中。应用路由会关闭旧的 客户端并取消未完成的登录;后续连接将使用该路由,且不 提供直接的备用方案。 新的外部密钥安装会通过 HKDF-SHA256,基于主密钥文件和存储的随机盐值,为每个工作区生成 Fernet 密钥。这将 密钥与数据目录分开保护,而非将日志/媒体内容以明文形式存储。

本地演示入口使用单独生成的进程权限,绝不使用已配置的 面板令牌。签发和接受需明确启用演示模式,使用不包含额外工作区或授权会话的合成根 节点,采用环回对等方/主机,且不包含代理 转发头,也不进行跨源浏览器请求。 正式版 API 保留承载者 身份验证,并在演示模式下拒绝收集更改。