通过 SDK 访问本地网络
使用 Node.js 或 Python 本地代理隧道,让云浏览器访问公司内网、VPN 和开发站点。
在能够访问目标站点的电脑上运行 SDK,普通云浏览器即可通过这个 SDK 进程发送网页流量。目标域名由 SDK 所在电脑的系统 DNS 解析,支持公司/VPN DNS;TCP 连接也从这台电脑发起。
这是 Cloud Browser 的会话功能,不会让独立的 Web Fetch API 获得本地网络访问能力。
使用条件
- Node.js 和 Python SDK 从 0.6.0 起支持 local proxy,建议使用 0.6.1 或更高版本。按 Node.js 或 Python 快速开始 设置
LEXMOUNT_API_KEY、LEXMOUNT_PROJECT_ID。 - 项目需要
custom_proxy权限,所选区域也必须已启用本地代理。 - 使用
browserMode: 'normal'/browser_mode="normal";Light/Moli 会话不支持该模式。 - 隧道和浏览器必须使用同一项目、API Key 与区域。复用同一个客户端;可将
LEXMOUNT_REGION设置为catalogInfo()/catalog_info()返回的区域 ID。 - SDK 电脑需要能向服务的 HTTPS/WSS 入口和目标站点发起连接。无需开放入站端口、配置公网 IP 或修改云端 hosts。整个会话期间保持 SDK 进程和 VPN 运行。
Node.js 示例
安装依赖,将下面的 TypeScript 保存为 local-proxy.ts:
npm install lexmount@^0.6.1 playwright
npm install --save-dev tsx
export TARGET_URL='https://your-internal-site.example/'
npx tsx local-proxy.ts示例使用顶层 await,需要 ESM 项目(package.json 中设置 "type": "module")。将目标替换为 SDK 电脑能访问的 HTTP(S) 地址,并先设置凭证环境变量。
import { Lexmount } from 'lexmount';
import { chromium } from 'playwright';
const target = process.env.TARGET_URL;
if (!target) throw new Error('Set TARGET_URL to a reachable HTTP(S) URL');
const client = new Lexmount({ region: process.env.LEXMOUNT_REGION });
try {
const tunnel = await client.tunnels.open();
try {
const session = await client.sessions.create({
browserMode: 'normal',
proxy: { type: 'local', tunnelId: tunnel.id },
});
try {
const browser = await chromium.connectOverCDP(session.connectUrl);
try {
const context = browser.contexts()[0];
if (!context) throw new Error('No browser context');
const page = context.pages()[0] ?? await context.newPage();
await page.goto(target, { waitUntil: 'domcontentloaded', timeout: 60_000 });
console.log(await page.title());
} finally {
await browser.close();
}
} finally {
await session.close();
}
} finally {
await tunnel.close();
}
} finally {
client.close();
}Python 示例
python3 -m pip install --upgrade 'lexmount>=0.6.1' playwright
export TARGET_URL='https://your-internal-site.example/'
python3 local_proxy.py将下面内容保存为 local_proxy.py,并先设置凭证环境变量:
import os
from lexmount import Lexmount
from playwright.sync_api import sync_playwright
target = os.environ["TARGET_URL"]
with Lexmount(region=os.getenv("LEXMOUNT_REGION") or None) as client:
with client.tunnels.open() as tunnel:
with client.sessions.create(
browser_mode="normal",
proxy={"type": "local", "tunnel_id": tunnel.id},
) as session:
with sync_playwright() as playwright:
browser = playwright.chromium.connect_over_cdp(session.connect_url)
try:
if not browser.contexts:
raise RuntimeError("No browser context")
context = browser.contexts[0]
page = context.pages[0] if context.pages else context.new_page()
page.goto(target, wait_until="domcontentloaded", timeout=60_000)
print(page.title())
finally:
browser.close()浏览器运行在云端,这两个示例通过 CDP 连接,不需要在本机安装 Chromium。
隧道选项与生命周期
| Node.js | Python | 说明 |
|---|---|---|
client.tunnels.open() | client.tunnels.open() | 连接器 ready 后才返回 |
tunnel.id | tunnel.id | 传入会话的代理配置 |
tunnel.regionId | tunnel.region_id | 隧道实际使用的区域 |
tunnel.ready | tunnel.ready | 连接器当前是否 ready |
reconnect | reconnect | 打开隧道的选项,默认启用重连 |
connectTimeoutMs | connect_timeout | 打开隧道的选项,本地 DNS/TCP 连接超时,默认 15,000 毫秒 / 15 秒 |
await tunnel.close() | tunnel.close() | 关闭连接并撤销隧道 |
例如 client.tunnels.open({ connectTimeoutMs: 20_000 }) 或 client.tunnels.open(connect_timeout=20.0)。这是连接时限,不是页面导航时限;Python 使用秒,Node.js 使用毫秒。
按浏览器连接、云会话、隧道、SDK 客户端的顺序清理。示例在导航失败时也会执行这一顺序。只关闭隧道不会关闭浏览器会话,也不会停止会话计费。
默认自动重连。隧道断开时现有 TCP 流会失败,重连后只有新连接使用恢复的隧道。连接器不会重放请求或表单提交,也不会回退到云端 DNS 或其他代理;写入操作重试前先确认结果。隧道七天后到期,最多承载 128 个并发 TCP 流;这是隧道连接数限制,不是浏览器会话配额。
功能范围与计费
- 支持基于 TCP 的 HTTP、HTTPS、WS 和 WSS 网页流量,不是通用 UDP/VPN 接口,浏览器自身限制仍适用。
- local proxy、外部代理、
officialProxy/official_proxy三选一,不能同时开启。 - 隧道提供网络可达性,不会复制本机 Cookie、浏览器登录态或证书信任。登录和私有 CA 仍需在云浏览器工作流中处理。
- 本地出口流量与官方代理流量分别统计;浏览器时长、并发和项目权限限制仍然适用。
故障排查
| 现象 | 检查项 |
|---|---|
找不到 tunnels | 检查已安装 SDK 版本,升级到 0.6.1 或更新版本 |
打开隧道返回 403 | 项目权限,以及 Key/Project ID 是否匹配 |
503 / 本地代理不可用 | 所选区域是否已启用本地代理 |
| 隧道与浏览器区域不一致 | 使用同一个客户端/区域,重新打开隧道 |
| 隧道一直未 ready | 出站 WSS、VPN/防火墙限制和当前凭证 |
导航超时 / ERR_TUNNEL_CONNECTION_FAILED | 保持连接器运行,在 SDK 电脑验证目标 DNS 和端口,再检查隧道 ready 状态 |
| 证书或登录错误 | 云浏览器的证书信任和鉴权;本地网络访问不会导入这些状态 |
隧道 ready、会话创建成功都只证明相应阶段完成,仍需验证真实目标地址。隧道到期后,新建隧道并用新 ID 创建会话。
现成示例脚本
完成 Node.js 示例环境安装 后运行:
npm run local-proxy-demo -- --url 'https://your-internal-site.example/'完成 Python 示例环境安装 后运行:
python3 local_proxy_demo.py --url 'https://your-internal-site.example/'两个脚本都支持 --region,或读取 .env 中的 LEXMOUNT_REGION。目标地址必须用 --url 传入,这两个现成脚本不读取 TARGET_URL。导航后会保存 local_proxy_demo.png,按任意键后清理退出。
