52 lines
16 KiB
HTML
52 lines
16 KiB
HTML
<!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="客户甲 内部项目代号"></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>
|