sarm-sdk


Namesarm-sdk JSON
Version 1.0.13 PyPI version JSON
download
home_pagehttps://github.com/murphysec
SummaryPython SDK for SARM(Security Asset Risk Management) Platform
upload_time2025-07-17 17:03:30
maintainerNone
docs_urlNone
authorMurphysec Team
requires_python>=3.7
licenseMIT
keywords security asset risk management sdk api
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # SARM SDK

**资产风险管理平台 Python SDK**

[![Python Version](https://img.shields.io/badge/python-3.7+-blue.svg)](https://python.org)
[![License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)

SARM SDK 是 SARM(资产风险管理平台)的官方 Python SDK,提供了完整的 API 封装和数据模型,支持组织架构、软件成分、漏洞管理、安全问题等全业务流程的数据导入和管理。

## ✨ 主要特性

- 🚀 **简单易用**: 提供 Pythonic 的 API 接口,易于学习和使用
- 📊 **完整覆盖**: 支持平台所有核心功能模块
- 🔒 **类型安全**: 基于 Pydantic 提供完整的数据验证和类型提示
- 🔄 **批量操作**: 支持高效的批量数据导入和处理
- 🛡️ **异常处理**: 完善的错误处理和异常体系
- 📝 **丰富示例**: 提供详细的使用示例和最佳实践

## 📦 安装

```bash
pip install sarm-sdk
```

## 🚀 快速开始

### 基础使用

```python
from sarm_sdk import SARMClient
from sarm_sdk.models import OrganizeInsert, VulnInsert

# 初始化客户端
client = SARMClient(
    base_url="https://your-platform-api.com",
    token="your-bearer-token"
)

# 创建组织
org = OrganizeInsert(
    organize_name="技术部",
    organize_unique_id="ORG-001",
    organize_punique_id="0",
    status="active"
)
result = client.organizations.create(org, execute_release=True)
print(f"组织创建成功: {result.success_count}个")

# 刷新组织缓存(重要!)
client.organizations.refresh_cache()

# 创建漏洞
vuln = VulnInsert(
    vuln_unique_id="VULN-001",
    title="SQL注入漏洞",
    description="存在SQL注入风险",
    severity="high",
    security_capability_unique_id="SAST-001"
)
result = client.vulnerabilities.create(vuln, execute_release=True)
print(f"漏洞创建成功: {result.success_count}个")

# 关闭客户端
client.close()
```

### 批量操作

```python
from sarm_sdk.models import ComponentInsert

# 批量创建软件成分
components = [
    ComponentInsert(
        component_unique_id="spring-boot-2.7.0",
        component_name="Spring Boot",
        component_version="2.7.0",
        status="active",
        asset_type="open_source_component",
        ecosystem="Maven"
    ),
    ComponentInsert(
        component_unique_id="jackson-2.13.2",
        component_name="Jackson",
        component_version="2.13.2", 
        status="active",
        asset_type="open_source_component",
        ecosystem="Maven"
    )
]

# 批量创建(支持最多1000条记录)
result = client.components.create_batch(components, execute_release=True)
print(f"批量创建完成: 总数{result.total_count}, 成功{result.success_count}, 失败{result.failed_count}")

# 查看失败的记录
for failed_item in result.failed_items:
    print(f"失败: {failed_item.unique_id}, 原因: {failed_item.msg}")
```

## 📚 核心功能模块

### 1. 组织架构管理 (`client.organizations`)

```python
# 创建组织
client.organizations.create(org_data, execute_release=True)

# 批量创建组织
client.organizations.create_batch(org_list, execute_release=True)

# 刷新组织架构缓存(批量操作后必须调用)
client.organizations.refresh_cache()

# 获取组织架构树
tree = client.organizations.get_tree()

# 查询组织
result = client.organizations.get(organize_name="技术部", page=1, limit=50)
```

### 2. 漏洞管理 (`client.vulnerabilities`)

```python
# 创建漏洞
client.vulnerabilities.create(vuln_data, execute_release=True)

# 批量创建漏洞
client.vulnerabilities.create_batch(vuln_list, execute_release=True)

# 获取漏洞列表
result = client.vulnerabilities.get_list(severity="critical", page=1, limit=50)
```

### 3. 安全问题管理 (`client.security_issues`)

```python
# 创建安全问题
client.security_issues.create(issue_data, execute_release=True)

# 批量创建安全问题
client.security_issues.create_batch(issue_list, execute_release=True)

# 获取安全问题列表
result = client.security_issues.get_list(issue_level="critical")
```

### 4. 软件成分管理 (`client.components`)

```python
# 创建软件成分
client.components.create(component_data, execute_release=True)

# 批量创建软件成分
client.components.create_batch(component_list, execute_release=True)

# 获取软件成分列表
result = client.components.get_list(asset_type="open_source_component")
```

### 5. 应用载体管理 (`client.carriers`)

```python
# 创建应用载体
client.carriers.create(carrier_data, execute_release=True)

# 批量创建应用载体
client.carriers.create_batch(carrier_list, execute_release=True)
```

### 6. 安全能力管理 (`client.security_capabilities`)

```python
# 创建安全能力
client.security_capabilities.create(capability_data)

# 获取安全能力列表
result = client.security_capabilities.get_list()
```

## 🔧 高级特性

### 错误处理

```python
from sarm_sdk.exceptions import (
    SARMException,
    SARMAPIError, 
    SARMValidationError,
    SARMNetworkError
)

try:
    result = client.organizations.create(org_data)
except SARMValidationError as e:
    print(f"数据验证失败: {e}")
    print(f"字段错误: {e.field_errors}")
except SARMAPIError as e:
    print(f"API调用失败: {e}")
    print(f"状态码: {e.status_code}")
    print(f"错误代码: {e.error_code}")
except SARMNetworkError as e:
    print(f"网络错误: {e}")
except SARMException as e:
    print(f"SDK错误: {e}")
```

### 客户端配置

```python
client = SARMClient(
    base_url="https://api.platform.com",
    token="your-token",
    timeout=60,                    # 请求超时时间
    max_retries=3,                 # 最大重试次数
    retry_backoff_factor=0.5       # 重试退避因子
)

# 测试连接
if client.test_connection():
    print("连接成功")
else:
    print("连接失败")
```

### Execute-Release 参数

```python
# execute_release=True: 数据直接发布,跳过预处理
result = client.organizations.create(org_data, execute_release=True)

# execute_release=False 或不传: 数据进入预处理状态,等待审核
result = client.organizations.create(org_data, execute_release=False)
```

## 📖 数据模型

SDK 提供了完整的数据模型,支持数据验证和类型提示:

```python
from sarm_sdk.models import (
    # 组织架构
    OrganizeInsert, Organization, OrganizationTree,
    
    # 漏洞管理  
    VulnInsert, Vulnerability, VulnCvss, VulnContext,
    
    # 安全问题
    IssueInsert, SecurityIssue,
    
    # 软件成分
    ComponentInsert, Component,
    
    # 应用载体
    CarrierInsert, Carrier,
    
    # 安全能力
    SecurityCapability,
    
    # 响应模型
    BatchOperationResult, SuccessResponse, ErrorResponse
)
```

## 🚨 重要注意事项

### 1. 数据导入顺序

建议按以下顺序导入数据,确保依赖关系正确:

```python
# 1. 安全能力(前置依赖)
client.security_capabilities.create_batch(capabilities)

# 2. 组织架构
client.organizations.create_batch(organizations, execute_release=True)
client.organizations.refresh_cache()  # 必须刷新缓存!

# 3. 业务系统和应用载体
client.carriers.create_batch(carriers, execute_release=True)

# 4. 软件成分
client.components.create_batch(components, execute_release=True)

# 5. 漏洞数据
client.vulnerabilities.create_batch(vulnerabilities, execute_release=True)

# 6. 安全问题
client.security_issues.create_batch(issues, execute_release=True)
```

### 2. 批量操作限制

- 单次批量操作最大支持 **1000条** 记录
- 请求大小限制:最大 **10MB**
- 请求频率限制:每分钟最大 **1000次** 请求

### 3. 组织架构缓存

- 批量导入组织数据后 **必须** 调用 `refresh_cache()` 方法
- 缓存刷新是异步操作,大量数据可能需要等待
- 建议在业务低峰期执行批量操作

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/murphysec",
    "name": "sarm-sdk",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.7",
    "maintainer_email": null,
    "keywords": "security, asset, risk, management, sdk, api",
    "author": "Murphysec Team",
    "author_email": "Murphysec Team <developer@murphysec.com>",
    "download_url": "https://files.pythonhosted.org/packages/44/b0/d8b79956af0199bab3947774d27b54e2c19e203154563f8d0f4254e6dcfb/sarm_sdk-1.0.13.tar.gz",
    "platform": null,
    "description": "# SARM SDK\r\n\r\n**\u8d44\u4ea7\u98ce\u9669\u7ba1\u7406\u5e73\u53f0 Python SDK**\r\n\r\n[![Python Version](https://img.shields.io/badge/python-3.7+-blue.svg)](https://python.org)\r\n[![License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)\r\n\r\nSARM SDK \u662f SARM\uff08\u8d44\u4ea7\u98ce\u9669\u7ba1\u7406\u5e73\u53f0\uff09\u7684\u5b98\u65b9 Python SDK\uff0c\u63d0\u4f9b\u4e86\u5b8c\u6574\u7684 API \u5c01\u88c5\u548c\u6570\u636e\u6a21\u578b\uff0c\u652f\u6301\u7ec4\u7ec7\u67b6\u6784\u3001\u8f6f\u4ef6\u6210\u5206\u3001\u6f0f\u6d1e\u7ba1\u7406\u3001\u5b89\u5168\u95ee\u9898\u7b49\u5168\u4e1a\u52a1\u6d41\u7a0b\u7684\u6570\u636e\u5bfc\u5165\u548c\u7ba1\u7406\u3002\r\n\r\n## \u2728 \u4e3b\u8981\u7279\u6027\r\n\r\n- \ud83d\ude80 **\u7b80\u5355\u6613\u7528**: \u63d0\u4f9b Pythonic \u7684 API \u63a5\u53e3\uff0c\u6613\u4e8e\u5b66\u4e60\u548c\u4f7f\u7528\r\n- \ud83d\udcca **\u5b8c\u6574\u8986\u76d6**: \u652f\u6301\u5e73\u53f0\u6240\u6709\u6838\u5fc3\u529f\u80fd\u6a21\u5757\r\n- \ud83d\udd12 **\u7c7b\u578b\u5b89\u5168**: \u57fa\u4e8e Pydantic \u63d0\u4f9b\u5b8c\u6574\u7684\u6570\u636e\u9a8c\u8bc1\u548c\u7c7b\u578b\u63d0\u793a\r\n- \ud83d\udd04 **\u6279\u91cf\u64cd\u4f5c**: \u652f\u6301\u9ad8\u6548\u7684\u6279\u91cf\u6570\u636e\u5bfc\u5165\u548c\u5904\u7406\r\n- \ud83d\udee1\ufe0f **\u5f02\u5e38\u5904\u7406**: \u5b8c\u5584\u7684\u9519\u8bef\u5904\u7406\u548c\u5f02\u5e38\u4f53\u7cfb\r\n- \ud83d\udcdd **\u4e30\u5bcc\u793a\u4f8b**: \u63d0\u4f9b\u8be6\u7ec6\u7684\u4f7f\u7528\u793a\u4f8b\u548c\u6700\u4f73\u5b9e\u8df5\r\n\r\n## \ud83d\udce6 \u5b89\u88c5\r\n\r\n```bash\r\npip install sarm-sdk\r\n```\r\n\r\n## \ud83d\ude80 \u5feb\u901f\u5f00\u59cb\r\n\r\n### \u57fa\u7840\u4f7f\u7528\r\n\r\n```python\r\nfrom sarm_sdk import SARMClient\r\nfrom sarm_sdk.models import OrganizeInsert, VulnInsert\r\n\r\n# \u521d\u59cb\u5316\u5ba2\u6237\u7aef\r\nclient = SARMClient(\r\n    base_url=\"https://your-platform-api.com\",\r\n    token=\"your-bearer-token\"\r\n)\r\n\r\n# \u521b\u5efa\u7ec4\u7ec7\r\norg = OrganizeInsert(\r\n    organize_name=\"\u6280\u672f\u90e8\",\r\n    organize_unique_id=\"ORG-001\",\r\n    organize_punique_id=\"0\",\r\n    status=\"active\"\r\n)\r\nresult = client.organizations.create(org, execute_release=True)\r\nprint(f\"\u7ec4\u7ec7\u521b\u5efa\u6210\u529f: {result.success_count}\u4e2a\")\r\n\r\n# \u5237\u65b0\u7ec4\u7ec7\u7f13\u5b58\uff08\u91cd\u8981\uff01\uff09\r\nclient.organizations.refresh_cache()\r\n\r\n# \u521b\u5efa\u6f0f\u6d1e\r\nvuln = VulnInsert(\r\n    vuln_unique_id=\"VULN-001\",\r\n    title=\"SQL\u6ce8\u5165\u6f0f\u6d1e\",\r\n    description=\"\u5b58\u5728SQL\u6ce8\u5165\u98ce\u9669\",\r\n    severity=\"high\",\r\n    security_capability_unique_id=\"SAST-001\"\r\n)\r\nresult = client.vulnerabilities.create(vuln, execute_release=True)\r\nprint(f\"\u6f0f\u6d1e\u521b\u5efa\u6210\u529f: {result.success_count}\u4e2a\")\r\n\r\n# \u5173\u95ed\u5ba2\u6237\u7aef\r\nclient.close()\r\n```\r\n\r\n### \u6279\u91cf\u64cd\u4f5c\r\n\r\n```python\r\nfrom sarm_sdk.models import ComponentInsert\r\n\r\n# \u6279\u91cf\u521b\u5efa\u8f6f\u4ef6\u6210\u5206\r\ncomponents = [\r\n    ComponentInsert(\r\n        component_unique_id=\"spring-boot-2.7.0\",\r\n        component_name=\"Spring Boot\",\r\n        component_version=\"2.7.0\",\r\n        status=\"active\",\r\n        asset_type=\"open_source_component\",\r\n        ecosystem=\"Maven\"\r\n    ),\r\n    ComponentInsert(\r\n        component_unique_id=\"jackson-2.13.2\",\r\n        component_name=\"Jackson\",\r\n        component_version=\"2.13.2\", \r\n        status=\"active\",\r\n        asset_type=\"open_source_component\",\r\n        ecosystem=\"Maven\"\r\n    )\r\n]\r\n\r\n# \u6279\u91cf\u521b\u5efa\uff08\u652f\u6301\u6700\u591a1000\u6761\u8bb0\u5f55\uff09\r\nresult = client.components.create_batch(components, execute_release=True)\r\nprint(f\"\u6279\u91cf\u521b\u5efa\u5b8c\u6210: \u603b\u6570{result.total_count}, \u6210\u529f{result.success_count}, \u5931\u8d25{result.failed_count}\")\r\n\r\n# \u67e5\u770b\u5931\u8d25\u7684\u8bb0\u5f55\r\nfor failed_item in result.failed_items:\r\n    print(f\"\u5931\u8d25: {failed_item.unique_id}, \u539f\u56e0: {failed_item.msg}\")\r\n```\r\n\r\n## \ud83d\udcda \u6838\u5fc3\u529f\u80fd\u6a21\u5757\r\n\r\n### 1. \u7ec4\u7ec7\u67b6\u6784\u7ba1\u7406 (`client.organizations`)\r\n\r\n```python\r\n# \u521b\u5efa\u7ec4\u7ec7\r\nclient.organizations.create(org_data, execute_release=True)\r\n\r\n# \u6279\u91cf\u521b\u5efa\u7ec4\u7ec7\r\nclient.organizations.create_batch(org_list, execute_release=True)\r\n\r\n# \u5237\u65b0\u7ec4\u7ec7\u67b6\u6784\u7f13\u5b58\uff08\u6279\u91cf\u64cd\u4f5c\u540e\u5fc5\u987b\u8c03\u7528\uff09\r\nclient.organizations.refresh_cache()\r\n\r\n# \u83b7\u53d6\u7ec4\u7ec7\u67b6\u6784\u6811\r\ntree = client.organizations.get_tree()\r\n\r\n# \u67e5\u8be2\u7ec4\u7ec7\r\nresult = client.organizations.get(organize_name=\"\u6280\u672f\u90e8\", page=1, limit=50)\r\n```\r\n\r\n### 2. \u6f0f\u6d1e\u7ba1\u7406 (`client.vulnerabilities`)\r\n\r\n```python\r\n# \u521b\u5efa\u6f0f\u6d1e\r\nclient.vulnerabilities.create(vuln_data, execute_release=True)\r\n\r\n# \u6279\u91cf\u521b\u5efa\u6f0f\u6d1e\r\nclient.vulnerabilities.create_batch(vuln_list, execute_release=True)\r\n\r\n# \u83b7\u53d6\u6f0f\u6d1e\u5217\u8868\r\nresult = client.vulnerabilities.get_list(severity=\"critical\", page=1, limit=50)\r\n```\r\n\r\n### 3. \u5b89\u5168\u95ee\u9898\u7ba1\u7406 (`client.security_issues`)\r\n\r\n```python\r\n# \u521b\u5efa\u5b89\u5168\u95ee\u9898\r\nclient.security_issues.create(issue_data, execute_release=True)\r\n\r\n# \u6279\u91cf\u521b\u5efa\u5b89\u5168\u95ee\u9898\r\nclient.security_issues.create_batch(issue_list, execute_release=True)\r\n\r\n# \u83b7\u53d6\u5b89\u5168\u95ee\u9898\u5217\u8868\r\nresult = client.security_issues.get_list(issue_level=\"critical\")\r\n```\r\n\r\n### 4. \u8f6f\u4ef6\u6210\u5206\u7ba1\u7406 (`client.components`)\r\n\r\n```python\r\n# \u521b\u5efa\u8f6f\u4ef6\u6210\u5206\r\nclient.components.create(component_data, execute_release=True)\r\n\r\n# \u6279\u91cf\u521b\u5efa\u8f6f\u4ef6\u6210\u5206\r\nclient.components.create_batch(component_list, execute_release=True)\r\n\r\n# \u83b7\u53d6\u8f6f\u4ef6\u6210\u5206\u5217\u8868\r\nresult = client.components.get_list(asset_type=\"open_source_component\")\r\n```\r\n\r\n### 5. \u5e94\u7528\u8f7d\u4f53\u7ba1\u7406 (`client.carriers`)\r\n\r\n```python\r\n# \u521b\u5efa\u5e94\u7528\u8f7d\u4f53\r\nclient.carriers.create(carrier_data, execute_release=True)\r\n\r\n# \u6279\u91cf\u521b\u5efa\u5e94\u7528\u8f7d\u4f53\r\nclient.carriers.create_batch(carrier_list, execute_release=True)\r\n```\r\n\r\n### 6. \u5b89\u5168\u80fd\u529b\u7ba1\u7406 (`client.security_capabilities`)\r\n\r\n```python\r\n# \u521b\u5efa\u5b89\u5168\u80fd\u529b\r\nclient.security_capabilities.create(capability_data)\r\n\r\n# \u83b7\u53d6\u5b89\u5168\u80fd\u529b\u5217\u8868\r\nresult = client.security_capabilities.get_list()\r\n```\r\n\r\n## \ud83d\udd27 \u9ad8\u7ea7\u7279\u6027\r\n\r\n### \u9519\u8bef\u5904\u7406\r\n\r\n```python\r\nfrom sarm_sdk.exceptions import (\r\n    SARMException,\r\n    SARMAPIError, \r\n    SARMValidationError,\r\n    SARMNetworkError\r\n)\r\n\r\ntry:\r\n    result = client.organizations.create(org_data)\r\nexcept SARMValidationError as e:\r\n    print(f\"\u6570\u636e\u9a8c\u8bc1\u5931\u8d25: {e}\")\r\n    print(f\"\u5b57\u6bb5\u9519\u8bef: {e.field_errors}\")\r\nexcept SARMAPIError as e:\r\n    print(f\"API\u8c03\u7528\u5931\u8d25: {e}\")\r\n    print(f\"\u72b6\u6001\u7801: {e.status_code}\")\r\n    print(f\"\u9519\u8bef\u4ee3\u7801: {e.error_code}\")\r\nexcept SARMNetworkError as e:\r\n    print(f\"\u7f51\u7edc\u9519\u8bef: {e}\")\r\nexcept SARMException as e:\r\n    print(f\"SDK\u9519\u8bef: {e}\")\r\n```\r\n\r\n### \u5ba2\u6237\u7aef\u914d\u7f6e\r\n\r\n```python\r\nclient = SARMClient(\r\n    base_url=\"https://api.platform.com\",\r\n    token=\"your-token\",\r\n    timeout=60,                    # \u8bf7\u6c42\u8d85\u65f6\u65f6\u95f4\r\n    max_retries=3,                 # \u6700\u5927\u91cd\u8bd5\u6b21\u6570\r\n    retry_backoff_factor=0.5       # \u91cd\u8bd5\u9000\u907f\u56e0\u5b50\r\n)\r\n\r\n# \u6d4b\u8bd5\u8fde\u63a5\r\nif client.test_connection():\r\n    print(\"\u8fde\u63a5\u6210\u529f\")\r\nelse:\r\n    print(\"\u8fde\u63a5\u5931\u8d25\")\r\n```\r\n\r\n### Execute-Release \u53c2\u6570\r\n\r\n```python\r\n# execute_release=True: \u6570\u636e\u76f4\u63a5\u53d1\u5e03\uff0c\u8df3\u8fc7\u9884\u5904\u7406\r\nresult = client.organizations.create(org_data, execute_release=True)\r\n\r\n# execute_release=False \u6216\u4e0d\u4f20: \u6570\u636e\u8fdb\u5165\u9884\u5904\u7406\u72b6\u6001\uff0c\u7b49\u5f85\u5ba1\u6838\r\nresult = client.organizations.create(org_data, execute_release=False)\r\n```\r\n\r\n## \ud83d\udcd6 \u6570\u636e\u6a21\u578b\r\n\r\nSDK \u63d0\u4f9b\u4e86\u5b8c\u6574\u7684\u6570\u636e\u6a21\u578b\uff0c\u652f\u6301\u6570\u636e\u9a8c\u8bc1\u548c\u7c7b\u578b\u63d0\u793a\uff1a\r\n\r\n```python\r\nfrom sarm_sdk.models import (\r\n    # \u7ec4\u7ec7\u67b6\u6784\r\n    OrganizeInsert, Organization, OrganizationTree,\r\n    \r\n    # \u6f0f\u6d1e\u7ba1\u7406  \r\n    VulnInsert, Vulnerability, VulnCvss, VulnContext,\r\n    \r\n    # \u5b89\u5168\u95ee\u9898\r\n    IssueInsert, SecurityIssue,\r\n    \r\n    # \u8f6f\u4ef6\u6210\u5206\r\n    ComponentInsert, Component,\r\n    \r\n    # \u5e94\u7528\u8f7d\u4f53\r\n    CarrierInsert, Carrier,\r\n    \r\n    # \u5b89\u5168\u80fd\u529b\r\n    SecurityCapability,\r\n    \r\n    # \u54cd\u5e94\u6a21\u578b\r\n    BatchOperationResult, SuccessResponse, ErrorResponse\r\n)\r\n```\r\n\r\n## \ud83d\udea8 \u91cd\u8981\u6ce8\u610f\u4e8b\u9879\r\n\r\n### 1. \u6570\u636e\u5bfc\u5165\u987a\u5e8f\r\n\r\n\u5efa\u8bae\u6309\u4ee5\u4e0b\u987a\u5e8f\u5bfc\u5165\u6570\u636e\uff0c\u786e\u4fdd\u4f9d\u8d56\u5173\u7cfb\u6b63\u786e\uff1a\r\n\r\n```python\r\n# 1. \u5b89\u5168\u80fd\u529b\uff08\u524d\u7f6e\u4f9d\u8d56\uff09\r\nclient.security_capabilities.create_batch(capabilities)\r\n\r\n# 2. \u7ec4\u7ec7\u67b6\u6784\r\nclient.organizations.create_batch(organizations, execute_release=True)\r\nclient.organizations.refresh_cache()  # \u5fc5\u987b\u5237\u65b0\u7f13\u5b58\uff01\r\n\r\n# 3. \u4e1a\u52a1\u7cfb\u7edf\u548c\u5e94\u7528\u8f7d\u4f53\r\nclient.carriers.create_batch(carriers, execute_release=True)\r\n\r\n# 4. \u8f6f\u4ef6\u6210\u5206\r\nclient.components.create_batch(components, execute_release=True)\r\n\r\n# 5. \u6f0f\u6d1e\u6570\u636e\r\nclient.vulnerabilities.create_batch(vulnerabilities, execute_release=True)\r\n\r\n# 6. \u5b89\u5168\u95ee\u9898\r\nclient.security_issues.create_batch(issues, execute_release=True)\r\n```\r\n\r\n### 2. \u6279\u91cf\u64cd\u4f5c\u9650\u5236\r\n\r\n- \u5355\u6b21\u6279\u91cf\u64cd\u4f5c\u6700\u5927\u652f\u6301 **1000\u6761** \u8bb0\u5f55\r\n- \u8bf7\u6c42\u5927\u5c0f\u9650\u5236\uff1a\u6700\u5927 **10MB**\r\n- \u8bf7\u6c42\u9891\u7387\u9650\u5236\uff1a\u6bcf\u5206\u949f\u6700\u5927 **1000\u6b21** \u8bf7\u6c42\r\n\r\n### 3. \u7ec4\u7ec7\u67b6\u6784\u7f13\u5b58\r\n\r\n- \u6279\u91cf\u5bfc\u5165\u7ec4\u7ec7\u6570\u636e\u540e **\u5fc5\u987b** \u8c03\u7528 `refresh_cache()` \u65b9\u6cd5\r\n- \u7f13\u5b58\u5237\u65b0\u662f\u5f02\u6b65\u64cd\u4f5c\uff0c\u5927\u91cf\u6570\u636e\u53ef\u80fd\u9700\u8981\u7b49\u5f85\r\n- \u5efa\u8bae\u5728\u4e1a\u52a1\u4f4e\u5cf0\u671f\u6267\u884c\u6279\u91cf\u64cd\u4f5c\r\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "Python SDK for SARM(Security Asset Risk Management) Platform",
    "version": "1.0.13",
    "project_urls": {
        "Homepage": "https://www.murphysec.com"
    },
    "split_keywords": [
        "security",
        " asset",
        " risk",
        " management",
        " sdk",
        " api"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "24ecd32543692a6dc496c04a24f96fd178cf23fd85eea9f7a2ab39f8b707d9e3",
                "md5": "7db20dc46fe2c2c487c6e476698aca53",
                "sha256": "89377dbffc2eafd633850b9bf2bbd850acef52496ea1825f0666bb301d0107d6"
            },
            "downloads": -1,
            "filename": "sarm_sdk-1.0.13-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "7db20dc46fe2c2c487c6e476698aca53",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.7",
            "size": 42576,
            "upload_time": "2025-07-17T17:03:29",
            "upload_time_iso_8601": "2025-07-17T17:03:29.024607Z",
            "url": "https://files.pythonhosted.org/packages/24/ec/d32543692a6dc496c04a24f96fd178cf23fd85eea9f7a2ab39f8b707d9e3/sarm_sdk-1.0.13-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "44b0d8b79956af0199bab3947774d27b54e2c19e203154563f8d0f4254e6dcfb",
                "md5": "586551bd5540669ec6e867865f53b9ea",
                "sha256": "953f9514010c251e6fa320ef530d461fc559fb1dfc28d598be04d3526f01b48f"
            },
            "downloads": -1,
            "filename": "sarm_sdk-1.0.13.tar.gz",
            "has_sig": false,
            "md5_digest": "586551bd5540669ec6e867865f53b9ea",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.7",
            "size": 30728,
            "upload_time": "2025-07-17T17:03:30",
            "upload_time_iso_8601": "2025-07-17T17:03:30.101645Z",
            "url": "https://files.pythonhosted.org/packages/44/b0/d8b79956af0199bab3947774d27b54e2c19e203154563f8d0f4254e6dcfb/sarm_sdk-1.0.13.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-07-17 17:03:30",
    "github": false,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "lcname": "sarm-sdk"
}
        
Elapsed time: 0.75833s