WeChatMsg/wxManager/db_v3/micro_msg.py
2025-03-28 21:43:32 +08:00

205 lines
7.1 KiB
Python

import os.path
import shutil
import sqlite3
import threading
import traceback
from wxManager.merge import increase_update_data
from wxManager.log import logger
from wxManager.model import DataBaseBase
from wxManager.model.contact import Contact
lock = threading.Lock()
# db_path = "./app/Database/Msg/MicroMsg.db"
db_path = '.'
def singleton(cls):
_instance = {}
def inner():
if cls not in _instance:
_instance[cls] = cls()
return _instance[cls]
return inner
def is_database_exist():
return os.path.exists(db_path)
class MicroMsg(DataBaseBase):
def get_label_by_id(self, label_id) -> str:
sql = '''
select LabelName from ContactLabel
where LabelId = ?
'''
try:
cursor = self.DB.cursor()
cursor.execute(sql, [label_id])
result = cursor.fetchone()
if result:
return result[0]
else:
return ''
except:
return ''
def get_labels(self, label_id_list) -> str:
if not label_id_list:
return ''
return ','.join(map(self.get_label_by_id, label_id_list.strip(',').split(',')))
def get_contact(self) -> list:
if not self.open_flag:
return []
try:
sql = '''SELECT UserName, Alias, Type, Remark, NickName, PYInitial, RemarkPYInitial, ContactHeadImgUrl.smallHeadImgUrl, ContactHeadImgUrl.bigHeadImgUrl,ExTraBuf,LabelIDList
FROM Contact
INNER JOIN ContactHeadImgUrl ON Contact.UserName = ContactHeadImgUrl.usrName
WHERE (Type!=4 AND Type!=0)
ORDER BY
CASE
WHEN RemarkQuanPin = '' THEN QuanPin
ELSE RemarkQuanPin
END ASC
'''
cursor = self.DB.cursor()
cursor.execute(sql)
result = cursor.fetchall()
except sqlite3.OperationalError:
# lock.acquire(True)
sql = '''SELECT UserName, Alias, Type, Remark, NickName, PYInitial, RemarkPYInitial,
ContactHeadImgUrl.smallHeadImgUrl, ContactHeadImgUrl.bigHeadImgUrl,ExTraBuf,"None"
FROM Contact INNER
JOIN ContactHeadImgUrl ON Contact.UserName = ContactHeadImgUrl.usrName WHERE (Type!=4 AND Type!=0)
AND NickName != '' ORDER BY CASE WHEN RemarkQuanPin = '' THEN QuanPin ELSE RemarkQuanPin END ASC'''
self.cursor.execute(sql)
result = self.cursor.fetchall()
return result
def get_contact_by_username(self, username) -> list:
if not self.open_flag:
return []
try:
sql = '''
SELECT UserName, Alias, Type, Remark, NickName, PYInitial, RemarkPYInitial, ContactHeadImgUrl.smallHeadImgUrl, ContactHeadImgUrl.bigHeadImgUrl,ExTraBuf,LabelIDList
FROM Contact
INNER JOIN ContactHeadImgUrl ON Contact.UserName = ContactHeadImgUrl.usrName
WHERE UserName = ?
'''
cursor = self.DB.cursor()
cursor.execute(sql, [username])
result1 = cursor.fetchone()
except sqlite3.OperationalError:
# 解决ContactLabel表不存在的问题
# lock.acquire(True)
sql = '''
SELECT UserName, Alias, Type, Remark, NickName, PYInitial, RemarkPYInitial, ContactHeadImgUrl.smallHeadImgUrl, ContactHeadImgUrl.bigHeadImgUrl,ExTraBuf,""
FROM Contact
INNER JOIN ContactHeadImgUrl ON Contact.UserName = ContactHeadImgUrl.usrName
WHERE UserName = ?
'''
self.cursor.execute(sql, [username])
result1 = self.cursor.fetchone()
if result1:
result = [*result1[:-1], self.get_labels(result1[-1])]
return result
else:
return []
def set_remark(self, username, remark) -> bool:
try:
update_sql = '''
UPDATE Contact
SET Remark = ?
WHERE UserName = ?
'''
cursor = self.DB.cursor()
cursor.execute(update_sql, [remark, username])
self.commit() # 提交更改
except:
return False
return True
def set_head_image(self, username, image_url):
pass
def get_chatroom_info(self, chatroomname):
"""
获取群聊信息
"""
if not self.open_flag:
return None
sql = '''SELECT ChatRoomName, RoomData,UserNameList,DisplayNameList FROM ChatRoom WHERE ChatRoomName = ?'''
cursor = self.DB.cursor()
cursor.execute(sql, [chatroomname])
result = cursor.fetchone()
return result
def add_contact(self, contact: Contact):
sql1 = '''
insert into Contact (UserName,Alias,Remark,NickName,Type)
values(?,?,?,?,10086);
'''
sql2 = '''
insert into ContactHeadImgUrl (usrName,smallHeadImgUrl,bigHeadImgUrl)
values(?,?,?);
'''
try:
cursor = self.DB.cursor()
cursor.execute(sql1, [contact.wxid, contact.alias, contact.remark, contact.nickname])
cursor.execute(sql2, [contact.wxid, contact.small_head_img_url, contact.big_head_img_url])
self.commit()
except:
logger.error(traceback.format_exc())
return True
def get_session(self):
"""
获取聊天对话
@return:
"""
if not self.open_flag:
return None
sql = '''
SELECT strUsrName, nOrder,nUnreadCount,strNickName ,nIsSend,strContent,nMsgType,nTime,strftime('%Y/%m/%d', nTime, 'unixepoch','localtime') AS strTime
FROM Session
'''
cursor = self.DB.cursor()
cursor.execute(sql)
result = cursor.fetchall()
if result:
result.reverse()
return result
def merge(self, db_path):
if not (os.path.exists(db_path) or os.path.isfile(db_path)):
print(f'{db_path} 不存在')
return
try:
# 获取列名
increase_update_data(db_path, self.cursor, self.DB, 'ChatRoom', 'ChatRoomName', 0)
increase_update_data(db_path, self.cursor, self.DB, 'ChatRoomInfo', 'ChatRoomName', 0)
increase_update_data(db_path, self.cursor, self.DB, 'Contact', 'UserName', 0)
increase_update_data(db_path, self.cursor, self.DB, 'ContactHeadImgUrl', 'usrName', 0)
increase_update_data(db_path, self.cursor, self.DB, 'ContactLabel', 'LabelId', 0)
increase_update_data(db_path, self.cursor, self.DB, 'Session', 'strUsrName', 0)
except:
print(f"数据库操作错误: {traceback.format_exc()}")
self.DB.rollback()
if __name__ == '__main__':
db_path = "./Msg/MicroMsg.db"
msg = MicroMsg()
msg.init_database()
contacts = msg.get_contact()
sessions = msg.get_session()
print(sessions)
for session in sessions:
print(session)