diff --git a/message_storage/message_to_db.py b/message_storage/message_to_db.py index 6ac4a2f..86b3df3 100644 --- a/message_storage/message_to_db.py +++ b/message_storage/message_to_db.py @@ -42,51 +42,58 @@ def archive_message(group_id, timestamp_str, sender, content, message_type, atta def get_messages(group_id, all_contacts: dict): # 连接到数据库 - connection = pymysql.connect(**db_config) - - try: - # 获取redis 中的上次总结时间,本次从上次开始算,弱没有,则从8小时之前开始计算 - # 生成Redis key + with pymysql.connect(**db_config) as connection: + # 获取 redis 中的上次总结时间,本次从上次开始算,若没有,则从 8 小时之前开始计算 key = f"{group_id}:summary_time" last_summary_time = r.get(key) + + # 如果 Redis 返回值为字节类型,转换为字符串 + if last_summary_time: + last_summary_time = last_summary_time.decode('utf-8') + current_time = datetime.now() current_date = current_time.strftime('%Y-%m-%d %H:%M:%S') - if last_summary_time is None: - # 获取当前时间并计算8小时前的时间 + + if not last_summary_time: + # 获取当前时间并计算 8 小时前的时间 eight_hours_ago = current_time - timedelta(hours=8) - - # 转换为数据库中存储的时间格式 (假设timestamp是DATETIME类型) last_summary_time = eight_hours_ago.strftime('%Y-%m-%d %H:%M:%S') - r.set(key, current_date) - with connection.cursor() as cursor: + else: + # 检查 redis 中的时间与当前时间差是否小于 3 小时 + last_summary_time_obj = datetime.strptime(last_summary_time, '%Y-%m-%d %H:%M:%S') + time_diff = current_time - last_summary_time_obj - # 执行查询,获取最近8小时的消息 + if time_diff < timedelta(hours=3): + # 如果小于 3 小时,取当天的内容 + last_summary_time = current_time.replace(hour=0, minute=0, second=0, microsecond=0).strftime( + '%Y-%m-%d %H:%M:%S') + elif time_diff > timedelta(days=1): + # 如果超过 24 小时,将时间设置为当天 0 点 + last_summary_time = current_time.replace(hour=0, minute=0, second=0, microsecond=0).strftime( + '%Y-%m-%d %H:%M:%S') + + # 更新 Redis 存储的当前时间 + r.set(key, current_date) + + with connection.cursor() as cursor: + # 执行查询,获取最近 8 小时的消息 query = """ - SELECT group_id, timestamp, sender, content - FROM messages - WHERE timestamp >= %s AND message_type =1 and group_id = %s - """ + SELECT timestamp, sender, content + FROM messages + WHERE timestamp >= %s AND message_type = 1 AND group_id = %s + """ cursor.execute(query, (last_summary_time, group_id)) - # 提取结果并组成带逗号的字符串 + # 构建最终的结果字符串 result = [] - if cursor.rowcount > 0: - result.append(f"聊天记录总行数:{cursor.rowcount}") for row in cursor.fetchall(): - group_id = row[0] - timestamp = row[1] - sender = row[2] - content = row[3] - result.append(f"{group_id},{timestamp},{all_contacts.get(sender, sender)},{content}") + timestamp, sender, content = row + sender_name = all_contacts.get(sender, sender) # 获取发送者的名字,若找不到则使用原 ID + result.append(f"{timestamp},{sender_name},{content}") - # 将列表中的字符串连接成一个最终的结果 - result_str = "\n".join(result) - # print(result_str) # 输出带逗号的字符串 + result_str = "\n".join(result) # 将结果拼接为最终字符串 return result_str - finally: - connection.close() # 关闭数据库连接 - # 示例用法 if __name__ == "__main__": diff --git a/message_summary/message_summary_4o.py b/message_summary/message_summary_4o.py index 743114f..9485cf4 100644 --- a/message_summary/message_summary_4o.py +++ b/message_summary/message_summary_4o.py @@ -18,21 +18,107 @@ def message_summary(content): # 设置Authorization和URL authorization = "46a5674a-e978-491b-a810-5d54605f2c36" # 请替换为真实的Authorization token url = 'http://127.0.0.1:8080/v1/chat/completions' + # 群聊精华总结生成指令 + prompt = """ + 【基础要求】 + + 总结风格:采用轻松幽默的口吻,加入适量的网络流行语和emoji(如👍/🎉等),让总结更有趣。 + 时间范围:[自动识别日期]的群聊记录。 + + 【结构要求】: + ⭐ 创意标题(10字内,带emoji) + 📊 数据看板(消息总数/最活跃时段/表情包冠军) + 🕒 聊天时段(开始时间 - 结束时间) + 🗂️ 话题星系(分类3-5个核心话题) + 🏆 今日MVP(最具贡献成员+获奖理由) + + 【话题分析细则】: + 分类逻辑:根据聊天主题相关性自动聚类。 + 过滤无效内容:过滤广告/刷屏等无效内容。 + 识别延伸话题树:自动识别主话题及相关子话题。 + + 质量评分维度: + 🎯 参与度(参与人数/消息密度) + 💡 信息量(实用知识/资源分享) + 🎭 娱乐值(段子/梗图/神回复) + ⚡ 热议指数(讨论持续时间) + + 评分方式:根据话题参与人数动态生成星级评分(1-5颗星)。 + + 贡献者识别: + 标记每个话题的"话题发起者"和"气氛担当"。 + 统计优质内容产出者(表情包/段子/资源等)。 + 自动生成趣味头衔(如“段子王”、“知识达人”、“活跃分子”等)。 + + 【输出模板】 + 「[群名]-[日期]群聊总结」 + + 📊 今日数据快报: + - 共诞生[消息数]条信息 + - 最活跃时段:[时段]([消息数]条/小时) + - 表情包冠军:[用户](贡献[数量]个搞笑表情) + - 聊天时段:[开始时间] - [结束时间] + + 🌌 话题总结: + 1️⃣ 【[话题1]】⭐️⭐️⭐️⭐️⭐️ + 🔍 [3句话简要回顾] + 🏅 热点人物:[@用户A] [@用户B] + 💬 精彩语录:"[精选金句]"... + + 2️⃣ 【[话题2]】⭐️⭐️⭐️⭐️ + 🔍 [3句话高能回顾] + 🏅 知识分享:[@用户C] + 📌 实用内容:[资源链接/知识点总结]... + + 🎖️ 今日荣誉榜: + - 🏆 群聊MVP:[@用户D] + 👑 获奖理由: + - 发起[话题数]个热门话题 + - 贡献[数量]个表情包/段子 + - 分享了[亮点内容] + + ✨ 潜力新人:[@用户E](首次贡献[亮点内容]) + + 🔮 明日预告: + "[根据今日话题生成的趣味预测]" + + 【示例输出】 + 「吃货联盟-5.20群聊总结」 + + 📊 今日数据快报: + - 共诞生428条信息 + - 最活跃时段:20:00-21:00(153条/小时) + - 表情包冠军:🐻熊本熊(贡献23个美食表情) + - 聊天时段:18:30 - 22:00 + + 🌌 话题总结: + 1️⃣ 【暗黑料理实验室】⭐️⭐️⭐️⭐️⭐️ + 🔍 从“香菜月饼”到“螺蛳粉蛋糕”,群友脑洞大开,表情包大战也同步上线。 + 🏅 热点人物:@美食探险家 @甜品恶魔 + 💬 精彩语录:"建议把折耳根榨汁做鸡尾酒"——@料理鬼才 + + 2️⃣ 【办公室偷吃指南】⭐️⭐️⭐️⭐️ + 🔍 提供了12种拆包装技巧,@咖啡小妹贡献的“键盘抽屉收纳法”引发热议 + 📌 实用内容:无声咀嚼口香糖推荐清单... + + 🎖️ 今日荣誉榜: + - 🏆 群聊MVP:@零食特工 + 👑 获奖理由: + - 发起3个受欢迎话题 + - 贡献15个表情包 + - 发明了“薯片袋静音开封法”已申请专利 + + ✨ 潜力新人:@养生青年(首度分享“枸杞拿铁”配方) + + 🔮 明日预告: + "基于今日的暗黑料理趋势,明天可能会出现《泡面的一百种吃法》新企划!" + + ### 调节参数说明 + - 严谨度调节:通过增减评分维度权重,调整总结风格的专业度和趣味性。 + - 敏感词过滤:自动屏蔽政治/广告等违规内容,确保内容健康。 + - 个性化适配:根据群成员特点,生成个性化头衔和角色。 + """ - prompt = ('你是一个聊天记录总结助手,请使用如下格式进行聊天记录整理(如果存在多个主题则每个主题分开显示相关的参与者时间点,内容摘要):' - '[聊天主题] ☆☆☆' - '参与者:[列出参与者名字]' - '时间点:[开始时间] - [结束时间]' - '内容摘要: [简要总结讨论的内容,包括讨论的主题、观点、信息等。]' - '☑ 点评: [对讨论内容的简要评价,结合实际情况分析其意义或影响。]' - '· 趣味互动' - '[列出群成员之间互动的有趣部分,例如个人经验、笑点或特别的观点分享等。]' - '· 待跟进事项' - '[列出具体的行动项或下一步的讨论计划,包括需要落实的具体任务。]' - '· 结语' - '[总结今日讨论的主题和氛围,简要表达对未来讨论的期待。鼓励群成员继续参与。]' - '注: [对本次讨论的特殊情况进行说明,例如讨论话题较简单或较复杂等。]') - # 设置请求的payload data = { # "stream": True, "model": "windsurf/gpt4o",