52 lines
16 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!doctype html>
<html lang="zh-CN">
<head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><meta name="workbench-token" content="__SESSION_TOKEN__"><title>知微 · 微信知识需求分析</title><link rel="stylesheet" href="/style.css"><script src="/app.js" defer></script></head>
<body>
<aside class="sidebar"><a class="brand" href="#overview"><span class="mark">微</span><span>知微<small>从对话到知识</small></span></a><div class="nav-label">工作空间</div><nav><button data-page="overview" class="active">◫ <span>数据概览</span></button><button data-page="connect">⌘ <span>连接 Mac 微信</span></button><button data-page="import">↥ <span>导入记录</span></button><button data-page="analyze">◎ <span>发现知识需求</span></button><button data-page="settings">⚙ <span>模型与脱敏</span></button></nav><div class="sidebar-bottom"><span class="dot"></span> 本地工作空间<p>原文保存在本机<br>仅主动发送预览过的脱敏文本</p><small>从实际问题到可复用知识</small></div></aside>
<main>
<header><div><h1 id="page-title">看见对话中的知识需求</h1></div><span class="pill">本地优先</span></header>
<div id="notice" role="status" hidden></div>
<section id="page-overview" class="page">
<div class="hero"><div><span class="eyebrow">从真实问题出发</span><h2>哪些问题,<br>值得被认真整理?</h2><p>发现重复提问、风险线索与可复用经验。<br>每一个判断,都能回到原始对话。</p><button class="primary" data-go="import">导入聊天记录 ↗</button> <button data-action="demo">体验虚构样例</button></div><div class="hero-art" aria-hidden="true"><div class="orbit outer"></div><div class="orbit inner"></div><div class="art-center">知<small>知识线索</small></div><span class="art-note a">反复出现的问题</span><span class="art-note b">可追溯的经验</span><span class="art-note c">值得沉淀的知识</span></div></div>
<div class="stats" id="stats"></div>
<div class="panel"><div class="panel-head"><div><h2>数据覆盖范围</h2><p>仅展示已导入的记录。最早与最晚日期之间可能存在缺失。</p></div><button data-action="refresh">刷新</button></div><div class="table-scroll"><table><thead><tr><th>会话</th><th>类型</th><th>消息数</th><th>非文字</th><th>最早记录</th><th>最近记录</th></tr></thead><tbody id="conversations"></tbody></table></div><div id="empty" class="empty">还没有导入记录。先导入文件,或体验一组虚构样例。</div></div>
<div class="panel"><div class="panel-head"><div><h2>分析历史</h2><p>保留筛选范围、分析方式与人工修正。</p></div></div><div id="history" class="history"></div></div>
</section>
<section id="page-connect" class="page" hidden>
<div class="intro"><h2>在页面里,把微信记录接进来</h2><p>在安装微信的 Mac 上启动知微,按下面三步完成接入。群聊、私聊一起导入,分析时再选时间段。</p></div>
<div id="mac-platform" class="callout">正在检查本机环境…</div>
<div class="connect-steps"><span>01 找到账号</span><span>02 本机读取密钥</span><span>03 备份并导入</span></div>
<div class="panel form-panel"><h3>01 · 找到你的微信账号</h3><p class="muted">自动查找微信 4.x 数据目录。自定义位置可通过系统文件夹选择器指定;旧版目录不会自动混入。</p><div class="actions"><button id="mac-scan" class="primary">扫描本机微信</button><button id="mac-folder">选择数据文件夹</button><button id="mac-refresh">刷新状态</button></div><label>选择账号<select id="mac-account"><option value="">请先扫描</option></select></label><div id="mac-accounts"></div></div>
<div class="panel form-panel"><h3>02 · 让本机读取消息</h3><p>先打开并登录微信,在微信中打开你想分析的聊天,然后点击读取。候选密钥仅保存在本工具的运行内存,不会发送给模型、写入日志或仓库。</p><div class="actions"><button id="mac-permissions">检查签名与权限</button><button id="mac-capture" class="primary">读取本机密钥</button><button id="mac-capture-admin">使用 macOS 管理员授权读取</button><button id="mac-dependencies">安装文本解压支持</button></div><p class="muted">管理员按钮会弹出系统密码框,用于尝试读取微信进程;不会修改原版微信签名、关闭 SIP 或保存密码。系统保护仍可能拒绝访问,授权不保证成功。文本解压支持从 PyPI 安装到本工具的数据目录,不发送聊天。</p><details id="mac-key-options"><summary>已有本地密钥文件?选择文件继续</summary><label>密钥 JSON(只在本机处理,请勿分享)<input id="mac-key-file" type="file" accept=".json"></label><p class="muted">支持包含 key / key_hex 字段的 JSON;64 位 raw key 或 96 位 key+salt。微信登录密码不能用来代替。</p></details><p id="mac-key-state" class="muted"></p></div>
<div id="mac-diagnostic-panel" class="panel mac-guidance" hidden><h3 id="mac-next-title">读取方式建议</h3><p id="mac-next-description"></p><div class="actions"><button id="mac-diagnostic-next" class="primary">继续下一步</button><button id="mac-show-recovery">查看临时副本说明</button></div><details><summary>查看检查信息</summary><p id="mac-diagnostic-summary"></p><pre id="mac-diagnostic-details"></pre></details><p class="muted">检查和实际读取是不同的步骤。按钮不会自动修改原版微信;创建副本仍需要预览并明确同意。</p></div>
<div id="mac-recovery-section" class="panel form-panel"><h3>读取被签名限制时:使用临时调试副本</h3><p>先预览备份位置与操作影响。只有你明确同意后,工具才会备份账号数据,并对独立副本添加调试权限;原版安装文件保持不变。</p><div class="actions"><button id="mac-preview-copy">预览临时副本方案</button><button id="mac-launch-copy" disabled>启动已准备的临时副本</button></div><div id="mac-copy-plan" hidden><pre id="mac-copy-paths"></pre><ul id="mac-copy-effects"></ul><label class="check"><input id="mac-copy-consent" type="checkbox">我同意备份账号数据、为临时副本添加调试权限;理解副本登录可能更新同一账号的本地数据,且仍可能无法启动或取钥。</label><p class="muted">确认前请先正常退出所有微信,知微保持运行。预览 30 分钟内有效,使用一次后失效;备份会保留,不自动删除。</p><button id="mac-create-copy" class="primary" disabled>同意并备份、创建临时副本</button></div><p class="muted">副本启动后,按系统提示登录微信、打开目标聊天,再点击“读取本机密钥”;如仍被拒绝,可在页面主动尝试管理员读取。取钥后退出副本,再备份并导入。仅用于本人账号,取钥完成后恢复原版使用。</p></div>
<div class="panel form-panel"><h3>03 · 备份、解密、校验并导入</h3><p>密钥匹配后,请正常退出微信,保持知微运行,再点击下面的按钮。原始数据库不会被修改,完整副本与可读库留在本机。</p><label class="check"><input id="mac-include-biz" type="checkbox">同时导入业务消息分片(可能包括公众号或服务消息)</label><div class="actions"><button id="mac-import" class="primary">备份并导入所选账号</button><button data-go="analyze">去分析记录 →</button></div><p class="muted">请预留至少约四倍所选数据库大小的磁盘空间。未知格式、缺失身份映射或认证失败时会停止,避免静默漏消息。</p></div>
<div id="mac-job-panel" class="panel" hidden><h3>接入进度</h3><p id="mac-job-stage" role="status"></p><div id="mac-job-error" class="callout" hidden></div><p id="mac-job-result" hidden></p><dl id="mac-job-details" hidden></dl></div>
<p class="muted">实验性接入:支持 SQLCipher 4 raw key / 4096 字节页 / SHA512 认证,以及部分微信 4.x 表结构。尚未在你的 Intel Mac 4.1.0.18 实机验收;页面会显示实际结果,不保证任何版本都能一键读取。</p>
</section>
<section id="page-import" class="page" hidden>
<div class="intro"><h2>把记录带进来</h2><p>支持可读 JSON、JSONL、CSV、TSV、TXT,以及明文 SQLite。重复导入自动去重。</p></div>
<div class="callout">Mac 微信原生数据库请使用“连接 Mac 微信”向导;此页导入已经可读的文件或 SQLite 表。原生接入仍需满足本机权限和版本兼容条件。</div>
<div class="panel form-panel"><label class="drop" for="import-file"><span>↥</span><strong>选择本地聊天记录文件</strong><small>文件仅上传到本机服务,建议不超过 45 MB</small><input id="import-file" type="file" accept=".json,.jsonl,.ndjson,.csv,.tsv,.txt,.db,.sqlite,.sqlite3"></label><div id="file-info" class="muted"></div>
<div class="form-grid"><label>默认会话名称<input id="default-conversation" placeholder="文件缺少会话字段时必填,如:测试项目群"></label><label>默认会话类型<select id="default-kind"><option value="">按记录字段 / @chatroom 后缀识别</option><option value="group">群聊</option><option value="private">私聊</option></select></label></div><p class="muted">没有类型字段或 @chatroom 标识时会归为私聊。单群导出建议手动选“群聊”;混合导出请提供 kind 字段。</p>
<div id="sqlite-options" hidden><label>消息表<select id="sqlite-table"></select></label><p class="muted">只导入所选表;多张分表需分别导入。请使用完整离线快照,直接复制运行中的 .db 可能缺少 WAL 数据。可用 scripts/export_sqlite.py 只读导出完整表。联系人关联、压缩或编码内容需先转换成可读字段。</p></div>
<details><summary>字段映射(非标准格式时配置)</summary><p class="muted">填入导出文件里的实际列名。留空则自动匹配常见列名。原生数据库字段仅做映射,不会自动解码。</p><div id="mapping-fields" class="form-grid"></div></details>
<p class="muted">无时区的日期按“模型与脱敏”中设置的源时区解释;带时区日期和 Unix 时间戳统一转换为 UTC 存储。</p><button id="import-button" class="primary" disabled>导入到本机</button><pre id="import-result" hidden></pre></div>
<div class="panel"><h3>标准格式示例</h3><p>JSON 是消息数组;CSV 使用相同字段作为表头。完整虚构样例位于 <code>examples/demo.json</code>。</p><pre>[{"id":"001", "conversation":"测试项目群", "conversation_id":"test@chatroom",
"kind":"group", "sender":"张三", "sender_id":"user_a",
"timestamp":"2026-10-01 09:00:00", "content":"测试比例怎么确定?",
"message_type":"text", "quote":""}]</pre><p class="muted">TXT 格式:<code>[2026-10-01 09:00:00] 张三: 消息内容</code>,续行会接入上一条消息。其他文本布局请转换为 CSV / JSON。</p></div>
</section>
<section id="page-analyze" class="page" hidden>
<div class="intro"><h2>从问题到知识需求清单</h2><p>选择一个时间段,覆盖全部会话,也可以聚焦指定群聊或私聊。</p></div>
<div class="panel form-panel"><div class="form-grid three"><label>开始日期与时间<input type="datetime-local" id="start"></label><label>结束日期与时间<input type="datetime-local" id="end"></label><label>会话类型<select id="filter-kind"><option value="">全部会话</option><option value="group">仅群聊</option><option value="private">仅私聊</option></select></label></div><p class="muted" id="timezone-label"></p><div class="form-grid"><label>包含会话(不选代表全部)<select multiple id="include-conversations" size="5"></select></label><label>排除会话<select multiple id="exclude-conversations" size="5"></select></label></div><div class="form-grid"><label>消息关键词(可选)<input id="filter-search" placeholder="只选含关键词的消息,会缩小上下文"></label><label class="check"><input id="cross" type="checkbox" checked> 跨会话汇总相似问题</label></div><p class="muted">多选用 ⌘ / Ctrl;关键词筛选会剔除不匹配的上下文,完整讨论分析建议留空。规则按最多 30 分钟间隔、30 条消息收集讨论候选,延迟回复与交错话题需要人工检查。</p><div class="actions"><button id="analyze-local" class="primary">本地发现线索</button><button id="preview-api">预览脱敏内容 → 模型分析</button></div><p class="muted">本地模式无需 API,采用规则与文本相似度。模型模式按批提炼;跨批相似主题可在结果中人工合并。</p></div>
<div id="preview-panel" class="panel" hidden><div class="panel-head"><div><h2>发送前预览</h2><p id="preview-summary"></p></div><button id="close-preview">关闭</button></div><div class="callout">以下是将发送的完整 JSON 请求体,不含密钥。自动脱敏可能漏掉业务机密;请补充敏感词后重新预览。仅“发送这些内容”会调用外部 API,配置保存和预览不会发出请求。</div><textarea id="preview-text" readonly rows="16" aria-label="完整脱敏 API 请求体"></textarea><div class="actions"><button id="send-api" class="primary">发送这些内容,开始分析</button><span class="muted">预览 30 分钟内有效,仅可发送一次。费用由你配置的模型服务商收取。</span></div></div>
<div id="results" hidden><div class="results-head"><div><h2>值得沉淀的知识线索</h2><p id="result-meta"></p></div><div class="actions"><a id="export-csv" class="button">导出 CSV</a><a id="export-md" class="button">导出 Markdown</a></div></div><div id="run-status" class="callout" hidden></div><div class="result-tools"><label>搜索主题<input id="card-search" placeholder="主题 / 摘要关键词"></label><label>筛选信号<select id="card-signal"><option value="">全部信号</option><option value="repeat">反复提问</option><option value="risk">风险 / 事故</option><option value="rework">重复踩坑</option><option value="future">后续复用</option></select></label><button id="merge-cards">合并选中主题</button></div><div id="cards" class="cards"></div></div>
</section>
<section id="page-settings" class="page" hidden><div class="intro"><h2>数据在本地,发送由你决定</h2><p>支持兼容 Chat Completions 协议的服务,也可连接本机模型。</p></div><div class="panel form-panel"><h3>模型接口</h3><label>完整 API 地址<input id="api-endpoint" type="url" placeholder="https://你的服务地址/v1/chat/completions" autocomplete="off"></label><div class="form-grid"><label>模型名称<input id="api-model" placeholder="填写服务商提供的模型名称"></label><label>API 密钥<input id="api-key" type="password" placeholder="仅存运行内存;重启后重新填写" autocomplete="new-password"></label></div><p id="key-state" class="muted"></p><label class="check"><input type="checkbox" id="clear-key">清除当前内存中的密钥</label><p class="muted">远程接口要求 HTTPS;本机 localhost 可用 HTTP。不自动重试、跟随重定向或使用系统代理。保存配置不会调用接口。</p><h3>源记录 / 显示时区</h3><label>固定 UTC 偏移<input id="utc-offset" value="+08:00" placeholder="+08:00"></label><p class="muted">中文微信记录默认 +08:00。时间筛选和页面显示使用此偏移;无时区的导入时间也按此解释。跨夏令时记录请在导出文件中使用带偏移的 ISO 日期。</p><h3>自定义敏感词</h3><label>每行一个:客户名、项目名、产品编号、内部地址等<textarea id="custom-words" rows="8" placeholder="客户甲&#10;内部项目代号"></textarea></label><p class="muted">自动替换已导入会话中的发送人名称/ID、会话名称/ID,以及常见邮箱、数字电话、身份证、网址、IP 和凭据。代号在本地保持稳定;自然语言中的其他人名与秘密需要添加到这里。</p><button id="save-settings" class="primary">保存配置</button></div></section>
</main>
<dialog id="detail-dialog"><div class="dialog-head"><div><h2 id="detail-title"></h2></div><button id="close-detail" aria-label="关闭">✕</button></div><div id="detail-content"></div></dialog>
<dialog id="merge-dialog"><h2>合并选中主题</h2><p>原有摘要会保留在备注,合并后的主题需要重新审核。</p><label>合并后的主题名称<input id="merge-title"></label><div class="actions"><button id="confirm-merge" class="primary">合并</button><button id="cancel-merge">取消</button></div></dialog>
<footer>知微 · 基于本机已导入的证据发现线索,人工审核与实践验证让知识更可靠。</footer>
</body></html>