指导 Claude 使用官方 bb CLI 部署无服务器浏览器自动化。
浏览器库函数 Skill.是一项面向实际任务的技能,主要用于Guide Claude 通过使用正式 bb CLI 部署无服务器浏览器自动化.;When to use. 使用此技能时: User 想要部署自动化在 s 上运行。
从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;
若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。
引导 Claude 使用官方 bb CLI 部署无服务器浏览器自动化。
在以下情况下使用该技能:
从以下地址获取 API 密钥和 Project ID:https://browserbase.com/settings
直接设置:
export BROWSERBASE_API_KEY="your_api_key" export BROWSERBASE_PROJECT_ID="your_project_id"
pnpm dlx @browserbasehq/sdk-functions init my-function cd my-function
此操作将生成如下结构:
my-function/ ├── package.json ├── index.ts # 你的函数代码 └── .env # 在此处添加凭证
.env# 从已保存的凭证中复制 echo "BROWSERBASE_API_KEY=$BROWSERBASE_API_KEY" >> .env echo "BROWSERBASE_PROJECT_ID=$BROWSERBASE_PROJECT_ID" >> .env
或手动编辑 .env 文件:
BROWSERBASE_API_KEY=your_api_key BROWSERBASE_PROJECT_ID=your_project_id
pnpm install
import { defineFn } from "@browserbasehq/sdk-functions";
import { chromium } from "playwright-core";
defineFn("my-function", async (context) => {
const { session, params } = context;
// 连接浏览器
const browser = await chromium.connectOverCDP(session.connectUrl);
const page = browser.contexts()[0]!.pages()[0]!;
// 执行你的自动化逻辑
await page.goto(params.url || "https://example.com");
const title = await page.title();
// 返回可 JSON 序列化的结果
return { success: true, title };
});
关键对象说明:
context.session.connectUrl —— Playwright 用于连接的 CDP 终端地址context.params —— 调用时传入的输入参数pnpm bb dev index.ts
服务器运行于 http://127.0.0.1:14113
curl -X POST http://127.0.0.1:14113/v1/functions/my-function/invoke
-H "Content-Type: application/json"
-d '{"params": {"url": "https://news.ycombinator.com"}}'
开发服务器会在文件变更后自动重载。使用 console.log() 进行调试,输出内容将显示在终端中。
pnpm bb publish index.ts
输出示例:
Function published successfully Build ID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx Function ID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
请保存 Function ID —— 后续调用时必需使用。
# 发起调用
curl -X POST "https://api.browserbase.com/v1/functions/FUNCTION_ID/invoke"
-H "Content-Type: application/json"
-H "x-bb-api-key: $BROWSERBASE_API_KEY"
-d '{"params": {"url": "https://example.com"}}'
# 响应示例:{"id": "INVOCATION_ID"}
# 轮询获取结果
curl "https://api.browserbase.com/v1/functions/invocations/INVOCATION_ID"
-H "x-bb-api-key: $BROWSERBASE_API_KEY"
async function invokeFunction(functionId: string, params: object) {
// 发起调用
const invokeRes = await fetch(
`https://api.browserbase.com/v1/functions/${functionId}/invoke`,
{
method: 'POST',
headers: {
'Content-Type': 'application/json',
'x-bb-api-key': process.env.BROWSERBASE_API_KEY!,
},
body: JSON.stringify({ params }),
}
);
const { id: invocationId } = await invokeRes.json();
// 持续轮询直至完成
while (true) {
await new Promise(r => setTimeout(r, 5000));
const statusRes = await fetch(
`https://api.browserbase.com/v1/functions/invocations/${invocationId}`,
{ headers: { 'x-bb-api-key': process.env.BROWSERBASE_API_KEY! } }
);
const result = await statusRes.json();
if (result.status === 'COMPLETED') return result.results;
if (result.status === 'FAILED') throw new Error(result.error);
}
}
defineFn("scrape", async ({ session, params }) => {
const browser = await chromium.connectOverCDP(session.connectUrl);
const page = browser.contexts()[0]!.pages()[0]!;
await page.goto(params.url);
await page.waitForSelector(params.selector);
const items = await page.$$eval(params.selector, els =>
els.map(el => el.textContent?.trim())
);
return { url: params.url, items };
});
defineFn("authenticated-action", async ({ session, params }) => {
const browser = await chromium.connectOverCDP(session.connectUrl);
const page = browser.contexts()[0]!.pages()[0]!;
// 登录
await page.goto("https://example.com/login");
await page.fill('[name="email"]', params.email);
await page.fill('[name="password"]', params.password);
await page.click('button[type="submit"]');
await page.waitForURL('**/dashboard');
// 执行需认证的操作
const data = await page.textContent('.user-data');
return { data };
});
defineFn("safe-scrape", async ({ session, params }) => {
const browser = await chromium.connectOverCDP(session.connectUrl);
const page = browser.contexts()[0]!.pages()[0]!;
try {
await page.goto(params.url, { timeout: 30000 });
await page.waitForSelector(params.selector, { timeout: 10000 });
const data = await page.textContent(params.selector);
return { success: true, data };
} catch (error) {
return {
success: false,
error: error instanceof Error ? error.message : 'Unknown error'
};
}
});
| 命令 | 说明 |
|---|---|
pnpm dlx @browserbasehq/sdk-functions init |
创建新项目 |
pnpm bb dev |
启动本地开发服务器 |
pnpm bb publish |
部署至 Browserbase |
# 检查 .env 文件是否包含凭证 cat .env # 或为当前 Shell 设置 export BROWSERBASE_API_KEY="your_key" export BROWSERBASE_PROJECT_ID="your_project"
# 确保 SDK 已安装 pnpm add @browserbasehq/sdk-functions # 或使用 npx npx @browserbasehq/sdk-functions dev index.ts
waitForSelector 而非 sleepsession.connectUrlchromium.connectOverCDP(),而非 chromium.launch()相关专题
热门下载
相关下载
精品课程
共6课时 | 54.7万人学习
共89课时 | 134.1万人学习
共49课时 | 82.6万人学习
最新文章