opencli-universal-cli-hub
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseOpenCLI Universal CLI Hub
OpenCLI 通用CLI中心
Skill by ara.so — Devtools Skills collection.
OpenCLI transforms any website, Electron app, or local binary into a standardized command-line interface. It provides AI agents with the ability to operate websites through a logged-in browser, execute built-in adapters for 100+ sites, and create new adapters using browser automation primitives.
由ara.so开发的Skill——Devtools Skills合集。
OpenCLI可将任意网站、Electron应用或本地二进制文件转换为标准化命令行界面。它让AI Agent能够通过已登录的浏览器操作网站,为100+个站点执行内置适配器,并利用浏览器自动化原语创建新适配器。
Installation
安装
Prerequisites
前置要求
- Node.js >= 21.0.0
- Chrome or Chromium browser
- Logged-in browser session for target sites
- Node.js >= 21.0.0
- Chrome或Chromium浏览器
- 目标网站的已登录浏览器会话
Install OpenCLI CLI
安装OpenCLI CLI
bash
undefinedbash
undefinedCheck Node.js version
检查Node.js版本
node --version
node --version
Install globally
全局安装
npm install -g @jackwener/opencli
npm install -g @jackwener/opencli
Verify installation
验证安装
opencli doctor
undefinedopencli doctor
undefinedInstall Browser Bridge Extension
安装Browser Bridge扩展
Chrome Web Store (recommended):
Install from Chrome Web Store
Manual Installation:
- Download from GitHub Releases
opencli-extension-v{version}.zip - Unzip and navigate to
chrome://extensions - Enable Developer mode
- Click Load unpacked and select the folder
Chrome应用商店(推荐):
从Chrome应用商店安装
手动安装:
- 从GitHub Releases下载
opencli-extension-v{version}.zip - 解压后进入页面
chrome://extensions - 启用开发者模式
- 点击加载已解压的扩展程序并选择解压后的文件夹
Verify Setup
验证安装配置
bash
opencli doctorbash
opencli doctorCore Concepts
核心概念
Three Automation Modes
三种自动化模式
- Built-in Adapters: Pre-built commands for popular sites (Bilibili, Twitter, Reddit, etc.)
- Browser Automation: AI agents operate any website via primitives
opencli browser - CLI Hub: Expose local tools and Electron apps through unified interface
- 内置适配器:为热门站点(Bilibili、Twitter、Reddit等)预构建的命令
- 浏览器自动化:AI Agent通过原语操作任意网站
opencli browser - CLI中心:通过统一界面暴露本地工具与Electron应用
Browser Sessions
浏览器会话
Browser commands require an explicit identifier:
<session>bash
undefined浏览器命令需要明确的标识符:
<session>bash
undefinedSession names are arbitrary but must be consistent
会话名称可自定义,但需保持一致
opencli browser work open https://example.com
opencli browser work state
opencli browser work click "button.submit"
opencli browser work close
undefinedopencli browser work open https://example.com
opencli browser work state
opencli browser work click "button.submit"
opencli browser work close
undefinedMulti-Profile Support
多配置文件支持
bash
undefinedbash
undefinedList connected Chrome profiles
列出已连接的Chrome配置文件
opencli profile list
opencli profile list
Rename profile for easier reference
重命名配置文件以便识别
opencli profile rename <contextId> work
opencli profile rename <contextId> work
Set default profile
设置默认配置文件
opencli profile use work
opencli profile use work
Use specific profile for command
为命令指定特定配置文件
opencli --profile work browser mysession open https://example.com
undefinedopencli --profile work browser mysession open https://example.com
undefinedUsing Built-in Adapters
使用内置适配器
List Available Commands
列出可用命令
bash
undefinedbash
undefinedShow all registered commands
显示所有已注册命令
opencli list
opencli list
Show commands for specific site
显示特定站点的命令
opencli list bilibili
undefinedopencli list bilibili
undefinedCommon Built-in Commands
常用内置命令
bash
undefinedbash
undefinedHackerNews top stories
HackerNews热门文章
opencli hackernews top --limit 5
opencli hackernews top --limit 5
Bilibili trending videos
Bilibili热门视频
opencli bilibili hot --limit 10
opencli bilibili hot --limit 10
Reddit hot posts
Reddit热门帖子
opencli reddit hot --subreddit programming --limit 20
opencli reddit hot --subreddit programming --limit 20
Twitter/X trending
Twitter/X趋势
opencli twitter trending
opencli twitter trending
Xiaohongshu (Little Red Book)
小红书
opencli xiaohongshu hot --limit 15
opencli xiaohongshu hot --limit 15
Zhihu hot questions
知乎热门问题
opencli zhihu hot --limit 10
undefinedopencli zhihu hot --limit 10
undefinedBrowser Automation Primitives
浏览器自动化原语
Navigation Commands
导航命令
bash
undefinedbash
undefinedOpen URL in new session
在新会话中打开URL
opencli browser mysession open https://github.com/trending
opencli browser mysession open https://github.com/trending
Get current page state (URL, title, DOM snapshot)
获取当前页面状态(URL、标题、DOM快照)
opencli browser mysession state
opencli browser mysession state
Navigate back
返回上一页
opencli browser mysession back
opencli browser mysession back
Close session
关闭会话
opencli browser mysession close
undefinedopencli browser mysession close
undefinedTab Management
标签页管理
bash
undefinedbash
undefinedList all tabs in session
列出会话中的所有标签页
opencli browser mysession tab list
opencli browser mysession tab list
Create new tab (returns targetId)
创建新标签页(返回targetId)
opencli browser mysession tab new https://example.com
opencli browser mysession tab new https://example.com
Select specific tab as default target
选择特定标签页作为默认目标
opencli browser mysession tab select <targetId>
opencli browser mysession tab select <targetId>
Close tab
关闭标签页
opencli browser mysession tab close <targetId>
opencli browser mysession tab close <targetId>
Execute command on specific tab
在特定标签页执行命令
opencli browser mysession state --tab <targetId>
undefinedopencli browser mysession state --tab <targetId>
undefinedInteraction Commands
交互命令
bash
undefinedbash
undefinedClick element by selector
通过选择器点击元素
opencli browser mysession click "button.login"
opencli browser mysession click "button.login"
Type text into element
向元素输入文本
opencli browser mysession type "input[name='username']" "myuser"
opencli browser mysession type "input[name='username']" "myuser"
Fill form field (clears first, then types)
填充表单字段(先清空再输入)
opencli browser mysession fill "input[name='password']" "mypass"
opencli browser mysession fill "input[name='password']" "mypass"
Select dropdown option
选择下拉选项
opencli browser mysession select "select#country" "US"
opencli browser mysession select "select#country" "US"
Send keyboard keys
发送键盘按键
opencli browser mysession keys "Enter"
opencli browser mysession keys "Control+a"
undefinedopencli browser mysession keys "Enter"
opencli browser mysession keys "Control+a"
undefinedWaiting and Extraction
等待与提取
bash
undefinedbash
undefinedWait for element to appear
等待元素出现
opencli browser mysession wait "div.content"
opencli browser mysession wait "div.content"
Wait for specific text
等待特定文本出现
opencli browser mysession wait --text "Loading complete"
opencli browser mysession wait --text "Loading complete"
Extract data from page
提取页面数据
opencli browser mysession extract "h1.title"
opencli browser mysession extract "h1.title"
Get element properties
获取元素属性
opencli browser mysession get "a.link" --attribute href
opencli browser mysession get "a.link" --attribute href
Find elements
查找元素
opencli browser mysession find "article"
undefinedopencli browser mysession find "article"
undefinedAdvanced Commands
高级命令
bash
undefinedbash
undefinedTake screenshot
截取屏幕截图
opencli browser mysession screenshot output.png
opencli browser mysession screenshot output.png
Scroll page
滚动页面
opencli browser mysession scroll --distance 500
opencli browser mysession scroll --distance 500
Execute JavaScript
执行JavaScript
opencli browser mysession eval "document.title"
opencli browser mysession eval "document.title"
Monitor network requests
监控网络请求
opencli browser mysession network --pattern "api/v1/*"
opencli browser mysession network --pattern "api/v1/*"
List frames
列出框架
opencli browser mysession frames
undefinedopencli browser mysession frames
undefinedCreating New Adapters
创建新适配器
Manual Adapter Creation
手动创建适配器
bash
undefinedbash
undefinedInitialize adapter structure
初始化适配器结构
opencli browser init mysite/trending
opencli browser init mysite/trending
Creates ~/.opencli/clis/mysite/trending/
创建 ~/.opencli/clis/mysite/trending/
- index.js (main adapter logic)
- index.js(适配器主逻辑)
- schema.json (command definition)
- schema.json(命令定义)
**Example Adapter Structure** (`~/.opencli/clis/mysite/trending/index.js`):
```javascript
import { executeAdapter } from '@jackwener/opencli-core';
export default async function handler(args, context) {
const { limit = 10 } = args;
// Use browser automation
const session = context.session || 'adapter';
try {
// Open page
await executeAdapter('browser', [session, 'open', 'https://mysite.com/trending']);
// Wait for content
await executeAdapter('browser', [session, 'wait', 'article.post']);
// Extract data
const posts = await executeAdapter('browser', [session, 'extract', 'article.post', '--limit', limit]);
// Return structured data
return {
success: true,
data: posts.map(post => ({
title: post.querySelector('h2')?.textContent,
author: post.querySelector('.author')?.textContent,
url: post.querySelector('a')?.href
}))
};
} finally {
await executeAdapter('browser', [session, 'close']);
}
}Schema Definition ():
~/.opencli/clis/mysite/trending/schema.jsonjson
{
"name": "trending",
"description": "Get trending posts from mysite",
"arguments": {
"limit": {
"type": "number",
"description": "Number of posts to fetch",
"default": 10
}
},
"output": {
"columns": ["title", "author", "url"]
}
}
**适配器示例结构** (`~/.opencli/clis/mysite/trending/index.js`):
```javascript
import { executeAdapter } from '@jackwener/opencli-core';
export default async function handler(args, context) {
const { limit = 10 } = args;
// 使用浏览器自动化
const session = context.session || 'adapter';
try {
// 打开页面
await executeAdapter('browser', [session, 'open', 'https://mysite.com/trending']);
// 等待内容加载
await executeAdapter('browser', [session, 'wait', 'article.post']);
// 提取数据
const posts = await executeAdapter('browser', [session, 'extract', 'article.post', '--limit', limit]);
// 返回结构化数据
return {
success: true,
data: posts.map(post => ({
title: post.querySelector('h2')?.textContent,
author: post.querySelector('.author')?.textContent,
url: post.querySelector('a')?.href
}))
};
} finally {
await executeAdapter('browser', [session, 'close']);
}
}Schema定义 ():
~/.opencli/clis/mysite/trending/schema.jsonjson
{
"name": "trending",
"description": "Get trending posts from mysite",
"arguments": {
"limit": {
"type": "number",
"description": "Number of posts to fetch",
"default": 10
}
},
"output": {
"columns": ["title", "author", "url"]
}
}Using Recon Workflow
使用侦察工作流
bash
undefinedbash
undefinedAnalyze site pattern (SPA, SSR, JSONP, etc.)
分析站点模式(SPA、SSR、JSONP等)
opencli browser recon analyze https://mysite.com/trending
opencli browser recon analyze https://mysite.com/trending
Initialize adapter with recon data
利用侦察数据初始化适配器
opencli browser recon init mysite/trending
opencli browser recon init mysite/trending
Verify adapter works
验证适配器功能
opencli browser recon verify mysite/trending
undefinedopencli browser recon verify mysite/trending
undefinedSite Knowledge Persistence
站点知识持久化
Store common patterns for reuse:
bash
undefined存储通用模式以便复用:
bash
undefinedSite knowledge is saved to ~/.opencli/sites/mysite/
站点知识将保存至 ~/.opencli/sites/mysite/
- auth.json (authentication strategy)
- auth.json(认证策略)
- endpoints.json (discovered API endpoints)
- endpoints.json(已发现的API端点)
- patterns.json (site architecture patterns)
- patterns.json(站点架构模式)
undefinedundefinedPlugin Management
插件管理
Create and Install Plugins
创建与安装插件
bash
undefinedbash
undefinedCreate new plugin structure
创建新插件结构
opencli plugin create my-adapters
opencli plugin create my-adapters
Install from local directory
从本地目录安装
opencli plugin install file://./my-adapters
opencli plugin install file://./my-adapters
Install from GitHub
从GitHub安装
opencli plugin install github:username/opencli-adapters
opencli plugin install github:username/opencli-adapters
Install from npm
从npm安装
opencli plugin install @myorg/opencli-adapters
opencli plugin install @myorg/opencli-adapters
List installed plugins
列出已安装插件
opencli plugin list
opencli plugin list
Uninstall plugin
卸载插件
opencli plugin uninstall my-adapters
undefinedopencli plugin uninstall my-adapters
undefinedEject and Customize Built-in Adapters
导出并自定义内置适配器
bash
undefinedbash
undefinedEject adapter to local for modification
将适配器导出到本地进行修改
opencli adapter eject zhihu
opencli adapter eject zhihu
Modified adapter now lives in ~/.opencli/clis/zhihu/
修改后的适配器将存放在 ~/.opencli/clis/zhihu/
Reset to built-in version
重置为内置版本
opencli adapter reset zhihu
undefinedopencli adapter reset zhihu
undefinedExternal CLI Integration
外部CLI集成
Register Local Tools
注册本地工具
bash
undefinedbash
undefinedRegister any CLI tool
注册任意CLI工具
opencli external register gh
opencli external register docker
opencli external register kubectl
opencli external register gh
opencli external register docker
opencli external register kubectl
Use through OpenCLI
通过OpenCLI使用
opencli gh repo list
opencli docker ps
opencli kubectl get pods
undefinedopencli gh repo list
opencli docker ps
opencli kubectl get pods
undefinedConfiguration
配置
External CLIs are registered in :
~/.opencli/external.jsonjson
{
"gh": {
"command": "gh",
"description": "GitHub CLI"
},
"docker": {
"command": "docker",
"description": "Docker CLI"
}
}外部CLI将注册在中:
~/.opencli/external.jsonjson
{
"gh": {
"command": "gh",
"description": "GitHub CLI"
},
"docker": {
"command": "docker",
"description": "Docker CLI"
}
}Environment Variables
环境变量
bash
undefinedbash
undefinedDaemon port (default: 19825)
守护进程端口(默认:19825)
export OPENCLI_DAEMON_PORT=19825
export OPENCLI_DAEMON_PORT=19825
Browser profile to use
使用的浏览器配置文件
export OPENCLI_PROFILE=work
export OPENCLI_PROFILE=work
Window placement (foreground|background)
窗口显示位置(foreground|background)
export OPENCLI_WINDOW=foreground
export OPENCLI_WINDOW=foreground
Connection timeout (seconds)
连接超时时间(秒)
export OPENCLI_BROWSER_CONNECT_TIMEOUT=30
export OPENCLI_BROWSER_CONNECT_TIMEOUT=30
Command timeout (seconds)
命令超时时间(秒)
export OPENCLI_BROWSER_COMMAND_TIMEOUT=60
export OPENCLI_BROWSER_COMMAND_TIMEOUT=60
Chrome DevTools Protocol endpoint
Chrome DevTools Protocol端点
export OPENCLI_CDP_ENDPOINT=ws://localhost:9222
export OPENCLI_CDP_ENDPOINT=ws://localhost:9222
CDP target filter
CDP目标过滤器
export OPENCLI_CDP_TARGET=detail.1688.com
export OPENCLI_CDP_TARGET=detail.1688.com
Verbose logging
详细日志
export OPENCLI_VERBOSE=true
export OPENCLI_VERBOSE=true
DOM snapshot debugging
DOM快照调试
export DEBUG_SNAPSHOT=1
undefinedexport DEBUG_SNAPSHOT=1
undefinedConfiguration Files
配置文件
Global Config (~/.opencli/config.json
)
~/.opencli/config.json全局配置 (~/.opencli/config.json
)
~/.opencli/config.jsonjson
{
"defaultProfile": "work",
"daemonPort": 19825,
"browserTimeout": 60,
"windowMode": "background"
}json
{
"defaultProfile": "work",
"daemonPort": 19825,
"browserTimeout": 60,
"windowMode": "background"
}Per-Site Config (~/.opencli/sites/mysite/config.json
)
~/.opencli/sites/mysite/config.json站点专属配置 (~/.opencli/sites/mysite/config.json
)
~/.opencli/sites/mysite/config.jsonjson
{
"auth": "COOKIE",
"baseUrl": "https://mysite.com",
"pattern": "SPA",
"endpoints": {
"trending": "/api/v1/trending"
}
}json
{
"auth": "COOKIE",
"baseUrl": "https://mysite.com",
"pattern": "SPA",
"endpoints": {
"trending": "/api/v1/trending"
}
}Common Patterns
常见模式
Pattern 1: Simple Data Extraction
模式1:简单数据提取
javascript
export default async function handler(args, context) {
const session = 'extract-session';
await executeAdapter('browser', [session, 'open', args.url]);
await executeAdapter('browser', [session, 'wait', args.selector]);
const data = await executeAdapter('browser', [
session, 'extract', args.selector
]);
await executeAdapter('browser', [session, 'close']);
return { success: true, data };
}javascript
export default async function handler(args, context) {
const session = 'extract-session';
await executeAdapter('browser', [session, 'open', args.url]);
await executeAdapter('browser', [session, 'wait', args.selector]);
const data = await executeAdapter('browser', [
session, 'extract', args.selector
]);
await executeAdapter('browser', [session, 'close']);
return { success: true, data };
}Pattern 2: Form Automation
模式2:表单自动化
javascript
export default async function handler(args, context) {
const session = 'form-session';
await executeAdapter('browser', [session, 'open', args.url]);
// Fill form fields
await executeAdapter('browser', [
session, 'fill', 'input[name="email"]', args.email
]);
await executeAdapter('browser', [
session, 'fill', 'input[name="password"]', args.password
]);
// Submit
await executeAdapter('browser', [session, 'click', 'button[type="submit"]']);
// Wait for success indicator
await executeAdapter('browser', [session, 'wait', '.success-message']);
await executeAdapter('browser', [session, 'close']);
return { success: true };
}javascript
export default async function handler(args, context) {
const session = 'form-session';
await executeAdapter('browser', [session, 'open', args.url]);
// 填充表单字段
await executeAdapter('browser', [
session, 'fill', 'input[name="email"]', args.email
]);
await executeAdapter('browser', [
session, 'fill', 'input[name="password"]', args.password
]);
// 提交表单
await executeAdapter('browser', [session, 'click', 'button[type="submit"]']);
// 等待成功提示
await executeAdapter('browser', [session, 'wait', '.success-message']);
await executeAdapter('browser', [session, 'close']);
return { success: true };
}Pattern 3: Multi-Tab Workflow
模式3:多标签页工作流
javascript
export default async function handler(args, context) {
const session = 'multi-tab';
// Open first tab
await executeAdapter('browser', [session, 'open', args.url1]);
// Create second tab
const { targetId } = await executeAdapter('browser', [
session, 'tab', 'new', args.url2
]);
// Work in first tab
const data1 = await executeAdapter('browser', [
session, 'extract', '.content'
]);
// Work in second tab
const data2 = await executeAdapter('browser', [
session, 'extract', '.content', '--tab', targetId
]);
await executeAdapter('browser', [session, 'close']);
return { success: true, data: { tab1: data1, tab2: data2 } };
}javascript
export default async function handler(args, context) {
const session = 'multi-tab';
// 打开第一个标签页
await executeAdapter('browser', [session, 'open', args.url1]);
// 创建第二个标签页
const { targetId } = await executeAdapter('browser', [
session, 'tab', 'new', args.url2
]);
// 在第一个标签页操作
const data1 = await executeAdapter('browser', [
session, 'extract', '.content'
]);
// 在第二个标签页操作
const data2 = await executeAdapter('browser', [
session, 'extract', '.content', '--tab', targetId
]);
await executeAdapter('browser', [session, 'close']);
return { success: true, data: { tab1: data1, tab2: data2 } };
}Pattern 4: Network Interception
模式4:网络拦截
javascript
export default async function handler(args, context) {
const session = 'network-session';
// Start monitoring network
const networkPromise = executeAdapter('browser', [
session, 'network', '--pattern', 'api/data'
]);
// Navigate to trigger request
await executeAdapter('browser', [session, 'open', args.url]);
// Get intercepted data
const networkData = await networkPromise;
await executeAdapter('browser', [session, 'close']);
return { success: true, data: networkData };
}javascript
export default async function handler(args, context) {
const session = 'network-session';
// 开始监控网络
const networkPromise = executeAdapter('browser', [
session, 'network', '--pattern', 'api/data'
]);
// 导航以触发请求
await executeAdapter('browser', [session, 'open', args.url]);
// 获取拦截到的数据
const networkData = await networkPromise;
await executeAdapter('browser', [session, 'close']);
return { success: true, data: networkData };
}Pattern 5: Authenticated Session
模式5:已认证会话
javascript
export default async function handler(args, context) {
const session = 'auth-session';
// Browser already logged in via Chrome profile
await executeAdapter('browser', [session, 'open', args.url]);
// Verify authentication
const state = await executeAdapter('browser', [session, 'state']);
if (state.url.includes('/login')) {
throw new Error('Not authenticated. Please log in to Chrome.');
}
// Proceed with authenticated actions
const data = await executeAdapter('browser', [
session, 'extract', '.user-content'
]);
await executeAdapter('browser', [session, 'close']);
return { success: true, data };
}javascript
export default async function handler(args, context) {
const session = 'auth-session';
// 浏览器已通过Chrome配置文件登录
await executeAdapter('browser', [session, 'open', args.url]);
// 验证认证状态
const state = await executeAdapter('browser', [session, 'state']);
if (state.url.includes('/login')) {
throw new Error('未认证,请登录Chrome。');
}
// 执行已认证操作
const data = await executeAdapter('browser', [
session, 'extract', '.user-content'
]);
await executeAdapter('browser', [session, 'close']);
return { success: true, data };
}Troubleshooting
故障排查
Browser Not Connecting
浏览器无法连接
bash
undefinedbash
undefinedCheck daemon status
检查守护进程状态
opencli doctor
opencli doctor
Verify extension is installed and enabled
验证扩展已安装并启用
Visit chrome://extensions
访问 chrome://extensions
Check daemon port
检查守护进程端口
lsof -i :19825
lsof -i :19825
Restart daemon (kill and it will auto-restart)
重启守护进程(杀死后会自动重启)
pkill -f opencli-daemon
undefinedpkill -f opencli-daemon
undefinedMultiple Chrome Profiles
多个Chrome配置文件
bash
undefinedbash
undefinedList profiles to see which are connected
列出配置文件查看已连接的配置
opencli profile list
opencli profile list
If you see multiple profiles, set default
如果存在多个配置文件,设置默认配置
opencli profile use <alias>
opencli profile use <alias>
Or specify profile per-command
或为每个命令指定配置文件
opencli --profile work browser mysession open https://example.com
undefinedopencli --profile work browser mysession open https://example.com
undefinedEmpty or Permission Errors
返回空数据或权限错误
Issue: Commands return empty data or permission errors
Solution: Ensure you're logged in to the target site in Chrome
bash
undefined问题:命令返回空数据或权限错误
解决方案:确保已在Chrome中登录目标网站
bash
undefined1. Open Chrome and log in to the site manually
1. 打开Chrome并手动登录目标网站
2. Verify extension is active
2. 验证扩展处于激活状态
3. Run OpenCLI command
3. 运行OpenCLI命令
opencli bilibili hot --limit 5
undefinedopencli bilibili hot --limit 5
undefinedAdapter Not Found
适配器未找到
bash
undefinedbash
undefinedVerify adapter is installed
验证适配器已安装
opencli list | grep mysite
opencli list | grep mysite
Check adapter directory exists
检查适配器目录是否存在
ls ~/.opencli/clis/mysite/
ls ~/.opencli/clis/mysite/
Reinstall if needed
必要时重新安装
opencli plugin install file://path/to/plugin
undefinedopencli plugin install file://path/to/plugin
undefinedTimeout Issues
超时问题
bash
undefinedbash
undefinedIncrease command timeout
增加命令超时时间
export OPENCLI_BROWSER_COMMAND_TIMEOUT=120
export OPENCLI_BROWSER_COMMAND_TIMEOUT=120
Or per-command
或针对单个命令设置
opencli browser mysession wait "slow-element" --timeout 120000
undefinedopencli browser mysession wait "slow-element" --timeout 120000
undefinedCDP Connection Issues
CDP连接问题
bash
undefinedbash
undefinedFor Electron apps or remote Chrome
针对Electron应用或远程Chrome
export OPENCLI_CDP_ENDPOINT=ws://localhost:9222
export OPENCLI_CDP_ENDPOINT=ws://localhost:9222
Filter targets if multiple exist
若存在多个目标,设置过滤器
export OPENCLI_CDP_TARGET=myapp.com
export OPENCLI_CDP_TARGET=myapp.com
Test connection
测试连接
opencli doctor
undefinedopencli doctor
undefinedDebug Mode
调试模式
bash
undefinedbash
undefinedEnable verbose logging
启用详细日志
opencli -v browser mysession open https://example.com
opencli -v browser mysession open https://example.com
Or via environment
或通过环境变量设置
export OPENCLI_VERBOSE=true
export OPENCLI_VERBOSE=true
DOM snapshot debugging
DOM快照调试
export DEBUG_SNAPSHOT=1
opencli browser mysession state
undefinedexport DEBUG_SNAPSHOT=1
opencli browser mysession state
undefinedAdapter Verification
适配器验证
bash
undefinedbash
undefinedInitialize adapter with recon workflow
利用侦察工作流初始化适配器
opencli browser recon init mysite/command
opencli browser recon init mysite/command
Verify adapter works correctly
验证适配器功能正常
opencli browser recon verify mysite/command
opencli browser recon verify mysite/command
Check output format
检查输出格式
opencli mysite command --limit 5
undefinedopencli mysite command --limit 5
undefinedBest Practices
最佳实践
- Use explicit session names: Helps track browser automation flows
- Always close sessions: Prevents resource leaks ()
opencli browser <session> close - Handle authentication: Verify login state before executing commands
- Use --tab for multi-tab: Specify when working with multiple tabs
--tab <targetId> - Store credentials in browser: Let Chrome manage logins, don't hardcode credentials
- Profile separation: Use Chrome profiles for different accounts/contexts
- Error handling: Wrap browser commands in try-finally to ensure cleanup
- Rate limiting: Be respectful of site resources when creating adapters
- Recon first: Use before building adapters
opencli browser recon analyze - Persist site knowledge: Save patterns to for reuse
~/.opencli/sites/<site>/
- 使用明确的会话名称:便于跟踪浏览器自动化流程
- 始终关闭会话:避免资源泄漏()
opencli browser <session> close - 处理认证逻辑:执行命令前验证登录状态
- 多标签页使用--tab参数:操作多标签页时指定
--tab <targetId> - 在浏览器中存储凭证:让Chrome管理登录信息,不要硬编码凭证
- 配置文件分离:为不同账户/场景使用不同的Chrome配置文件
- 错误处理:将浏览器命令包裹在try-finally中确保资源清理
- 速率限制:创建适配器时尊重站点资源限制
- 先侦察再构建:构建适配器前使用分析站点
opencli browser recon analyze - 持久化站点知识:将模式保存至以便复用
~/.opencli/sites/<site>/