API 概览

Shadowrocket桌面端提供完整的RESTful API接口,专为开发者与运维团队设计,支持节点管理、订阅控制、流量查询、规则更新等核心操作的编程化调用。

Python SDK 现已发布

pip install shadowrocket-sdk 即可使用高级封装接口,支持异步调用与自动重试。详情见文末。

基础信息

Base
http://127.0.0.1:1989/api
仅监听本地,安全无公网暴露
Auth
Bearer Token
设置 → 开发者选项中生成
Format
application/json
统一 JSON 响应格式
Encoding
UTF-8
全中文标签页支持

核心接口速查

GET
/v1/status
获取连接状态与流量统计
POST
/v1/node/switch
切换当前节点
POST
/v1/subscription/refresh
刷新订阅同步
GET
/v1/traffic
查询流量详细数据
GET
/v1/nodes
获取节点列表与延迟
POST
/v1/rules/update
远程更新规则集

实战一:节点健康检查与自动切换

企业内网环境中,保持节点池的健康状态至关重要。以下脚本每10分钟执行一次,自动刷新订阅并切换到延迟最低的节点:

#!/usr/bin/env python3 # shadowrocket_auto_switch.py # 定时检查节点健康状况并自动切换最优节点 import requests, json, time from datetime import datetime API = "http://127.0.0.1:1989/api" TOKEN = "your_dev_token" def get_best_node(): """获取延迟最低的节点""" resp = requests.get(f"{API}/v1/nodes", headers={"Authorization": f"Bearer {TOKEN}"}) nodes = resp.json().get("nodes", []) # 按延迟升序排序,选取最优 viable = [n for n in nodes if n.get("latency", 999) < 500] if not viable: return None return min(viable, key=lambda x: x["latency"]) def auto_switch(): ts = datetime.now().strftime("%Y-%m-%d %H:%M") # 刷新订阅 requests.post(f"{API}/v1/subscription/refresh", headers={"Authorization": f"Bearer {TOKEN}"}) best = get_best_node() if best: requests.post(f"{API}/v1/node/switch", json={"node_id": best["id"]}, headers={"Authorization": f"Bearer {TOKEN}"}) print(f"[{ts}] 已切换至 {best['name']} ({best['latency']}ms)") while True: auto_switch() time.sleep(10 * 60) # 每10分钟执行一次

实战二:流量配额告警系统

运维团队可通过API实时监控各节点流量使用情况,超配额时触发告警通知:

#!/usr/bin/env python3 # shadowrocket_quota_monitor.py # 企业流量配额监控与告警 import requests, logging, json from datetime import datetime API = "http://127.0.0.1:1989/api" TOKEN = "your_token" QUOTA_GB = 100 WEBHOOK = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY" logging.basicConfig( level=logging.INFO, format='%(asctime)s %(levelname)s: %(message)s' ) def get_usage(): s = requests.get(f"{API}/v1/status", headers={"Authorization": f"Bearer {TOKEN}"}).json() total = (s.get("up_bytes",0) + s.get("down_bytes",0)) / (1024**3) return round(total, 2) def check_and_alert(): used = get_usage() if used >= QUOTA_GB: logging.warning(f"流量超限: {used}GB / {QUOTA_GB}GB") msg = { "msgtype": "text", "text": { "content": f"⚠️ Shadowrocket节点 {used}GB 流量超限,请及时处理。" } } requests.post(WEBHOOK, json=msg) else: logging.info(f"当前使用量: {used}GB / {QUOTA_GB}GB") if __name__ == "__main__": check_and_alert()

Python SDK 快速上手

# 安装 pip install shadowrocket-sdk # 使用示例 from shadowrocket import ShadowrocketClient client = ShadowrocketClient( host="127.0.0.1", port=1989, token="your_token" ) # 获取状态 status = client.get_status() print(f"已连接: {status.connected}") print(f"当前节点: {status.node}") print(f"延迟: {status.latency_ms}ms") # 切换节点 client.switch_node("jp-tokyo-03") # 刷新订阅 result = client.refresh_subscription() print(f"已加载 {result.nodes_count} 个节点") # 异步用法 import asyncio async def demo(): async with client: status = await client.async_get_status() print(status) asyncio.run(demo())
⚠️ 安全提醒:API Token 在设置页面的「开发者选项」中生成,请勿将其泄露给第三方。API 仅在本地 127.0.0.1 监听,无公网暴露风险,但建议配合系统防火墙使用。

注意事项