Ezviz Device Capture (萤石设备抓图) 批量获取萤石摄像头实时画面,支持多设备同时抓图。 --- ⚠️ 安全警告 (安装前必读) 在使用此技能前,请完成以下安全检查: | # | 检查项 | 状态 | 说明 | |---|--------|------|------| | 1 | 凭证权限 | ⚠️ 必需 | 使用 最小权限 的 AppKey/AppSecret,不要用主账号凭证 | | 2 | 配置文件读取 | ⚠️ 注意 | 技能会读取 文件( 但环境变量优先级更高 ) | | 3 | Token 缓存 | ⚠️ 注意 | Token 缓存在 (权限 600) | | 4 | API 域名 | ✅ 已验证 | 是萤石官方 API 端点( = Open API,不是 AI) | | 5 | 代码审查 | ✅ 推荐 | 审查 和 | 🔒 配置文件读取详细说明 凭证获取优先级 (从高到低): 安全建议 : - ✅ 最佳实践 : 使用环境变量,完全避免配置文件读取 - ✅ 隔离配置 : 在专用配置文件只存放萤石凭证,不混用其他服务 - ⚠️ 风险缓解 : 设置环境变量覆盖配置文件(即使配置文件存在也会被忽略) 快速安全配置 凭证优先级 技能按以下顺序获取凭证( 优先级从高到低 ): 1. 环境变量 ( , ) ← 推荐 2. Channels 配置 ( 等) 3…

, device_str):\n print(f\"[ERROR] Invalid device serial format. Only alphanumeric, colon, comma allowed.\")\n sys.exit(1)\n print(f\"[OK] Device serial format validated\")\n \n # Validate credentials source\n if config_source == \"config file\":\n print(f\"[WARNING] Using credentials from config file - ensure dedicated Ezviz credentials\")\n else:\n print(f\"[OK] Using credentials from environment variables\")\n \n print()\n \n print(f\"[INFO] Target devices: {len(devices)}\")\n for serial, channel in devices:\n print(f\" - {serial} (Channel: {channel})\")\n \n # Step 1: Get access token (with caching)\n print(f\"\\n{'='*60}\")\n print(\"[Step 1] Getting access token...\")\n token_result = get_access_token(app_key, app_secret, use_cache=None) # Respects EZVIZ_TOKEN_CACHE env\n \n if not token_result[\"success\"]:\n print(f\"[ERROR] Failed to get token: {token_result.get('error', 'Unknown error')}\")\n sys.exit(1)\n \n access_token = token_result[\"access_token\"]\n expire_time = token_result.get(\"expire_time\", 0)\n expire_str = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(expire_time / 1000))\n from_cache = token_result.get(\"from_cache\", False)\n \n if from_cache:\n print(f\"[SUCCESS] Using cached token, expires: {expire_str}\")\n else:\n print(f\"[SUCCESS] Token obtained, expires: {expire_str}\")\n \n # Step 2: Capture images from all devices\n print(f\"\\n{'='*60}\")\n print(\"[Step 2] Capturing images...\")\n print(f\"{'='*60}\")\n \n results = {\n \"total\": len(devices),\n \"success\": 0,\n \"failed\": 0,\n \"captures\": []\n }\n \n for device_serial, channel_no in devices:\n print(f\"\\n[Device] {device_serial} (Channel: {channel_no})\")\n \n capture_result = capture_device_image(access_token, device_serial, channel_no)\n \n if capture_result[\"success\"]:\n pic_url = capture_result[\"pic_url\"]\n print(f\"[SUCCESS] Image captured: {pic_url[:60]}...\")\n \n # Download if path specified\n local_path = None\n if download_path:\n os.makedirs(download_path, exist_ok=True)\n timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')\n filename = f\"{device_serial}_{timestamp}.jpg\"\n local_path = os.path.join(download_path, filename)\n download_image(pic_url, local_path)\n \n results[\"success\"] += 1\n results[\"captures\"].append({\n \"device\": device_serial,\n \"channel\": channel_no,\n \"pic_url\": pic_url,\n \"local_path\": local_path,\n \"expire_hours\": 2\n })\n else:\n error_msg = capture_result.get(\"error\", \"Unknown error\")\n error_code = capture_result.get(\"code\", \"\")\n print(f\"[FAILED] {error_msg} (Code: {error_code})\")\n results[\"failed\"] += 1\n results[\"captures\"].append({\n \"device\": device_serial,\n \"channel\": channel_no,\n \"error\": error_msg,\n \"code\": error_code\n })\n \n # Wait 4s between captures to avoid rate limiting (Ezviz recommends >=4s interval)\n time.sleep(4)\n \n # Print summary\n print(f\"\\n{'='*60}\")\n print(\"CAPTURE SUMMARY\")\n print(f\"{'='*60}\")\n print(f\" Total devices: {results['total']}\")\n print(f\" Success: {results['success']}\")\n print(f\" Failed: {results['failed']}\")\n print(f\"{'='*60}\")\n \n # Output JSON result\n print(f\"\\n[JSON Result]\")\n print(json.dumps(results, indent=2, ensure_ascii=False))\n \n print(f\"\\n{'='*60}\")\n print(\"Workflow completed\")\n print(f\"{'='*60}\")\n \n # Exit with error if any failed\n sys.exit(0 if results[\"failed\"] == 0 else 1)\n\n\nif __name__ == \"__main__\":\n main()\n","content_type":"text/x-python; charset=utf-8","language":"python","size":14927,"content_sha256":"dd6ff522aab040be03b729eea62cc696e33102f821136aa69a0b9027cee99307"}],"content_json":{"type":"doc","content":[{"type":"heading","attrs":{"level":1},"content":[{"text":"Ezviz Device Capture (萤石设备抓图)","type":"text"}]},{"type":"paragraph","content":[{"text":"批量获取萤石摄像头实时画面,支持多设备同时抓图。","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"⚠️ 安全警告 (安装前必读)","type":"text"}]},{"type":"paragraph","content":[{"text":"在使用此技能前,请完成以下安全检查:","type":"text","marks":[{"type":"strong"}]}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"#","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"检查项","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"状态","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"说明","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"1","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"凭证权限","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"⚠️ 必需","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"使用","type":"text"},{"text":"最小权限","type":"text","marks":[{"type":"strong"}]},{"text":"的 AppKey/AppSecret,不要用主账号凭证","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"2","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"配置文件读取","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"⚠️ 注意","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"技能会读取 ","type":"text"},{"text":"~/.openclaw/*.json","type":"text","marks":[{"type":"code_inline"}]},{"text":" 文件(","type":"text"},{"text":"但环境变量优先级更高","type":"text","marks":[{"type":"strong"}]},{"text":")","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"3","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Token 缓存","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"⚠️ 注意","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Token 缓存在 ","type":"text"},{"text":"/tmp/ezviz_global_token_cache/","type":"text","marks":[{"type":"code_inline"}]},{"text":" (权限 600)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"4","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"API 域名","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"✅ 已验证","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"openai.ys7.com","type":"text","marks":[{"type":"code_inline"}]},{"text":" 是萤石官方 API 端点(","type":"text"},{"text":"openai","type":"text","marks":[{"type":"code_inline"}]},{"text":" = Open API,不是 AI)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"5","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"代码审查","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"✅ 推荐","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"审查 ","type":"text"},{"text":"scripts/device_capture.py","type":"text","marks":[{"type":"code_inline"}]},{"text":" 和 ","type":"text"},{"text":"lib/token_manager.py","type":"text","marks":[{"type":"code_inline"}]}]}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"🔒 配置文件读取详细说明","type":"text"}]},{"type":"paragraph","content":[{"text":"凭证获取优先级","type":"text","marks":[{"type":"strong"}]},{"text":"(从高到低):","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"┌─────────────────────────────────────────────────────────────┐\n│ 1. 环境变量 (最高优先级 - 推荐) │\n│ ├─ EZVIZ_APP_KEY │\n│ ├─ EZVIZ_APP_SECRET │\n│ └─ EZVIZ_DEVICE_SERIAL │\n│ ✅ 优点:不读取配置文件,完全隔离 │\n├─────────────────────────────────────────────────────────────┤\n│ 2. OpenClaw 配置文件 (仅当环境变量未设置时使用) │\n│ ├─ ~/.openclaw/config.json │\n│ ├─ ~/.openclaw/gateway/config.json │\n│ └─ ~/.openclaw/channels.json │\n│ ⚠️ 注意:只读取 channels.ezviz 字段,不读取其他服务凭证 │\n├─────────────────────────────────────────────────────────────┤\n│ 3. 命令行参数 (最低优先级) │\n│ python3 device_capture.py appKey appSecret deviceSerial │\n└─────────────────────────────────────────────────────────────┘","type":"text"}]},{"type":"paragraph","content":[{"text":"安全建议","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"✅ ","type":"text"},{"text":"最佳实践","type":"text","marks":[{"type":"strong"}]},{"text":": 使用环境变量,完全避免配置文件读取","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"✅ ","type":"text"},{"text":"隔离配置","type":"text","marks":[{"type":"strong"}]},{"text":": 在专用配置文件只存放萤石凭证,不混用其他服务","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"⚠️ ","type":"text"},{"text":"风险缓解","type":"text","marks":[{"type":"strong"}]},{"text":": 设置环境变量覆盖配置文件(即使配置文件存在也会被忽略)","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"快速安全配置","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# 1. 使用环境变量(优先级最高,避免配置文件意外使用)\nexport EZVIZ_APP_KEY=\"your_dedicated_app_key\"\nexport EZVIZ_APP_SECRET=\"your_dedicated_app_secret\"\nexport EZVIZ_DEVICE_SERIAL=\"dev1,dev2,dev3\"\n\n# 2. 高安全环境:禁用 Token 缓存\nexport EZVIZ_TOKEN_CACHE=0\n\n# 3. 测试凭证(推荐先用测试账号)\n# 登录 https://openai.ys7.com/ 创建专用应用,仅开通抓图相关权限","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"凭证优先级","type":"text"}]},{"type":"paragraph","content":[{"text":"技能按以下顺序获取凭证(","type":"text"},{"text":"优先级从高到低","type":"text","marks":[{"type":"strong"}]},{"text":"):","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"环境变量","type":"text","marks":[{"type":"strong"}]},{"text":" (","type":"text"},{"text":"EZVIZ_APP_KEY","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"EZVIZ_APP_SECRET","type":"text","marks":[{"type":"code_inline"}]},{"text":") ← 推荐","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Channels 配置","type":"text","marks":[{"type":"strong"}]},{"text":" (","type":"text"},{"text":"~/.openclaw/config.json","type":"text","marks":[{"type":"code_inline"}]},{"text":" 等)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"命令行参数","type":"text","marks":[{"type":"strong"}]},{"text":" (直接传入)","type":"text"}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"快速开始","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"安装依赖","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"pip install requests","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"设置环境变量","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"export EZVIZ_APP_KEY=\"your_app_key\"\nexport EZVIZ_APP_SECRET=\"your_app_secret\"\nexport EZVIZ_DEVICE_SERIAL=\"dev1,dev2,dev3\"","type":"text"}]},{"type":"paragraph","content":[{"text":"可选环境变量:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"export EZVIZ_CHANNEL_NO=\"1\" # 通道号,默认 1\nexport EZVIZ_DOWNLOAD_PATH=\"./captures\" # 下载路径(可选)\nexport EZVIZ_TOKEN_CACHE=\"1\" # Token 缓存:1=启用 (默认), 0=禁用","type":"text"}]},{"type":"paragraph","content":[{"text":"Token 缓存说明","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"✅ ","type":"text"},{"text":"默认启用","type":"text","marks":[{"type":"strong"}]},{"text":": 技能默认使用 Token 缓存,提升效率","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"⚠️ ","type":"text"},{"text":"禁用缓存","type":"text","marks":[{"type":"strong"}]},{"text":": 设置 ","type":"text"},{"text":"EZVIZ_TOKEN_CACHE=0","type":"text","marks":[{"type":"code_inline"}]},{"text":" 每次重新获取 Token","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"📁 ","type":"text"},{"text":"缓存位置","type":"text","marks":[{"type":"strong"}]},{"text":": ","type":"text"},{"text":"/tmp/ezviz_global_token_cache/global_token_cache.json","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"🔒 ","type":"text"},{"text":"文件权限","type":"text","marks":[{"type":"strong"}]},{"text":": 600 (仅所有者可读写)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"⏰ ","type":"text"},{"text":"有效期","type":"text","marks":[{"type":"strong"}]},{"text":": 7 天,到期前 5 分钟自动刷新","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"注意","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"不需要设置 ","type":"text"},{"text":"EZVIZ_ACCESS_TOKEN","type":"text","marks":[{"type":"code_inline"}]},{"text":"!技能会自动获取 Token","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"图片 URL 有效期 2 小时","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"运行","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"python3 {baseDir}/scripts/device_capture.py","type":"text"}]},{"type":"paragraph","content":[{"text":"命令行参数:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# 单个设备\npython3 {baseDir}/scripts/device_capture.py appKey appSecret dev1 1\n\n# 多个设备(逗号分隔)\npython3 {baseDir}/scripts/device_capture.py appKey appSecret \"dev1,dev2,dev3\" 1\n\n# 指定通道号\npython3 {baseDir}/scripts/device_capture.py appKey appSecret \"dev1:1,dev2:2\" 1\n\n# 带下载路径\npython3 {baseDir}/scripts/device_capture.py appKey appSecret \"dev1,dev2\" 1 ./captures","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Channels 配置(推荐)","type":"text"}]},{"type":"paragraph","content":[{"text":"技能支持从 OpenClaw 的 channels 配置中自动读取萤石凭证,无需单独设置环境变量。","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"配置方式","type":"text"}]},{"type":"paragraph","content":[{"text":"在 ","type":"text"},{"text":"~/.openclaw/config.json","type":"text","marks":[{"type":"code_inline"}]},{"text":" 或 ","type":"text"},{"text":"~/.openclaw/channels.json","type":"text","marks":[{"type":"code_inline"}]},{"text":" 中添加:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"json"},"content":[{"text":"{\n \"channels\": {\n \"ezviz\": {\n \"appId\": \"your_app_id\",\n \"appSecret\": \"your_app_secret\",\n \"domain\": \"https://openai.ys7.com\",\n \"enabled\": true\n }\n }\n}","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"配置搜索顺序","type":"text"}]},{"type":"paragraph","content":[{"text":"技能会按以下顺序查找配置文件:","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"~/.openclaw/config.json","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"~/.openclaw/gateway/config.json","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"~/.openclaw/channels.json","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"优先级","type":"text"}]},{"type":"paragraph","content":[{"text":"凭证获取优先级:","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"环境变量","type":"text","marks":[{"type":"strong"}]},{"text":" (最高优先级)","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"EZVIZ_APP_KEY","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"EZVIZ_APP_SECRET","type":"text","marks":[{"type":"code_inline"}]}]}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Channels 配置","type":"text","marks":[{"type":"strong"}]},{"text":" (中等优先级)","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"channels.ezviz.appId","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"channels.ezviz.appSecret","type":"text","marks":[{"type":"code_inline"}]}]}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"命令行参数","type":"text","marks":[{"type":"strong"}]},{"text":" (最低优先级)","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"优势","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"✅ 集中管理凭证","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"✅ 无需每次设置环境变量","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"✅ 多个技能共享同一配置","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"✅ 更符合 OpenClaw 最佳实践","type":"text"}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"工作流程","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"1. 获取 Token (appKey + appSecret → accessToken)\n ↓\n2. 设备抓图 (accessToken + deviceSerial → picUrl)\n ↓\n3. 可选下载 (picUrl → 本地文件)\n ↓\n4. 输出结果 (JSON + 控制台)","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Token 自动获取说明","type":"text"}]},{"type":"paragraph","content":[{"text":"你不需要手动获取或配置 ","type":"text","marks":[{"type":"strong"}]},{"text":"EZVIZ_ACCESS_TOKEN","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":"!","type":"text","marks":[{"type":"strong"}]}]},{"type":"paragraph","content":[{"text":"技能会自动处理 Token 的获取:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"首次运行:\n appKey + appSecret → 调用萤石 API → 获取 accessToken (有效期 7 天)\n ↓\n保存到缓存文件(系统临时目录)\n ↓\n后续运行:\n 检查缓存 Token 是否过期\n ├─ 未过期 → 直接使用缓存 Token ✅\n └─ 已过期 → 重新获取新 Token","type":"text"}]},{"type":"paragraph","content":[{"text":"Token 管理特性","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"✅ ","type":"text"},{"text":"自动获取","type":"text","marks":[{"type":"strong"}]},{"text":": 首次运行自动调用萤石 API 获取","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"✅ ","type":"text"},{"text":"有效期 7 天","type":"text","marks":[{"type":"strong"}]},{"text":": 获取的 Token 7 天内有效","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"✅ ","type":"text"},{"text":"智能缓存","type":"text","marks":[{"type":"strong"}]},{"text":": Token 有效期内不重复获取,提升效率","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"✅ ","type":"text"},{"text":"安全缓冲","type":"text","marks":[{"type":"strong"}]},{"text":": 到期前 5 分钟自动刷新,避免边界问题","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"✅ ","type":"text"},{"text":"无需配置","type":"text","marks":[{"type":"strong"}]},{"text":": 不需要手动设置 ","type":"text"},{"text":"EZVIZ_ACCESS_TOKEN","type":"text","marks":[{"type":"code_inline"}]},{"text":" 环境变量","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"✅ ","type":"text"},{"text":"安全存储","type":"text","marks":[{"type":"strong"}]},{"text":": 缓存文件存储在系统临时目录,权限 600","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"⚠️ ","type":"text"},{"text":"可选禁用","type":"text","marks":[{"type":"strong"}]},{"text":": 设置 ","type":"text"},{"text":"EZVIZ_TOKEN_CACHE=0","type":"text","marks":[{"type":"code_inline"}]},{"text":" 可禁用缓存(每次运行重新获取)","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"输出示例","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"======================================================================\nEzviz Device Capture Skill (萤石设备抓图)\n======================================================================\n[Time] 2026-03-18 20:14:51\n[INFO] Target devices: 1\n - BF6985110 (Channel: 1)\n\n======================================================================\nSECURITY VALIDATION\n======================================================================\n[OK] Device serial format validated\n[OK] Using credentials from environment variables\n\n======================================================================\n[Step 1] Getting access token...\n======================================================================\n[INFO] Using cached global token, expires: 2026-03-25 19:21:16\n[SUCCESS] Using cached token, expires: 2026-03-25 19:21:16\n\n======================================================================\n[Step 2] Capturing images...\n======================================================================\n\n[Device] BF6985110 (Channel: 1)\n[SUCCESS] Image captured: https://opencapture.ys7.com/...\n\n======================================================================\nCAPTURE SUMMARY\n======================================================================\n Total devices: 1\n Success: 1\n Failed: 0\n======================================================================","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"多设备格式","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"格式","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"示例","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"说明","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"单设备","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"dev1","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"默认通道 1","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"多设备","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"dev1,dev2,dev3","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"全部使用默认通道","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"指定通道","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"dev1:1,dev2:2","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"每个设备独立通道","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"混合","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"dev1,dev2:2,dev3","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"部分指定通道","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"API 接口","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"接口","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"URL","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"文档","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"获取 Token","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"POST /api/lapp/token/get","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"https://openai.ys7.com/help/81","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"设备抓图","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"POST /api/lapp/device/capture","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"https://openai.ys7.com/help/687","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"网络端点","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"域名","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"用途","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"openai.ys7.com","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"萤石开放平台 API(Token、抓图)","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"格式代码","type":"text"}]},{"type":"paragraph","content":[{"text":"返回字段","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"picUrl","type":"text","marks":[{"type":"code_inline"}]},{"text":" - 抓拍图片 URL(有效期 2 小时)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"expire_hours","type":"text","marks":[{"type":"code_inline"}]},{"text":" - URL 有效期(2 小时)","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"错误码","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"200","type":"text","marks":[{"type":"code_inline"}]},{"text":" - 操作成功","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"10002","type":"text","marks":[{"type":"code_inline"}]},{"text":" - accessToken 过期","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"10028","type":"text","marks":[{"type":"code_inline"}]},{"text":" - 抓图次数超限","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"20007","type":"text","marks":[{"type":"code_inline"}]},{"text":" - 设备不在线","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"20008","type":"text","marks":[{"type":"code_inline"}]},{"text":" - 设备响应超时","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Tips","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"多设备","type":"text","marks":[{"type":"strong"}]},{"text":": 逗号分隔 ","type":"text"},{"text":"dev1,dev2,dev3","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"指定通道","type":"text","marks":[{"type":"strong"}]},{"text":": 冒号分隔 ","type":"text"},{"text":"dev1:1,dev2:2","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Token 有效期","type":"text","marks":[{"type":"strong"}]},{"text":": 7 天(每次运行自动获取)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"图片有效期","type":"text","marks":[{"type":"strong"}]},{"text":": 2 小时","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"频率限制","type":"text","marks":[{"type":"strong"}]},{"text":": 设备间自动间隔 4 秒,避免限流","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"定时任务","type":"text","marks":[{"type":"strong"}]},{"text":": 建议 ≥5 分钟","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"下载路径","type":"text","marks":[{"type":"strong"}]},{"text":": 设置 ","type":"text"},{"text":"EZVIZ_DOWNLOAD_PATH","type":"text","marks":[{"type":"code_inline"}]},{"text":" 自动下载图片","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"注意事项","type":"text"}]},{"type":"paragraph","content":[{"text":"⚠️ ","type":"text"},{"text":"频率限制","type":"text","marks":[{"type":"strong"}]},{"text":": 萤石抓图接口建议间隔 4 秒以上。技能已自动在设备间等待 4 秒,避免触发限流(错误码 10028)","type":"text"}]},{"type":"paragraph","content":[{"text":"⚠️ ","type":"text"},{"text":"隐私合规","type":"text","marks":[{"type":"strong"}]},{"text":": 使用摄像头监控可能涉及隐私问题,确保符合当地法律法规","type":"text"}]},{"type":"paragraph","content":[{"text":"⚠️ ","type":"text"},{"text":"设备要求","type":"text","marks":[{"type":"strong"}]},{"text":": 设备必须在线且支持抓图功能(","type":"text"},{"text":"support_capture=1","type":"text","marks":[{"type":"code_inline"}]},{"text":")","type":"text"}]},{"type":"paragraph","content":[{"text":"⚠️ ","type":"text"},{"text":"Token 安全","type":"text","marks":[{"type":"strong"}]},{"text":": Token 会缓存到系统临时目录(自动管理),不写入日志,不发送到非萤石端点","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"数据流出说明","type":"text"}]},{"type":"paragraph","content":[{"text":"本技能会向第三方服务发送数据","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"数据类型","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"发送到","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"用途","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"是否必需","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"appKey/appSecret","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"openai.ys7.com","type":"text","marks":[{"type":"code_inline"}]},{"text":" (萤石)","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"获取访问 Token","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"✅ 必需","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"设备序列号","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"openai.ys7.com","type":"text","marks":[{"type":"code_inline"}]},{"text":" (萤石)","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"请求抓图","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"✅ 必需","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"抓拍图片 URL","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"openai.ys7.com","type":"text","marks":[{"type":"code_inline"}]},{"text":" (萤石)","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"返回图片地址","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"✅ 必需","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"EZVIZ_ACCESS_TOKEN","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"自动生成","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"每次运行自动获取","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"✅ 自动","type":"text","marks":[{"type":"strong"}]}]}]}]}]},{"type":"paragraph","content":[{"text":"数据流出说明","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"✅ ","type":"text"},{"text":"萤石开放平台","type":"text","marks":[{"type":"strong"}]},{"text":" (","type":"text"},{"text":"openai.ys7.com","type":"text","marks":[{"type":"code_inline"}]},{"text":"): Token 请求、设备抓图 - 萤石官方 API","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"❌ ","type":"text"},{"text":"无其他第三方","type":"text","marks":[{"type":"strong"}]},{"text":": 不会发送数据到其他服务","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"❌ ","type":"text"},{"text":"图片不上传","type":"text","marks":[{"type":"strong"}]},{"text":": 图片存储在萤石服务器,技能只获取 URL","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"凭证权限建议","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"使用","type":"text"},{"text":"最小权限","type":"text","marks":[{"type":"strong"}]},{"text":"的 appKey/appSecret","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"仅开通必要的 API 权限(设备抓图)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"定期轮换凭证","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"不要使用主账号凭证","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"本地处理","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"✅ Token 缓存到系统临时目录(","type":"text"},{"text":"/tmp/ezviz_global_token_cache/","type":"text","marks":[{"type":"code_inline"}]},{"text":"),权限 600","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"✅ Token 有效期 7 天,到期前 5 分钟自动刷新","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"✅ 可禁用缓存:设置 ","type":"text"},{"text":"EZVIZ_TOKEN_CACHE=0","type":"text","marks":[{"type":"code_inline"}]},{"text":" 环境变量","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"✅ 不记录完整 API 响应","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"✅ 图片 URL 只显示前 50 字符","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"✅ 可选下载图片到本地(默认不下载)","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"应用场景","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"场景","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"说明","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"📸 监控存档","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"定时抓图保存,建立监控档案","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"🔍 异常记录","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"检测到异常时自动抓图取证","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"📊 巡检报告","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"定期抓图生成巡检报告","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"🏠 智能家居","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"远程查看家中实时画面","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"🏪 店铺管理","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"多店铺摄像头集中管理","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"使用示例","type":"text"}]},{"type":"paragraph","content":[{"text":"场景 1: 单设备快速抓图","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"python3 device_capture.py your_key your_secret BF6985110","type":"text"}]},{"type":"paragraph","content":[{"text":"场景 2: 多设备批量抓图","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"export EZVIZ_DEVICE_SERIAL=\"dev1,dev2,dev3\"\npython3 device_capture.py","type":"text"}]},{"type":"paragraph","content":[{"text":"场景 3: 指定通道抓图","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"python3 device_capture.py your_key your_secret \"dev1:1,dev2:2\"","type":"text"}]},{"type":"paragraph","content":[{"text":"场景 4: 下载图片到本地","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"export EZVIZ_DOWNLOAD_PATH=\"./captures\"\npython3 device_capture.py your_key your_secret dev1","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"API 端点","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"接口","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"URL","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"文档","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"获取 Token","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"POST /api/lapp/token/get","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"https://openai.ys7.com/help/81","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"设备抓图","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"POST /api/lapp/device/capture","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"https://openai.ys7.com/help/687","type":"text"}]}]}]}]},{"type":"paragraph","content":[{"text":"API 域名","type":"text","marks":[{"type":"strong"}]},{"text":": ","type":"text"},{"text":"https://openai.ys7.com","type":"text","marks":[{"type":"code_inline"}]},{"text":" (萤石开放平台 API 专用)","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"⚠️ 域名说明","type":"text"}]},{"type":"paragraph","content":[{"text":"为什么是 ","type":"text","marks":[{"type":"strong"}]},{"text":"openai.ys7.com","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":" 而不是 ","type":"text","marks":[{"type":"strong"}]},{"text":"open.ys7.com","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":"?","type":"text","marks":[{"type":"strong"}]}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"域名","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"用途","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"说明","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"openai.ys7.com","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"✅ API 接口","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"萤石开放平台 ","type":"text"},{"text":"API 专用域名","type":"text","marks":[{"type":"strong"}]},{"text":"(AI 不是指人工智能)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"open.ys7.com","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"🌐 官方网站","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"萤石开放平台 ","type":"text"},{"text":"官网/文档","type":"text","marks":[{"type":"strong"}]},{"text":" 入口","type":"text"}]}]}]}]},{"type":"paragraph","content":[{"text":"openai","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":" 的含义","type":"text","marks":[{"type":"strong"}]},{"text":": 这里是 \"Open API\" 的缩写,","type":"text"},{"text":"不是","type":"text","marks":[{"type":"strong"}]},{"text":" 指 OpenAI 或人工智能。","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"✅ 域名验证","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# 验证 API 域名连通性\ncurl -I https://openai.ys7.com/api/lapp/token/get\n\n# 验证官网连通性\ncurl -I https://open.ys7.com/\n\n# 检查 SSL 证书(API 域名)\ncurl -vI https://openai.ys7.com/api/lapp/token/get 2>&1 | grep -A5 \"SSL certificate\"\n\n# 验证域名所有权(萤石)\nwhois ys7.com","type":"text"}]},{"type":"paragraph","content":[{"text":"官方文档","type":"text","marks":[{"type":"strong"}]},{"text":": https://open.ys7.com/","type":"text"}]},{"type":"paragraph","content":[{"text":"安全提示","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"✅ ","type":"text"},{"text":"openai.ys7.com","type":"text","marks":[{"type":"code_inline"}]},{"text":" 是萤石官方 API 域名","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"✅ 两个域名都属于萤石(ys7.com)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"⚠️ 如果担心域名安全,先用测试凭证验证","type":"text"}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"API 详细说明","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"1. 获取 AccessToken 接口","type":"text"}]},{"type":"paragraph","content":[{"text":"文档 URL","type":"text","marks":[{"type":"strong"}]},{"text":": https://openai.ys7.com/help/81","type":"text"}]},{"type":"paragraph","content":[{"text":"接口说明","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"AccessToken 是访问令牌,接口调用必备的公共参数","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"有效期 7 天","type":"text","marks":[{"type":"strong"}]},{"text":",有效期内不需要重复申请","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"新 Token 不会使老 Token 失效","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"最佳实践:本地缓存,即将过期或报错 10002 时再获取","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"请求地址","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"POST https://openai.ys7.com/api/lapp/token/get","type":"text"}]},{"type":"paragraph","content":[{"text":"请求参数","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"参数名","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"类型","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"描述","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"是否必选","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"appKey","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"String","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"appKey","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Y","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"appSecret","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"String","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"appSecret","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Y","type":"text"}]}]}]}]},{"type":"paragraph","content":[{"text":"返回数据","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"json"},"content":[{"text":"{\n \"data\": {\n \"accessToken\": \"at.xxxxxxxxxxxxx\",\n \"expireTime\": 1470810222045\n },\n \"code\": \"200\",\n \"msg\": \"操作成功!\"\n}","type":"text"}]},{"type":"paragraph","content":[{"text":"错误码","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"返回码","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"返回消息","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"描述","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"200","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"操作成功","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"请求成功","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"10001","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"参数错误","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"参数为空或格式不正确","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"10005","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"appKey 异常","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"appKey 被冻结","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"10017","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"appKey 不存在","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"确认 appKey 是否正确","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"10030","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"appkey 和 appSecret 不匹配","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"-","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"2. 设备抓拍图片接口","type":"text"}]},{"type":"paragraph","content":[{"text":"文档 URL","type":"text","marks":[{"type":"strong"}]},{"text":": https://openai.ys7.com/help/687","type":"text"}]},{"type":"paragraph","content":[{"text":"接口功能","type":"text","marks":[{"type":"strong"}]},{"text":": 抓拍设备当前画面,","type":"text"},{"text":"该接口仅适用于 IPC 或者关联 IPC 的 DVR 设备","type":"text","marks":[{"type":"strong"}]},{"text":"。","type":"text"}]},{"type":"paragraph","content":[{"text":"该接口需要设备支持能力集","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"},{"text":"support_capture=1","type":"text","marks":[{"type":"code_inline"}]}]},{"type":"blockquote","content":[{"type":"paragraph","content":[{"text":"⚠️ ","type":"text"},{"text":"注意","type":"text","marks":[{"type":"strong"}]},{"text":":设备抓图能力有限,请勿频繁调用,建议每个摄像头调用的间隔","type":"text"},{"text":"4s 以上","type":"text","marks":[{"type":"strong"}]},{"text":"。","type":"text"}]}]},{"type":"paragraph","content":[{"text":"请求地址","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"POST https://openai.ys7.com/api/lapp/device/capture","type":"text"}]},{"type":"paragraph","content":[{"text":"请求参数","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"参数名","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"类型","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"描述","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"是否必选","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"accessToken","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"String","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"授权过程获取的 access_token","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Y","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"deviceSerial","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"String","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"设备序列号,字母需为大写","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Y","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"channelNo","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"int","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"通道号,IPC 设备填写 1","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Y","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"quality","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"int","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"视频清晰度(此参数不生效)","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"N","type":"text"}]}]}]}]},{"type":"paragraph","content":[{"text":"返回数据","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"json"},"content":[{"text":"{\n \"data\": {\n \"picUrl\": \"https://opencapture.ys7.com/.../capture/xxx.jpg?Expires=xxx&...\"\n },\n \"code\": \"200\",\n \"msg\": \"操作成功!\"\n}","type":"text"}]},{"type":"paragraph","content":[{"text":"返回字段","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"字段名","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"类型","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"描述","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"picUrl","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"String","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"抓拍后的图片路径,","type":"text"},{"text":"图片保存有效期为 2 小时","type":"text","marks":[{"type":"strong"}]}]}]}]}]},{"type":"paragraph","content":[{"text":"错误码","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"返回码","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"返回消息","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"描述","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"200","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"操作成功","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"请求成功","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"10001","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"参数错误","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"参数为空或格式不正确","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"10002","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"accessToken 异常或过期","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"重新获取 accessToken","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"10028","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"抓图接口调用次数超限","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"降低频率,间隔>4s","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"20002","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"设备不存在","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"检查设备序列号","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"20006","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"网络异常","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"检查设备网络状况","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"20007","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"设备不在线","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"检查设备是否在线","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"20008","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"设备响应超时","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"操作过于频繁或设备不支持","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"20014","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"deviceSerial 不合法","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"检查序列号格式","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"60020","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"不支持该命令","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"确认设备是否支持抓图","type":"text"}]}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"🔐 Token 管理与安全","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Token 缓存行为","type":"text"}]},{"type":"paragraph","content":[{"text":"默认行为","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"✅ Token 会缓存到系统临时目录(","type":"text"},{"text":"/tmp/ezviz_global_token_cache/global_token_cache.json","type":"text","marks":[{"type":"code_inline"}]},{"text":")","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"✅ 缓存有效期 7 天(与 Token 实际有效期一致)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"✅ 到期前 5 分钟自动刷新","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"✅ 缓存文件权限 600(仅当前用户可读写)","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"为什么缓存 Token","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"⚡ ","type":"text"},{"text":"性能","type":"text","marks":[{"type":"strong"}]},{"text":": 避免每次运行都调用 API 获取 Token(减少等待时间)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"🌐 ","type":"text"},{"text":"稳定性","type":"text","marks":[{"type":"strong"}]},{"text":": 减少 API 调用次数,降低网络失败风险","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"💰 ","type":"text"},{"text":"限流保护","type":"text","marks":[{"type":"strong"}]},{"text":": 避免频繁调用触发 API 限流","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"禁用 Token 缓存","type":"text"}]},{"type":"paragraph","content":[{"text":"如果您不希望 Token 被持久化,可以通过以下方式禁用缓存:","type":"text"}]},{"type":"paragraph","content":[{"text":"方法 1: 环境变量","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"export EZVIZ_TOKEN_CACHE=0\npython3 scripts/device_capture.py ...","type":"text"}]},{"type":"paragraph","content":[{"text":"方法 2: 修改代码","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"python"},"content":[{"text":"from token_manager import get_cached_token\n\n# 禁用缓存\ntoken_result = get_cached_token(app_key, app_secret, use_cache=False)","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"缓存文件位置","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"系统","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"路径","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"macOS","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"/var/folders/xx/xxxx/T/ezviz_global_token_cache/","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Linux","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"/tmp/ezviz_global_token_cache/","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Windows","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"C:\\Users\\{user}\\AppData\\Local\\Temp\\ezviz_global_token_cache\\","type":"text","marks":[{"type":"code_inline"}]}]}]}]}]},{"type":"paragraph","content":[{"text":"查看缓存","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# macOS/Linux\nls -la /tmp/ezviz_global_token_cache/\ncat /tmp/ezviz_global_token_cache/global_token_cache.json\n\n# 清除缓存\nrm -rf /tmp/ezviz_global_token_cache/","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"验证命令","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# 1. 验证缓存文件权限\nls -la /tmp/ezviz_global_token_cache/global_token_cache.json\n# 应该显示:-rw------- (600)\n\n# 2. 验证缓存内容\ncat /tmp/ezviz_global_token_cache/global_token_cache.json | python3 -m json.tool\n\n# 3. 验证禁用缓存\nexport EZVIZ_TOKEN_CACHE=0\npython3 scripts/device_capture.py ...\n# 应该显示 \"Getting access token from Ezviz API\" 而不是 \"Using cached global token\"\n\n# 4. 清除缓存\npython3 lib/token_manager.py clear","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"🔒 安全建议","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"1. 使用最小权限凭证","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"创建专用的 appKey/appSecret,仅开通必要的 API 权限","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"不要使用主账号凭证","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"定期轮换凭证(建议每 90 天)","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"2. 环境变量安全","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# 推荐:使用 .env 文件(不要提交到版本控制)\necho \"EZVIZ_APP_KEY=your_key\" >> .env\necho \"EZVIZ_APP_SECRET=your_secret\" >> .env\nchmod 600 .env\n\n# 加载环境变量\nsource .env","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"3. 禁用缓存(高安全场景)","type":"text"}]},{"type":"paragraph","content":[{"text":"如果您在共享计算机或高安全环境中使用:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"export EZVIZ_TOKEN_CACHE=0 # 禁用缓存\npython3 scripts/device_capture.py ...","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"4. 定期清理缓存","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# 清除所有缓存的 Token\nrm -rf /tmp/ezviz_global_token_cache/","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"5. 配置文件扫描说明","type":"text"}]},{"type":"paragraph","content":[{"text":"技能会读取以下路径中的萤石配置(仅当环境变量未设置时):","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"~/.openclaw/config.json\n~/.openclaw/gateway/config.json\n~/.openclaw/channels.json","type":"text"}]},{"type":"paragraph","content":[{"text":"配置格式","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"json"},"content":[{"text":"{\n \"channels\": {\n \"ezviz\": {\n \"appId\": \"your_app_id\",\n \"appSecret\": \"your_app_secret\",\n \"domain\": \"https://openai.ys7.com\",\n \"enabled\": true\n }\n }\n}","type":"text"}]},{"type":"paragraph","content":[{"text":"安全建议","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"✅ 使用","type":"text"},{"text":"专用萤石凭证","type":"text","marks":[{"type":"strong"}]},{"text":",不要与其他服务共享","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"✅ 如果不想使用配置文件扫描,设置环境变量覆盖","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"✅ 定期审查配置文件中的凭证权限","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"❌ 不要在配置文件中存储主账号凭证","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"禁用配置文件扫描","type":"text","marks":[{"type":"strong"}]},{"text":"(环境变量优先):","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"export EZVIZ_APP_KEY=\"your_key\"\nexport EZVIZ_APP_SECRET=\"your_secret\"\n# 环境变量优先级高于配置文件","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"定时任务示例","type":"text"}]},{"type":"paragraph","content":[{"text":"Linux Crontab","type":"text","marks":[{"type":"strong"}]},{"text":" (每 5 分钟):","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"*/5 * * * * cd /path/to/device-capture && python3 scripts/device_capture.py >> /var/log/capture.log 2>&1","type":"text"}]},{"type":"paragraph","content":[{"text":"macOS Launchd","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"xml"},"content":[{"text":"\u003ckey>StartInterval\u003c/key>\n\u003cinteger>300\u003c/integer>","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"安全审计清单 (安装前完成)","type":"text"}]},{"type":"paragraph","content":[{"text":"根据安全审计建议,请在安装前完成以下检查:","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"安装前检查","type":"text"}]},{"type":"checkbox_list","attrs":{"id":null},"content":[{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"审查代码","type":"text","marks":[{"type":"strong"}]},{"text":" — 阅读 ","type":"text"},{"text":"scripts/device_capture.py","type":"text","marks":[{"type":"code_inline"}]},{"text":" 和 ","type":"text"},{"text":"lib/token_manager.py","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"验证 API 域名","type":"text","marks":[{"type":"strong"}]},{"text":" — 确认 ","type":"text"},{"text":"openai.ys7.com","type":"text","marks":[{"type":"code_inline"}]},{"text":" 是萤石官方端点","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"准备测试凭证","type":"text","marks":[{"type":"strong"}]},{"text":" — 创建专用萤石应用,仅开通抓图相关权限","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"检查配置文件","type":"text","marks":[{"type":"strong"}]},{"text":" — 审查 ","type":"text"},{"text":"~/.openclaw/*.json","type":"text","marks":[{"type":"code_inline"}]},{"text":" 中是否有敏感凭证","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"确认缓存位置","type":"text","marks":[{"type":"strong"}]},{"text":" — 确认 ","type":"text"},{"text":"/tmp/ezviz_global_token_cache/","type":"text","marks":[{"type":"code_inline"}]},{"text":" 可接受","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"安装时配置","type":"text"}]},{"type":"checkbox_list","attrs":{"id":null},"content":[{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"使用环境变量","type":"text","marks":[{"type":"strong"}]},{"text":" — 优先使用 ","type":"text"},{"text":"EZVIZ_APP_KEY","type":"text","marks":[{"type":"code_inline"}]},{"text":" 等环境变量","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"禁用缓存","type":"text","marks":[{"type":"strong"}]},{"text":" (可选) — 高安全环境设置 ","type":"text"},{"text":"EZVIZ_TOKEN_CACHE=0","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"最小权限凭证","type":"text","marks":[{"type":"strong"}]},{"text":" — 不要使用主账号凭证","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"隔离环境","type":"text","marks":[{"type":"strong"}]},{"text":" (可选) — 在容器/VM 中运行","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"安装后验证","type":"text"}]},{"type":"checkbox_list","attrs":{"id":null},"content":[{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"验证缓存权限","type":"text","marks":[{"type":"strong"}]},{"text":" — 确认缓存文件权限为 600","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"测试功能","type":"text","marks":[{"type":"strong"}]},{"text":" — 使用测试设备验证抓图功能","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"监控日志","type":"text","marks":[{"type":"strong"}]},{"text":" — 检查 API 调用是否正常","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"记录凭证","type":"text","marks":[{"type":"strong"}]},{"text":" — 安全存储凭证信息(密钥管理器)","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"持续维护","type":"text"}]},{"type":"checkbox_list","attrs":{"id":null},"content":[{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"定期轮换凭证","type":"text","marks":[{"type":"strong"}]},{"text":" — 建议每 90 天轮换一次","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"审查依赖","type":"text","marks":[{"type":"strong"}]},{"text":" — 定期检查 ","type":"text"},{"text":"requests","type":"text","marks":[{"type":"code_inline"}]},{"text":" 等依赖的安全更新","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"清理缓存","type":"text","marks":[{"type":"strong"}]},{"text":" — 高安全环境使用后清除缓存","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"监控异常","type":"text","marks":[{"type":"strong"}]},{"text":" — 关注异常 API 调用或错误","type":"text"}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"paragraph","content":[{"text":"更新日志","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"日期","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"版本","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"变更","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"说明","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"2026-03-18","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"1.0.3","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"添加 channels.json 支持","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"从 OpenClaw 配置文件读取凭证,优先级低于环境变量","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"2026-03-18","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"1.0.3","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"添加安全验证","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"设备序列号格式验证、凭证来源警告","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"2026-03-18","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"1.0.2","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"添加 Token 缓存说明","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"明确缓存行为,支持 ","type":"text"},{"text":"EZVIZ_TOKEN_CACHE=0","type":"text","marks":[{"type":"code_inline"}]},{"text":" 禁用","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"2026-03-18","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"1.0.1","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"添加安全审计清单","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"根据安全建议添加完整检查清单","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"2026-03-18","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"1.0.1","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"明确配置文件行为","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"说明 ","type":"text"},{"text":"~/.openclaw/*.json","type":"text","marks":[{"type":"code_inline"}]},{"text":" 读取逻辑","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"2026-03-18","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"1.0.1","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"添加 API 域名验证","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"提供域名和 SSL 验证命令","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"最后更新","type":"text","marks":[{"type":"strong"}]},{"text":": 2026-03-18","type":"text"},{"type":"br"},{"text":"版本","type":"text","marks":[{"type":"strong"}]},{"text":": 1.0.3 (Channels 配置支持版)","type":"text"}]}]},"metadata":{"date":"2026-06-05","name":"ezviz-device-capture","author":"@skillopedia","source":{"stars":2012,"repo_name":"openclaw-master-skills","origin_url":"https://github.com/leoyeai/openclaw-master-skills/blob/HEAD/skills/ezviz-open-picture/SKILL.md","repo_owner":"leoyeai","body_sha256":"c6664f1f697b8ac5f7a5d82da98052806418c642c459bd79a75e938c8b7e9bbe","cluster_key":"8aa48adf3340d761711f846b847b59996157f37b562cc9334711a56bd20ea1d2","clean_bundle":{"format":"clean-skill-bundle-v1","source":"leoyeai/openclaw-master-skills/skills/ezviz-open-picture/SKILL.md","attachments":[{"id":"efa04e81-519d-5165-8d80-548159cadc1b","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/efa04e81-519d-5165-8d80-548159cadc1b/attachment.json","path":"_meta.json","size":470,"sha256":"d7b2206d3b6c083450d9550d532434c9d38d1410a5a9af93af9834370b335556","contentType":"application/json; charset=utf-8"},{"id":"72141e03-76bc-5269-84a4-297c4f5a29db","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/72141e03-76bc-5269-84a4-297c4f5a29db/attachment.md","path":"lib/README_TOKEN_MANAGER.md","size":4518,"sha256":"7e293c149736d5051f8d7d1ce54fc379e281ece6b31d954f1ab921bbd951ae23","contentType":"text/markdown; charset=utf-8"},{"id":"d72d87ae-3607-5e78-9710-befc3636e81a","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/d72d87ae-3607-5e78-9710-befc3636e81a/attachment.py","path":"lib/token_manager.py","size":11574,"sha256":"322a51f0c200b67397a083f08de91e8a7d10e21cb45dc6d3618013d11088302a","contentType":"text/x-python; charset=utf-8"},{"id":"d8df3c3e-1c2d-5e8c-9ee8-d5a8291b3593","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/d8df3c3e-1c2d-5e8c-9ee8-d5a8291b3593/attachment.md","path":"references/ezviz-capture-api.md","size":4498,"sha256":"0b6702f3d417652d12e49755aea73291f11736dcfc18a75b0810321c6c59a296","contentType":"text/markdown; charset=utf-8"},{"id":"36eaefb0-511f-5360-b935-4e054a4298a4","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/36eaefb0-511f-5360-b935-4e054a4298a4/attachment.py","path":"scripts/device_capture.py","size":14927,"sha256":"dd6ff522aab040be03b729eea62cc696e33102f821136aa69a0b9027cee99307","contentType":"text/x-python; charset=utf-8"}],"bundle_sha256":"e5d9864844da97b14d8ed47bd9ff7f7b2dcc81fcccf1ebcd7fecccf3137412a7","attachment_count":5,"text_attachments":5,"attachment_storage":"skillopedia-attachments-v1","binary_attachments":0,"excluded_attachments":[]},"cluster_size":1,"skill_md_path":"skills/ezviz-open-picture/SKILL.md","import_metadata":{"date":"2026-06-05","author":"@skillopedia","version":"v1","category":"web-development","category_label":"Web"},"exact_dupes_collapsed_into_this":0},"version":"v1","category":"web-development","metadata":{"openclaw":{"emoji":"📸","config":{"tokenCache":{"path":"/tmp/ezviz_global_token_cache/global_token_cache.json","envVar":"EZVIZ_TOKEN_CACHE","default":true,"description":"Enable token caching (default: true). Set to 0 to disable.","permissions":"0600"},"configFileRead":{"paths":["~/.openclaw/config.json","~/.openclaw/gateway/config.json","~/.openclaw/channels.json"],"priority":"lower than environment variables","description":"Reads Ezviz credentials from OpenClaw config files as fallback"}},"requires":{"env":["EZVIZ_APP_KEY","EZVIZ_APP_SECRET","EZVIZ_DEVICE_SERIAL"],"pip":["requests"]},"warnings":["Requires Ezviz credentials with minimal permissions","Token cached in system temp directory (configurable)","May read ~/.openclaw/*.json for credentials (env vars have priority)"],"primaryEnv":"EZVIZ_APP_KEY"}},"import_tag":"clean-skills-v1","description":"萤石设备批量抓图技能。支持多设备同时抓图,自动管理 Token 并可选下载图片到本地。\nUse when: 需要获取多个摄像头实时画面、批量抓图存档、监控画面采集、定时抓图任务。\n\n⚠️ 安全要求:必须设置 EZVIZ_APP_KEY 和 EZVIZ_APP_SECRET 环境变量,使用最小权限凭证。\n"}},"renderedAt":1782981390941}

Ezviz Device Capture (萤石设备抓图) 批量获取萤石摄像头实时画面,支持多设备同时抓图。 --- ⚠️ 安全警告 (安装前必读) 在使用此技能前,请完成以下安全检查: | # | 检查项 | 状态 | 说明 | |---|--------|------|------| | 1 | 凭证权限 | ⚠️ 必需 | 使用 最小权限 的 AppKey/AppSecret,不要用主账号凭证 | | 2 | 配置文件读取 | ⚠️ 注意 | 技能会读取 文件( 但环境变量优先级更高 ) | | 3 | Token 缓存 | ⚠️ 注意 | Token 缓存在 (权限 600) | | 4 | API 域名 | ✅ 已验证 | 是萤石官方 API 端点( = Open API,不是 AI) | | 5 | 代码审查 | ✅ 推荐 | 审查 和 | 🔒 配置文件读取详细说明 凭证获取优先级 (从高到低): 安全建议 : - ✅ 最佳实践 : 使用环境变量,完全避免配置文件读取 - ✅ 隔离配置 : 在专用配置文件只存放萤石凭证,不混用其他服务 - ⚠️ 风险缓解 : 设置环境变量覆盖配置文件(即使配置文件存在也会被忽略) 快速安全配置 凭证优先级 技能按以下顺序获取凭证( 优先级从高到低 ): 1. 环境变量 ( , ) ← 推荐 2. Channels 配置 ( 等) 3…