Skill: chengjunai/chengjun-content-security (version 1.0.2)

# 成均内容安全 Skill name: 成均内容安全 description: 通过调用成均平台的HTTP API接口，检测文本中的敏感信息、语法错误、标点符号问题等，保障内容合规。 ## 简介 这是一个用于检测文本敏感信息的 Skill，通过调用成均智能平台（[博达智能体开放平台](https://platform.vsbclub.com/)）的内容安全接口，快速识别文本内容中的敏感数据、语法错误等问题，适用于内容审核、数据合规等场景。 本技能支持检测以下内容： - 敏感词汇 - 领导人称谓 - 官员称谓 - 禁用词汇 - 语法错误 - 标点符号问题 > ⚠️ **重要配置说明** > > **API 认证配置**： > > **方式：直接使用Token** > ```bash > export CHENGJUN_API_KEY="your_http_api_token" > ``` > > > **服务信息**： > > - 生产环境 Base URL: https://api.vsbclub.com/ > - 获取[REDACTED_SECRET] ## 功能特性 - 支持多种内容安全检查（敏感词、领导人称谓、官员称谓、禁用词、语法词、标点符号） - 支持直接Token和自动获取Token两种认证方式 - Token自动缓存管理，避免频繁请求 - 标准化的 JSON 格式输入输出 - 完善的错误处理和超时机制 - 兼容 OpenClaw 对话式调用 - 文本长度限制：5000 字符 - 使用 Python 标准库，无需额外依赖 ## 安全说明 ### API 认证 - 支持直接传入 Token - Token 通过 Authorization 请求头传递 ### 数据安全 - 预检结果不会被服务端保存 - 单次请求文本长度不超过 5000 字符 - 使用 HTTPS 协议传输数据 ## 技术实现 ### 使用的技术栈 技术 用途 Python 3.8+ 主要开发语言 urllib (标准库) HTTP 请求库 ### 依赖安装 本 skill 使用 Python 标准库，无需安装额外依赖。 ## 使用方法 ### 对话式调用 ``` 请帮我检测这段文本是否包含敏感信息：{待检测文本内容} ``` ### API 认证配置 **方式：直接使用Token** ```bash export CHENGJUN_API_KEY="your_http_api_token" ``` ### 参数说明 参数名 类型 必传 说明 text string 是 待检测的文本内容（不超过5000字符） api_key string 否 API密钥（可选，默认从环境变量读取） ### 返回格式 ```json { "code": 200, "msg": "检测成功", "precheck": { "leader": [], "officer": [], "forbidden": [], "grammar_word": [], "sensitive": [ { "word": "党的二十", "correct": ["党的二十大"], "misdescription": null, "category": "中国共产党相关表述", "sentence": "为深入学习贯彻党的二十精神", "explain": null, "startInSentence": 9, "riskLevel": "middle", "level": "疑似错误", "start": 9, "end": 13, "priority": 2, "typeNum": 1 } ], "punctuation": [], "urlBody": null, "wordNum": 481 } } ``` ### 检查项说明 检查项 说明 leader 领导人称谓检查结果 officer 官员称谓检查结果 forbidden 禁用词检查结果 grammar_word 语法词检查结果 sensitive 敏感词检查结果 punctuation 标点符号检查结果 ### 错误码说明 #### 通用错误码 错误码 说明 200 检测成功 -1 业务逻辑错误（文本为空或超长） #### API 调用错误 错误码 说明 401 认证失败（Token无效或凭证错误） 403 权限不足 429 请求频率超限 500 服务器内部错误 -2 API 调用失败（网络或服务问题） ## 示例代码 ```python from main import check_content, run # 方式1：使用环境变量中的Token # export CHENGJUN_API_KEY="your_http_api_token" result = check_content( text="创建特色社会主义道路，为深入学习贯彻党的二十精神" ) # 方式2：直接传入Token result = check_content( text="创建特色社会主义道路，为深入学习贯彻党的二十精神", [REDACTED_SECRET]" ) # 使用run函数（兼容OpenClaw） result = run({ "text": "创建特色社会主义道路，为深入学习贯彻党的二十精神" }) # 打印结果 print(json.dumps(result, ensure_ascii=False, indent=2)) ``` ## 注意事项 1. 使用前需要配置API认证（Token） 2. 单次请求文本长度不超过 5000 字符 3. 预检结果不会被服务端保存 4. 接口调用超时时间为 30 秒 5. Token自动缓存，有效期内的请求不会重复获取 ## API 接口文档 详细文档请参考：https://platform.vsbclub.com/docs/zh/webber/content_check.html ### 文本预检接口 - **请求地址**：POST https://api.vsbclub.com/pre-sys/precheck/text - **请求头**：Authorization: {token} - **请求参数**：text（待检测文本） - **返回**：precheck（检测结果） ## 故障排查 如果调用失败，检查： 1. **网络连接**：`curl -I https://api.vsbclub.com/` 2. **Token配置**：确认 CHENGJUN_API_KEY 设置正确 3. **文本长度**：确保不超过5000字符 4. **服务状态**：服务可能暂时不可用，稍后重试 ## 获取 API Token 直接获取可用的 HTTP API Token https://platform.vsbclub.com/

path: requirements.txt
content: # 使用Python标准库，无需额外依赖
# 如需使用requests库，请安装：pip install requests


path: README.md
content: # 成均内容安全 Skill

通过调用成均平台的HTTP API接口，检测文本中的敏感信息、语法错误、标点符号问题等。

## 快速开始

### 1. 配置 API 凭证

**方式：直接使用Token**
https://platform.vsbclub.com/
```bash
export CHENGJUN_API_KEY="your_http_api_token"
```

### 2. 测试

```bash
python3 test_skill.py
```

或直接调用：

```bash
python3 main.py "创建特色社会主义道路，为深入学习贯彻党的二十精神"
```

## API 说明

- **生产环境 Base URL**: https://api.vsbclub.com
- **获取Token**: https://platform.vsbclub.com/
- **文本预检接口**: POST /pre-sys/precheck/text
- **认证方式**: Authorization Bearer Token
- **文本限制**: 不超过 5000 字符

## 返回格式

```json
{
  "code": 200,
  "msg": "检测成功",
  "precheck": {
    "leader": [],
    "officer": [],
    "forbidden": [],
    "grammar_word": [],
    "sensitive": [...],
    "punctuation": [],
    "wordNum": 481
  }
}
```

## 技术实现

- 使用 Python 标准库（urllib），无需额外依赖
- 支持 Token 缓存，避免频繁请求
- 兼容 OpenClaw 对话式调用

## 故障排查

如果调用失败，可能的原因：

1. **网络问题**: 检查是否能访问 https://api.vsbclub.com
2. **凭证错误**: 确认环境变量设置正确
3. **Token过期**: Token有效期约2小时，会自动重新获取
4. **文本过长**: 确保不超过5000字符
5. **服务问题**: 服务可能暂时不可用，稍后重试

## 作为 OpenClaw Skill 使用

将此目录作为 skill 安装到 OpenClaw：

```bash
openclaw skills install ./chengjun-content-security
```

## 获取 API 凭证

直接获取可用的 HTTP API Token https://platform.vsbclub.com/


path: test_skill.py
content: #!/usr/bin/env python3
# -*- coding: utf-8 -*-

import os
import sys
import json

# 测试导入
try:
    from main import check_content, run
    print("✓ 模块导入成功")
except Exception as e:
    print(f"✗ 模块导入失败：{e}")
    sys.exit(1)

# 测试空文本
print("\n测试 1: 空文本检测")
result = check_content("")
print(json.dumps(result, ensure_ascii=False, indent=2))

# 测试超长文本
print("\n测试 2: 超长文本检测")
long_text = "a" * 5001
result = check_content(long_text)
print(json.dumps(result, ensure_ascii=False, indent=2))

# 测试正常文本（需要配置正确的 API 凭证）
print("\n测试 3: 正常文本检测（需要配置正确的 API 凭证）")
print("提示：请设置以下环境变量：")
print("  export CHENGJUN_API_KEY='your_http_api_token'")

test_text = "创建特色社会主义道路，为深入学习贯彻党的二十精神"
result = check_content(test_text)
print(json.dumps(result, ensure_ascii=False, indent=2))

print("\n测试完成")


path: main.py
content: #!/usr/bin/env python3
# -*- coding: utf-8 -*-

import os
import sys
import json
import ssl
import urllib.request
import urllib.parse
from typing import Optional, Dict, Any

# 成均平台配置
BASE_URL = "https://api.vsbclub.com"
PRECHECK_URL = f"{BASE_URL}/pre-sys/precheck/text"
DEFAULT_TIMEOUT = 30

# Header 缓存
_cached_api_key = None

def get_api_key():
    """获取 API Key（从 X-API-KEY header 鉴权）"""
    global _cached_api_key
    [REDACTED_SECRET]"CHENGJUN_API_KEY")
    
    # 使用缓存
    if _cached_api_key:
        return _cached_api_key
    
    if [REDACTED_SECRET] = api_key
        return api_key
    
    raise ValueError(
        "API Key 未配置。请设置环境变量：CHENGJUN_API_KEY"
    )

def http_request(url, method='GET', params=None, data=None, headers=None, timeout=DEFAULT_TIMEOUT):
    """发送 HTTP 请求（使用标准库）"""
    # 构建 URL，参数放在 query string
    if params:
        url = url + "?" + urllib.parse.urlencode(params)
    
    # 创建请求
    req = urllib.request.Request(url, method=method)
    if headers:
        for key, value in headers.items():
            req.add_header(key, value)
    
    # 如果有 data，作为 form 数据发送
    if data:
        if isinstance(data, dict):
            req.data = urllib.parse.urlencode(data).encode('utf-8')
        else:
            req.data = data if isinstance(data, bytes) else data.encode('utf-8')
    
    try:
        with urllib.request.urlopen(req, timeout=timeout) as response:
            return json.loads(response.read().decode('utf-8'))
    except urllib.error.HTTPError as e:
        raise Exception(f"HTTP错误 {e.code}: {e.reason}")
    except Exception as e:
        raise Exception(f"请求失败：{str(e)}")

def check_content(text: str) -> Dict[str, Any]:
    """获取访问token"""
    global _token_cache, _token_expires
    
    # 检查缓存
    import time
    if _token_cache and time.time() < _token_expires:
        return _token_cache
    
    # 获取凭证
    creds = get_api_credentials()
    
    # 如果是直接token，直接返回
    if creds["type"] == "direct_token":
        return creds["token"]
    
    # 否则调用接口获取token
    params = {
        "tenantId": creds["tenant_id"],
        "clientId": creds["client_id"],
        "clientSecret": creds["client_secret"]
    }
    
    try:
        result = http_request(TOKEN_URL, method='GET', params=params)
        
        if result.get("code") == 200 and "data" in result:
            [REDACTED_SECRET]"data"].get("token")
            expires_in = result["data"].get("expiresIn", 7200)
            
            # 缓存token（提前60秒过期）
            _token_cache = token
            _token_expires = time.time() + expires_in - 60
            
            return token
        else:
            raise Exception(f"获取token失败: {result.get('msg', '未知错误')}")
            
    except Exception as e:
        raise Exception(f"获取token请求失败: {str(e)}")

def check_content(text: str) -> Dict[str, Any]:
    """
    检测文本内容
    
    Args:
        text: 待检测的文本内容
    
    Returns:
        检测结果字典
    """
    # 参数验证
    if not text:
        return {
            "code": -1,
            "msg": "待检测文本不能为空",
            "precheck": None
        }
    
    if len(text) > 5000:
        return {
            "code": -1,
            "msg": "文本长度超过 5000 字符限制",
            "precheck": None
        }
    
    try:
        # 获取 API Key
        [REDACTED_SECRET])
        
        # 使用 X-API-KEY header 进行鉴权
        headers = {
            "X-API-KEY": api_key
        }
        
        result = http_request(
            PRECHECK_URL,
            method='POST',
            params={"text": text},
            headers=headers
        )
        
        # 标准化返回格式
        if result.get("code") == 200:
            return {
                "code": 200,
                "msg": "检测成功",
                "precheck": result.get("precheck", {})
            }
        else:
            return {
                "code": result.get("code", -1),
                "msg": result.get("msg", "检测失败"),
                "precheck": None
            }
            
    except ValueError as e:
        return {
            "code": 401,
            "msg": str(e),
            "precheck": None
        }
    except Exception as e:
        return {
            "code": -2,
            "msg": f"API 调用失败：{str(e)}",
            "precheck": None
        }

def run(params: Dict[str, Any]) -> Dict[str, Any]:
    """
    主入口函数（兼容 OpenClaw 调用）
    
    Args:
        params: 参数字典，包含 text 等参数
    
    Returns:
        检测结果字典
    """
    text = params.get("text", "")
    
    return check_content(text)

if __name__ == "__main__":
    # 命令行调用支持
    if len(sys.argv) < 2:
        print(json.dumps({
            "code": -1,
            "msg": "请提供文本内容",
            "precheck": None
        }, ensure_ascii=False))
        sys.exit(1)
    
    text = sys.argv[1]
    
    result = check_content(text)
    print(json.dumps(result, ensure_ascii=False, indent=2))


path: skill.json
content: {
  "name": "成均内容安全",
  "slug": "chengjun-content-security",
  "version": "1.0.0",
  "description": "通过调用成均平台的内容安全接口，检测文本中的敏感信息、语法错误、标点符号问题等，保障内容合规。",
  "author": "成均",
  "license": "MIT",
  "platform": {
    "always": false,
    "disable-model-invocation": false
  },
  "install": {
    "type": "instruction-only",
    "instructions": [
      "pip install -r requirements.txt",
      "设置环境变量: export CHENGJUN_API_KEY='your_api_key_here'",
      "获取API密钥: 访问开放平台注册页面获取"
    ]
  },
  "environment": {
    "variables": [
      {
        "name": "CHENGJUN_API_KEY",
        "description": "成均平台API密钥",
        "required": true
      }
    ]
  },
  "tools": [
    {
      "name": "check_content",
      "description": "检测文本内容中的敏感信息、语法错误等问题",
      "parameters": {
        "text": {
          "type": "string",
          "description": "待检测的文本内容",
          "required": true
        },
        "api_key": {
          "type": "string",
          "description": "API密钥（可选，默认从环境变量读取）",
          "required": false
        }
      }
    }
  ]
}


Security scan verdicts — ClawScan: clean | static analysis: clean | VirusTotal: clean | SkillSpector: suspicious (HIGH)