From 0400644aaa44f49898105e964170a9312506c38d Mon Sep 17 00:00:00 2001
From: daimiaopeng <844362911@qq.com>
Date: Wed, 6 Dec 2023 10:40:25 +0800
Subject: [PATCH 1/9] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=9F=A5=E8=AF=A2?=
=?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=BA=93=E4=B8=AD=E7=BB=93=E6=9E=9C=E4=B8=8D?=
=?UTF-8?q?=E8=83=BD=E7=BC=96=E7=A0=81=E5=88=B0UTF-8=E7=9A=84=E9=97=AE?=
=?UTF-8?q?=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/DataBase/merge.py | 1 +
1 file changed, 1 insertion(+)
diff --git a/app/DataBase/merge.py b/app/DataBase/merge.py
index e28073e..7679821 100644
--- a/app/DataBase/merge.py
+++ b/app/DataBase/merge.py
@@ -13,6 +13,7 @@ def merge_databases(source_paths, target_path):
if not os.path.exists(source_path):
break
db = sqlite3.connect(source_path)
+ db.text_factory = bytes
cursor = db.cursor()
sql = '''
SELECT TalkerId,MsgsvrID,Type,SubType,IsSender,CreateTime,Sequence,StrTalker,StrContent,DisplayContent,BytesExtra
From a56e96e2d15603976bac1f0a15cc067144aadd22 Mon Sep 17 00:00:00 2001
From: STDquantum <405720329@qq.com>
Date: Wed, 6 Dec 2023 11:23:33 +0800
Subject: [PATCH 2/9] =?UTF-8?q?=E5=B0=86=E5=AF=BC=E5=87=BAhtml=E4=B8=AD?=
=?UTF-8?q?=E7=9A=84"[=E6=96=87=E6=9C=AC]"=E6=9B=BF=E6=8D=A2=E4=B8=BA?=
=?UTF-8?q?=E5=BE=AE=E4=BF=A1=E8=A1=A8=E6=83=85=E5=8C=85=E7=9A=84=E9=93=BE?=
=?UTF-8?q?=E6=8E=A5?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/DataBase/output_pc.py | 14 ++++++++++++++
1 file changed, 14 insertions(+)
diff --git a/app/DataBase/output_pc.py b/app/DataBase/output_pc.py
index a9e8e15..292d30c 100644
--- a/app/DataBase/output_pc.py
+++ b/app/DataBase/output_pc.py
@@ -671,6 +671,13 @@ input {
font-size: 14px;
}
+.emoji_img {
+ width: 26px;
+ height: 26px;
+ position: relative;
+ bottom: -6px;
+}
+
@@ -723,6 +730,8 @@ const chatMessages = [
MePC().avatar.save(os.path.join(origin_docx_path, 'myhead.png'))
self.contact.avatar.save(os.path.join(origin_docx_path, 'tahead.png'))
self.rangeSignal.emit(len(messages))
+ emoji = {'[微笑]': '
', '[撇嘴]': '
', '[色]': '
', '[发呆]': '
', '[得意]': '
', '[流泪]': '
', '[害羞]': '
', '[闭嘴]': '
', '[睡]': '
', '[大哭]': '
', '[尴尬]': '
', '[发怒]': '
', '[调皮]': '
', '[呲牙]': '
', '[惊讶]': '
', '[难过]': '
', '[抓狂]': '
', '[吐]': '
', '[偷笑]': '
', '[愉快]': '
', '[白眼]': '
', '[傲慢]': '
', '[困]': '
', '[惊恐]': '
', '[憨笑]': '
', '[悠闲]': '
', '[咒骂]': '
', '[疑问]': '
', '[嘘]': '
', '[晕]': '
', '[衰]': '
', '[骷髅]': '
', '[敲打]': '
', '[再见]': '
', '[擦汗]': '
', '[抠鼻]': '
', '[鼓掌]': '
', '[坏笑]': '
', '[右哼哼]': '
', '[鄙视]': '
', '[委屈]': '
', '[快哭了]': '
', '[阴险]': '
', '[亲亲]': '
', '[可怜]': '
', '[笑脸]': '
', '[生病]': '
', '[脸红]': '
', '[破涕为笑]': '
', '[恐惧]': '
', '[失望]': '
', '[无语]': '
', '[嘿哈]': '
', '[捂脸]': '
', '[奸笑]': '
', '[机智]': '
', '[皱眉]': '
', '[耶]': '
', '[吃瓜]': '
', '[加油]': '
', '[汗]': '
', '[天啊]': '
', '[Emm]': '
', '[社会社会]': '
', '[旺柴]': '
', '[好的]': '
', '[打脸]': '
', '[哇]': '
', '[翻白眼]': '
', '[666]': '
', '[让我看看]': '
', '[叹气]': '
', '[苦涩]': '
', '[裂开]': '
', '[嘴唇]': '
', '[爱心]': '
', '[心碎]': '
', '[拥抱]': '
', '[强]': '
', '[弱]': '
', '[握手]': '
', '[胜利]': '
', '[抱拳]': '
', '[勾引]': '
', '[拳头]': '
', '[OK]': '
', '[合十]': '
', '[啤酒]': '
', '[咖啡]': '
', '[蛋糕]': '
', '[玫瑰]': '
', '[凋谢]': '
', '[菜刀]': '
', '[炸弹]': '
', '[便便]': '
', '[月亮]': '
', '[太阳]': '
', '[庆 祝]': '
', '[礼物]': '
', '[红包]': '
', '[發]': '
', '[福]': '
', '[烟花]': '
', '[爆竹]': '
', '[猪头]': '
', '[跳跳]': '
', '[发抖]': '
', '[转圈]': '
'}
+ from re import findall
for index, message in enumerate(messages):
type_ = message[2]
str_content = message[7]
@@ -740,6 +749,11 @@ const chatMessages = [
f.write(
f'''{{ type:0, text: '{str_time}',is_send:0,avatar_path:''}},'''
)
+
+ emojiText = findall(r"(\[.+?\])", str_content)
+ for emoji_text in emojiText:
+ if emoji_text in emoji:
+ str_content = str_content.replace(emoji_text, emoji[emoji_text])
f.write(
f'''{{ type:{type_}, text: '{str_content}',is_send:{is_send},avatar_path:'{avatar}'}},'''
)
From 0aa1ac964fe14c8432a0dfe59e17eafeb4a4a8b0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=8E=8B=E4=BC=9F?=
Date: Wed, 6 Dec 2023 15:34:56 +0800
Subject: [PATCH 3/9] =?UTF-8?q?=E5=AF=BC=E5=87=BAcsv=E6=96=87=E4=BB=B6?=
=?UTF-8?q?=E6=97=B6=EF=BC=8C=E5=A2=9E=E5=8A=A0=E5=8F=91=E9=80=81=E4=BA=BA?=
=?UTF-8?q?=E5=90=8D=E7=A7=B0=E3=80=81=E6=8E=A5=E5=8F=97=E8=80=85=E5=90=8D?=
=?UTF-8?q?=E7=A7=B0=E3=80=81=E5=A4=87=E6=B3=A8=E5=90=8D=E5=AD=97=E6=AE=B5?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/DataBase/micro_msg.py | 31 +++++++++
app/DataBase/msg.py | 2 +-
app/DataBase/output_pc.py | 13 ++--
app/DataBase/package_msg.py | 103 +++++++++++++++++++++++++++++
app/util/protocbuf/__init__.py | 0
app/util/protocbuf/msg.proto | 18 +++++
app/util/protocbuf/msg_pb2.py | 54 +++++++++++++++
app/util/protocbuf/readme.md | 34 ++++++++++
app/util/protocbuf/roomdata.proto | 19 ++++++
app/util/protocbuf/roomdata_pb2.py | 45 +++++++++++++
requirements.txt | Bin 838 -> 936 bytes
11 files changed, 314 insertions(+), 5 deletions(-)
create mode 100644 app/DataBase/package_msg.py
create mode 100644 app/util/protocbuf/__init__.py
create mode 100644 app/util/protocbuf/msg.proto
create mode 100644 app/util/protocbuf/msg_pb2.py
create mode 100644 app/util/protocbuf/readme.md
create mode 100644 app/util/protocbuf/roomdata.proto
create mode 100644 app/util/protocbuf/roomdata_pb2.py
diff --git a/app/DataBase/micro_msg.py b/app/DataBase/micro_msg.py
index f36cec8..23e7d7e 100644
--- a/app/DataBase/micro_msg.py
+++ b/app/DataBase/micro_msg.py
@@ -63,6 +63,37 @@ class MicroMsg:
lock.release()
return result
+ def get_contact_by_username(self, username):
+ if not self.open_flag:
+ return None
+ try:
+ lock.acquire(True)
+ sql = '''SELECT UserName, Alias, Type, Remark, NickName, PYInitial, RemarkPYInitial, ContactHeadImgUrl.smallHeadImgUrl, ContactHeadImgUrl.bigHeadImgUrl
+ FROM Contact
+ INNER JOIN ContactHeadImgUrl ON Contact.UserName = ContactHeadImgUrl.usrName
+ WHERE UserName = ?
+ '''
+ self.cursor.execute(sql, [username])
+ result = self.cursor.fetchone()
+ finally:
+ lock.release()
+ return result
+
+ def get_chatroom_info(self, chatroomname):
+ '''
+ 获取群聊信息
+ '''
+ if not self.open_flag:
+ return None
+ try:
+ lock.acquire(True)
+ sql = '''SELECT ChatRoomName, RoomData FROM ChatRoom WHERE ChatRoomName = ?'''
+ self.cursor.execute(sql, [chatroomname])
+ result = self.cursor.fetchone()
+ finally:
+ lock.release()
+ return result
+
def close(self):
if self.open_flag:
try:
diff --git a/app/DataBase/msg.py b/app/DataBase/msg.py
index 9399c82..76a2919 100644
--- a/app/DataBase/msg.py
+++ b/app/DataBase/msg.py
@@ -72,7 +72,7 @@ class Msg:
def get_messages_all(self):
sql = '''
- select localId,TalkerId,Type,SubType,IsSender,CreateTime,Status,StrContent,strftime('%Y-%m-%d %H:%M:%S',CreateTime,'unixepoch','localtime') as StrTime,MsgSvrID
+ select localId,TalkerId,Type,SubType,IsSender,CreateTime,Status,StrContent,strftime('%Y-%m-%d %H:%M:%S',CreateTime,'unixepoch','localtime') as StrTime,MsgSvrID,BytesExtra,StrTalker,Reserved1
from MSG
order by CreateTime
'''
diff --git a/app/DataBase/output_pc.py b/app/DataBase/output_pc.py
index a9e8e15..6f78d93 100644
--- a/app/DataBase/output_pc.py
+++ b/app/DataBase/output_pc.py
@@ -5,6 +5,7 @@ import os
from PyQt5.QtCore import pyqtSignal, QThread
from . import msg_db
+from .package_msg import PackageMsg
from ..DataBase import hard_link_db
from ..person_pc import MePC
from ..util import get_abs_path
@@ -65,8 +66,10 @@ class Output(QThread):
# columns = ["用户名", "消息内容", "发送时间", "发送状态", "消息类型", "isSend", "msgId"]
columns = ['localId', 'TalkerId', 'Type', 'SubType',
'IsSender', 'CreateTime', 'Status', 'StrContent',
- 'StrTime']
- messages = msg_db.get_messages_all()
+ 'StrTime', 'Remark', 'NickName', 'Sender']
+ # messages = msg_db.get_messages_all()
+ packagemsg = PackageMsg()
+ messages = packagemsg.get_package_message_all()
# 写入CSV文件
with open(filename, mode='w', newline='', encoding='utf-8') as file:
writer = csv.writer(file)
@@ -165,8 +168,10 @@ class ChildThread(QThread):
# columns = ["用户名", "消息内容", "发送时间", "发送状态", "消息类型", "isSend", "msgId"]
columns = ['localId', 'TalkerId', 'Type', 'SubType',
'IsSender', 'CreateTime', 'Status', 'StrContent',
- 'StrTime']
- messages = msg_db.get_messages_all()
+ 'StrTime', 'Remark', 'NickName', 'Sender']
+ # messages = msg_db.get_messages_all()
+ packagemsg = PackageMsg()
+ messages = packagemsg.get_package_message_all()
# 写入CSV文件
with open(filename, mode='w', newline='', encoding='utf-8') as file:
writer = csv.writer(file)
diff --git a/app/DataBase/package_msg.py b/app/DataBase/package_msg.py
new file mode 100644
index 0000000..59bfd9a
--- /dev/null
+++ b/app/DataBase/package_msg.py
@@ -0,0 +1,103 @@
+import threading
+
+from app.DataBase import msg_db, micro_msg_db
+from app.util.protocbuf.msg_pb2 import MessageBytesExtra
+from app.util.protocbuf.roomdata_pb2 import ChatRoomData
+
+lock = threading.Lock()
+
+
+def singleton(cls):
+ _instance = {}
+
+ def inner():
+ if cls not in _instance:
+ _instance[cls] = cls()
+ return _instance[cls]
+
+ return inner
+
+
+@singleton
+class PackageMsg:
+ def __init__(self):
+ self.ChatRoomMap = {}
+
+ def get_package_message_all(self):
+ '''
+ 获取完整的聊天记录
+ '''
+ updated_messages = [] # 用于存储修改后的消息列表
+
+ messages = msg_db.get_messages_all()
+ for row in messages:
+ row_list = list(row)
+ # 删除不使用的几个字段
+ del row_list[12]
+ del row_list[11]
+ del row_list[10]
+
+ strtalker = row[11]
+ info = micro_msg_db.get_contact_by_username(strtalker)
+ if info is not None:
+ row_list.append(info[3])
+ row_list.append(info[4])
+ # 判断是否是群聊
+ if strtalker.__contains__('@chatroom'):
+ # 自己发送
+ if row[12] == 1:
+ row_list.append('我')
+ else:
+ # 存在BytesExtra为空的情况,此时消息类型应该为提示性消息。跳过不处理
+ if row[10] is None:
+ continue
+ # 解析BytesExtra
+ msgbytes = MessageBytesExtra()
+ msgbytes.ParseFromString(row[10])
+ wxid = ''
+ for tmp in msgbytes.message2:
+ if tmp.field1 != 1:
+ continue
+ wxid = tmp.field2
+ sender = ''
+ # 获取群聊成员列表
+ membersMap = self.get_chatroom_member_list(strtalker)
+ if membersMap is not None:
+ if wxid in membersMap:
+ sender = membersMap.get(wxid)
+ else:
+ senderinfo = micro_msg_db.get_contact_by_username(wxid)
+ if senderinfo is not None:
+ sender = senderinfo[4]
+ membersMap[wxid] = senderinfo[4]
+ if len(senderinfo[3]) > 0:
+ sender = senderinfo[3]
+ membersMap[wxid] = senderinfo[3]
+ row_list.append(sender)
+ updated_messages.append(tuple(row_list))
+ return updated_messages
+
+ def get_chatroom_member_list(self, strtalker):
+ membermap = {}
+ '''
+ 获取群聊成员
+ '''
+ try:
+ lock.acquire(True)
+ if strtalker in self.ChatRoomMap:
+ membermap = self.ChatRoomMap.get(strtalker)
+ else:
+ chatroom = micro_msg_db.get_chatroom_info(strtalker)
+ if chatroom is None:
+ return None
+ # 解析RoomData数据
+ parsechatroom = ChatRoomData()
+ parsechatroom.ParseFromString(chatroom[1])
+ # 群成员数据放入字典存储
+ for mem in parsechatroom.members:
+ if mem.displayName is not None and len(mem.displayName) > 0:
+ membermap[mem.wxID] = mem.displayName
+ self.ChatRoomMap[strtalker] = membermap
+ finally:
+ lock.release()
+ return membermap
diff --git a/app/util/protocbuf/__init__.py b/app/util/protocbuf/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/app/util/protocbuf/msg.proto b/app/util/protocbuf/msg.proto
new file mode 100644
index 0000000..1d88cec
--- /dev/null
+++ b/app/util/protocbuf/msg.proto
@@ -0,0 +1,18 @@
+syntax = "proto3";
+package app.protobuf;
+option go_package=".;proto";
+
+message SubMessage1 {
+ int32 field1 = 1;
+ int32 field2 = 2;
+}
+
+message SubMessage2 {
+ int32 field1 = 1;
+ string field2 = 2;
+}
+
+message MessageBytesExtra {
+ SubMessage1 message1 = 1;
+ repeated SubMessage2 message2 = 3;
+}
diff --git a/app/util/protocbuf/msg_pb2.py b/app/util/protocbuf/msg_pb2.py
new file mode 100644
index 0000000..f5f31c5
--- /dev/null
+++ b/app/util/protocbuf/msg_pb2.py
@@ -0,0 +1,54 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler. DO NOT EDIT!
+# source: msg.proto
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+
+
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\tmsg.proto\x12\x0c\x61pp.protobuf\"-\n\x0bSubMessage1\x12\x0e\n\x06\x66ield1\x18\x01 \x01(\x05\x12\x0e\n\x06\x66ield2\x18\x02 \x01(\x05\"-\n\x0bSubMessage2\x12\x0e\n\x06\x66ield1\x18\x01 \x01(\x05\x12\x0e\n\x06\x66ield2\x18\x02 \x01(\t\"m\n\x11MessageBytesExtra\x12+\n\x08message1\x18\x01 \x01(\x0b\x32\x19.app.protobuf.SubMessage1\x12+\n\x08message2\x18\x03 \x03(\x0b\x32\x19.app.protobuf.SubMessage2b\x06proto3')
+
+
+
+_SUBMESSAGE1 = DESCRIPTOR.message_types_by_name['SubMessage1']
+_SUBMESSAGE2 = DESCRIPTOR.message_types_by_name['SubMessage2']
+_MESSAGEBYTESEXTRA = DESCRIPTOR.message_types_by_name['MessageBytesExtra']
+SubMessage1 = _reflection.GeneratedProtocolMessageType('SubMessage1', (_message.Message,), {
+ 'DESCRIPTOR' : _SUBMESSAGE1,
+ '__module__' : 'msg_pb2'
+ # @@protoc_insertion_point(class_scope:app.protobuf.SubMessage1)
+ })
+_sym_db.RegisterMessage(SubMessage1)
+
+SubMessage2 = _reflection.GeneratedProtocolMessageType('SubMessage2', (_message.Message,), {
+ 'DESCRIPTOR' : _SUBMESSAGE2,
+ '__module__' : 'msg_pb2'
+ # @@protoc_insertion_point(class_scope:app.protobuf.SubMessage2)
+ })
+_sym_db.RegisterMessage(SubMessage2)
+
+MessageBytesExtra = _reflection.GeneratedProtocolMessageType('MessageBytesExtra', (_message.Message,), {
+ 'DESCRIPTOR' : _MESSAGEBYTESEXTRA,
+ '__module__' : 'msg_pb2'
+ # @@protoc_insertion_point(class_scope:app.protobuf.MessageBytesExtra)
+ })
+_sym_db.RegisterMessage(MessageBytesExtra)
+
+if _descriptor._USE_C_DESCRIPTORS == False:
+
+ DESCRIPTOR._options = None
+ _SUBMESSAGE1._serialized_start=27
+ _SUBMESSAGE1._serialized_end=72
+ _SUBMESSAGE2._serialized_start=74
+ _SUBMESSAGE2._serialized_end=119
+ _MESSAGEBYTESEXTRA._serialized_start=121
+ _MESSAGEBYTESEXTRA._serialized_end=230
+# @@protoc_insertion_point(module_scope)
diff --git a/app/util/protocbuf/readme.md b/app/util/protocbuf/readme.md
new file mode 100644
index 0000000..15b3c63
--- /dev/null
+++ b/app/util/protocbuf/readme.md
@@ -0,0 +1,34 @@
+# 说明
+
+## 解析
+```shell
+protoc --decode_raw < msg_data.txt
+```
+
+## 根据解析结果,设置.proto文件
+```shell
+1 {
+ 1: 16
+ 2: 0
+}
+3 {
+ 1: 1
+ 2: "wxid_4b1t09d63spw22"
+}
+3 {
+ 1: 7
+ 2: "\n\t\n\t\t2\n\t\n\t\n\t\tc6680ab2c57499a1a22e44a7eada76e8_\n\t\n\t1\n\t198\n\tv1_Gj7hfmi5\n\t\n\t\t\n\t\n\n"
+}
+3 {
+ 1: 2
+ 2: "c13acbc95512d1a59bb686d684fd64d8"
+}
+3 {
+ 1: 4
+ 2: "yiluoAK_47\\FileStorage\\Cache\\2023-08\\2286b5852db82f6cbd9c2084ccd52358"
+}
+```
+## 生成python文件
+```shell
+protoc --python_out=. msg.proto
+```
\ No newline at end of file
diff --git a/app/util/protocbuf/roomdata.proto b/app/util/protocbuf/roomdata.proto
new file mode 100644
index 0000000..36b1f9c
--- /dev/null
+++ b/app/util/protocbuf/roomdata.proto
@@ -0,0 +1,19 @@
+syntax = "proto3";
+package app.protobuf;
+option go_package=".;proto";
+
+message ChatRoomData {
+ message ChatRoomMember {
+ string wxID = 1;
+ string displayName = 2;
+ int32 state = 3;
+ }
+ repeated ChatRoomMember members = 1;
+ int32 field_2 = 2;
+ int32 field_3 = 3;
+ int32 field_4 = 4;
+ int32 room_capacity = 5;
+ int32 field_6 = 6;
+ int64 field_7 = 7;
+ int64 field_8 = 8;
+}
\ No newline at end of file
diff --git a/app/util/protocbuf/roomdata_pb2.py b/app/util/protocbuf/roomdata_pb2.py
new file mode 100644
index 0000000..7800214
--- /dev/null
+++ b/app/util/protocbuf/roomdata_pb2.py
@@ -0,0 +1,45 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler. DO NOT EDIT!
+# source: roomdata.proto
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+
+
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0eroomdata.proto\x12\x0c\x61pp.protobuf\"\x8b\x02\n\x0c\x43hatRoomData\x12:\n\x07members\x18\x01 \x03(\x0b\x32).app.protobuf.ChatRoomData.ChatRoomMember\x12\x0f\n\x07\x66ield_2\x18\x02 \x01(\x05\x12\x0f\n\x07\x66ield_3\x18\x03 \x01(\x05\x12\x0f\n\x07\x66ield_4\x18\x04 \x01(\x05\x12\x15\n\rroom_capacity\x18\x05 \x01(\x05\x12\x0f\n\x07\x66ield_6\x18\x06 \x01(\x05\x12\x0f\n\x07\x66ield_7\x18\x07 \x01(\x03\x12\x0f\n\x07\x66ield_8\x18\x08 \x01(\x03\x1a\x42\n\x0e\x43hatRoomMember\x12\x0c\n\x04wxID\x18\x01 \x01(\t\x12\x13\n\x0b\x64isplayName\x18\x02 \x01(\t\x12\r\n\x05state\x18\x03 \x01(\x05\x62\x06proto3')
+
+
+
+_CHATROOMDATA = DESCRIPTOR.message_types_by_name['ChatRoomData']
+_CHATROOMDATA_CHATROOMMEMBER = _CHATROOMDATA.nested_types_by_name['ChatRoomMember']
+ChatRoomData = _reflection.GeneratedProtocolMessageType('ChatRoomData', (_message.Message,), {
+
+ 'ChatRoomMember' : _reflection.GeneratedProtocolMessageType('ChatRoomMember', (_message.Message,), {
+ 'DESCRIPTOR' : _CHATROOMDATA_CHATROOMMEMBER,
+ '__module__' : 'roomdata_pb2'
+ # @@protoc_insertion_point(class_scope:app.protobuf.ChatRoomData.ChatRoomMember)
+ })
+ ,
+ 'DESCRIPTOR' : _CHATROOMDATA,
+ '__module__' : 'roomdata_pb2'
+ # @@protoc_insertion_point(class_scope:app.protobuf.ChatRoomData)
+ })
+_sym_db.RegisterMessage(ChatRoomData)
+_sym_db.RegisterMessage(ChatRoomData.ChatRoomMember)
+
+if _descriptor._USE_C_DESCRIPTORS == False:
+
+ DESCRIPTOR._options = None
+ _CHATROOMDATA._serialized_start=33
+ _CHATROOMDATA._serialized_end=300
+ _CHATROOMDATA_CHATROOMMEMBER._serialized_start=234
+ _CHATROOMDATA_CHATROOMMEMBER._serialized_end=300
+# @@protoc_insertion_point(module_scope)
diff --git a/requirements.txt b/requirements.txt
index afa9ee0da14451a74ae66a3838952e5635aed887..917bb83aebb523af977f0a8f8a89970e7f0c1b27 100644
GIT binary patch
delta 106
zcmX@cwt{_w8*>sb0~bR&Lp~6uGvqL&GS~v4F@qk10T_d13mA%kvL!&A#8AqR23BDL
hlr>^71(JpgAT`B6*;1g&Vunnh8D&s&jDYf{3;^815eEPO
delta 7
OcmZ3%evEB{8#4e4UIKLh
From eed226b04cfbc08aab6648f8dcc59f9d5c66b923 Mon Sep 17 00:00:00 2001
From: shuaikangzhou <863909694@qq.com>
Date: Wed, 6 Dec 2023 20:50:32 +0800
Subject: [PATCH 4/9] =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=81=8A=E5=A4=A9?=
=?UTF-8?q?=E8=AE=B0=E5=BD=95=E6=96=87=E4=BB=B6=E7=9A=84=E5=AD=98=E5=82=A8?=
=?UTF-8?q?=E7=BB=93=E6=9E=84=20#81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/DataBase/output_pc.py | 128 ++++++++++++++++++++++++++++++++++++--
app/util/path.py | 17 +++--
readme.md | 3 +-
requirements_pc.txt | 1 +
4 files changed, 138 insertions(+), 11 deletions(-)
diff --git a/app/DataBase/output_pc.py b/app/DataBase/output_pc.py
index 36c0756..77f0adf 100644
--- a/app/DataBase/output_pc.py
+++ b/app/DataBase/output_pc.py
@@ -8,11 +8,20 @@ from . import msg_db
from .package_msg import PackageMsg
from ..DataBase import hard_link_db
from ..person_pc import MePC
-from ..util import get_abs_path
+from ..util import path
os.makedirs('./data/聊天记录', exist_ok=True)
+def makedirs(path):
+ os.makedirs(path,exist_ok=True)
+ os.makedirs(os.path.join(path, 'image'), exist_ok=True)
+ os.makedirs(os.path.join(path, 'emoji'), exist_ok=True)
+ os.makedirs(os.path.join(path, 'video'), exist_ok=True)
+ os.makedirs(os.path.join(path, 'voice'), exist_ok=True)
+ os.makedirs(os.path.join(path, 'file'), exist_ok=True)
+
+
def escape_js_and_html(input_str):
# 转义HTML特殊字符
html_escaped = html.escape(input_str, quote=False)
@@ -439,7 +448,7 @@ class ChildThread(QThread):
def to_html_(self):
origin_docx_path = f"{os.path.abspath('.')}/data/聊天记录/{self.contact.remark}"
- os.makedirs(origin_docx_path, exist_ok=True)
+ makedirs(origin_docx_path)
messages = msg_db.get_messages(self.contact.wxid)
filename = f"{os.path.abspath('.')}/data/聊天记录/{self.contact.remark}/{self.contact.remark}.html"
f = open(filename, 'w', encoding='utf-8')
@@ -735,7 +744,115 @@ const chatMessages = [
MePC().avatar.save(os.path.join(origin_docx_path, 'myhead.png'))
self.contact.avatar.save(os.path.join(origin_docx_path, 'tahead.png'))
self.rangeSignal.emit(len(messages))
- emoji = {'[微笑]': '
', '[撇嘴]': '
', '[色]': '
', '[发呆]': '
', '[得意]': '
', '[流泪]': '
', '[害羞]': '
', '[闭嘴]': '
', '[睡]': '
', '[大哭]': '
', '[尴尬]': '
', '[发怒]': '
', '[调皮]': '
', '[呲牙]': '
', '[惊讶]': '
', '[难过]': '
', '[抓狂]': '
', '[吐]': '
', '[偷笑]': '
', '[愉快]': '
', '[白眼]': '
', '[傲慢]': '
', '[困]': '
', '[惊恐]': '
', '[憨笑]': '
', '[悠闲]': '
', '[咒骂]': '
', '[疑问]': '
', '[嘘]': '
', '[晕]': '
', '[衰]': '
', '[骷髅]': '
', '[敲打]': '
', '[再见]': '
', '[擦汗]': '
', '[抠鼻]': '
', '[鼓掌]': '
', '[坏笑]': '
', '[右哼哼]': '
', '[鄙视]': '
', '[委屈]': '
', '[快哭了]': '
', '[阴险]': '
', '[亲亲]': '
', '[可怜]': '
', '[笑脸]': '
', '[生病]': '
', '[脸红]': '
', '[破涕为笑]': '
', '[恐惧]': '
', '[失望]': '
', '[无语]': '
', '[嘿哈]': '
', '[捂脸]': '
', '[奸笑]': '
', '[机智]': '
', '[皱眉]': '
', '[耶]': '
', '[吃瓜]': '
', '[加油]': '
', '[汗]': '
', '[天啊]': '
', '[Emm]': '
', '[社会社会]': '
', '[旺柴]': '
', '[好的]': '
', '[打脸]': '
', '[哇]': '
', '[翻白眼]': '
', '[666]': '
', '[让我看看]': '
', '[叹气]': '
', '[苦涩]': '
', '[裂开]': '
', '[嘴唇]': '
', '[爱心]': '
', '[心碎]': '
', '[拥抱]': '
', '[强]': '
', '[弱]': '
', '[握手]': '
', '[胜利]': '
', '[抱拳]': '
', '[勾引]': '
', '[拳头]': '
', '[OK]': '
', '[合十]': '
', '[啤酒]': '
', '[咖啡]': '
', '[蛋糕]': '
', '[玫瑰]': '
', '[凋谢]': '
', '[菜刀]': '
', '[炸弹]': '
', '[便便]': '
', '[月亮]': '
', '[太阳]': '
', '[庆 祝]': '
', '[礼物]': '
', '[红包]': '
', '[發]': '
', '[福]': '
', '[烟花]': '
', '[爆竹]': '
', '[猪头]': '
', '[跳跳]': '
', '[发抖]': '
', '[转圈]': '
'}
+ emoji = {
+ '[微笑]': '
',
+ '[撇嘴]': '
',
+ '[色]': '
',
+ '[发呆]': '
',
+ '[得意]': '
',
+ '[流泪]': '
',
+ '[害羞]': '
',
+ '[闭嘴]': '
',
+ '[睡]': '
',
+ '[大哭]': '
',
+ '[尴尬]': '
',
+ '[发怒]': '
',
+ '[调皮]': '
',
+ '[呲牙]': '
',
+ '[惊讶]': '
',
+ '[难过]': '
',
+ '[抓狂]': '
',
+ '[吐]': '
',
+ '[偷笑]': '
',
+ '[愉快]': '
',
+ '[白眼]': '
',
+ '[傲慢]': '
',
+ '[困]': '
',
+ '[惊恐]': '
',
+ '[憨笑]': '
',
+ '[悠闲]': '
',
+ '[咒骂]': '
',
+ '[疑问]': '
',
+ '[嘘]': '
',
+ '[晕]': '
',
+ '[衰]': '
',
+ '[骷髅]': '
',
+ '[敲打]': '
',
+ '[再见]': '
',
+ '[擦汗]': '
',
+ '[抠鼻]': '
',
+ '[鼓掌]': '
',
+ '[坏笑]': '
',
+ '[右哼哼]': '
',
+ '[鄙视]': '
',
+ '[委屈]': '
',
+ '[快哭了]': '
',
+ '[阴险]': '
',
+ '[亲亲]': '
',
+ '[可怜]': '
',
+ '[笑脸]': '
',
+ '[生病]': '
',
+ '[脸红]': '
',
+ '[破涕为笑]': '
',
+ '[恐惧]': '
',
+ '[失望]': '
',
+ '[无语]': '
',
+ '[嘿哈]': '
',
+ '[捂脸]': '
',
+ '[奸笑]': '
',
+ '[机智]': '
',
+ '[皱眉]': '
',
+ '[耶]': '
',
+ '[吃瓜]': '
',
+ '[加油]': '
',
+ '[汗]': '
',
+ '[天啊]': '
',
+ '[Emm]': '
',
+ '[社会社会]': '
',
+ '[旺柴]': '
',
+ '[好的]': '
',
+ '[打脸]': '
',
+ '[哇]': '
',
+ '[翻白眼]': '
',
+ '[666]': '
',
+ '[让我看看]': '
',
+ '[叹气]': '
',
+ '[苦涩]': '
',
+ '[裂开]': '
',
+ '[嘴唇]': '
',
+ '[爱心]': '
',
+ '[心碎]': '
',
+ '[拥抱]': '
',
+ '[强]': '
',
+ '[弱]': '
',
+ '[握手]': '
',
+ '[胜利]': '
',
+ '[抱拳]': '
',
+ '[勾引]': '
',
+ '[拳头]': '
',
+ '[OK]': '
',
+ '[合十]': '
',
+ '[啤酒]': '
',
+ '[咖啡]': '
',
+ '[蛋糕]': '
',
+ '[玫瑰]': '
',
+ '[凋谢]': '
',
+ '[菜刀]': '
',
+ '[炸弹]': '
',
+ '[便便]': '
',
+ '[月亮]': '
',
+ '[太阳]': '
',
+ '[庆 祝]': '
',
+ '[礼物]': '
',
+ '[红包]': '
',
+ '[發]': '
',
+ '[福]': '
',
+ '[烟花]': '
',
+ '[爆竹]': '
',
+ '[猪头]': '
',
+ '[跳跳]': '
',
+ '[发抖]': '
',
+ '[转圈]': '
'}
from re import findall
for index, message in enumerate(messages):
type_ = message[2]
@@ -754,7 +871,7 @@ const chatMessages = [
f.write(
f'''{{ type:0, text: '{str_time}',is_send:0,avatar_path:''}},'''
)
-
+
emojiText = findall(r"(\[.+?\])", str_content)
for emoji_text in emojiText:
if emoji_text in emoji:
@@ -772,9 +889,8 @@ const chatMessages = [
match = re.search(pattern2, str_content)
if match:
continue
-
image_path = hard_link_db.get_image(content=str_content, thumb=False)
- image_path = get_abs_path(image_path)
+ image_path = path.get_relative_path(image_path, base_path=f'./data/聊天记录/{self.contact.remark}/image')
image_path = image_path.replace('\\', '/')
# print(f"tohtml:---{image_path}")
if self.is_5_min(timestamp):
diff --git a/app/util/path.py b/app/util/path.py
index f174866..2b80bc9 100644
--- a/app/util/path.py
+++ b/app/util/path.py
@@ -7,16 +7,26 @@ from app.util import dat2pic
os.makedirs('./data/image', exist_ok=True)
-def get_abs_path(path):
+def get_abs_path(path, base_path="/data/image"):
# return os.path.join(os.getcwd(), 'app/data/icons/404.png')
if path:
- base_path = os.getcwd() + "/data/image"
- output_path = dat2pic.decode_dat(os.path.join(MePC().wx_dir, path), base_path) # './data/image')
+ base_path = os.getcwd() + base_path
+ output_path = dat2pic.decode_dat(os.path.join(MePC().wx_dir, path), base_path)
return output_path if output_path else ':/icons/icons/404.png'
else:
return ':/icons/icons/404.png'
+def get_relative_path(path, base_path):
+ if path:
+ base_path = os.getcwd() + base_path
+ output_path = dat2pic.decode_dat(os.path.join(MePC().wx_dir, path), base_path)
+ relative_path = './image/'+os.path.basename(output_path) if output_path else 'https://www.bing.com/images/search?view=detailV2&ccid=Zww6woP3&id=CCC91337C740656E800E51247E928ACD3052FECF&thid=OIP.Zww6woP3Em49TdSG_lnggAHaEK&mediaurl=https%3a%2f%2fmeekcitizen.files.wordpress.com%2f2018%2f09%2f404.jpg%3fw%3d656&exph=360&expw=640&q=404&simid=608040792714530493&FORM=IRPRST&ck=151E7337A86F1B9C5C5DB08B15B90809&selectedIndex=21&itb=0'
+ return relative_path
+ else:
+ return ':/icons/icons/404.png'
+
+
def mkdir(path):
if not os.path.exists(path):
os.mkdir(path)
@@ -44,4 +54,3 @@ def wx_path():
return wx_location
except FileNotFoundError:
return '.'
-
diff --git a/readme.md b/readme.md
index c2b004f..2e9cf06 100644
--- a/readme.md
+++ b/readme.md
@@ -294,7 +294,8 @@ python main.py
---
-> 声明:该项目有且仅有一个目的:“留痕”——我的数据我做主,前提是“我的数据”其次才是“我做主”,禁止任何人以任何形式将其用于任何非法用途,对于使用该程序所造成的任何后果,所有创作者不承担任何责任🙄
+> 声明:该项目有且仅有一个目的:“留痕”——我的数据我做主,前提是“我的数据”其次才是“我做主”,禁止任何人以任何形式将其用于任何非法用途,对于使用该程序所造成的任何后果,所有创作者不承担任何责任🙄
+> 该软件不会对您使用的微信造成任何影响,更不会对他人的微信造成任何影响,任何企图篡改微信聊天数据的想法都是无稽之谈。本项目所有功能均建立在”前言“的基础之上,基于该项目的所有开发者均不能接受任何有悖于”前言“的功能需求,违者后果自负。
[](https://star-history.com/?utm_source=bestxtools.com#LC044/WeChatMsg&Date)
diff --git a/requirements_pc.txt b/requirements_pc.txt
index 9016df1..85927c4 100644
--- a/requirements_pc.txt
+++ b/requirements_pc.txt
@@ -12,3 +12,4 @@ requests
flask==3.0.0
pyecharts==2.0.1
jieba==0.42.1
+protobuf==4.25.1
From b3745867c654a3574960dd1dc35c67483269dee7 Mon Sep 17 00:00:00 2001
From: shuaikangzhou <863909694@qq.com>
Date: Wed, 6 Dec 2023 20:58:08 +0800
Subject: [PATCH 5/9] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E5=81=9C=E7=94=A8?=
=?UTF-8?q?=E8=AF=8D=E6=96=87=E4=BB=B6?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/config.py | 3 +-
app/resources/stopwords.txt | 2560 +++++++++++++++++++++++++++++++++++
chat_window1.png | Bin 181997 -> 0 bytes
main_pc.py | 4 +-
4 files changed, 2564 insertions(+), 3 deletions(-)
create mode 100644 app/resources/stopwords.txt
delete mode 100644 chat_window1.png
diff --git a/app/config.py b/app/config.py
index fd1d898..189cc0e 100644
--- a/app/config.py
+++ b/app/config.py
@@ -1,8 +1,9 @@
-version = '0.2.6'
+version = '0.2.7'
contact = '474379264'
description = [
'1. 支持获取个人信息
',
'2. 支持显示聊天界面
',
'3. 支持导出聊天记录
* csv
* html
',
'4. 查找联系人
',
+ '5. 生成年度报告
',
]
diff --git a/app/resources/stopwords.txt b/app/resources/stopwords.txt
new file mode 100644
index 0000000..11fe11b
--- /dev/null
+++ b/app/resources/stopwords.txt
@@ -0,0 +1,2560 @@
+wxid
+就
+说
+啥
+好
+干
+哦
+好
+嗯
+恩
+噢
+喔
+行
+拿
+你
+裂开
+苦涩
+叹气
+让我看看
+酷
+奋斗
+疑问
+擦汗
+抠鼻
+鄙视
+勾引
+奸笑
+嘿哈
+捂脸
+机智
+加油
+吃瓜
+尴尬
+乡村
+炸弹
+腹肌
+徐坤
+振兴
+着力
+努力
+注重
+提供
+意义
+习近平
+加快
+实施
+参与
+带动
+带领
+方式
+力量
+主体
+矛盾
+切实
+进一步
+已经
+价值
+成为
+拓展
+保障
+面临
+国家
+中国
+推进
+推动
+世界
+战略
+维护
+强化
+贯彻
+治理
+增强
+健全
+确保
+开展
+老婆
+坚持
+体系
+建设
+在
+对
+我国
+实现
+提高
+统筹
+完善
+工作
+领导
+深化
+构建
+作用
+支持
+弘扬
+指导
+形成
+思想
+把握
+提出
+!
+"
+#
+$
+%
+&
+'
+(
+)
+*
++
+,
+-
+--
+.
+..
+...
+......
+...................
+./
+.一
+.数
+.日
+/
+//
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+:
+://
+::
+;
+<
+=
+>
+>>
+?
+@
+A
+Lex
+[
+\
+]
+^
+_
+`
+exp
+sub
+sup
+|
+}
+~
+~~~~
+·
+×
+×××
+Δ
+Ψ
+γ
+μ
+φ
+φ.
+В
+—
+——
+———
+‘
+’
+’‘
+“
+”
+”,
+…
+……
+…………………………………………………③
+′∈
+′|
+℃
+Ⅲ
+↑
+→
+∈[
+∪φ∈
+≈
+①
+②
+②c
+③
+③]
+④
+⑤
+⑥
+⑦
+⑧
+⑨
+⑩
+──
+■
+▲
+
+、
+。
+〈
+〉
+《
+》
+》),
+」
+『
+』
+【
+】
+〔
+〕
+〕〔
+㈧
+一
+一.
+一一
+一下
+一个
+一些
+一何
+一切
+一则
+一则通过
+一天
+一定
+一方面
+一旦
+一时
+一来
+一样
+一次
+一片
+一番
+一直
+一致
+一般
+一起
+一转眼
+一边
+一面
+七
+万一
+三
+三天两头
+三番两次
+三番五次
+上
+上下
+上升
+上去
+上来
+上述
+上面
+下
+下列
+下去
+下来
+下面
+不
+不一
+不下
+不久
+不了
+不亦乐乎
+不仅
+不仅...而且
+不仅仅
+不仅仅是
+不会
+不但
+不但...而且
+不光
+不免
+不再
+不力
+不单
+不变
+不只
+不可
+不可开交
+不可抗拒
+不同
+不外
+不外乎
+不够
+不大
+不如
+不妨
+不定
+不对
+不少
+不尽
+不尽然
+不巧
+不已
+不常
+不得
+不得不
+不得了
+不得已
+不必
+不怎么
+不怕
+不惟
+不成
+不拘
+不择手段
+不敢
+不料
+不断
+不日
+不时
+不是
+不曾
+不止
+不止一次
+不比
+不消
+不满
+不然
+不然的话
+不特
+不独
+不由得
+不知不觉
+不管
+不管怎样
+不经意
+不胜
+不能
+不能不
+不至于
+不若
+不要
+不论
+不起
+不足
+不过
+不迭
+不问
+不限
+与
+与其
+与其说
+与否
+与此同时
+专门
+且
+且不说
+且说
+两者
+严格
+严重
+个
+个人
+个别
+中小
+中间
+丰富
+串行
+临
+临到
+为
+为主
+为了
+为什么
+为什麽
+为何
+为止
+为此
+为着
+主张
+主要
+举凡
+举行
+乃
+乃至
+乃至于
+么
+之
+之一
+之前
+之后
+之後
+之所以
+之类
+乌乎
+乎
+乒
+乘
+乘势
+乘机
+乘胜
+乘虚
+乘隙
+九
+也
+也好
+也就是说
+也是
+也罢
+了
+了解
+争取
+二
+二来
+二话不说
+二话没说
+于
+于是
+于是乎
+云云
+云尔
+互
+互相
+五
+些
+交口
+亦
+产生
+亲口
+亲手
+亲眼
+亲自
+亲身
+人
+人人
+人们
+人家
+人民
+什么
+什么样
+什麽
+仅
+仅仅
+今
+今后
+今天
+今年
+今後
+介于
+仍
+仍旧
+仍然
+从
+从不
+从严
+从中
+从事
+从今以后
+从优
+从古到今
+从古至今
+从头
+从宽
+从小
+从新
+从无到有
+从早到晚
+从未
+从来
+从此
+从此以后
+从而
+从轻
+从速
+从重
+他
+他人
+他们
+他是
+他的
+代替
+以
+以上
+以下
+以为
+以便
+以免
+以前
+以及
+以后
+以外
+以後
+以故
+以期
+以来
+以至
+以至于
+以致
+们
+任
+任何
+任凭
+任务
+企图
+伙同
+会
+伟大
+传
+传说
+传闻
+似乎
+似的
+但
+但凡
+但愿
+但是
+何
+何乐而不为
+何以
+何况
+何处
+何妨
+何尝
+何必
+何时
+何止
+何苦
+何须
+余外
+作为
+你
+你们
+你是
+你的
+使
+使得
+使用
+例如
+依
+依据
+依照
+依靠
+便
+便于
+促进
+保持
+保管
+保险
+俺
+俺们
+倍加
+倍感
+倒不如
+倒不如说
+倒是
+倘
+倘使
+倘或
+倘然
+倘若
+借
+借以
+借此
+假使
+假如
+假若
+偏偏
+做到
+偶尔
+偶而
+傥然
+像
+儿
+允许
+元/吨
+充其极
+充其量
+充分
+先不先
+先后
+先後
+先生
+光
+光是
+全体
+全力
+全年
+全然
+全身心
+全部
+全都
+全面
+八
+八成
+公然
+六
+兮
+共
+共同
+共总
+关于
+其
+其一
+其中
+其二
+其他
+其余
+其后
+其它
+其实
+其次
+具体
+具体地说
+具体来说
+具体说来
+具有
+兼之
+内
+再
+再其次
+再则
+再有
+再次
+再者
+再者说
+再说
+冒
+冲
+决不
+决定
+决非
+况且
+准备
+凑巧
+凝神
+几
+几乎
+几度
+几时
+几番
+几经
+凡
+凡是
+凭
+凭借
+出
+出于
+出去
+出来
+出现
+分别
+分头
+分期
+分期分批
+切
+切不可
+切切
+切勿
+切莫
+则
+则甚
+刚
+刚好
+刚巧
+刚才
+初
+别
+别人
+别处
+别是
+别的
+别管
+别说
+到
+到了儿
+到处
+到头
+到头来
+到底
+到目前为止
+前后
+前此
+前者
+前进
+前面
+加上
+加之
+加以
+加入
+加强
+动不动
+动辄
+勃然
+匆匆
+十分
+千
+千万
+千万千万
+半
+单
+单单
+单纯
+即
+即令
+即使
+即便
+即刻
+即如
+即将
+即或
+即是说
+即若
+却
+却不
+历
+原来
+去
+又
+又及
+及
+及其
+及时
+及至
+双方
+反之
+反之亦然
+反之则
+反倒
+反倒是
+反应
+反手
+反映
+反而
+反过来
+反过来说
+取得
+取道
+受到
+变成
+古来
+另
+另一个
+另一方面
+另外
+另悉
+另方面
+另行
+只
+只当
+只怕
+只是
+只有
+只消
+只要
+只限
+叫
+叫做
+召开
+叮咚
+叮当
+可
+可以
+可好
+可是
+可能
+可见
+各
+各个
+各人
+各位
+各地
+各式
+各种
+各级
+各自
+合理
+同
+同一
+同时
+同样
+后
+后来
+后者
+后面
+向
+向使
+向着
+吓
+吗
+否则
+吧
+吧哒
+吱
+呀
+呃
+呆呆地
+呐
+呕
+呗
+呜
+呜呼
+呢
+周围
+呵
+呵呵
+呸
+呼哧
+呼啦
+咋
+和
+咚
+咦
+咧
+
+敢
+敢于
+敢情
+数/
+整个
+断然
+方
+方便
+方才
+方能
+方面
+旁人
+无
+无宁
+无法
+无论
+既
+既...又
+既往
+既是
+既然
+日复一日
+日渐
+日益
+日臻
+日见
+时候
+昂然
+明显
+明确
+是
+是不是
+是以
+是否
+是的
+显然
+显著
+普通
+普遍
+暗中
+暗地里
+暗自
+更
+更为
+更加
+更进一步
+曾
+曾经
+替
+替代
+最
+最后
+最大
+最好
+最後
+最近
+最高
+有
+有些
+有关
+有利
+有力
+有及
+有所
+有效
+有时
+有点
+有的
+有的是
+有着
+有著
+望
+朝
+朝着
+末##末
+本
+本人
+本地
+本着
+本身
+权时
+来
+来不及
+来得及
+来看
+来着
+来自
+来讲
+来说
+极
+极为
+极了
+极其
+极力
+极大
+极度
+极端
+构成
+果然
+果真
+某
+某个
+某些
+某某
+根据
+根本
+格外
+梆
+概
+次第
+欢迎
+欤
+正值
+正在
+正如
+正巧
+正常
+正是
+此
+此中
+此后
+此地
+此处
+此外
+此时
+此次
+此间
+殆
+毋宁
+每
+每个
+每天
+每年
+每当
+每时每刻
+每每
+每逢
+比
+比及
+比如
+比如说
+比方
+比照
+比起
+比较
+毕竟
+毫不
+毫无
+毫无例外
+毫无保留地
+汝
+沙沙
+没
+没奈何
+没有
+沿
+沿着
+注意
+活
+深入
+清楚
+满
+满足
+漫说
+焉
+然
+然则
+然后
+然後
+然而
+照
+照着
+牢牢
+特别是
+特殊
+特点
+犹且
+犹自
+独
+独自
+猛然
+猛然间
+率尔
+率然
+现代
+现在
+理应
+理当
+理该
+瑟瑟
+甚且
+甚么
+甚或
+甚而
+甚至
+甚至于
+用
+用来
+甫
+甭
+由
+由于
+由是
+由此
+由此可见
+略
+略为
+略加
+略微
+白
+白白
+的
+的确
+的话
+皆可
+目前
+直到
+直接
+相似
+相信
+相反
+相同
+相对
+相对而言
+相应
+相当
+相等
+省得
+看
+看上去
+看出
+看到
+看来
+看样子
+看看
+看见
+看起来
+真是
+真正
+眨眼
+着
+着呢
+矣
+矣乎
+矣哉
+知道
+砰
+确定
+碰巧
+社会主义
+离
+种
+积极
+移动
+究竟
+穷年累月
+突出
+突然
+窃
+立
+立刻
+立即
+立地
+立时
+立马
+竟
+竟然
+竟而
+第
+第二
+等
+等到
+等等
+策略地
+简直
+简而言之
+简言之
+管
+类如
+粗
+精光
+紧接着
+累年
+累次
+纯
+纯粹
+纵
+纵令
+纵使
+纵然
+练习
+组成
+经
+经常
+经过
+结合
+结果
+给
+绝
+绝不
+绝对
+绝非
+绝顶
+继之
+继后
+继续
+继而
+维持
+综上所述
+缕缕
+罢了
+老
+老大
+老是
+老老实实
+考虑
+者
+而
+而且
+而况
+而又
+而后
+而外
+而已
+而是
+而言
+而论
+联系
+联袂
+背地里
+背靠背
+能
+能否
+能够
+腾
+自
+自个儿
+自从
+自各儿
+自后
+自家
+自己
+自打
+自身
+臭
+至
+至于
+至今
+至若
+致
+般的
+良好
+若
+若夫
+若是
+若果
+若非
+范围
+莫
+莫不
+莫不然
+莫如
+莫若
+莫非
+获得
+藉以
+虽
+虽则
+虽然
+虽说
+蛮
+行为
+行动
+表明
+表示
+被
+要
+要不
+要不是
+要不然
+要么
+要是
+要求
+见
+规定
+觉得
+譬喻
+譬如
+认为
+认真
+认识
+让
+许多
+论
+论说
+设使
+设或
+设若
+诚如
+诚然
+话说
+该
+该当
+说明
+说来
+说说
+请勿
+诸
+诸位
+诸如
+谁
+谁人
+谁料
+谁知
+谨
+豁然
+贼死
+赖以
+赶
+赶快
+赶早不赶晚
+起
+起先
+起初
+起头
+起来
+起见
+起首
+趁
+趁便
+趁势
+趁早
+趁机
+趁热
+趁着
+越是
+距
+跟
+路经
+转动
+转变
+转贴
+轰然
+较
+较为
+较之
+较比
+边
+达到
+达旦
+迄
+迅速
+过
+过于
+过去
+过来
+运用
+近
+近几年来
+近年来
+近来
+还
+还是
+还有
+还要
+这
+这一来
+这个
+这么
+这么些
+这么样
+这么点儿
+这些
+这会儿
+这儿
+这就是说
+这时
+这样
+这次
+这点
+这种
+这般
+这边
+这里
+这麽
+进入
+进去
+进来
+进步
+进而
+进行
+连
+连同
+连声
+连日
+连日来
+连袂
+连连
+迟早
+迫于
+适应
+适当
+适用
+逐步
+逐渐
+通常
+通过
+造成
+逢
+遇到
+遭到
+遵循
+遵照
+避免
+那
+那个
+那么
+那么些
+那么样
+那些
+那会儿
+那儿
+那时
+那末
+那样
+那般
+那边
+那里
+那麽
+部分
+都
+鄙人
+采取
+里面
+重大
+重新
+重要
+鉴于
+针对
+长期以来
+长此下去
+长线
+长话短说
+问题
+间或
+防止
+阿
+附近
+陈年
+限制
+陡然
+除
+除了
+除却
+除去
+除外
+除开
+除此
+除此之外
+除此以外
+除此而外
+除非
+随
+随后
+随时
+随着
+随著
+隔夜
+隔日
+难得
+难怪
+难说
+难道
+难道说
+集中
+零
+需要
+非但
+非常
+非徒
+非得
+非特
+非独
+靠
+顶多
+顷
+顷刻
+顷刻之间
+顷刻间
+顺
+顺着
+顿时
+颇
+风雨无阻
+饱
+首先
+马上
+高低
+高兴
+默然
+默默地
+齐
+︿
+!
+#
+$
+%
+&
+'
+(
+)
+)÷(1-
+)、
+*
++
++ξ
+++
+,
+,也
+-
+-β
+--
+-[*]-
+.
+/
+0
+0:2
+1
+1.
+12%
+2
+2.3%
+3
+4
+5
+5:0
+6
+7
+8
+9
+:
+;
+<
+<±
+<Δ
+<λ
+<φ
+<<
+=
+=″
+=☆
+=(
+=-
+=[
+={
+>
+>λ
+?
+@
+A
+LI
+R.L.
+ZXFITL
+[
+[①①]
+[①②]
+[①③]
+[①④]
+[①⑤]
+[①⑥]
+[①⑦]
+[①⑧]
+[①⑨]
+[①A]
+[①B]
+[①C]
+[①D]
+[①E]
+[①]
+[①a]
+[①c]
+[①d]
+[①e]
+[①f]
+[①g]
+[①h]
+[①i]
+[①o]
+[②
+[②①]
+[②②]
+[②③]
+[②④
+[②⑤]
+[②⑥]
+[②⑦]
+[②⑧]
+[②⑩]
+[②B]
+[②G]
+[②]
+[②a]
+[②b]
+[②c]
+[②d]
+[②e]
+[②f]
+[②g]
+[②h]
+[②i]
+[②j]
+[③①]
+[③⑩]
+[③F]
+[③]
+[③a]
+[③b]
+[③c]
+[③d]
+[③e]
+[③g]
+[③h]
+[④]
+[④a]
+[④b]
+[④c]
+[④d]
+[④e]
+[⑤]
+[⑤]]
+[⑤a]
+[⑤b]
+[⑤d]
+[⑤e]
+[⑤f]
+[⑥]
+[⑦]
+[⑧]
+[⑨]
+[⑩]
+[*]
+[-
+[]
+]
+]∧′=[
+][
+_
+a]
+b]
+c]
+e]
+f]
+ng昉
+{
+{-
+|
+}
+}>
+~
+~±
+~+
+¥
+打开天窗说亮话
+到目前为止
+赶早不赶晚
+常言说得好
+何乐而不为
+毫无保留地
+由此可见
+这就是说
+这么点儿
+综上所述
+总的来看
+总的来说
+总的说来
+总而言之
+相对而言
+除此之外
+反过来说
+恰恰相反
+如上所述
+换句话说
+具体地说
+具体说来
+另一方面
+与此同时
+一则通过
+毫无例外
+不然的话
+从此以后
+从古到今
+从古至今
+从今以后
+大张旗鼓
+从无到有
+从早到晚
+弹指之间
+不亦乐乎
+不知不觉
+不止一次
+不择手段
+不可开交
+不可抗拒
+不仅仅是
+不管怎样
+挨家挨户
+长此下去
+长话短说
+除此而外
+除此以外
+除此之外
+得天独厚
+川流不息
+长期以来
+挨门挨户
+挨门逐户
+多多少少
+多多益善
+二话不说
+更进一步
+二话没说
+分期分批
+风雨无阻
+归根到底
+归根结底
+反之亦然
+大面儿上
+倒不如说
+成年累月
+换句话说
+或多或少
+简而言之
+接连不断
+尽如人意
+尽心竭力
+尽心尽力
+尽管如此
+据我所知
+具体地说
+具体来说
+具体说来
+近几年来
+每时每刻
+屡次三番
+三番两次
+三番五次
+三天两头
+另一方面
+老老实实
+年复一年
+恰恰相反
+顷刻之间
+穷年累月
+千万千万
+日复一日
+如此等等
+如前所述
+如上所述
+一方面
+切不可
+顷刻间
+全身心
+另方面
+另一个
+猛然间
+默默地
+就是说
+近年来
+尽可能
+接下来
+简言之
+急匆匆
+即是说
+基本上
+换言之
+充其极
+充其量
+暗地里
+反之则
+比如说
+背地里
+背靠背
+并没有
+不得不
+不得了
+不得已
+不仅仅
+不经意
+不能不
+不外乎
+不由得
+不怎么
+不至于
+策略地
+差不多
+常言道
+常言说
+多年来
+多年前
+差一点
+敞开儿
+抽冷子
+大不了
+反倒是
+反过来
+大体上
+当口儿
+倒不如
+怪不得
+动不动
+看起来
+看上去
+看样子
+够瞧的
+到了儿
+呆呆地
+来不及
+来得及
+到头来
+连日来
+于是乎
+为什么
+这会儿
+换言之
+那会儿
+那么些
+那么样
+什么样
+反过来
+紧接着
+就是说
+要不然
+要不是
+一方面
+以至于
+自个儿
+自各儿
+之所以
+这么些
+这么样
+怎么办
+怎么样
+谁知
+顺着
+似的
+虽然
+虽说
+虽则
+随着
+所以
+他们
+他人
+它们
+她们
+倘或
+倘然
+倘若
+倘使
+要么
+要是
+也罢
+也好
+以便
+依照
+以及
+以免
+以至
+以致
+抑或
+因此
+因而
+因为
+由于
+有的
+有关
+有些
+于是
+与否
+与其
+越是
+云云
+一般
+一旦
+一来
+一切
+一样
+同时
+万一
+为何
+为了
+为着
+嗡嗡
+我们
+呜呼
+乌乎
+无论
+无宁
+沿着
+毋宁
+向着
+照着
+怎么
+咱们
+在下
+再说
+再者
+怎样
+这边
+这儿
+这个
+这里
+这么
+这时
+这些
+这样
+正如
+之类
+之一
+只是
+只限
+只要
+只有
+至于
+诸位
+着呢
+纵令
+纵然
+纵使
+遵照
+作为
+喔唷
+自从
+自己
+自家
+自身
+总之
+要不
+哎呀
+哎哟
+俺们
+按照
+吧哒
+罢了
+本着
+比方
+比如
+鄙人
+彼此
+别的
+别说
+并且
+不比
+不成
+不单
+不但
+不独
+不管
+不光
+不过
+不仅
+不拘
+不论
+不怕
+不然
+不如
+不特
+不惟
+不问
+不只
+朝着
+趁着
+除非
+除了
+此间
+此外
+从而
+但是
+当着
+的话
+等等
+叮咚
+对于
+多少
+而况
+而且
+而是
+而外
+而言
+而已
+尔后
+反之
+非但
+非徒
+否则
+嘎登
+各个
+各位
+各种
+各自
+根据
+故此
+固然
+关于
+果然
+果真
+哈哈
+何处
+何况
+何时
+哼唷
+呼哧
+还是
+还有
+或是
+或者
+极了
+及其
+及至
+即便
+即或
+即令
+即若
+即使
+既然
+既是
+继而
+加之
+假如
+假若
+假使
+鉴于
+几时
+较之
+接着
+结果
+进而
+尽管
+经过
+就是
+可见
+可是
+可以
+况且
+开始
+开外
+来着
+例如
+连同
+两者
+另外
+慢说
+漫说
+每当
+莫若
+某个
+某些
+哪边
+哪儿
+哪个
+哪里
+哪年
+哪怕
+哪天
+哪些
+哪样
+那边
+那儿
+那个
+那里
+那么
+那时
+那些
+那样
+乃至
+宁可
+宁肯
+宁愿
+你们
+啪达
+旁人
+凭借
+其次
+其二
+其他
+其它
+其一
+其余
+其中
+起见
+起见
+岂但
+前后
+前者
+然而
+然后
+然则
+人家
+任何
+任凭
+如此
+如果
+如何
+如其
+如若
+若非
+若是
+上下
+尚且
+设若
+设使
+甚而
+甚么
+甚至
+省得
+时候
+什么
+使得
+是的
+首先
+首先
+其次
+再次
+最后
+您们
+它们
+她们
+他们
+我们
+你是
+您是
+我是
+他是
+她是
+它是
+不是
+你们
+啊哈
+啊呀
+啊哟
+挨次
+挨个
+挨着
+哎呀
+哎哟
+俺们
+按理
+按期
+默然
+按时
+按说
+按照
+暗中
+暗自
+昂然
+八成
+倍感
+倍加
+本人
+本身
+本着
+并非
+别人
+必定
+比起
+比如
+比照
+鄙人
+毕竟
+必将
+必须
+并肩
+并没
+并排
+并且
+并无
+勃然
+不必
+不常
+不大
+不单
+不但
+而且
+不得
+不迭
+不定
+不独
+不对
+不妨
+不管
+不光
+不过
+不会
+不仅
+不拘
+不力
+不了
+不料
+不论
+不满
+不免
+不起
+不巧
+不然
+不日
+不少
+不胜
+不时
+不是
+不同
+不能
+不要
+不外
+不下
+不限
+不消
+不已
+不再
+不曾
+不止
+不只
+才能
+彻夜
+趁便
+趁机
+趁热
+趁势
+趁早
+趁着
+成心
+乘机
+乘势
+乘隙
+乘虚
+诚然
+迟早
+充分
+出来
+出去
+除此
+除非
+除开
+除了
+除去
+除却
+除外
+处处
+传说
+传闻
+纯粹
+此后
+此间
+此外
+此中
+次第
+匆匆
+从不
+从此
+从而
+从宽
+从来
+从轻
+从速
+从头
+从未
+从小
+从新
+从严
+从优
+从中
+从重
+凑巧
+存心
+达旦
+打从
+大大
+大抵
+大都
+大多
+大凡
+大概
+大家
+大举
+大略
+大约
+大致
+待到
+单纯
+单单
+但是
+但愿
+当场
+当儿
+当即
+当然
+当庭
+当头
+当下
+当真
+当中
+当着
+倒是
+到处
+到底
+到头
+得起
+的话
+的确
+等到
+等等
+顶多
+动辄
+陡然
+独自
+断然
+对于
+顿时
+多次
+多多
+多亏
+而后
+而论
+而且
+而是
+而外
+而言
+而已
+而又
+尔等
+反倒
+反而
+反手
+反之
+方才
+方能
+非常
+非但
+非得
+分头
+奋勇
+愤然
+更为
+更加
+根据
+个人
+各式
+刚才
+敢情
+该当
+嘎嘎
+否则
+赶快
+敢于
+刚好
+刚巧
+高低
+格外
+隔日
+隔夜
+公然
+过于
+果然
+果真
+光是
+关于
+共总
+姑且
+故此
+故而
+故意
+固然
+惯常
+毫不
+毫无
+很多
+何须
+好在
+何必
+何尝
+何妨
+何苦
+何况
+何止
+很少
+轰然
+后来
+呼啦
+哗啦
+互相
+忽地
+忽然
+话说
+或是
+伙同
+豁然
+恍然
+还是
+或许
+或者
+基本
+基于
+极大
+极度
+极端
+极力
+极其
+极为
+即便
+即将
+及其
+及至
+即刻
+即令
+即使
+几度
+几番
+几乎
+几经
+既然
+继而
+继之
+加上
+加以
+加之
+假如
+假若
+假使
+间或
+将才
+简直
+鉴于
+将近
+将要
+交口
+较比
+较为
+较之
+皆可
+截然
+截至
+藉以
+借此
+借以
+届时
+尽快
+近来
+进而
+进来
+进去
+尽管
+尽量
+尽然
+就算
+居然
+就此
+就地
+竟然
+究竟
+经常
+尽早
+精光
+经过
+就是
+局外
+举凡
+据称
+据此
+据实
+据说
+可好
+看来
+开外
+绝不
+决不
+据悉
+决非
+绝顶
+绝对
+绝非
+可见
+可能
+可是
+可以
+恐怕
+来讲
+来看
+快要
+况且
+拦腰
+牢牢
+老是
+累次
+累年
+理当
+理该
+理应
+例如
+立地
+立刻
+立马
+立时
+联袂
+连连
+连日
+路经
+临到
+连声
+连同
+连袂
+另外
+另行
+屡次
+屡屡
+缕缕
+率尔
+率然
+略加
+略微
+略为
+论说
+马上
+猛然
+没有
+每当
+每逢
+每每
+莫不
+莫非
+莫如
+莫若
+哪怕
+那么
+那末
+那些
+乃至
+难道
+难得
+难怪
+难说
+你们
+凝神
+宁可
+宁肯
+宁愿
+偶而
+偶尔
+碰巧
+譬如
+偏偏
+平素
+迫于
+扑通
+其次
+其后
+其实
+其它
+起初
+起来
+起首
+起头
+起先
+岂但
+岂非
+岂止
+恰逢
+恰好
+恰恰
+恰巧
+恰如
+恰似
+前后
+前者
+切莫
+切切
+切勿
+亲口
+亲身
+亲手
+亲眼
+亲自
+顷刻
+请勿
+取道
+权时
+全都
+全力
+全年
+全然
+然而
+然后
+人家
+人人
+仍旧
+仍然
+日见
+日渐
+日益
+日臻
+如常
+如次
+如果
+如今
+如期
+如若
+如上
+如下
+上来
+上去
+瑟瑟
+沙沙
+啊
+哎
+唉
+俺
+按
+吧
+把
+甭
+别
+嘿
+很
+乎
+会
+或
+既
+及
+啦
+了
+们
+你
+您
+哦
+砰
+啊
+你
+我
+他
+她
+它
+听
+哪
+想
+打
+🙄
+奥
+真
+旺柴
\ No newline at end of file
diff --git a/chat_window1.png b/chat_window1.png
deleted file mode 100644
index 2325b4e6837217bcf09ec71887cb5b95848dc4c0..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 181997
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