gengx
This commit is contained in:
@@ -0,0 +1,131 @@
|
||||
"""
|
||||
企业微信聊天记录导出 - 一键工具
|
||||
自动完成: 检测进程 → 提取密钥 → 解密数据库 → 导出CSV
|
||||
|
||||
用法:
|
||||
python wxwork_export_all.py [--output <输出目录>]
|
||||
"""
|
||||
|
||||
import json
|
||||
import os
|
||||
import shutil
|
||||
import subprocess
|
||||
import sys
|
||||
import time
|
||||
|
||||
# 模块路径
|
||||
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
|
||||
sys.path.insert(0, BASE_DIR)
|
||||
|
||||
|
||||
def check_wxwork_running():
|
||||
"""检查企业微信是否在运行"""
|
||||
try:
|
||||
result = subprocess.run(
|
||||
["tasklist", "/FI", "IMAGENAME eq WXWork.exe"],
|
||||
capture_output=True, text=True, timeout=10
|
||||
)
|
||||
if "WXWork.exe" in result.stdout:
|
||||
return True
|
||||
# 也检查其他可能的进程名
|
||||
for name in ["WXWorkMain.exe", "WXWorkWeb.exe", "WXWork.exe"]:
|
||||
result = subprocess.run(
|
||||
["tasklist", "/FI", f"IMAGENAME eq {name}"],
|
||||
capture_output=True, text=True, timeout=10
|
||||
)
|
||||
if name in result.stdout:
|
||||
return True
|
||||
return False
|
||||
except Exception:
|
||||
return False
|
||||
|
||||
|
||||
def main():
|
||||
print("=" * 60)
|
||||
print(" 企业微信聊天记录导出工具 v1.0")
|
||||
print("=" * 60)
|
||||
|
||||
# 步骤 1: 检查企业微信是否运行
|
||||
print("\n[步骤 1/4] 检查企业微信进程...")
|
||||
if not check_wxwork_running():
|
||||
print(" [提示] 企业微信未运行!")
|
||||
print(" " + "=" * 50)
|
||||
print(" 请按以下步骤操作:")
|
||||
print(" 1. 启动企业微信 (WXWork)")
|
||||
print(" 2. 登录你的账号")
|
||||
print(" 3. 保持企业微信在运行状态")
|
||||
print(" 4. 然后按 Enter 键继续...")
|
||||
print(" " + "=" * 50)
|
||||
try:
|
||||
input()
|
||||
except EOFError:
|
||||
pass
|
||||
|
||||
# 再次检查
|
||||
if not check_wxwork_running():
|
||||
print("\n[-] 仍未检测到企业微信进程, 请确认已启动并登录")
|
||||
return 1
|
||||
|
||||
print(" [OK] 企业微信正在运行")
|
||||
|
||||
# 步骤 2: 提取密钥
|
||||
print("\n[步骤 2/4] 从企业微信进程内存中提取密钥...")
|
||||
from wxwork_find_key import extract_wxwork_key
|
||||
result = extract_wxwork_key()
|
||||
|
||||
if result is None:
|
||||
print("\n[-] 密钥提取失败!")
|
||||
print(" 请尝试:")
|
||||
print(" 1. 以管理员身份运行此脚本")
|
||||
print(" 2. 确认企业微信已完全启动 (不是最小化到托盘)")
|
||||
return 1
|
||||
|
||||
key_bytes, pid, key_info = result
|
||||
key_hex = key_bytes.hex()
|
||||
print(f"\n [OK] 密钥提取成功!")
|
||||
print(f" Raw Key: {key_hex}")
|
||||
|
||||
# 保存密钥
|
||||
keys_file = os.path.join(BASE_DIR, "wxwork_keys.json")
|
||||
with open(keys_file, "w") as f:
|
||||
json.dump({"global_key": key_hex, "pid": pid, "source": key_info}, f, indent=2)
|
||||
print(f" 密钥已保存到: {keys_file}")
|
||||
|
||||
# 步骤 3: 解密数据库
|
||||
print("\n[步骤 3/4] 解密数据库...")
|
||||
from wxwork_export import decrypt_all_databases
|
||||
|
||||
db_base = os.path.join(os.path.expanduser("~"), "Documents", "WXWork")
|
||||
out_dir = os.path.join(BASE_DIR, "wxwork_export")
|
||||
|
||||
decrypted_dbs = decrypt_all_databases(db_base, os.path.join(out_dir, "decrypted"), key_bytes)
|
||||
|
||||
if not decrypted_dbs:
|
||||
print("\n[-] 没有成功解密的数据库!")
|
||||
return 1
|
||||
|
||||
print(f"\n [OK] 成功解密 {len(decrypted_dbs)} 个数据库文件")
|
||||
|
||||
# 步骤 4: 导出聊天记录
|
||||
print("\n[步骤 4/4] 导出聊天记录为 CSV...")
|
||||
from wxwork_export import export_messages_to_csv
|
||||
|
||||
csv_path = export_messages_to_csv(decrypted_dbs, out_dir)
|
||||
|
||||
if csv_path:
|
||||
print("\n" + "=" * 60)
|
||||
print(" 导出完成!")
|
||||
print("=" * 60)
|
||||
print(f"\n 聊天记录文件: {csv_path}")
|
||||
print(f" 输出目录: {out_dir}")
|
||||
print("\n 提示: 打开CSV文件时如果中文乱码,")
|
||||
print(" 请使用 Excel 的 '数据 > 从文本/CSV导入',")
|
||||
print(" 编码选择 UTF-8 (带 BOM)。")
|
||||
return 0
|
||||
else:
|
||||
print("\n[-] 导出失败")
|
||||
return 1
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(main())
|
||||
Reference in New Issue
Block a user