diff --git a/message_report/db_init.sql b/message_report/db_init.sql new file mode 100644 index 0000000..19c27cb --- /dev/null +++ b/message_report/db_init.sql @@ -0,0 +1,7 @@ +CREATE TABLE IF NOT EXISTS speech_counts ( + group_id TEXT, + wx_id TEXT, + date TEXT, + count INTEGER, + PRIMARY KEY (group_id, wx_id, date) + ) \ No newline at end of file diff --git a/message_report/message_stats.db b/message_report/message_stats.db new file mode 100644 index 0000000..8fd57fe Binary files /dev/null and b/message_report/message_stats.db differ diff --git a/message_report/process_message.py b/message_report/process_message.py new file mode 100644 index 0000000..4bbfc03 --- /dev/null +++ b/message_report/process_message.py @@ -0,0 +1,28 @@ +import redis +from datetime import datetime +import re +# 连接到Redis +r = redis.Redis(host='192.168.2.32', port=6379, db=0) + + +def process_message(message): + # 示例message字符串 + + # 使用正则表达式提取用户名称和聊天室标识 + user_info_regex = re.compile(r"(\w+)\[([^\]]+)\]") + match = user_info_regex.search(message) + if match: + user_name = match.group(1) + chatroom_id = match.group(2) + print(f"用户名称: {user_name}") + print(f"聊天室标识: {chatroom_id}") + current_date = datetime.now().strftime('%Y-%m-%d') + # 生成Redis key + key = f"{chatroom_id}:{user_name}:{current_date}:count" + # 使用Redis哈希(或字符串)增加发言次数 + print(key) + r.hincrby(key, 'count', 1) # 这里使用哈希,但也可以考虑用字符串的INCR操作 + # 或者使用字符串:r.incr(key) # 如果只存储一个整数值,字符串类型可能更简单 + else: + print("Failed to extract user name or chatroom ID.") + diff --git a/message_report/write_db.py b/message_report/write_db.py new file mode 100644 index 0000000..54ad1d9 --- /dev/null +++ b/message_report/write_db.py @@ -0,0 +1,71 @@ +import schedule +import time +import sqlite3 +from datetime import datetime, timedelta +import redis +# 连接到Redis +r = redis.Redis(host='192.168.2.32', port=6379, db=0) + +def write_to_db(): + # 连接到SQLite数据库 + conn = sqlite3.connect('message_stats.db') + c = conn.cursor() + + # 创建表(如果不存在) + c.execute('''CREATE TABLE IF NOT EXISTS speech_counts ( + group_id TEXT, + wx_id TEXT, + date TEXT, + count INTEGER, + PRIMARY KEY (group_id, wx_id, date) + )''') + + # 获取当前日期的前一天 + yesterday = (datetime.now() - timedelta(days=1)).strftime('%Y-%m-%d') + + # 遍历Redis中所有与昨天日期相关的key,并写入数据库 + for key in r.keys(f"*:*:{yesterday}:count"): + parts = key.decode('utf-8').split(':') + group_id, wx_id, _date = parts[0], parts[1], parts[2] # _date应该是yesterday,但这里为了完整性还是保留 + count = int(r.hget(key, 'count')) if isinstance(r.hget(key, 'count'), bytes) else 0 # 处理可能的None或空值情况 + + # 插入或更新数据库记录 + c.execute("INSERT OR REPLACE INTO speech_counts (group_id, wx_id, date, count) VALUES (?, ?, ?, ?)", + (group_id, wx_id, yesterday, count)) + + conn.commit() + conn.close() + + +def generate_and_send_ranking(): + # 连接到SQLite数据库(假设数据库文件名为database.db) + conn = sqlite3.connect('database.db') + cursor = conn.cursor() + + # 编写SQL查询来获取发言数量前20的用户 + query = """ + SELECT group_id,wx_id, COUNT(*) AS speech_count + FROM speech_counts + WHERE DATE(date) = DATE('now', '-1 day') + GROUP BY group_id,wx_id + ORDER BY count DESC + LIMIT 20 + """ + + # 执行查询并获取结果 + cursor.execute(query) + results = cursor.fetchall() + + # 格式化输出字符串 + ranking_str = "发言数量前20的用户排名:\n" + for rank, (username, speech_count) in enumerate(results, start=1): + ranking_str += f"{rank}. {username}: {speech_count} 次发言\n" + + # 关闭数据库连接 + conn.close() + + # 这里我们没有实际“发送”排名,只是返回字符串 + # 如果需要发送,可以在此添加发送逻辑 + return ranking_str + + diff --git a/robot.py b/robot.py index 3038fc5..3e312cb 100644 --- a/robot.py +++ b/robot.py @@ -25,6 +25,9 @@ from job_mgmt import Job __version__ = "39.2.4.0" +from message_report.process_message import process_message +from message_report.write_db import write_to_db, generate_and_send_ranking + class Robot(Job): """个性化自己的机器人 @@ -148,6 +151,13 @@ class Robot(Job): # 群聊消息 if msg.from_group(): + + # 调用统计逻辑进行聊天数据统计: + try: + process_message(msg) + except Exception as e: + self.LOG.error(f"process_message error: {e}") + # 如果在群里被 @ if msg.roomid not in self.config.GROUPS: # 不在配置的响应的群列表里,忽略 return @@ -306,3 +316,10 @@ class Robot(Job): for r in receivers: self.sendTextMsg(games, r) + + + def messageCountToDB(self): + write_to_db() + + def generateAndSendRanking(self): + generate_and_send_ranking()