📦 Functions — 部署无头浏览器函数

v1.0.0

通过官方 bb CLI,引导 Claude 在 Browserbase 平台快速构建、本地调试并一键部署无服务器浏览器自动化函数,实现远程网页抓取、登录与数据提取。

0· 1.4k·1 当前·1 累计
peytoncasper 头像by @peytoncasper·MIT-0
下载技能包
License
MIT-0
最后更新
2026/4/14
0
安全扫描
VirusTotal
可疑
查看报告
OpenClaw
可疑
medium confidence
SKILL.md 描述了合法的 Browserbase/`bb` CLI 流程,并正确要求提供 Browserbase API 密钥与项目 ID,但注册元数据声称无需环境变量且技能无已知来源/主页——该不一致与出处缺失令人担忧。
评估建议
此技能的指令对部署 Browserbase 函数看似合法,但使用前请谨慎:1) 验证技能出处——查找官方主页或仓库,确认 @browserbasehq/sdk-functions 与 `bb` CLI 为真实包。2) 切勿在公开聊天中粘贴 API 密钥或密码;优先使用密钥管理器或 CI 环境变量,而非提交 .env 文件。3) 除非控制存储与访问策略,否则勿在函数参数中传递真实用户凭据。4) 确认所创建 Browserbase API 密钥的最小权限范围。5) 若无法验证技能来源或其安装的 npm 包,请视为高风险并停止操作。...
详细分析 ▾
用途与能力
The skill's stated purpose (deploy serverless browser automation with the official bb CLI) matches the instructions, but the registry metadata lists no required environment variables or credentials while the SKILL.md clearly requires BROWSERBASE_API_KEY and BROWSERBASE_PROJECT_ID. The skill's source and homepage are unknown, which reduces provenance for a tool that requests an API key.
指令范围
The SKILL.md stays within the claimed scope: it walks through initializing a function project, adding a .env with Browserbase credentials, running pnpm/`bb` dev and publish, and invoking functions. It also shows patterns for authenticated automation (filling login forms) which is consistent with browser automation but elevates risk because user account credentials may be passed into functions/params.
安装机制
This is an instruction-only skill with no install spec or code files, so nothing will be written or executed by the skill itself. That lowers installer risk — the user runs the commands. The SKILL.md recommends using pnpm dlx and pnpm install which pull packages from npm; that's expected for this workflow but you should verify the packages are official.
凭证需求
The SKILL.md requires BROWSERBASE_API_KEY and BROWSERBASE_PROJECT_ID (and the example uses them in curl and process.env). Those credentials are proportionate to the task, but the registry metadata omits them — an inconsistency. The skill also encourages storing credentials in a .env file and passing sensitive site login credentials through function params, which can lead to accidental exposure if not handled securely.
持久化与权限
The skill does not request persistent presence (always:false), does not modify other skills' configs, and declares no config paths. It does not request elevated system privileges.
安全有层次,运行前请审查代码。

License

MIT-0

可自由使用、修改和再分发,无需署名。

运行时依赖

无特殊依赖

版本

latestv1.0.02026/2/6

“functions”技能的初始版本发布: - 提供使用官方 bb CLI 部署无服务器浏览器自动化的完整指南。 - 包含入门说明、凭据设置、项目初始化和 .env 配置。 - 详述开发工作流,包括本地开发服务器、测试、自动重载与调试。 - 解释部署、调用(通过 curl 和代码)以及轮询结果。 - 提供常见模式示例:参数化抓取、认证工作流与错误处理。 - 附带 CLI 参考与常见设置和运行时问题的故障排除技巧。

可疑

安装命令

点击复制
官方npx clawhub@latest install functions
镜像加速npx clawhub@latest install functions --registry https://cn.longxiaskill.com

技能文档

# Browserbase Functions 技能 指导 Claude 使用官方 bb CLI 部署无服务器浏览器自动化。 ## 何时使用 在以下场景使用本技能: - 用户希望按调度部署自动化任务 - 用户需要浏览器自动化的 webhook 端点 - 用户想在云端(非本地)运行自动化 - 用户询问 Browserbase Functions ## 前置条件 ### 1. 获取凭据 从 https://browserbase.com/settings 获取 API key 和 Project ID ### 2. 设置环境变量 直接设置: ``bash export BROWSERBASE_API_KEY="your_api_key" export BROWSERBASE_PROJECT_ID="your_project_id" ` ## 创建 Function 项目 ### 1. 使用官方 CLI 初始化 `bash pnpm dlx @browserbasehq/sdk-functions init my-function cd my-function ` 这会创建: ` my-function/ ├── package.json ├── index.ts # 你的函数代码 └── .env # 在此添加凭据 ` ### 2. 将凭据添加到 .env `bash # 从已保存的凭据复制 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 ` ### 3. 安装依赖 `bash pnpm install ` ## 函数结构 `typescript 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 - 调用时传入的参数 ## 开发工作流 ### 1. 启动开发服务器 `bash pnpm bb dev index.ts ` 服务器运行在 http://127.0.0.1:14113 ### 2. 本地测试 `bash 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"}}' ` ### 3. 迭代 开发服务器会在文件变更时自动重载。使用 console.log() 调试——输出会出现在终端。 ## 部署 ### 发布到 Browserbase `bash 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 `bash # 启动调用 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" ` ### 使用代码 `typescript 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); } } ` ## 常见模式 ### 带参数抓取 `typescript 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 }; }); ` ### 带认证 `typescript 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 }; }); ` ### 错误处理 `typescript 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' }; } }); ` ## CLI 参考 | 命令 | 描述 | |---------|-------------| | pnpm dlx @browserbasehq/sdk-functions init | 创建新项目 | | pnpm bb dev | 启动本地开发服务器 | | pnpm bb publish | 部署到 Browserbase | ## 故障排查 ### “缺少 API key” `bash # 检查 .env 文件是否包含凭据 cat .env # 或仅为当前 shell 设置 export BROWSERBASE_API_KEY="your_key" export BROWSERBASE_PROJECT_ID="your_project" ` ### 开发服务器无法启动 `bash # 确保 SDK 已安装 pnpm add @browserbasehq/sdk-functions # 或使用 npx npx @browserbasehq/sdk-functions dev index.ts ` ### 函数超时 - 最大执行时间为 15 分钟 - 为页面操作增加具体超时 - 使用 waitForSelector 而非 sleep ### 无法连接到浏览器 - 检查是否正确使用 session.connectUrl - 确保使用 chromium.connectOverCDP() 而非 chromium.launch()`

数据来源ClawHub ↗ · 中文优化:龙虾技能库