import logging from datetime import datetime, timedelta from db.connection import DBConnectionManager from db.message_storage import MessageStorageDB # 配置日志 logging.basicConfig( level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' ) # 获取数据库连接管理器的单例 db_manager = DBConnectionManager() message_db = MessageStorageDB(db_manager) def write_to_db(): """从Redis读取发言统计数据并写入数据库""" # 获取Redis连接 redis_conn = db_manager.get_redis_connection() # 获取当前日期的前一天 yesterday = (datetime.now() - timedelta(days=1)).strftime('%Y-%m-%d') # 遍历Redis中所有与昨天日期相关的key,并写入数据库 for key_bytes in redis_conn.keys(f"*:*:{yesterday}:count"): key = key_bytes.decode('utf-8') parts = key.split(':') group_id, wx_id, _date = parts[0], parts[1], parts[2] # _date应该是yesterday # 获取计数值 count_bytes = redis_conn.hget(key, 'count') count = int(count_bytes) if isinstance(count_bytes, bytes) else 0 # 使用MessageStorageDB插入数据 try: result = message_db.insert_speech_count(group_id, wx_id, yesterday, count) if result: logging.info(f"成功写入发言统计: {group_id}, {wx_id}, {yesterday}, {count}") else: logging.error(f"写入发言统计失败: {group_id}, {wx_id}, {yesterday}, {count}") except Exception as e: logging.error(f"写入发言统计出错: {e}") def generate_and_send_ranking(groupId, allContacts: dict): """生成并发送群聊发言排名""" try: yesterday = (datetime.now() - timedelta(days=1)).strftime('%Y-%m-%d') # 使用数据库操作类获取排名数据 results = message_db.get_speech_ranking(yesterday, groupId, limit=20) if not results: logging.info(f"没有找到 {yesterday} 的群聊 {groupId} 发言记录") return f"{yesterday} 没有发言记录" # 格式化输出字符串 ranking_str = yesterday + "发言数量前20的用户排名:\n" for rank, result in enumerate(results, start=1): username = result['wx_id'] speech_count = result['speech_count'] ranking_str += f"{rank}. {allContacts.get(username, username)}: {speech_count} 次发言\n" logging.info(f"成功生成 {yesterday} 的群聊 {groupId} 发言排名") return ranking_str except Exception as e: logging.error(f"生成发言排名出错: {e}") return f"生成发言排名出错: {e}" if __name__ == '__main__': write_to_db()