Skip to content

个人信息API

个人信息API模块提供用户信息查询和管理功能,让插件能够获取和使用用户的相关信息。

导入方式

python
from src.plugin_system.apis import person_api

主要功能

1. Person ID管理

get_person_id(platform: str, user_id: int) -> str

根据平台和用户ID获取person_id

参数:

  • platform:平台名称,如 "qq", "telegram" 等
  • user_id:用户ID

返回:

  • str:唯一的person_id(MD5哈希值)

示例:

python
person_id = person_api.get_person_id("qq", 123456)
print(f"Person ID: {person_id}")

2. 用户信息查询

get_person_value(person_id: str, field_name: str, default: Any = None) -> Any

根据person_id和字段名获取某个值

参数:

  • person_id:用户的唯一标识ID
  • field_name:要获取的字段名,如 "nickname", "impression" 等
  • default:当字段不存在或获取失败时返回的默认值

返回:

  • Any:字段值或默认值

示例:

python
nickname = await person_api.get_person_value(person_id, "nickname", "未知用户")
impression = await person_api.get_person_value(person_id, "impression")

get_person_values(person_id: str, field_names: list, default_dict: dict = None) -> dict

批量获取用户信息字段值

参数:

  • person_id:用户的唯一标识ID
  • field_names:要获取的字段名列表
  • default_dict:默认值字典,键为字段名,值为默认值

返回:

  • dict:字段名到值的映射字典

示例:

python
values = await person_api.get_person_values(
    person_id,
    ["nickname", "impression", "know_times"],
    {"nickname": "未知用户", "know_times": 0}
)

3. 用户状态查询

is_person_known(platform: str, user_id: int) -> bool

判断是否认识某个用户

参数:

  • platform:平台名称
  • user_id:用户ID

返回:

  • bool:是否认识该用户

示例:

python
known = await person_api.is_person_known("qq", 123456)
if known:
    print("这个用户我认识")

4. 用户名查询

get_person_id_by_name(person_name: str) -> str

根据用户名获取person_id

参数:

  • person_name:用户名

返回:

  • str:person_id,如果未找到返回空字符串

示例:

python
person_id = person_api.get_person_id_by_name("张三")
if person_id:
    print(f"找到用户: {person_id}")

使用示例

1. 基础用户信息获取

python
from src.plugin_system.apis import person_api

async def get_user_info(platform: str, user_id: int):
    """获取用户基本信息"""
    
    # 获取person_id
    person_id = person_api.get_person_id(platform, user_id)
    
    # 获取用户信息
    user_info = await person_api.get_person_values(
        person_id,
        ["nickname", "impression", "know_times", "last_seen"],
        {
            "nickname": "未知用户",
            "impression": "",
            "know_times": 0,
            "last_seen": 0
        }
    )
    
    return {
        "person_id": person_id,
        "nickname": user_info["nickname"],
        "impression": user_info["impression"],
        "know_times": user_info["know_times"],
        "last_seen": user_info["last_seen"]
    }

2. 在Action中使用用户信息

python
from src.plugin_system.base import BaseAction

class PersonalizedAction(BaseAction):
    async def execute(self, action_data, chat_stream):
        # 获取发送者信息
        user_id = chat_stream.user_info.user_id
        platform = chat_stream.platform
        
        # 获取person_id
        person_id = person_api.get_person_id(platform, user_id)
        
        # 获取用户昵称和印象
        nickname = await person_api.get_person_value(person_id, "nickname", "朋友")
        impression = await person_api.get_person_value(person_id, "impression", "")
        
        # 根据用户信息个性化回复
        if impression:
            response = f"你好 {nickname}!根据我对你的了解:{impression}"
        else:
            response = f"你好 {nickname}!很高兴见到你。"
        
        return {
            "success": True,
            "response": response,
            "user_info": {
                "nickname": nickname,
                "impression": impression
            }
        }

3. 用户识别和欢迎

python
async def welcome_user(chat_stream):
    """欢迎用户,区分新老用户"""
    
    user_id = chat_stream.user_info.user_id
    platform = chat_stream.platform
    
    # 检查是否认识这个用户
    is_known = await person_api.is_person_known(platform, user_id)
    
    if is_known:
        # 老用户,获取详细信息
        person_id = person_api.get_person_id(platform, user_id)
        nickname = await person_api.get_person_value(person_id, "nickname", "老朋友")
        know_times = await person_api.get_person_value(person_id, "know_times", 0)
        
        welcome_msg = f"欢迎回来,{nickname}!我们已经聊过 {know_times} 次了。"
    else:
        # 新用户
        welcome_msg = "你好!很高兴认识你,我是MaiBot。"
    
    return welcome_msg

4. 用户搜索功能

python
async def find_user_by_name(name: str):
    """根据名字查找用户"""
    
    person_id = person_api.get_person_id_by_name(name)
    
    if not person_id:
        return {"found": False, "message": f"未找到名为 '{name}' 的用户"}
    
    # 获取用户详细信息
    user_info = await person_api.get_person_values(
        person_id,
        ["nickname", "platform", "user_id", "impression", "know_times"],
        {}
    )
    
    return {
        "found": True,
        "person_id": person_id,
        "info": user_info
    }

5. 用户印象分析

python
async def analyze_user_relationship(chat_stream):
    """分析用户关系"""
    
    user_id = chat_stream.user_info.user_id
    platform = chat_stream.platform
    person_id = person_api.get_person_id(platform, user_id)
    
    # 获取关系相关信息
    relationship_info = await person_api.get_person_values(
        person_id,
        ["nickname", "impression", "know_times", "relationship_level", "last_interaction"],
        {
            "nickname": "未知",
            "impression": "",
            "know_times": 0,
            "relationship_level": "stranger",
            "last_interaction": 0
        }
    )
    
    # 分析关系程度
    know_times = relationship_info["know_times"]
    if know_times == 0:
        relationship = "陌生人"
    elif know_times < 5:
        relationship = "新朋友"
    elif know_times < 20:
        relationship = "熟人"
    else:
        relationship = "老朋友"
    
    return {
        "nickname": relationship_info["nickname"],
        "relationship": relationship,
        "impression": relationship_info["impression"],
        "interaction_count": know_times
    }

常用字段说明

基础信息字段

  • nickname:用户昵称
  • platform:平台信息
  • user_id:用户ID

关系信息字段

  • impression:对用户的印象
  • know_times:交互次数
  • relationship_level:关系等级
  • last_seen:最后见面时间
  • last_interaction:最后交互时间

个性化字段

  • preferences:用户偏好
  • interests:兴趣爱好
  • mood_history:情绪历史
  • topic_interests:话题兴趣

最佳实践

1. 错误处理

python
async def safe_get_user_info(person_id: str, field: str):
    """安全获取用户信息"""
    try:
        value = await person_api.get_person_value(person_id, field)
        return value if value is not None else "未设置"
    except Exception as e:
        logger.error(f"获取用户信息失败: {e}")
        return "获取失败"

2. 批量操作

python
async def get_complete_user_profile(person_id: str):
    """获取完整用户档案"""
    
    # 一次性获取所有需要的字段
    fields = [
        "nickname", "impression", "know_times", 
        "preferences", "interests", "relationship_level"
    ]
    
    defaults = {
        "nickname": "用户",
        "impression": "",
        "know_times": 0,
        "preferences": "{}",
        "interests": "[]",
        "relationship_level": "stranger"
    }
    
    profile = await person_api.get_person_values(person_id, fields, defaults)
    
    # 处理JSON字段
    try:
        profile["preferences"] = json.loads(profile["preferences"])
        profile["interests"] = json.loads(profile["interests"])
    except:
        profile["preferences"] = {}
        profile["interests"] = []
    
    return profile

注意事项

  1. 异步操作:大部分查询函数都是异步的,需要使用await
  2. 错误处理:所有函数都有错误处理,失败时记录日志并返回默认值
  3. 数据类型:返回的数据可能是字符串、数字或JSON,需要适当处理
  4. 性能考虑:批量查询优于单个查询
  5. 隐私保护:确保用户信息的使用符合隐私政策
  6. 数据一致性:person_id是用户的唯一标识,应妥善保存和使用