Token导航 LogoToken导航

Agent Skill · 效率

obscura-skill(暗技能)

obscura-skill 用于处理浏览器自动化、网页检查和页面信息提取,适合在 OpenClaw 中需要让 Agent 打开页面、读取网页或验证前端流程时使用。可结合来源仓库、安装命令和原始 README 继续核验具体用法。安装前建议确认权限范围、维护状态,以及是否会触发联网、命令执行或文件读写。

obscura-skill 是效率类 Agent Skill,可用宿主为 OpenClaw,通过ClawHub获取,权限为接触敏感数据;许可证为 MIT-0,第三方扫描有提醒项,按安装量在效率类的 21,003 个 Skill 里排第 20,085。

总安装 1,721周安装 71GitHub Stars 公开资料未说明下载 562核验 2026-05-01

安装说明

本站只整理中文说明,不托管安装包,也不代用户安装。
GitHub
许可证
MIT-0
版本
1.0.0

安装方式

通过对话安装

复制提示词发给支持本地命令或 Skills 的 AI 助手,先确认命令和权限,再让它执行。

请帮我安装这个 Agent Skill:obscura-skill(暗技能)
来源仓库:https://github.com/felipeoff/obscura-skill
安装命令:
openclaw skills install obscura-skill
安装前请先检查当前环境是否支持对应 CLI,并向我确认将要执行的命令、安装目录、联网范围和文件读写权限;确认后再执行。

命令行安装

复制命令到本机终端执行。该命令会通过 OpenClaw 从第三方来源获取 Skill;本站只展示命令,不托管安装包,也不自动执行。

ClawHubOpenClaw
openclaw skills install obscura-skill

这个 Skill 是做什么的

效率类 Skill 把重复的整理、汇总、转换工作交给助手完成,减少手工复制粘贴。

obscura-skill 用于无头浏览器自动化与网页抓取任务。基于 Rust 实现轻量级 Chrome 替代品。适合驱动 E2E 测试或提取动态页面内容。obscura-skill 属于效率类 Skill,可作为该场景下的辅助能力补充。通过 clawhub 安装,需确认系统对嵌入式浏览器的支持。

涉及登录或敏感表单时应注意会话安全与数据加密。

上手步骤

4 步
  1. 1

    确认自己的宿主工具

    公开资料标注支持 OpenClaw;先确认自己用的是其中之一,再按对应工具的 Skills 目录放置。

  2. 2

    拿到安装命令

    可以直接复制的命令是 openclaw skills install obscura-skill;命令里的占位符换成自己的路径或密钥再执行。

  3. 3

    安装后重启宿主

    命令执行完要完全退出宿主工具再打开,让新装的 Skill 被重新扫描到,否则列表里可能看不到。

  4. 4

    按最小权限试用

    它需要接触敏感数据,先在测试目录或测试账号里跑,确认没问题再放到正式项目。

常见问题

6 条

obscura-skill 怎么安装?

在终端执行 openclaw skills install obscura-skill。装完完全退出宿主工具再打开,让它重新扫描本地 Skill。

obscura-skill 支持哪些 AI 工具?

公开资料标注支持 OpenClaw。其他工具只要能读取本地 Skill 目录,一般也能手动放进去,但要自己确认触发方式是否一致。

obscura-skill 需要什么权限?

权限级别是接触敏感数据。该 Skill 可能接触密钥、Token、环境变量或敏感配置,应进入高风险复核队列,默认不自动发布。

obscura-skill 是免费的吗?

来源标注的许可证是 MIT-0。本站不代收任何费用,也不托管安装包;能否商用、要不要署名,以许可证原文为准。

obscura-skill 用的人多吗?

公开数据是累计安装 1,721 次,近一周安装 71 次,下载 562 次。这些数字来自第三方目录统计,只能当作热度参考,不代表质量或安全性。

obscura-skill 安全吗?

第三方扫描有提醒项,说明存在需要人工确认的行为。安装前请打开源码看清它读了什么、联网到哪里。

值得选的地方和要先想清楚的地方

值得选的地方

  • 专注 OpenClaw 一种宿主,触发方式和使用习惯不用来回切换。
  • 许可证明确为 MIT-0,商用和分发边界好判断。

先想清楚的地方

  • 需要接触敏感数据,装到常用环境前要先评估影响面。
  • 第三方扫描存在提醒项或未通过项,需要人工逐条确认。
  • 第三方目录整理,版本更新和行为细节以来源仓库为准。

适不适合你

更适合

  • 已经在用 OpenClaw,想直接扩展它能力的人。
  • 需要处理效率类任务、又不想每次都手写提示词的人。

不太适合

  • 环境里有大量密钥、凭证,不方便给第三方 Skill 读取的人。
  • 需要厂商级技术支持和 SLA 的生产系统。

效率类 Skill 对比

6 个同类
Skill总安装GitHub 星权限许可证扫描
github

GitHub 代码协作 · OpenClaw

7,632,918545需要联网MIT-0通过
nano-pdf

Nano PDF 文档 · OpenClaw

4,249,476231需要联网MIT-0通过
auto-updater

自动更新程序 · OpenClaw

2,964,063386操作浏览器MIT-0通过
video-frames

视频帧 · OpenClaw

2,621,304112需要联网MIT-0通过
gemini

Gemini 助手 · OpenClaw

2,547,39648需要联网MIT-0有提醒
obscura-skill

暗技能 · 本页

1,721—接触敏感数据MIT-0有提醒

按安装量取同分类前几名;数字来自第三方目录统计,只作热度参考,不代表质量结论。

SKILL.md 原文

name
obscura
description
Use when scraping the web, driving headless browser automation, or running E2E tests from Claude Code. Obscura is a Rust-based, drop-in headless Chrome replacement (~30 MB) compatible with Puppeteer and Playwright via the Chrome DevTools Protocol. Trigger when the user mentions web scraping, headless browser, Puppeteer/Playwright, anti-bot/anti-detection, CDP, JS rendering, parallel page fetching, E2E tests for a React/Vue/Next/SPA frontend, or obscura/obscura serve/obscura fetch.

Obscura — Headless Browser for AI Agents and Web Scraping

Source: https://github.com/h4ckf0r0day/obscura License: Apache 2.0

Overview

Obscura is an open-source headless browser engine written in Rust. It runs real JavaScript via V8, speaks the Chrome DevTools Protocol, and works as a drop-in replacement for headless Chrome with Puppeteer and Playwright — but uses ~30 MB of memory instead of 200+ MB and starts instantly.

Use this skill whenever you need to:

  • Scrape JavaScript-heavy pages from the CLI
  • Drive Puppeteer or Playwright scripts without bundling Chromium
  • Spin up a CDP server for an AI agent to control
  • Defeat trivial bot-detection (built-in stealth + tracker blocking)
  • Parallel-fetch many URLs with low memory overhead

When to Use

TriggerAction
User wants to scrape one URL with JS renderingobscura fetch <url>
User wants to scrape many URLs in parallelobscura scrape url1 url2 ...
User has a Puppeteer/Playwright scriptStart obscura serve and connect via CDP
Page is bot-protectedAdd --stealth
User asks about anti-detect / fingerprintingRecommend stealth build

Installation

macOS (Apple Silicon)

curl -LO https://github.com/h4ckf0r0day/obscura/releases/latest/download/obscura-aarch64-macos.tar.gz
tar xzf obscura-aarch64-macos.tar.gz
sudo mv obscura /usr/local/bin/
obscura --version

macOS (Intel)

curl -LO https://github.com/h4ckf0r0day/obscura/releases/latest/download/obscura-x86_64-macos.tar.gz
tar xzf obscura-x86_64-macos.tar.gz
sudo mv obscura /usr/local/bin/

Linux x86_64

curl -LO https://github.com/h4ckf0r0day/obscura/releases/latest/download/obscura-x86_64-linux.tar.gz
tar xzf obscura-x86_64-linux.tar.gz
sudo mv obscura /usr/local/bin/

Windows

Download the .zip from the Releases page and extract it. Add the binary to PATH.

Build from source (with stealth)

git clone https://github.com/h4ckf0r0day/obscura.git
cd obscura
cargo build --release --features stealth
# Binary: ./target/release/obscura

Requires Rust 1.75+ (rustup.rs). First build takes ~5 min because V8 compiles from source — subsequent builds are cached.

Verify

obscura fetch https://example.com --eval "document.title"
# Expected output: "Example Domain"

Usage

1. Fetch a single page

# Get the page title
obscura fetch https://example.com --eval "document.title"

# Dump the rendered HTML (after JS executes)
obscura fetch https://news.ycombinator.com --dump html

# Dump only the links
obscura fetch https://example.com --dump links

# Dump plain text
obscura fetch https://example.com --dump text

# Wait for network to be idle before reading
obscura fetch https://example.com --wait-until networkidle0

# Wait for a specific element
obscura fetch https://example.com --selector ".article-body"

--dump accepts: html, text, links. --wait-until accepts: load, domcontentloaded, networkidle0.

2. Scrape many URLs in parallel

obscura scrape \
  https://example.com/page-1 \
  https://example.com/page-2 \
  https://example.com/page-3 \
  --concurrency 25 \
  --eval "document.querySelector('h1').textContent" \
  --format json

--format accepts: json or text. Use json when piping into jq.

3. Start a CDP server for Puppeteer / Playwright

obscura serve --port 9222

# With anti-detection + tracker blocking
obscura serve --port 9222 --stealth

# Through an HTTP/SOCKS5 proxy
obscura serve --port 9222 --proxy socks5://127.0.0.1:1080

# More worker processes for higher throughput
obscura serve --port 9222 --workers 4

Then connect from Node:

Puppeteer:

import puppeteer from 'puppeteer-core';

const browser = await puppeteer.connect({
  browserWSEndpoint: 'ws://127.0.0.1:9222/devtools/browser',
});

const page = await browser.newPage();
await page.goto('https://news.ycombinator.com');

const stories = await page.evaluate(() =>
  Array.from(document.querySelectorAll('.titleline > a'))
    .map(a => ({ title: a.textContent, url: a.href }))
);
console.log(stories);

await browser.disconnect();

Playwright:

import { chromium } from 'playwright-core';

const browser = await chromium.connectOverCDP({
  endpointURL: 'ws://127.0.0.1:9222',
});

const ctx = await browser.newContext();
const page = await ctx.newPage();
await page.goto('https://en.wikipedia.org/wiki/Web_scraping');
console.log(await page.title());

await browser.close();

4. Form submission & login

Obscura handles POSTs, follows 302 redirects, and maintains cookies natively.

await page.goto('https://quotes.toscrape.com/login');
await page.evaluate(() => {
  document.querySelector('#username').value = 'admin';
  document.querySelector('#password').value = 'admin';
  document.querySelector('form').submit();
});

React (and any SPA) E2E Testing with Playwright + Obscura

This is the most common Claude-Code use case. The agent already has access to the user's frontend repo and is asked to validate a feature ponta-a-ponta — not just unit tests, but real browser interaction (login, form submit, navigation, asserting UI). Use Obscura as a drop-in Chrome replacement so tests run 5–10× faster with ~1/7 of the memory.

This section is stack-agnostic: works with React, Vue, Svelte, Next.js, Remix, Nuxt, Astro, plain HTML, and anything else that runs in a browser. Playwright doesn't care what framework rendered the DOM.

When to invoke this workflow

The agent should reach for this whenever any of these is true:

  • The user changed code under a frontend route (src/pages/**, app/**,

client/src/features/**, routes/**)

  • The user asks to "test the flow", "validate the page", "make sure login

still works", "check the UI ponta-a-ponta"

  • A unit test is green but the user reports a runtime / integration bug

(form not submitting, redirect loop, modal not closing, toast still showing the wrong message)

  • The agent is about to claim a frontend task is done and the project

has Playwright already configured

Decision tree before running anything

Does the project already have @playwright/test in devDependencies?
├── YES → use the existing config; just plug Obscura in via env var
└── NO  → ask user before scaffolding Playwright; do NOT install silently

Is `obscura --version` available on PATH?
├── YES → start `obscura serve` in the background and run tests
└── NO  → tell the user to install Obscura (see Installation section);
         OR fall back to Playwright's bundled Chromium if the user prefers
         not to install Obscura

Setup (when Playwright is already configured)

The whole integration is one optional env var. Do not rewrite existing config — add a conditional block.

1) Patch playwright.config.ts to honor USE_OBSCURA=1:

// playwright.config.ts
import { defineConfig, devices } from "@playwright/test";

const useObscura = process.env.USE_OBSCURA === "1";
const obscuraWs = process.env.OBSCURA_WS || "ws://127.0.0.1:9222";

export default defineConfig({
  // ...keep all existing fields exactly as they are...
  use: {
    ...devices["Desktop Chrome"],
    baseURL: process.env.PLAYWRIGHT_BASE_URL || "http://localhost:5173",
    trace: "on-first-retry",
    video: "on-first-retry",
    screenshot: "only-on-failure",
    // Drop-in switch: if USE_OBSCURA=1, connect over CDP instead of
    // launching the bundled Chromium.
    ...(useObscura && {
      connectOptions: { wsEndpoint: obscuraWs },
    }),
  },
});

Without USE_OBSCURA=1 the project keeps behaving exactly as before. Setting the env var is an opt-in fast path.

2) Add npm scripts that orchestrate the Obscura server lifecycle.

The agent should not assume obscura serve is already running. Use a helper script that starts/stops it around the test run:

// package.json
{
  "scripts": {
    "obscura:start": "obscura serve --port 9222 --stealth &",
    "obscura:stop": "pkill -f 'obscura serve' || true",
    "e2e:fast": "bash ./scripts/run-e2e-obscura.sh"
  }
}
#!/usr/bin/env bash
# scripts/run-e2e-obscura.sh
set -e
obscura serve --port 9222 --stealth &
OBSCURA_PID=$!
trap "kill $OBSCURA_PID 2>/dev/null || true" EXIT
# Wait until the CDP server is reachable (max 5s)
for i in {1..50}; do
  curl -s http://127.0.0.1:9222/json/version >/dev/null && break
  sleep 0.1
done
USE_OBSCURA=1 npx playwright test "$@"

Make the script executable: chmod +x scripts/run-e2e-obscura.sh.

3) Verify the dev server is reachable before tests run.

The agent must guarantee the frontend is up at baseURL (default http://localhost:5173 for Vite, http://localhost:3000 for Next.js). Either:

  • Use Playwright's built-in webServer block (preferred; auto-starts dev

server on test run):

  webServer: {
    command: "npm run dev",
    url: "http://localhost:5173",
    reuseExistingServer: !process.env.CI,
    timeout: 120_000,
  },
  • Or check curl -fs http://localhost:5173 >/dev/null in the helper

script and start npm run dev & if it fails.

Setup (when the project does NOT have Playwright)

Do not install Playwright silently. Ask the user first. If they agree, run:

npm install -D @playwright/test
npx playwright install chromium       # only needed when NOT using Obscura
mkdir -p e2e

Then create a minimal playwright.config.ts, a smoke test e2e/smoke.spec.ts, and the helper script above. Keep the smoke test small (load /, assert the title) so the agent can prove the pipeline works before writing real coverage.

Writing the actual E2E test (framework-agnostic patterns)

Use these patterns regardless of React/Vue/Next/etc:

// e2e/login.spec.ts
import { test, expect } from "@playwright/test";

test("login flow works", async ({ page }) => {
  await page.goto("/");

  // Prefer accessibility selectors. They survive markup refactors and
  // work the same across React / Vue / Svelte renders.
  await page.getByRole("link", { name: /entrar|login|sign in/i }).click();
  await page.getByLabel(/email/i).fill("test@example.com");
  await page.getByLabel(/senha|password/i).fill("hunter2");
  await page.getByRole("button", { name: /entrar|submit/i }).click();

  // Auto-wait: Playwright retries the assertion until the timeout.
  // No manual sleeps, no flaky setTimeout.
  await expect(page).toHaveURL(/\/dashboard/);
  await expect(page.getByRole("heading", { level: 1 })).toBeVisible();
});

Selector priority (most stable to least):

  1. getByRole + accessible name
  2. getByLabel (forms)
  3. getByTestId (data-testid attribute the team controls)
  4. getByText (fragile if copy changes)
  5. CSS / XPath (last resort)

Things to assert in a typical SPA flow:

  • The URL changed to the expected route
  • The expected <h1> / page title is visible
  • Network call returned 2xx — use page.waitForResponse(/\/api\/.../)
  • Toast / error region is not visible (or shows the right message)
  • Local/session storage has the token (page.evaluate(() => localStorage.getItem("token")))

Running the suite

# Headed (you watch it run, debugging)
npx playwright test --headed

# Full speed via Obscura
npm run e2e:fast

# Only one spec
npm run e2e:fast -- e2e/login.spec.ts

# Open the HTML report after a run
npx playwright show-report

Reading the report when something fails

Playwright drops three artifacts on failure (configured above):

  • playwright-report/index.html — interactive UI
  • test-results/<spec>/trace.zip — open with npx playwright show-trace
  • test-results/<spec>/video.webm — full recording of the failing run
  • test-results/<spec>/test-failed-1.png — screenshot

The agent should always open the trace before guessing the fix. Most "flaky" failures are real timing bugs in the app code visible in the trace timeline.

Common pitfalls in React/SPA E2E

SymptomLikely CauseFix
Test passes locally, fails in CIRace with hydrationUse await page.waitForLoadState("networkidle") after goto
Click hits wrong elementSame role appears twice (header + sidebar)Scope with page.getByRole("main").getByRole(...)
Form submit silently no-opsRHF / Zod async validationUse page.getByRole("button").click() then expect(toast).toBeVisible(); don't assert URL immediately
localStorage is empty in next testEach test gets a fresh contextUse test.beforeEach to seed, or Playwright fixtures
Auth cookies dropped between testsCross-context isolationSave state with page.context().storageState() and reuse via test.use({ storageState: ... })
Long animations slow the suiteFramer Motion / CSS transitionsInject * { transition: none !important; animation: none !important } via page.addStyleTag

CI tips

In GitHub Actions (or any CI), add Obscura as a download step. The binary is small, the install is fast, and you stop paying the ~300 MB Chromium download per job:

- name: Install Obscura
  run: |
    curl -L -o /tmp/obscura.tar.gz \
      https://github.com/h4ckf0r0day/obscura/releases/latest/download/obscura-x86_64-linux.tar.gz
    tar xzf /tmp/obscura.tar.gz -C /usr/local/bin/
- name: Run E2E with Obscura
  run: npm run e2e:fast

What the agent must NOT do

  • Do not run npx playwright install if Obscura is going to drive the

tests — that downloads ~300 MB of Chromium for nothing.

  • Do not modify existing E2E specs to make them pass; if a spec fails,

the bug is in the app code 95% of the time.

  • Do not hard-code setTimeout waits in tests. Use expect(...).toPass()

or built-in auto-waiting locators.

  • Do not commit .env files with real credentials for E2E. Use

process.env.E2E_USER / E2E_PASS and document them in .env.example.

  • Do not start obscura serve and forget to kill it. Always use the

trap pattern in the helper script.

Decision shortcut for the agent

When the user says "rode os testes" or "valide o fluxo" on a frontend project, the agent should:

  1. Detect Playwright (grep -q '"@playwright/test"' package.json).
  2. Detect Obscura (command -v obscura).
  3. If both present → npm run e2e:fast (or equivalent).
  4. If only Playwright → npm run e2e and recommend installing Obscura.
  5. If neither → ask the user before scaffolding.

Stealth Mode

Build with --features stealth (or use the stealth release binary) and run with --stealth.

What it does:

  • Per-session fingerprint randomization (GPU, screen, canvas, audio, battery)
  • Realistic navigator.userAgentData (Chrome 145, high-entropy values)
  • event.isTrusted = true for dispatched events
  • Hidden internal properties (Object.keys(window) is safe)
  • Native function masking (Function.prototype.toString() returns [native code])
  • navigator.webdriver = undefined (matches real Chrome)
  • Blocks 3,520 tracker / analytics / fingerprinting domains

CLI Reference Cheat Sheet

obscura serve

FlagDefaultDescription
--port9222WebSocket port
--proxy—HTTP/SOCKS5 proxy URL
--stealthoffAnti-detection + tracker blocking
--workers1Parallel worker processes
--obey-robotsoffRespect robots.txt

obscura fetch <URL>

FlagDefaultDescription
--dumphtmlhtml \text \links
--eval—JS expression to evaluate
--wait-untilloadload \domcontentloaded \networkidle0
--selector—Wait for CSS selector
--stealthoffAnti-detection mode
--quietoffSuppress banner

obscura scrape <URL...>

FlagDefaultDescription
--concurrency10Parallel workers
--eval—JS expression per page
--formatjsonjson \text

CDP Coverage

Obscura implements the Chrome DevTools Protocol surface needed by Puppeteer / Playwright:

DomainMethods
TargetcreateTarget, closeTarget, attachToTarget, createBrowserContext, disposeBrowserContext
Pagenavigate, getFrameTree, addScriptToEvaluateOnNewDocument, lifecycleEvents
Runtimeevaluate, callFunctionOn, getProperties, addBinding
DOMgetDocument, querySelector, querySelectorAll, getOuterHTML, resolveNode
Networkenable, setCookies, getCookies, setExtraHTTPHeaders, setUserAgentOverride
Fetchenable, continueRequest, fulfillRequest, failRequest
StoragegetCookies, setCookies, deleteCookies
InputdispatchMouseEvent, dispatchKeyEvent
LPgetMarkdown (DOM-to-Markdown)

Decision Heuristics

When the user asks for web automation, choose this way:

  1. One page, one shot → obscura fetch <url> --eval "..."
  2. Many pages, same selector → obscura scrape <urls> --concurrency 25
  3. Stateful flow, login, multi-step → obscura serve + Puppeteer/Playwright
  4. Page detects bots → add --stealth
  5. Behind a proxy → --proxy <url>
  6. CI / Docker → use the static Linux binary, no Chrome needed

Anti-Patterns

  • Do not use Obscura against sites whose terms of service forbid scraping.
  • Do not disable --obey-robots on third-party sites in production

pipelines without consent.

  • Do not treat stealth mode as a bypass for paywalls or auth — it only

hides the fact that the browser is automated, not the fact that requests are made.

  • Do not spawn obscura fetch in a tight shell loop for many URLs — use

obscura scrape (worker pool) instead.

Troubleshooting

SymptomLikely CauseFix
connection refused from PuppeteerServer not runningobscura serve --port 9222 first
Page renders empty HTMLJS hasn't finishedAdd --wait-until networkidle0
Site detects automationwebdriver leakBuild with --features stealth, run with --stealth
Build fails on v8Rust < 1.75rustup update stable
Slow first buildV8 compilingExpected ~5 min, cached after

References

  • Repository: https://github.com/h4ckf0r0day/obscura
  • Releases (binaries): https://github.com/h4ckf0r0day/obscura/releases
  • Chrome DevTools Protocol: https://chromedevtools.github.io/devtools-protocol/
  • Puppeteer: https://pptr.dev/
  • Playwright: https://playwright.dev/

平台分布

OpenClaw

77.48%
按下载量换算435

安全审计

VirusTotal

可疑

ClawScan

通过

Static analysis

通过

权限和风险

接触敏感数据

该 Skill 可能接触密钥、Token、环境变量或敏感配置,应进入高风险复核队列,默认不自动发布。

安装前确认

本站仅展示第三方公开信息,不托管安装包,不提供自动安装或运行环境。安装前应自行审查源码、依赖和命令行为。来源安全扫描存在提醒或未通过项,安装前请自行复核。目前只有一个公开来源,建议同时核对源仓库。

继续浏览同类 Skills