重写架构,支持微信4.0
This commit is contained in:
57
example/1-decrypt.py
Normal file
57
example/1-decrypt.py
Normal file
@@ -0,0 +1,57 @@
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
"""
|
||||
@Time : 2025/3/11 18:17
|
||||
@Author : SiYuan
|
||||
@Email : 863909694@qq.com
|
||||
@File : WeChatMsg-1-decrypt.py
|
||||
@Description :
|
||||
"""
|
||||
|
||||
import json
|
||||
import os
|
||||
from multiprocessing import freeze_support
|
||||
|
||||
from wxManager import Me
|
||||
from wxManager.decrypt import get_info_v4, get_info_v3
|
||||
from wxManager.decrypt.decrypt_dat import get_decode_code_v4
|
||||
from wxManager.decrypt.decrypt_v4 import decrypt_db_files
|
||||
|
||||
if __name__ == '__main__':
|
||||
freeze_support() # 使用多进程必须
|
||||
|
||||
# r_4 = get_info_v4() # 微信4.0
|
||||
r_4 = []
|
||||
for wx_info in r_4:
|
||||
print(wx_info)
|
||||
me = Me()
|
||||
me.wx_dir = wx_info.wx_dir
|
||||
me.wxid = wx_info.wxid
|
||||
me.name = wx_info.nick_name
|
||||
me.xor_key = get_decode_code_v4(wx_info.wx_dir)
|
||||
info_data = me.to_json()
|
||||
output_dir = wx_info.wxid
|
||||
key = wx_info.key
|
||||
wx_dir = wx_info.wx_dir
|
||||
decrypt_db_files(key, src_dir=wx_dir, dest_dir=output_dir)
|
||||
with open(os.path.join(output_dir, 'db_storage', 'info.json'), 'w', encoding='utf-8') as f:
|
||||
json.dump(info_data, f, ensure_ascii=False, indent=4)
|
||||
|
||||
version_list_path = '../wxManager/decrypt/version_list.json'
|
||||
with open(version_list_path, "r", encoding="utf-8") as f:
|
||||
version_list = json.loads(f.read())
|
||||
r_3 = get_info_v3(version_list) # 微信3.x
|
||||
for wx_info in r_3:
|
||||
print(wx_info)
|
||||
me = Me()
|
||||
me.wx_dir = wx_info.wx_dir
|
||||
me.wxid = wx_info.wxid
|
||||
me.name = wx_info.nick_name
|
||||
info_data = me.to_json()
|
||||
output_dir = wx_info.wxid
|
||||
key = wx_info.key
|
||||
wx_dir = wx_info.wx_dir
|
||||
# decrypt_db_files(key, src_dir=wx_dir, dest_dir=output_dir)
|
||||
with open(os.path.join(output_dir, 'info.json'), 'w', encoding='utf-8') as f:
|
||||
json.dump(info_data, f, ensure_ascii=False, indent=4)
|
||||
197
example/README.md
Normal file
197
example/README.md
Normal file
@@ -0,0 +1,197 @@
|
||||
## wxManager使用教程
|
||||
|
||||
### 1、解析数据
|
||||
|
||||
```python
|
||||
import json
|
||||
import os
|
||||
import time
|
||||
from multiprocessing import freeze_support
|
||||
|
||||
import pymem
|
||||
|
||||
from wxManager import Me
|
||||
from wxManager.decrypt import get_wx_info
|
||||
from wxManager.decrypt.decrypt_dat import get_decode_code_v4
|
||||
from wxManager.decrypt.wxinfo import dump_wechat_info_v4_
|
||||
from wxManager.decrypt.decrypt import decrypt_db_files
|
||||
|
||||
|
||||
def dump_v4():
|
||||
freeze_support()
|
||||
st = time.time()
|
||||
pm = pymem.Pymem("Weixin.exe")
|
||||
pid = pm.process_id
|
||||
w = dump_wechat_info_v4_(pid)
|
||||
if w:
|
||||
print(w)
|
||||
et = time.time()
|
||||
print(et - st)
|
||||
me = Me()
|
||||
me.wx_dir = w.wx_dir
|
||||
me.wxid = w.wxid
|
||||
me.name = w.nick_name
|
||||
me.xor_key = get_decode_code_v4(w.wx_dir)
|
||||
info_data = me.to_json()
|
||||
output_dir = w.wxid
|
||||
key = w.key
|
||||
wx_dir = w.wx_dir
|
||||
decrypt_db_files(key, src_dir=wx_dir, dest_dir=output_dir)
|
||||
with open(os.path.join(output_dir, 'db_storage', 'info.json'), 'w', encoding='utf-8') as f:
|
||||
json.dump(info_data, f, ensure_ascii=False, indent=4)
|
||||
else:
|
||||
print('数据解析失败')
|
||||
|
||||
|
||||
def dump_v3():
|
||||
version__list_path = '../../wxManager/decrypt/version_list.json'
|
||||
with open(version__list_path, "r", encoding="utf-8") as f:
|
||||
version__list = json.loads(f.read())
|
||||
wx_info_v3 = get_wx_info.get_info_v3(version__list)
|
||||
|
||||
for wx_info in wx_info_v3:
|
||||
errcode = wx_info.get('errcode')
|
||||
if errcode == 405:
|
||||
print(wx_info.get('errmsg'))
|
||||
elif errcode == 200:
|
||||
print(wx_info)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
dump_v4()
|
||||
# dump_v3()
|
||||
```
|
||||
|
||||
### 2、导出聊天记录
|
||||
|
||||
#### 查看联系人
|
||||
|
||||
```python
|
||||
from wxManager import DatabaseConnection
|
||||
|
||||
db_dir = '' # 数据库路径
|
||||
conn = DatabaseConnection(db_dir, db_version=4)
|
||||
database = conn.get_interface()
|
||||
|
||||
contacts = database.get_contacts()
|
||||
for contact in contacts:
|
||||
contact.smallHeadImgBLOG = database.get_avatar_buffer(contact.wxid) # 头像
|
||||
if contact.is_chatroom:
|
||||
print('*' * 80)
|
||||
print(contact)
|
||||
chatroom_members = database.get_chatroom_members(contact.wxid)
|
||||
print('群成员个数:', len(chatroom_members))
|
||||
for wxid, chatroom_member in chatroom_members.items():
|
||||
chatroom_member.smallHeadImgBLOG = database.get_avatar_buffer(wxid)
|
||||
print(chatroom_member)
|
||||
```
|
||||
|
||||
#### 导出TXT
|
||||
|
||||
```python
|
||||
from exporter.config import FileType
|
||||
from exporter.exporter_txt import TxtExporter
|
||||
from wxManager import DatabaseConnection
|
||||
|
||||
|
||||
db_dir = '' # 数据库路径
|
||||
wxid = '' # 要导出联系人的wxid
|
||||
output_dir = './data/' # 输出文件夹
|
||||
|
||||
conn = DatabaseConnection(db_dir, db_version=4)
|
||||
database = conn.get_interface()
|
||||
|
||||
contact = database.get_contact_by_username(wxid)
|
||||
|
||||
exporter = TxtExporter(
|
||||
database,
|
||||
contact,
|
||||
output_dir=output_dir,
|
||||
type_=FileType.TXT,
|
||||
message_types=None,
|
||||
time_range=None,
|
||||
group_members=None
|
||||
)
|
||||
|
||||
|
||||
# 设置自定义进度回调函数
|
||||
def update_progress(progress):
|
||||
print(progress)
|
||||
|
||||
|
||||
exporter.set_update_callback(update_progress)
|
||||
exporter.start()
|
||||
```
|
||||
|
||||
#### 导出Excel
|
||||
|
||||
```python
|
||||
from multiprocessing import freeze_support
|
||||
|
||||
from exporter.config import FileType
|
||||
from exporter.exporter_xlsx import ExcelExporter
|
||||
from wxManager import DatabaseConnection
|
||||
|
||||
if __name__ == '__main__':
|
||||
freeze_support()
|
||||
db_dir = '' # 解析后的数据库文件夹
|
||||
wxid = 'xxx'
|
||||
output_dir = './data/'
|
||||
conn = DatabaseConnection(db_dir, db_version=4)
|
||||
database = conn.get_interface()
|
||||
contact = database.get_contact_by_username(wxid)
|
||||
exporter = ExcelExporter(
|
||||
database,
|
||||
contact,
|
||||
output_dir=output_dir,
|
||||
type_=FileType.XLSX,
|
||||
message_types=None,
|
||||
time_range=None,
|
||||
group_members=None
|
||||
)
|
||||
def update_progress(progress):
|
||||
print(progress)
|
||||
# exporter.set_update_callback(update_progress)
|
||||
exporter.start()
|
||||
```
|
||||
|
||||
#### 导出HTML
|
||||
|
||||
```python
|
||||
import time
|
||||
from multiprocessing import freeze_support
|
||||
|
||||
from exporter.config import FileType
|
||||
from exporter.exporter_html import HtmlExporterBase
|
||||
from wxManager import DatabaseConnection
|
||||
|
||||
if __name__ == '__main__':
|
||||
freeze_support()
|
||||
st = time.time()
|
||||
|
||||
db_dir = '' # 解析后的数据库文件夹
|
||||
wxid = '' # 要导出好友的wxid
|
||||
output_dir = './data/' # 输出文件夹
|
||||
|
||||
conn = DatabaseConnection(db_dir, db_version=4)
|
||||
database = conn.get_interface()
|
||||
contact = database.get_contact_by_username(wxid)
|
||||
|
||||
exporter = HtmlExporterBase(
|
||||
database,
|
||||
contact,
|
||||
output_dir=output_dir,
|
||||
type_=FileType.TXT,
|
||||
message_types=None,
|
||||
time_range=None,
|
||||
group_members=None
|
||||
)
|
||||
|
||||
|
||||
def update_progress(progress):
|
||||
print(progress)
|
||||
exporter.set_update_callback(update_progress)
|
||||
exporter.start()
|
||||
et = time.time()
|
||||
print(f'耗时:{et - st:.2f}s')
|
||||
```
|
||||
Reference in New Issue
Block a user