# 调用智谱的api，修改每一个项目的分类
# 从db文件读取表，读取第二个项，标题，根据标题，提交到api，获取回复，返回，并更新到db文件

import sqlite3
import time
from loguru import logger
from zhipuai import ZhipuAI

# 配置日志
logger.add("db_modify_zhipu.log", rotation="10 MB", level="INFO")

# 初始化客户端
client = ZhipuAI(api_key="fad3d9f9a45f4d939f0e7a7133fa07bf.X4bOO053GAIPKLE5")

def get_simplified_category(title):
    """
    调用智谱API获取简化的分类名称
    """
    try:
        # 创建聊天完成请求
        response = client.chat.completions.create(
            model="glm-4-flash",
            messages=[
                {
                    "role": "system",
                    "content": "你是一个专业的分类助手。请根据文章标题，提供一个3-6个汉字的简化分类名称，去除空格和特殊符号，更容易理解，并保持原意。"
                },
                {
                    "role": "user",
                    "content": f"对以下文字内容进行分类，返回结果为类别，如\"社会新闻\"，\"机器人\"，\"金融\"，\"历史\"，\"购物\"，\"新质生产力\"等等。目的：只返回2-6个汉字，不返回其它内容。内容：'{title}'"
                }
            ],
            temperature=0.7
        )
        
        # 提取回复内容
        category = response.choices[0].message.content.strip()
        logger.info(f"标题: {title[:30]}... -> 分类: {category}")
        return category
        
    except Exception as e:
        logger.error(f"获取分类失败: {str(e)}")
        return None

def update_database_categories():
    """
    更新数据库中的分类信息
    """
    # 连接到数据库
    conn = sqlite3.connect('tophub_data.db')
    cursor = conn.cursor()
    
    try:
        # 获取所有记录
        cursor.execute("SELECT id, title, category FROM articles")
        records = cursor.fetchall()
        
        logger.info(f"共找到 {len(records)} 条记录需要处理")
        
        updated_count = 0
        failed_count = 0
        
        # 处理每条记录
        for record in records:
            record_id, title, current_category = record
            
            # 跳过已经简化的分类（长度<=6且不包含特殊字符）
            if current_category and len(current_category) <= 6 and not any(c in current_category for c in " ,.!?;:，。！？；："):
                logger.info(f"跳过记录 {record_id}，分类已简化: {current_category}")
                continue
                
            logger.info(f"处理记录 {record_id}: {title[:30]}...")
            
            # 获取新的分类
            new_category = get_simplified_category(title)
            
            if new_category:
                # 更新数据库
                cursor.execute("UPDATE articles SET category = ? WHERE id = ?", (new_category, record_id))
                conn.commit()
                updated_count += 1
                logger.info(f"已更新记录 {record_id} 的分类为: {new_category}")
            else:
                failed_count += 1
                logger.error(f"无法获取记录 {record_id} 的新分类")
            
            # 添加延迟，避免API调用过于频繁
            time.sleep(1)
        
        logger.info(f"处理完成! 成功更新 {updated_count} 条记录，失败 {failed_count} 条记录")
        
    except Exception as e:
        logger.error(f"更新数据库时出错: {str(e)}")
        conn.rollback()
    finally:
        conn.close()

if __name__ == "__main__":
    logger.info("开始更新数据库分类...")
    update_database_categories()
    logger.info("程序执行完成")
