ClawHub API Guidance 技能是一个全面的 API 使用指南,帮助开发者快速上手并熟练使用 ClawHub API。本技能提供了详细的 API 文档、认证说明、使用场景、最佳实践和错误处理指南。
2026-06-03
欢迎使用 ClawHub API!本指南将帮助您在 5 分钟内完成第一个 API 调用。
clh_...curl 或 requests (Python) 等工具bash
curl -X GET "https://clawhub.ai/api/v1/search?q=example&limit=10"
python
import requests
response = requests.get(
"https://clawhub.ai/api/v1/search",
params={"q": "example", "limit": 10}
)
print(response.json())
Q: 我需要认证吗? A: 公开读取端点(如搜索、列表)无需认证。写入和账户操作需要 Bearer Token。
Q: 如何处理限流?
A: 监控响应头中的 X-RateLimit-Remaining,在接近限制时减慢请求速度。
ClawHub API 使用 Bearer Token 认证。
http
Authorization: Bearer clh_...
详细的API接口文档已移至 reference/api-reference.md,包含41个接口的完整说明。
接口分类主要端点技能搜索GET /api/v1/search技能列表GET /api/v1/skills技能详情GET /api/v1/skills/{slug}包列表GET /api/v1/packages包详情GET /api/v1/packages/{name}包下载GET /api/v1/packages/{name}/download用户信息GET /api/v1/whoami
适用API: GET /api/v1/skills, GET /api/v1/skills/{slug}, GET /api/v1/search
实现步骤:
GET /api/v1/skills 获取技能列表GET /api/v1/skills/{slug} 获取详细信息GET /api/v1/search 实现搜索功能python
import requests
import time
BASE_URL = "https://clawhub.ai/api/v1"
def get_skills(limit=20, cursor=None):
params = {"limit": limit}
if cursor:
params["cursor"] = cursor
response = requests.get(f"{BASE_URL}/skills", params=params)
if response.status_code == 429:
retry_after = int(response.headers.get("Retry-After", 5))
time.sleep(retry_after)
return get_skills(limit, cursor)
return response.json()
def search_skills(query, limit=10):
response = requests.get(
f"{BASE_URL}/search",
params={"q": query, "limit": limit}
)
return response.json()
# 使用示例
skills = get_skills(limit=20)
print(f"获取到 {len(skills.get('items', []))} 个技能")
适用API: GET /api/v1/skills/{slug}/moderation, GET /api/v1/skills/{slug}/scan, GET /api/v1/packages/{name}/versions/{version}/security
实现步骤:
python
import requests
BASE_URL = "https://clawhub.ai/api/v1"
def is_skill_safe(slug, version):
# 检查审核状态
moderation = requests.get(f"{BASE_URL}/skills/{slug}/moderation").json()
if moderation.get('isMalwareBlocked') or moderation.get('isSuspicious'):
return False
# 检查安全扫描
scan = requests.get(f"{BASE_URL}/skills/{slug}/scan").json()
if scan.get('status') in ['malicious', 'suspicious']:
return False
# 检查包信任摘要
security = requests.get(f"{BASE_URL}/packages/@owner/{slug}/versions/{version}/security").json()
trust = security.get('trust', {})
if trust.get('blockedFromDownload'):
return False
if trust.get('scanStatus') != 'clean':
return False
if trust.get('moderationState') != 'approved':
return False
return True
# 使用示例
is_safe = is_skill_safe("example-skill", "1.0.0")
适用API: GET /api/v1/download, GET /api/v1/packages/{name}/download, GET /api/v1/skills/{slug}/file
实现步骤:
python
import requests
import zipfile
BASE_URL = "https://clawhub.ai/api/v1"
def download_skill(slug, version=None):
params = {"slug": slug}
if version:
params["version"] = version
response = requests.get(
f"{BASE_URL}/download",
params=params,
stream=True
)
if response.status_code == 200:
filename = f"{slug}.zip"
with open(filename, 'wb') as f:
for chunk in response.iter_content(chunk_size=8192):
f.write(chunk)
return filename
return None
def get_skill_file(slug, file_path, version=None):
params = {"path": file_path}
if version:
params["version"] = version
response = requests.get(
f"{BASE_URL}/skills/{slug}/file",
params=params
)
if response.status_code == 200:
return response.text
return None
# 使用示例
zip_path = download_skill("example-skill", version="1.0.0")
readme = get_skill_file("example-skill", "README.md", version="1.0.0")
python
import requests
from requests.exceptions import RequestException
try:
response = requests.get("https://clawhub.ai/api/v1/skills", timeout=10)
response.raise_for_status()
data = response.json()
except RequestException as e:
print(f"请求异常: {e}")
python
import time
import random
def request_with_retry(url, params=None, max_retries=3):
for attempt in range(max_retries):
response = requests.get(url, params=params)
if response.status_code != 429:
return response
retry_after = int(response.headers.get("Retry-After", 2))
jitter = random.uniform(0, 1)
wait_time = retry_after + jitter
print(f"限流中,等待 {wait_time:.1f} 秒后重试...")
time.sleep(wait_time)
return response
python
from functools import lru_cache
@lru_cache(maxsize=100)
def get_skill_detail_cached(slug):
response = requests.get(f"https://clawhub.ai/api/v1/skills/{slug}")
return response.json()
python
import os
# ✅ 推荐:使用环境变量
API_KEY = os.getenv("CLAWHUB_API_KEY")
# ❌ 不推荐:硬编码
API_KEY = "clh_abc123..."
状态码含义处理建议400Bad Request检查参数格式和值是否正确401Unauthorized重新获取有效的Bearer Token403Forbidden检查账户权限,确认资源未被审核阻止404Not Found确认slug、version等参数正确413Payload Too Large减小文件大小或分批上传415Unsupported Media Type检查Content-Type是否正确429Too Many Requests实现指数退避重试,尊重Retry-After头
操作类型每IP限制每Key限制读取3000/分钟12000/分钟写入300/分钟3000/分钟下载1200/分钟6000/分钟
响应头说明X-RateLimit-Limit限流配额总数X-RateLimit-Remaining剩余配额X-RateLimit-ResetUnix时间戳(绝对重置时间)Retry-After429状态码时建议等待的秒数
python
import time
import random
def handle_rate_limit(response):
retry_after = response.headers.get("Retry-After")
if retry_after:
wait_time = int(retry_after)
else:
reset = response.headers.get("RateLimit-Reset")
if reset:
wait_time = int(reset)
else:
wait_time = 5
jitter = random.uniform(0, 1)
wait_time += jitter
print(f"速率限制,等待 {wait_time:.1f} 秒...")
time.sleep(wait_time)
GET /api/v1/skills, GET /api/v1/search, GET /api/v1/skills/{slug}429、 Retry-After 和限流响应头,避免激进轮询https://clawhub.ai/<owner>/<slug>ClawHub API Guidance 技能提供了完整的 ClawHub API 使用指南:
开发者可以参考本技能文档,快速集成和使用 ClawHub API。
🎯