opencli-universal-cli-hub

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

OpenCLI 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
undefined
bash
undefined

Check 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
undefined
opencli doctor
undefined

Install Browser Bridge Extension

安装Browser Bridge扩展

Chrome Web Store (recommended): Install from Chrome Web Store
Manual Installation:
  1. Download
    opencli-extension-v{version}.zip
    from GitHub Releases
  2. Unzip and navigate to
    chrome://extensions
  3. Enable Developer mode
  4. Click Load unpacked and select the folder
Chrome应用商店(推荐):Chrome应用商店安装
手动安装:
  1. GitHub Releases下载
    opencli-extension-v{version}.zip
  2. 解压后进入
    chrome://extensions
    页面
  3. 启用开发者模式
  4. 点击加载已解压的扩展程序并选择解压后的文件夹

Verify Setup

验证安装配置

bash
opencli doctor
bash
opencli doctor

Core Concepts

核心概念

Three Automation Modes

三种自动化模式

  1. Built-in Adapters: Pre-built commands for popular sites (Bilibili, Twitter, Reddit, etc.)
  2. Browser Automation: AI agents operate any website via
    opencli browser
    primitives
  3. CLI Hub: Expose local tools and Electron apps through unified interface
  1. 内置适配器:为热门站点(Bilibili、Twitter、Reddit等)预构建的命令
  2. 浏览器自动化:AI Agent通过
    opencli browser
    原语操作任意网站
  3. CLI中心:通过统一界面暴露本地工具与Electron应用

Browser Sessions

浏览器会话

Browser commands require an explicit
<session>
identifier:
bash
undefined
浏览器命令需要明确的
<session>
标识符:
bash
undefined

Session 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
undefined
opencli browser work open https://example.com opencli browser work state opencli browser work click "button.submit" opencli browser work close
undefined

Multi-Profile Support

多配置文件支持

bash
undefined
bash
undefined

List 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
undefined
opencli --profile work browser mysession open https://example.com
undefined

Using Built-in Adapters

使用内置适配器

List Available Commands

列出可用命令

bash
undefined
bash
undefined

Show all registered commands

显示所有已注册命令

opencli list
opencli list

Show commands for specific site

显示特定站点的命令

opencli list bilibili
undefined
opencli list bilibili
undefined

Common Built-in Commands

常用内置命令

bash
undefined
bash
undefined

HackerNews 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
undefined
opencli zhihu hot --limit 10
undefined

Browser Automation Primitives

浏览器自动化原语

Navigation Commands

导航命令

bash
undefined
bash
undefined

Open 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
undefined
opencli browser mysession close
undefined

Tab Management

标签页管理

bash
undefined
bash
undefined

List 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>
undefined
opencli browser mysession state --tab <targetId>
undefined

Interaction Commands

交互命令

bash
undefined
bash
undefined

Click 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"
undefined
opencli browser mysession keys "Enter" opencli browser mysession keys "Control+a"
undefined

Waiting and Extraction

等待与提取

bash
undefined
bash
undefined

Wait 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"
undefined
opencli browser mysession find "article"
undefined

Advanced Commands

高级命令

bash
undefined
bash
undefined

Take 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
undefined
opencli browser mysession frames
undefined

Creating New Adapters

创建新适配器

Manual Adapter Creation

手动创建适配器

bash
undefined
bash
undefined

Initialize 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.json
):
json
{
  "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.json
):
json
{
  "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
undefined
bash
undefined

Analyze 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
undefined
opencli browser recon verify mysite/trending
undefined

Site Knowledge Persistence

站点知识持久化

Store common patterns for reuse:
bash
undefined
存储通用模式以便复用:
bash
undefined

Site 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(站点架构模式)

undefined
undefined

Plugin Management

插件管理

Create and Install Plugins

创建与安装插件

bash
undefined
bash
undefined

Create 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
undefined
opencli plugin uninstall my-adapters
undefined

Eject and Customize Built-in Adapters

导出并自定义内置适配器

bash
undefined
bash
undefined

Eject 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
undefined
opencli adapter reset zhihu
undefined

External CLI Integration

外部CLI集成

Register Local Tools

注册本地工具

bash
undefined
bash
undefined

Register 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
undefined
opencli gh repo list opencli docker ps opencli kubectl get pods
undefined

Configuration

配置

External CLIs are registered in
~/.opencli/external.json
:
json
{
  "gh": {
    "command": "gh",
    "description": "GitHub CLI"
  },
  "docker": {
    "command": "docker",
    "description": "Docker CLI"
  }
}
外部CLI将注册在
~/.opencli/external.json
中:
json
{
  "gh": {
    "command": "gh",
    "description": "GitHub CLI"
  },
  "docker": {
    "command": "docker",
    "description": "Docker CLI"
  }
}

Environment Variables

环境变量

bash
undefined
bash
undefined

Daemon 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
undefined
export DEBUG_SNAPSHOT=1
undefined

Configuration Files

配置文件

Global Config (
~/.opencli/config.json
)

全局配置 (
~/.opencli/config.json
)

json
{
  "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
)

json
{
  "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
undefined
bash
undefined

Check 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
undefined
pkill -f opencli-daemon
undefined

Multiple Chrome Profiles

多个Chrome配置文件

bash
undefined
bash
undefined

List 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
undefined
opencli --profile work browser mysession open https://example.com
undefined

Empty 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
undefined

1. 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
undefined
opencli bilibili hot --limit 5
undefined

Adapter Not Found

适配器未找到

bash
undefined
bash
undefined

Verify 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
undefined
opencli plugin install file://path/to/plugin
undefined

Timeout Issues

超时问题

bash
undefined
bash
undefined

Increase 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
undefined
opencli browser mysession wait "slow-element" --timeout 120000
undefined

CDP Connection Issues

CDP连接问题

bash
undefined
bash
undefined

For 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
undefined
opencli doctor
undefined

Debug Mode

调试模式

bash
undefined
bash
undefined

Enable 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
undefined
export DEBUG_SNAPSHOT=1 opencli browser mysession state
undefined

Adapter Verification

适配器验证

bash
undefined
bash
undefined

Initialize 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
undefined
opencli mysite command --limit 5
undefined

Best Practices

最佳实践

  1. Use explicit session names: Helps track browser automation flows
  2. Always close sessions: Prevents resource leaks (
    opencli browser <session> close
    )
  3. Handle authentication: Verify login state before executing commands
  4. Use --tab for multi-tab: Specify
    --tab <targetId>
    when working with multiple tabs
  5. Store credentials in browser: Let Chrome manage logins, don't hardcode credentials
  6. Profile separation: Use Chrome profiles for different accounts/contexts
  7. Error handling: Wrap browser commands in try-finally to ensure cleanup
  8. Rate limiting: Be respectful of site resources when creating adapters
  9. Recon first: Use
    opencli browser recon analyze
    before building adapters
  10. Persist site knowledge: Save patterns to
    ~/.opencli/sites/<site>/
    for reuse
  1. 使用明确的会话名称:便于跟踪浏览器自动化流程
  2. 始终关闭会话:避免资源泄漏(
    opencli browser <session> close
  3. 处理认证逻辑:执行命令前验证登录状态
  4. 多标签页使用--tab参数:操作多标签页时指定
    --tab <targetId>
  5. 在浏览器中存储凭证:让Chrome管理登录信息,不要硬编码凭证
  6. 配置文件分离:为不同账户/场景使用不同的Chrome配置文件
  7. 错误处理:将浏览器命令包裹在try-finally中确保资源清理
  8. 速率限制:创建适配器时尊重站点资源限制
  9. 先侦察再构建:构建适配器前使用
    opencli browser recon analyze
    分析站点
  10. 持久化站点知识:将模式保存至
    ~/.opencli/sites/<site>/
    以便复用