diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 066ce8f..4eaf32b 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -4,11 +4,18 @@ - @@ -657,7 +663,8 @@ - diff --git a/app/person.py b/app/person.py index 09f22a4..c7f9cca 100644 --- a/app/person.py +++ b/app/person.py @@ -46,6 +46,8 @@ class ContactPC: # Alias,Type,Remark,NickName,PYInitial,RemarkPYInitial,ContactHeadImgUrl.smallHeadImgUrl,ContactHeadImgUrl,bigHeadImgUrl self.alias = contact_info.get('Alias') self.nickName = contact_info.get('NickName') + if not self.remark: + self.remark = self.nickName self.smallHeadImgUrl = contact_info.get('smallHeadImgUrl') self.smallHeadImgBLOG = b'' self.avatar = QPixmap() diff --git a/app/ui_pc/tool/pc_decrypt/decryptUi.py b/app/ui_pc/tool/pc_decrypt/decryptUi.py index 44145d5..99579ae 100644 --- a/app/ui_pc/tool/pc_decrypt/decryptUi.py +++ b/app/ui_pc/tool/pc_decrypt/decryptUi.py @@ -51,7 +51,9 @@ class Ui_Dialog(object): self.label_7.setObjectName("label_7") self.gridLayout.addWidget(self.label_7, 1, 0, 1, 1) self.lineEdit = QtWidgets.QLineEdit(Dialog) - self.lineEdit.setStyleSheet("background:transparent;border-width:0;border-style:outset") + self.lineEdit.setStyleSheet("\n" + " background:transparent;border-width:0;border-style:outset\n" + " ") self.lineEdit.setFrame(False) self.lineEdit.setObjectName("lineEdit") self.gridLayout.addWidget(self.lineEdit, 4, 1, 1, 1) @@ -62,6 +64,7 @@ class Ui_Dialog(object): self.label_6.setObjectName("label_6") self.gridLayout.addWidget(self.label_6, 5, 0, 1, 1) self.label_key = QtWidgets.QLabel(Dialog) + self.label_key.setMaximumSize(QtCore.QSize(200, 16777215)) self.label_key.setText("") self.label_key.setObjectName("label_key") self.gridLayout.addWidget(self.label_key, 5, 1, 1, 1) @@ -90,6 +93,7 @@ class Ui_Dialog(object): self.label_8.setObjectName("label_8") self.gridLayout.addWidget(self.label_8, 6, 0, 1, 1) self.label_db_dir = QtWidgets.QLabel(Dialog) + self.label_db_dir.setMaximumSize(QtCore.QSize(200, 300)) self.label_db_dir.setText("") self.label_db_dir.setObjectName("label_db_dir") self.gridLayout.addWidget(self.label_db_dir, 6, 1, 1, 1) diff --git a/app/ui_pc/tool/pc_decrypt/decryptUi.ui b/app/ui_pc/tool/pc_decrypt/decryptUi.ui index 846fc4c..04d9673 100644 --- a/app/ui_pc/tool/pc_decrypt/decryptUi.ui +++ b/app/ui_pc/tool/pc_decrypt/decryptUi.ui @@ -117,6 +117,12 @@ + + + 200 + 16777215 + + @@ -173,6 +179,12 @@ + + + 200 + 300 + + diff --git a/app/ui_pc/tool/pc_decrypt/pc_decrypt.py b/app/ui_pc/tool/pc_decrypt/pc_decrypt.py index af71116..dd10e57 100644 --- a/app/ui_pc/tool/pc_decrypt/pc_decrypt.py +++ b/app/ui_pc/tool/pc_decrypt/pc_decrypt.py @@ -46,6 +46,7 @@ class DecryptControl(QWidget, decryptUi.Ui_Dialog): self.label_pid.setText(str(self.info['pid'])) self.label_version.setText(self.info['version']) self.lineEdit.setFocus() + self.checkBox.setChecked(True) if self.wx_dir and os.path.exists(os.path.join(self.wx_dir, self.info['wxid'])): self.label_ready.setText('已就绪') except Exception as e: @@ -59,6 +60,7 @@ class DecryptControl(QWidget, decryptUi.Ui_Dialog): if directory: self.label_db_dir.setText(directory) self.wx_dir = directory + self.checkBox_2.setChecked(True) if self.ready: self.label_ready.setText('已就绪') diff --git a/decrypt_window.py b/decrypt_window.py index 04f7b7b..4151aa7 100644 --- a/decrypt_window.py +++ b/decrypt_window.py @@ -1,11 +1,9 @@ import ctypes import sys -import time from PyQt5.QtGui import QIcon from PyQt5.QtWidgets import * -from app.ui_pc import mainview from app.ui_pc.tool.pc_decrypt import pc_decrypt ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID("WeChatReport") @@ -28,23 +26,6 @@ class ViewController(QWidget): self.viewDecrypt.DecryptSignal.connect(self.show_success) self.viewDecrypt.show() - def loadMainWinView(self, username=None): - """ - 聊天界面 - :param username: 账号 - :return: - """ - username = '' - start = time.time() - self.viewMainWIn = mainview.MainWinController(username=username) - self.viewMainWIn.setWindowTitle("Chat") - # print(username) - self.viewMainWIn.username = username - # self.viewMainWIn.exitSignal.connect(self.loadDecryptView) # 不需要回到登录界面可以省略 - self.viewMainWIn.show() - end = time.time() - print('ok', end - start) - def show_success(self): QMessageBox.about(self, "解密成功", "数据库文件存储在\napp/DataBase/Msg\n文件夹下") @@ -52,7 +33,5 @@ class ViewController(QWidget): if __name__ == '__main__': app = QApplication(sys.argv) view = ViewController() - # view.loadPCDecryptView() - view.loadMainWinView() - # view.show_success() + view.loadPCDecryptView() sys.exit(app.exec_()) diff --git a/doc/images/messages_demo.png b/doc/images/messages_demo.png new file mode 100644 index 0000000..75da423 Binary files /dev/null and b/doc/images/messages_demo.png differ diff --git a/doc/images/pc_contact.png b/doc/images/pc_contact.png new file mode 100644 index 0000000..5770fd8 Binary files /dev/null and b/doc/images/pc_contact.png differ diff --git a/doc/数据库介绍.md b/doc/数据库介绍.md index 48510a2..2e3dd95 100644 --- a/doc/数据库介绍.md +++ b/doc/数据库介绍.md @@ -1,3 +1,4 @@ # 微信数据库介绍 -**这个人比较懒,还什么都没写** \ No newline at end of file +**这个人比较懒,还什么都没写** + diff --git a/doc/电脑端使用教程.md b/doc/电脑端使用教程.md new file mode 100644 index 0000000..add9010 --- /dev/null +++ b/doc/电脑端使用教程.md @@ -0,0 +1,70 @@ +# 一、解密微信数据库 + +## 主要功能 + +1. 解密微信数据库 +2. 查看聊天记录 +3. 导出聊天记录 + * CSV + * docx(待实现) + * HTML(待实现) + +## 安装 + +```shell +git clone https://github.com/LC044/WeChatMsg +cd WeChatMsg +pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple +``` + +## 解密 + +
+ +解密步骤: + +1. 登录微信 + +2. 运行程序 + + ```shell + python decrypt_window.py + ``` + +3. 点击获取信息 + + ![](./images/pc_decrypt_info.png) + +4. 设置微信安装路径 + 可以到微信->设置->文件管理查看 + ![](./images/setting.png) + + 点击**设置微信路径**按钮,选择该文件夹路径 + +5. 获取到密钥和微信路径之后点击开始解密 + +6. 解密后的数据库文件保存在./app/DataBase/Msg路径下 + +
+ +## 查看聊天记录 + +
+ +1. 运行程序 + +```shell +python main_pc.py +``` + +2. 选择联系人 + +运行图片 + +3. 导出聊天记录 + +聊天记录保存在 **/data/聊天记录/** 文件夹下 + + + +
\ No newline at end of file diff --git a/main_pc.py b/main_pc.py new file mode 100644 index 0000000..04f7b7b --- /dev/null +++ b/main_pc.py @@ -0,0 +1,58 @@ +import ctypes +import sys +import time + +from PyQt5.QtGui import QIcon +from PyQt5.QtWidgets import * + +from app.ui_pc import mainview +from app.ui_pc.tool.pc_decrypt import pc_decrypt + +ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID("WeChatReport") + + +class ViewController(QWidget): + def __init__(self): + super().__init__() + self.setWindowTitle('解密') + self.setWindowIcon(QIcon('./app/data/icons/logo.svg')) + self.viewMainWIn = None + self.viewDecrypt = None + + def loadPCDecryptView(self): + """ + 登录界面 + :return: + """ + self.viewDecrypt = pc_decrypt.DecryptControl() + self.viewDecrypt.DecryptSignal.connect(self.show_success) + self.viewDecrypt.show() + + def loadMainWinView(self, username=None): + """ + 聊天界面 + :param username: 账号 + :return: + """ + username = '' + start = time.time() + self.viewMainWIn = mainview.MainWinController(username=username) + self.viewMainWIn.setWindowTitle("Chat") + # print(username) + self.viewMainWIn.username = username + # self.viewMainWIn.exitSignal.connect(self.loadDecryptView) # 不需要回到登录界面可以省略 + self.viewMainWIn.show() + end = time.time() + print('ok', end - start) + + def show_success(self): + QMessageBox.about(self, "解密成功", "数据库文件存储在\napp/DataBase/Msg\n文件夹下") + + +if __name__ == '__main__': + app = QApplication(sys.argv) + view = ViewController() + # view.loadPCDecryptView() + view.loadMainWinView() + # view.show_success() + sys.exit(app.exec_()) diff --git a/readme.md b/readme.md index 69b45d6..f9c3c9c 100644 --- a/readme.md +++ b/readme.md @@ -94,7 +94,8 @@ pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple 随便下载一个SQLite数据库查看软件就能打开数据库,例如[DB Browser for SQLite](https://sqlitebrowser.org/dl/) -[数据库功能介绍](./doc/数据库介绍.md) +* [数据库功能介绍](./doc/数据库介绍.md) +* [更多功能介绍](./doc/电脑端使用教程.md)