导出所有数据库的聊天记录

This commit is contained in:
shuaikangzhou 2023-11-16 23:16:38 +08:00
parent 38080499cd
commit 9c7cb674f8
4 changed files with 89 additions and 56 deletions

View File

@ -4,17 +4,11 @@
<option name="autoReloadType" value="SELECTIVE" /> <option name="autoReloadType" value="SELECTIVE" />
</component> </component>
<component name="ChangeListManager"> <component name="ChangeListManager">
<list default="true" id="84e65474-7da9-466d-baf3-cc88dde3ffdd" name="变更" comment="修复情感分析数值显示过长的bug"> <list default="true" id="84e65474-7da9-466d-baf3-cc88dde3ffdd" name="变更" comment="新增聊天记录导出csv格式">
<change afterPath="$PROJECT_DIR$/app/data/icons/search.svg" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" /> <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/DataBase/micro_msg.py" beforeDir="false" afterPath="$PROJECT_DIR$/app/DataBase/micro_msg.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/DataBase/msg.py" beforeDir="false" afterPath="$PROJECT_DIR$/app/DataBase/msg.py" afterDir="false" /> <change beforePath="$PROJECT_DIR$/app/DataBase/msg.py" beforeDir="false" afterPath="$PROJECT_DIR$/app/DataBase/msg.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/DataBase/output_pc.py" beforeDir="false" afterPath="$PROJECT_DIR$/app/DataBase/output_pc.py" afterDir="false" /> <change beforePath="$PROJECT_DIR$/app/ui_pc/mainview.py" beforeDir="false" afterPath="$PROJECT_DIR$/app/ui_pc/mainview.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/components/bubble_message.py" beforeDir="false" afterPath="$PROJECT_DIR$/app/components/bubble_message.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/ui_pc/Icon.py" beforeDir="false" afterPath="$PROJECT_DIR$/app/ui_pc/Icon.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/ui_pc/contact/contactInfo.py" beforeDir="false" afterPath="$PROJECT_DIR$/app/ui_pc/contact/contactInfo.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/ui_pc/contact/contactUi.py" beforeDir="false" afterPath="$PROJECT_DIR$/app/ui_pc/contact/contactUi.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/ui_pc/contact/contactUi.ui" beforeDir="false" afterPath="$PROJECT_DIR$/app/ui_pc/contact/contactUi.ui" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/ui_pc/contact/contact_window.py" beforeDir="false" afterPath="$PROJECT_DIR$/app/ui_pc/contact/contact_window.py" afterDir="false" />
</list> </list>
<option name="SHOW_DIALOG" value="false" /> <option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" /> <option name="HIGHLIGHT_CONFLICTS" value="true" />
@ -111,27 +105,6 @@
</key> </key>
</component> </component>
<component name="RunManager" selected="Python.decrypt_window"> <component name="RunManager" selected="Python.decrypt_window">
<configuration name="CAvatar" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
<module name="WeChatMsg" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/app/components" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/app/components/CAvatar.py" />
<option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" />
<option name="MODULE_MODE" value="false" />
<option name="REDIRECT_INPUT" value="false" />
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
<configuration name="decrypt_window" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true"> <configuration name="decrypt_window" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
<module name="WeChatMsg" /> <module name="WeChatMsg" />
<option name="INTERPRETER_OPTIONS" value="" /> <option name="INTERPRETER_OPTIONS" value="" />
@ -237,13 +210,34 @@
<option name="INPUT_FILE" value="" /> <option name="INPUT_FILE" value="" />
<method v="2" /> <method v="2" />
</configuration> </configuration>
<configuration name="test" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
<module name="WeChatMsg" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/test.py" />
<option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" />
<option name="MODULE_MODE" value="false" />
<option name="REDIRECT_INPUT" value="false" />
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
<recent_temporary> <recent_temporary>
<list> <list>
<item itemvalue="Python.decrypt_window" /> <item itemvalue="Python.decrypt_window" />
<item itemvalue="Python.msg" /> <item itemvalue="Python.msg" />
<item itemvalue="Python.test" />
<item itemvalue="Python.main" /> <item itemvalue="Python.main" />
<item itemvalue="Python.misc" /> <item itemvalue="Python.misc" />
<item itemvalue="Python.CAvatar" />
</list> </list>
</recent_temporary> </recent_temporary>
</component> </component>
@ -259,13 +253,6 @@
<option name="presentableId" value="Default" /> <option name="presentableId" value="Default" />
<updated>1672848140146</updated> <updated>1672848140146</updated>
</task> </task>
<task id="LOCAL-00016" summary="窗口切换使用stackedWidget">
<created>1680630659802</created>
<option name="number" value="00016" />
<option name="presentableId" value="LOCAL-00016" />
<option name="project" value="LOCAL" />
<updated>1680630659802</updated>
</task>
<task id="LOCAL-00017" summary="修复了Webengine横向小的问题"> <task id="LOCAL-00017" summary="修复了Webengine横向小的问题">
<created>1680670947385</created> <created>1680670947385</created>
<option name="number" value="00017" /> <option name="number" value="00017" />
@ -602,7 +589,14 @@
<option name="project" value="LOCAL" /> <option name="project" value="LOCAL" />
<updated>1700064404522</updated> <updated>1700064404522</updated>
</task> </task>
<option name="localTasksCounter" value="65" /> <task id="LOCAL-00065" summary="新增聊天记录导出csv格式">
<created>1700145601841</created>
<option name="number" value="00065" />
<option name="presentableId" value="LOCAL-00065" />
<option name="project" value="LOCAL" />
<updated>1700145601841</updated>
</task>
<option name="localTasksCounter" value="66" />
<servers /> <servers />
</component> </component>
<component name="UnknownFeatures"> <component name="UnknownFeatures">
@ -638,7 +632,6 @@
</option> </option>
</component> </component>
<component name="VcsManagerConfiguration"> <component name="VcsManagerConfiguration">
<MESSAGE value="用stackedWidget实现导航栏" />
<MESSAGE value="修复部分bug" /> <MESSAGE value="修复部分bug" />
<MESSAGE value="替换chat里的contact" /> <MESSAGE value="替换chat里的contact" />
<MESSAGE value="增加中文路径提示" /> <MESSAGE value="增加中文路径提示" />
@ -663,7 +656,8 @@
<MESSAGE value="显示联系人信息" /> <MESSAGE value="显示联系人信息" />
<MESSAGE value="修复db文件空格路径的bug" /> <MESSAGE value="修复db文件空格路径的bug" />
<MESSAGE value="修复情感分析数值显示过长的bug" /> <MESSAGE value="修复情感分析数值显示过长的bug" />
<option name="LAST_COMMIT_MESSAGE" value="修复情感分析数值显示过长的bug" /> <MESSAGE value="新增聊天记录导出csv格式" />
<option name="LAST_COMMIT_MESSAGE" value="新增聊天记录导出csv格式" />
<option name="OPTIMIZE_IMPORTS_BEFORE_PROJECT_COMMIT" value="true" /> <option name="OPTIMIZE_IMPORTS_BEFORE_PROJECT_COMMIT" value="true" />
<option name="REFORMAT_BEFORE_PROJECT_COMMIT" value="true" /> <option name="REFORMAT_BEFORE_PROJECT_COMMIT" value="true" />
</component> </component>

View File

@ -37,5 +37,11 @@ def get_contact():
return result return result
def close():
global DB
if DB:
DB.close()
if __name__ == '__main__': if __name__ == '__main__':
get_contact() get_contact()

View File

@ -1,24 +1,40 @@
import os.path import os.path
import re
import sqlite3 import sqlite3
DB = None DB = []
cursor = None cursor = []
msg_path = "./app/Database/Msg/MSG0.db" msg_root_path = "./app/Database/Msg/"
# misc_path = './Msg/Misc.db' # misc_path = './Msg/Misc.db'
if os.path.exists(msg_path): if os.path.exists(msg_root_path):
DB = sqlite3.connect(msg_path, check_same_thread=False) for root, dirs, files in os.walk(msg_root_path):
for file in files:
if re.match('^MSG[0-9]+\.db$', file):
# print('ok', file)
msg_path = os.path.join(msg_root_path, file)
DB0 = sqlite3.connect(msg_path, check_same_thread=False)
# '''创建游标''' # '''创建游标'''
cursor = DB.cursor() cursor0 = DB0.cursor()
DB.append(DB0)
cursor.append(cursor0)
def init_database(): def init_database():
global DB global DB
global cursor global cursor
if not DB: if not DB:
if os.path.exists(msg_path): if os.path.exists(msg_root_path):
DB = sqlite3.connect(msg_path, check_same_thread=False) for root, dirs, files in os.walk(msg_root_path):
for file in files:
# print(file)
if re.match('^MSG[0-9]+\.db$', file):
print('ok', file)
msg_path = os.path.join(msg_root_path, file)
DB0 = sqlite3.connect(msg_path, check_same_thread=False)
# '''创建游标''' # '''创建游标'''
cursor = DB.cursor() cursor0 = DB0.cursor()
DB.append(DB0)
cursor.append(cursor0)
def get_messages(username_): def get_messages(username_):
@ -28,15 +44,25 @@ def get_messages(username_):
where StrTalker=? where StrTalker=?
order by CreateTime order by CreateTime
''' '''
cursor.execute(sql, [username_]) result = []
result_ = cursor.fetchall() for cur in cursor:
return result_ cur.execute(sql, [username_])
result_ = cur.fetchall()
# print(len(result))
result += result_
result.sort(key=lambda x: x[5])
return result
def close():
for db in DB:
db.close()
if __name__ == '__main__': if __name__ == '__main__':
from pprint import pprint from pprint import pprint
msg_path = './Msg/MSG3.db' msg_root_path = './Msg/'
init_database() init_database()
username = 'wxid_0o18ef858vnu22' username = 'wxid_0o18ef858vnu22'

View File

@ -13,6 +13,7 @@ from PyQt5.QtCore import *
from PyQt5.QtWidgets import * from PyQt5.QtWidgets import *
from app import config from app import config
from app.DataBase import msg
from app.Ui.Icon import Icon from app.Ui.Icon import Icon
from . import mainwindow from . import mainwindow
from .contact import ContactWindow from .contact import ContactWindow
@ -112,3 +113,9 @@ class MainWinController(QMainWindow, mainwindow.Ui_MainWindow):
f"QQ交流群:{config.contact}\n" f"QQ交流群:{config.contact}\n"
"地址https://github.com/LC044/WeChatMsg" "地址https://github.com/LC044/WeChatMsg"
) )
def close(self) -> bool:
del self.listWidget
del self.stackedWidget
msg.close()
self.contact_window.close()