diff --git a/pywxdump/__init__.py b/pywxdump/__init__.py index 97276c5..cfd486b 100644 --- a/pywxdump/__init__.py +++ b/pywxdump/__init__.py @@ -6,7 +6,7 @@ # Date: 2023/10/14 # ------------------------------------------------------------------------------- from .wx_info import BiasAddr, read_info, get_wechat_db, encrypt, batch_decrypt, decrypt, get_core_db -from .wx_info import merge_copy_db, merge_msg_db, merge_media_msg_db, merge_db, decrypt_merge +from .wx_info import merge_copy_db, merge_msg_db, merge_media_msg_db, merge_db, decrypt_merge,merge_real_time_db from .analyzer.db_parsing import read_img_dat, read_emoji, decompress_CompressContent, read_audio_buf, read_audio, \ parse_xml_string, read_BytesExtra from .analyzer import export_csv,export_json @@ -23,4 +23,4 @@ except: VERSION_LIST = {} VERSION_LIST_PATH = None -__version__ = "2.4.33" +__version__ = "2.4.34" diff --git a/pywxdump/api/api.py b/pywxdump/api/api.py index e58a203..7f6f3a0 100644 --- a/pywxdump/api/api.py +++ b/pywxdump/api/api.py @@ -16,7 +16,7 @@ from pywxdump import analyzer, read_img_dat, read_audio, get_wechat_db, get_core from pywxdump.analyzer.export_chat import get_contact, get_room_user_list from pywxdump.api.rjson import ReJson, RqJson from pywxdump.api.utils import read_session, save_session, error9999 -from pywxdump import read_info, VERSION_LIST, batch_decrypt, BiasAddr, merge_db, decrypt_merge +from pywxdump import read_info, VERSION_LIST, batch_decrypt, BiasAddr, merge_db, decrypt_merge, merge_real_time_db import pywxdump # app = Flask(__name__, static_folder='../ui/web/dist', static_url_path='/') @@ -46,8 +46,14 @@ def init(): save_msg_path = read_session(g.sf, "msg_path") save_micro_path = read_session(g.sf, "micro_path") save_my_wxid = read_session(g.sf, "my_wxid") + if save_msg_path and save_micro_path and os.path.exists(save_msg_path) and os.path.exists( save_micro_path): + try: + a = get_real_time_msg() + except Exception as e: + pass + return ReJson(0, {"msg_path": save_msg_path, "micro_path": save_micro_path, "is_init": True}) else: return ReJson(1002, body="上次初始化的路径不存在") @@ -284,6 +290,34 @@ def get_msgs(): return ReJson(0, {"msg_list": msg_list, "user_list": userlist, "my_wxid": my_wxid}) +@api.route('/api/realtimemsg', methods=["GET", "POST"]) +@error9999 +def get_real_time_msg(): + """ + 获取实时消息 使用 merge_real_time_db()函数 + :return: + """ + save_msg_path = read_session(g.sf, "msg_path") + save_media_path = read_session(g.sf, "media_path") + wx_path = read_session(g.sf, "wx_path") + key = read_session(g.sf, "key") + + if not save_msg_path or not save_media_path or not wx_path or not key: + return ReJson(1002, body="msg_path or media_path or wx_path or key is required") + media_paths = get_core_db(wx_path, ["MediaMSG"]) + msg_paths = get_core_db(wx_path, ["MSG"]) + + if not media_paths[0] or not msg_paths[0]: + return ReJson(1001, body="media_paths or msg_paths is required") + media_paths = media_paths[1] + media_paths.sort() + msg_paths = msg_paths[1] + msg_paths.sort() + merge_real_time_db(key=key, db_path=media_paths[-1], merge_path=save_media_path) + merge_real_time_db(key=key, db_path=msg_paths[-1], merge_path=save_msg_path) + return ReJson(0, "success") + + @api.route('/api/img', methods=["GET", 'POST']) @error9999 def get_img(): diff --git a/pywxdump/wx_info/__init__.py b/pywxdump/wx_info/__init__.py index 9f21b37..1b0c01f 100644 --- a/pywxdump/wx_info/__init__.py +++ b/pywxdump/wx_info/__init__.py @@ -8,4 +8,4 @@ from .get_wx_info import read_info, get_wechat_db, get_core_db from .get_bias_addr import BiasAddr from .decryption import batch_decrypt, encrypt, decrypt -from .merge_db import merge_msg_db, merge_copy_db, merge_media_msg_db, merge_db, decrypt_merge +from .merge_db import merge_msg_db, merge_copy_db, merge_media_msg_db, merge_db, decrypt_merge,merge_real_time_db diff --git a/pywxdump/wx_info/merge_db.py b/pywxdump/wx_info/merge_db.py index e637d95..8b20b54 100644 --- a/pywxdump/wx_info/merge_db.py +++ b/pywxdump/wx_info/merge_db.py @@ -330,3 +330,49 @@ def decrypt_merge(wx_path, key, outpath="", CreateTime: int = 0, endCreateTime: endCreateTime=endCreateTime) return True, merge_save_path + + +def merge_real_time_db(key, db_path: str, merge_path: str, CreateTime: int = 0, endCreateTime: int = 9999999999): + """ + 合并实时数据库消息,暂时只支持64位系统 + :param key: 解密密钥 + :param db_path: 数据库路径 + :param merge_path: 合并后的数据库路径 + :param CreateTime: 从这个时间开始的消息 10位时间戳 + :param endCreateTime: 结束时间 + :return: + """ + try: + import platform + except: + raise ImportError("未找到模块 platform") + # 判断系统位数是否为64位,如果不是则抛出异常 + if platform.architecture()[0] != '64bit': + raise Exception("System is not 64-bit.") + + + if not os.path.exists(db_path): + raise FileNotFoundError("数据库不存在") + + out_path = "tmp_real_time.db" + + if os.path.exists(out_path): + os.remove(out_path) + + # 获取当前文件夹路径 + current_path = os.path.dirname(__file__) + + real_time_exe_path = os.path.join(current_path, "tools", "realTime.exe") + + # 调用cmd命令 + cmd = f"{real_time_exe_path} \"{key}\" \"{db_path}\" \"{out_path}\" {CreateTime} {endCreateTime}" + os.system(cmd) + + if not os.path.exists(out_path): + raise FileNotFoundError("合并失败") + + a = merge_db([out_path], merge_path, CreateTime=CreateTime, endCreateTime=endCreateTime) + + os.remove(out_path) + + return merge_path diff --git a/pywxdump/wx_info/tools/libcrypto-1_1-x64.dll b/pywxdump/wx_info/tools/libcrypto-1_1-x64.dll new file mode 100644 index 0000000..5d7fea5 Binary files /dev/null and b/pywxdump/wx_info/tools/libcrypto-1_1-x64.dll differ diff --git a/pywxdump/wx_info/tools/realTime.exe b/pywxdump/wx_info/tools/realTime.exe new file mode 100644 index 0000000..d384058 Binary files /dev/null and b/pywxdump/wx_info/tools/realTime.exe differ diff --git a/setup.py b/setup.py index 5b7025e..d94bf5e 100644 --- a/setup.py +++ b/setup.py @@ -49,7 +49,7 @@ setup( }, package_data={ - 'pywxdump': ['version_list.json', 'ui/templates/*', 'ui/web/*', 'ui/web/assets/*'] + 'pywxdump': ['version_list.json', 'ui/templates/*', 'ui/web/*', 'ui/web/assets/*', 'wx_info/tools/*'] }, classifiers=[ "Programming Language :: Python :: 3", diff --git a/tests/build_exe.py b/tests/build_exe.py index 04875f9..cd82db9 100644 --- a/tests/build_exe.py +++ b/tests/build_exe.py @@ -164,6 +164,13 @@ if package_path: datas_741258.append(f'''(r'{file_path}', r'{os.path.dirname(file_path.replace(package_path, "")[1:])}' )''') datas_741258 = ",\n".join(datas_741258) + # 获取 wx_info/tools 文件夹下的所有文件 用于打包 + for root, dirs, files in os.walk(os.path.join(root_path, "wx_info", "tools")): + for file in files: + file_path = os.path.join(root, file) + datas_741258 += f''',\n(r'{file_path}', r'{os.path.dirname(file_path.replace(package_path, "")[1:])}' )''' + + # print(datas_741258) # 生成 spec 文件 spec_content = spec_content.format(root_path=root_path, hidden_imports=hidden_imports, datas_741258=datas_741258, version=__version__)