← 博客首页 实验室总入口 SKills实验室 实验索引 / 国泰道合商机提取
无尘阁 · 自研 Skill
LAB / SKILLS · 自研 · v1.0.0 · 2026-11-07

两个微信里的客户,一张表交出来

自研 WorkBuddy Skill · 国泰道合商机提取 · 24 个文件 / 887 KB

个人微信里聊了三年的客户,企业微信里加过的每一张名片,都在硬盘里躺着。这个技能把它们解密、拆开、读完,判别谁是真客户、谁在推销、谁已经报了名,最后落成一份 22 列的 Excel:诉求、意向等级、卡点、下一步动作,一行一个人。

自研 微信 + 企业微信 22 列 × 8 个工作表 语音转写 只做增量
2条提取链路
22列商机字段
8个工作表
7个主脚本
01 / WHAT IT DOES

它到底干了什么

一句话:把聊天记录变成可以排优先级、可以直接派活的客户表。

做培训、做咨询、做服务的人都有同一个毛病:客户信息全在微信里,翻得到,但理不出来。谁在问价格、谁卡在预算、谁上个月就该回访——这些答案散在几千条消息和几十条语音里,靠脑子记不住,靠人手翻不动。

这个技能接的活就是这一层。它不猜,它读:把微信本地数据库解密,把单聊一条一条捞出来,把语音转成文字,然后对每个会话判一次身份——客户、线索、推销、合作、同事、系统,判完再提炼诉求、意向、疑问、卡点、下一步。最后按 22 列写进 Excel,按身份分成 8 个工作表。

关键的一条设计是只做增量。第一次全量跑完会记下两台设备各自的最后消息时间,之后每次只处理这个时间点之后的新消息:新会话重新判别,老会话追加消息并更新结论,语音只转新的。因此它适合每周跑一次,而不是跑一次就完。

字段

22 列,逼着写结论

不是把消息堆进去就算完。每行必须落下「核心诉求」「主要异议」「建议下一步动作」——填不出来,说明这段聊天其实没聊出东西。

语音

语音才是商机的主战场

价格、折扣、决策人、时间点,这些话人更愿意说在语音里。个人微信语音全部提取转写,转写结果单独成表。

判别

先分清是谁,再谈意向

推销、同行、系统通知混在通讯录里是常态。判别错了,整张表的优先级就全错,因此身份判别是第一步,不是附赠。

02 / WHEN TO USE

什么时候该翻它出来

触发词:提取商机 / 整理客户信息 / 更新商机表 / 提取微信客户 / 提取企微客户 / 增量提取商机 / 出国泰道合商机表。

场景它交付什么
每周一盘客户把上周新聊的客户推进表里,给出本周该先打给谁。
销售交接 / 换人一个人三年的客户关系,压成一份能读完的表,新人接手不再靠口口相传。
复盘没成交的单「主要异议」「卡点」两列并排看,能看出到底卡在价格、卡在决策人,还是压根没需求。
盘点渠道与合作方「渠道与合作」单独一张表,与合作方、渠道商的往来一眼看清。
找回漏掉的语音线索语音转写单独成表,当年听漏的那几句报价,现在能搜到。

不适合拿它做的事也说清楚:它不负责群聊,只提单聊;不替人做决定,「建议下一步动作」是从对话里读出来的判断,最终怎么做还得人来定;不碰图片和文件内容,只记录消息本身。

03 / HOW IT RUNS

一个入口,两条链路

两条链路的库格式完全不同,因此解密方式也必须分开写。合并只发生在最后一步。

链路 A · 个人微信SQLCipher
  1. 密钥提取:扫进程内存拿库密钥(微信需要在运行)
  2. 库解密:wechat-cli init 一条命令解完
  3. 消息导出:只留 S: 前缀的单聊,群聊整个排除
  4. 语音提取 + 转写:SILK 解成 WAV,再跑 faster-whisper
  5. 语义判别:身份、需求、意向、卡点、下一步
链路 B · 企业微信wxSQLite3
  1. 密钥提取:find_wxwork_keys.py 扫内存
  2. 库解密:AES-128-CBC,按页解密全部 DB
  3. 消息导出:解析 message_table,文本在 protobuf 里
  4. 语音检查:企微语音不落盘,走智能助理在线查
  5. 语义判别:额外吃公司、职务、备注电话三个字段
合流 · 出表build_excel.py
两条链路数据→22 列格式化→8 个工作表分拣→来源底色区分→ 增量合并到已有表

两个库格式,差在哪儿

个人微信是 SQLCipher,企业微信是 wxSQLite3 的 AES-128-CBC。企微每一页的密钥都要单独算:

# 页密钥与 IV 都是算出来的,不是读出来的
page_key = MD5(raw_key + LE32(page_no) + b"sAlT")
iv       = MD5(LCG(page_no + 1))

这一条写进脚本之后,剩下的活就是解析。企微的消息正文藏在 protobuf 的嵌套字段里([1][2][1]),类型码要一层层对:0/2 是文本、13 是链接、14/15 是图片与文件、1011 是加好友通知。

企业微信的语音,得人搭一把手

这是个绕不过去的现实问题:企微语音消息不落盘到本地数据库,只能在客户端的智能助理里在线查。技能不伪造数据,它会把查询语句和两张操作截图递过来,等人把结果贴回来,再决定下一步。

查到了就走 wecom-cli media download 下载;查不到就在表里如实标注「企微语音未检出」。宁可空着,不编。

04 / STRUCTURE

包里装了什么

24 个文件,887 KB。主流程一份,参考文档五份,脚本十四个。

国泰道合商机提取/
├── SKILL.md                    主流程 SOP:两条链路全流程 + 22 列定义(12 KB)
├── _meta.json                  元信息与依赖清单
├── references/
│   ├── incremental-extract.md    增量提取:时间戳记什么、怎么合并
│   ├── semantic-judgment.md      语义判别:六类身份、五档意向的判据
│   ├── voice-pipeline.md        语音链路:SILK → WAV → 文字
│   ├── wechat-cli-commands.md   wechat-cli 命令速查
│   └── wecom-agent-voice.md    企微智能助理语音查询
├── scripts/
│   ├── build_excel.py          主入口:22 列 × 8 表,原子写入(18 KB)
│   ├── voice_index.py          语音索引:从 media 库捞每条语音
│   ├── transcribe_voices.py     转写:faster-whisper large-v3,int8
│   ├── wxwork_export.py        企微消息导出
│   ├── silkjs/decode.js           SILK → WAV(silk-wasm)
│   ├── wxlib/
│   │   ├── find_wxwork_keys.py    企微密钥提取(26 KB)
│   │   ├── wxwork_crypto.py      wxSQLite3 分页解密库
│   │   ├── config.py              路径与常量
│   │   └── key_scan_common.py     内存扫描公共逻辑
│   └── wechat-cli/                个人微信密钥与 blob 解析
└── assets/
    ├── step1-wecom-client.jpg            企微智能助理入口(截图)
    └── step2-wecom-agent-voice-search.png 语音查询那句话(截图)

主脚本各管一段

脚本职责
build_excel.py唯一出口。读两条链路的数据,写 22 列,分 8 个工作表,增量合并进已有文件。
voice_index.py从 media 数据库里捞出每一条语音,记下发送人、时长、路径,生成索引。
transcribe_voices.py拿索引逐条转写。模型用 large-v3,int8 量化,约 10 秒一条。
find_wxwork_keys.py扫企微进程内存拿密钥。必须企业微信正在运行才有戏。
wxwork_crypto.py按页解密的实现。这个库把企微的加密细节全部收在自己身上。
wxwork_export.py解析消息表,把正文从 protobuf 里拆出来。
decode.jsSILK 格式只有浏览器那套能解,所以单开一个 Node 环节。

跑之前得备齐六样

依赖用在哪
wechat-cli个人微信 4.x 的密钥提取与消息导出
Python 3.10+全部脚本
silk-wasmSILK 语音解码(npm 包)
faster-whisper语音转文字
微信 4.x 运行中密钥要从进程内存里扫出来
企业微信运行中同上,进程名 WXWork.exe

另外要备 openpyxl、numpy、zstandard、pycryptodome,以及 ffmpeg。

05 / OUTPUT

产出是一份工作簿

文件名带日期:国泰道合商机表-YYYY-MM-DD.xlsx。八个工作表,各司其职。

工作表装什么
商机总表核心交付。22 列,每个人都在这张表里,按来源分底色。
渠道与合作合作方、渠道商单独拎出来。
线索与学员有需求但还没深入的潜在客户。
非目标联系人推销、无关往来。
已排除人员同事、老板、合伙人、系统通知。
全部聊天记录每条消息的明细,用来回查。
语音记录转写结果,按人按时间排。
数据说明这次提取的时间范围、条数、方法。

22 列怎么排

整张表可以读成四段:是谁(微信名、备注名、真实姓名、微信号、手机号、公司、职务)→ 是什么关系(身份类型、核心诉求)→ 能不能成(是否报名、成交意愿、意向等级、关键疑问、主要异议、当前状态)→ 接下来干什么(建议下一步动作、首次加好友时间、最后沟通、消息数、会话 ID)。

其中「首次加好友时间」在两边的精度不一样,这个差异写进了注释:个人微信只能取首条消息时间作近似,企业微信则能读到精确的添加好友时间。口径不同就标出来,不混着用。

它踩过的那些坑,都留了处理办法

问题处理方式
Excel 写入被占用先写临时文件再原子替换;实在占用就退到 -v3.xlsx 备用名。
正文里有非法控制字符写表前过滤 \x00-\x08 这一段,否则 openpyxl 直接抛异常。
语音解码失败几条那几条是 0 字节占位记录,不是解码错误,跳过即可。
企微语音查不到正常现象,语音不落盘。如实标注,不补假数据。
06 / DOWNLOAD

拿走它

解压后把整个 国泰道合商机提取/ 目录放进 WorkBuddy 的技能目录即可。Windows 上遇到中文文件名乱码时,用 7-Zip 或 Bandizip 解压。

国泰道合商机提取 v1.0.0

24 个文件 · 887 KB 原始体积 · ZIP 745 KB · 含主流程、五份参考文档、十四个脚本与两张操作截图

文件 guotai-shangji-extract.zip 大小 744 KB 版本 1.0.0 发布 2026-11-07

装法

# 1. 解压到一个临时目录
unzip guotai-shangji-extract.zip -d /tmp/skill

# 2. 放进技能目录(macOS / Linux)
mv /tmp/skill/国泰道合商机提取 ~/.workbuddy/skills/

# 3. 补齐依赖
pip install wechat-cli faster-whisper openpyxl numpy zstandard pycryptodome
cd ~/.workbuddy/skills/国泰道合商机提取/scripts/silkjs && npm install

注意:这个技能会读取本机的微信与企业微信数据,只适合在自己的机器上跑。密钥提取需要两个客户端都处于登录运行状态,扫描的是进程内存,换机器必须重新提取。