diff --git a/app/DataBase/msg.py b/app/DataBase/msg.py index 7124775..90cf2fa 100644 --- a/app/DataBase/msg.py +++ b/app/DataBase/msg.py @@ -471,6 +471,32 @@ class Msg: # result.sort(key=lambda x: x[5]) return result + def get_emoji_Img(self, username_, year_='all'): + sql = f""" + SELECT StrContent, count(StrContent) + from MSG + where StrTalker = ? and isSender = ? + {"and strftime('%Y', CreateTime, 'unixepoch', 'localtime') = ?" if year_ != "all" else ""} and Type=47 + group by StrContent + order by Count(StrContent) desc + limit 3 + """ + me_result = None + ta_result = None + if not self.open_flag: + return None, None + try: + lock.acquire(True) + self.cursor.execute(sql, [username_, 1, year_] if year_ != "all" else [username_, 1]) + me_result = self.cursor.fetchall() + self.cursor.execute(sql, [username_, 0, year_] if year_ != "all" else [username_, 0]) + ta_result = self.cursor.fetchall() + except sqlite3.DatabaseError: + logger.error(f'{traceback.format_exc()}\n数据库损坏请删除msg文件夹重试') + finally: + lock.release() + return me_result, ta_result + def get_first_time_of_message(self, username_): if not self.open_flag: return None diff --git a/app/analysis/analysis.py b/app/analysis/analysis.py index 2fea05d..e635155 100644 --- a/app/analysis/analysis.py +++ b/app/analysis/analysis.py @@ -1,5 +1,6 @@ from collections import Counter from datetime import datetime +import re from PyQt5.QtCore import QFile, QTextStream, QIODevice @@ -11,6 +12,7 @@ from app.DataBase import msg_db, MsgType from pyecharts import options as opts from pyecharts.charts import WordCloud, Calendar, Bar, Line from app.resources import resource_rc +from app.util.emoji import get_emoji var = resource_rc.qt_resource_name charts_width = 800 @@ -243,6 +245,50 @@ def hour_count(wxid, is_Annual_report=False, year='2023'): } +def emoji_count(wxid, is_Annual_report=False, year='2023'): + # 最常发的表情 + txt_messages = msg_db.get_messages_by_type(wxid, MsgType.TEXT, is_Annual_report, year) + me_txt_messages = ''.join(map(lambda x: x[7] if x[4] == 1 else '', txt_messages)) + ta_txt_messages = ''.join(map(lambda x: x[7] if x[4] == 0 else '', txt_messages)) + + pattern = re.compile(r"\[.+?\]") + MeEmoji = re.findall(pattern, me_txt_messages) + TaEmoji = re.findall(pattern, ta_txt_messages) + + # 按照出现次数统计 + MeEmoji_num = Counter(MeEmoji) + TaEmoji_num = Counter(TaEmoji) + + # 打印统计结果 + ta_total_emoji_num = len(TaEmoji) + me_total_emoji_num = len(MeEmoji) + ta_max_emoji = TaEmoji_num.most_common(10) + me_max_emoji = MeEmoji_num.most_common(10) + print("ta发的表情数:", len(TaEmoji)) + print("我发的表情数:", len(MeEmoji)) + print("---"*10) + print("ta最常用的 10 个表情:\n", TaEmoji_num.most_common(10)) + print("---"*10) + print("我最常用的 10 个表情:\n", MeEmoji_num.most_common(10)) + + # 最常发的表情包图片 + MeImgList, TaImgList = msg_db.get_emoji_Img(wxid, year) + MeImgDict = {} + TaImgDict = {} + for xml, num in MeImgList: + MeImgDict[get_emoji(xml)] = num + for xml, num in TaImgList: + TaImgDict[get_emoji(xml)] = num + return { + 'ta_total_emoji_num': ta_total_emoji_num, + 'me_total_emoji_num': me_total_emoji_num, + 'ta_max_emoji': ta_max_emoji, + 'me_max_emoji': me_max_emoji, + 'MeImgDict': MeImgDict, # 三张图片地址+数量,字典格式,path为key + 'MeImgDict': MeImgDict + } + + class Analysis: pass @@ -250,13 +296,16 @@ class Analysis: if __name__ == '__main__': msg_db.init_database(path='../DataBase/Msg/MSG.db') # w = wordcloud('wxid_0o18ef858vnu22') - w_data = wordcloud('wxid_27hqbq7vx5hf22', True, '2023') - # print(w_data) - # w['chart_data'].render("./data/聊天统计/wordcloud.html") - c = calendar_chart('wxid_27hqbq7vx5hf22', False, '2023') - c['chart_data'].render("./data/聊天统计/calendar.html") - # print('c:::', c) - m = month_count('wxid_27hqbq7vx5hf22', False, '2023') - m['chart_data'].render("./data/聊天统计/month_num.html") - h = hour_count('wxid_27hqbq7vx5hf22',is_Annual_report=False) - h['chart_data'].render("./data/聊天统计/hour_count.html") + # w_data = wordcloud('wxid_27hqbq7vx5hf22', True, '2023') + # # print(w_data) + # # w['chart_data'].render("./data/聊天统计/wordcloud.html") + # c = calendar_chart('wxid_27hqbq7vx5hf22', False, '2023') + # c['chart_data'].render("./data/聊天统计/calendar.html") + # # print('c:::', c) + # m = month_count('wxid_27hqbq7vx5hf22', False, '2023') + # m['chart_data'].render("./data/聊天统计/month_num.html") + # h = hour_count('wxid_27hqbq7vx5hf22',is_Annual_report=False) + # h['chart_data'].render("./data/聊天统计/hour_count.html") + + h = emoji_count('wxid_27hqbq7vx5hf22',is_Annual_report=False) + # h['chart_data'].render("./data/聊天统计/hour_count.html") diff --git a/app/web_ui/web.py b/app/web_ui/web.py index 5047d39..7ea07aa 100644 --- a/app/web_ui/web.py +++ b/app/web_ui/web.py @@ -89,11 +89,19 @@ def month(): @app.route('/hour_count') def hour(): wxid = contact.wxid - world_cloud_data = analysis.month_count(wxid, is_Annual_report=True) + world_cloud_data = analysis.hour_count(wxid, is_Annual_report=True) with open('hour_count.html', 'w', encoding='utf-8') as f: f.write(render_template('hour_count.html', **world_cloud_data)) return render_template('hour_count.html', **world_cloud_data) +@app.route('/emoji_count') +def emoji_count(): + wxid = contact.wxid + world_cloud_data = analysis.emoji_count(wxid, is_Annual_report=True) + with open('emoji_count.html', 'w', encoding='utf-8') as f: + f.write(render_template('emoji_count.html', **world_cloud_data)) + return render_template('emoji_count.html', **world_cloud_data) + @app.route('/wordcloud') def cone():