본문으로 건너뛰기
cccskills
무료GitHub에 공개

network

Read the network instead of the DOM. Snoop JSON API responses, wait for a request instead of sleeping, collect items while scrolling, record a QA flight trace (jsonl, HAR, screenshots), and intercept requests with routes.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

설치 방법 보기

포함된 파일(1)

  • SKILL.md5.0 KB

SKILL.md(원문)

설치하기 전에 에이전트에게 전달되는 지시 내용을 확인할 수 있습니다.

Network

Every page session already has the Network domain on, so watching traffic costs nothing and pages can't see it. All four tools come from the package entrypoint:

const { createNetworkSnoop, collectWhileScrolling, createTrace, createRoutes } =
  await import("omowright");

Snoop before you scrape

When a page renders a list, a table, or search results, the data almost always arrived as JSON one request earlier. That JSON is complete, typed, and free of truncated labels. Snapshot to find and click; snoop to read.

const snoop = createNetworkSnoop(page, { match: { url: /\/api\//, mimeType: "json" } }); // strings match as substrings
await page.goto("https://example.com/search?q=widgets");
const results = snoop.popJson();          // parsed bodies, buffer drained
console.log(snoop.summary({ max: 20 }));  // "GET 200 application/json 8123B https://..."
snoop.dispose();

Create the snoop before the navigation or click that produces the traffic. Entries land when the response finishes, so match may test status and mimeType. pop() gives raw entries; peek() copies without draining.

Wait for the request, not the clock

A fixed sleep either wastes time or fails on a slow day. Wait for the response you need instead:

const saved = snoop.waitFor({ url: "/api/cart", method: "POST" }, { timeoutMs: 10000 });
await page.locator("e7").click();
const entry = await saved;                 // { status, body, ... }
if (entry.status !== 200) throw new Error(`cart save failed: ${entry.status} ${entry.statusText}`);

Start the wait first, then act; a response that finishes before waitFor is called goes to the buffer, not the waiter.

Collect while scrolling

Infinite lists load pages over XHR as you scroll. Drive the scroll and drain the snoop in one loop:

const snoop = createNetworkSnoop(page, { match: { url: /\/feed\?/ } });
const items = [];
const gen = collectWhileScrolling(page, snoop, {
  minItems: 200,
  maxScrolls: 15,
  extract: json => json.items ?? [],
  scroll: "wheel",       // "end" jumps to the bottom instead
  settleMs: 800,
});
let step;
while (!(step = await gen.next()).done) items.push(step.value);
step.value;   // { rounds, total, stoppedBecause }

for await (const item of gen) works too when you don't need the return value. The loop drains first, then scrolls, and stops on minItems, maxScrolls, or two consecutive rounds where the document height didn't grow (noGrowth). The default extract accepts bodies that are already arrays.

Flight recorder for QA

createTrace records what happened while you drove the page, so a failed run is a directory to read rather than a memory to reconstruct:

const trace = createTrace(page, { dir: "/tmp/checkout-trace" });
await trace.step("open cart", () => page.goto("https://example.com/cart"));
await trace.step("apply coupon", async () => {
  await page.locator("e3").fill("SAVE10");
  await page.locator("e4").click();
});
trace.mark("expected total", { total: "90.00" });
const summary = await trace.stop();      // { steps, events, network, startedAt, endedAt, url }

What lands in dir:

  • trace.jsonl: one JSON object per line, ordered by seq. kind is one of step (name, durationMs, error, screenshot paths), network, console, dialog, navigation, download, mark, warning. Grep it: rg '"kind":"console"' trace.jsonl or jq -c 'select(.kind=="step")'.
  • trace.har: HAR 1.2 of every finished request; open it in DevTools or any HAR viewer to see timings and bodies.
  • summary.json: the object stop() returned.
  • screenshots/<seq>-<slug>-before.png and -after.png for every step.

Steps rethrow, so call stop() in a finally to keep the evidence from a failure. The recorder rides the existing network and console paths.

Routes: intercept with care

createRoutes(page) blocks, rewrites, or fakes requests:

const routes = createRoutes(page);
await routes.route("*/analytics/*", ({ abort }) => abort("BlockedByClient"));
await routes.route(/\/api\/flags$/, ({ fulfill }) =>
  fulfill({ status: 200, contentType: "application/json", body: JSON.stringify({ beta: true }) }));
await routes.route(({ method }) => method === "POST", ({ request, continue: go }) =>
  go({ headers: { ...request.headers, "x-test-run": "1" } }));
// ... drive the page ...
await routes.dispose();                    // Fetch.disable

Glob strings use * and ?; a string without either is a substring match. A handler that throws or never settles lets the request continue, with a warning.

Stealth caveat: Fetch.enable goes out on the first route(), and interception changes the timing and blocking patterns that bot defenses score. Leave routes off for WAF-protected targets and stealth profiles; use the snoop, which is passive, to read the same traffic.

리뷰

아직 리뷰가 없습니다. 사용해 본 소감을 남겨 주세요.

댓글

로그인 없이 쓸 수 있습니다. 사용 후기, 질문, 작동하지 않은 환경 등을 편하게 남겨 주세요.

아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.

보내면 바로 공개됩니다. 이메일 주소나 전화번호 같은 개인 정보는 쓰지 마세요. URL은 2개까지입니다.

0 / 1,000자

이 양식은 reCAPTCHA로 보호되며 Google 개인정보처리방침 및 서비스 약관이 적용됩니다.

같은 저장소의 스킬

Push browser tab and download lifecycle events plus manager-owned background tabs. Read this when an agent needs lifecycle notifications or a temporary tab without polling.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

code-yeongyu/omowright52026년 10월 16일 업데이트

captcha

무료

Interact with challenge widgets in an authorized automation flow using checkbox clicks, slider drags, text OCR, and image-grid input. Verify completion with an application-specific condition.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

code-yeongyu/omowright52026년 10월 16일 업데이트

chrome

무료

Read this when you need Chrome MV3-shaped APIs — bookmarks, tabs, windows, history, downloads, or top sites — in standalone OmOWright.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

code-yeongyu/omowright52026년 10월 16일 업데이트

Use when a user-driven CloakBrowser profile needs MV3 Chrome writes/events through the native messaging bridge.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

code-yeongyu/omowright52026년 10월 16일 업데이트

omowright

무료

The default code-driven browser path for interactive browsing work: drives any browser from code with token-efficient a11y snapshots (57% smaller via compactSnapshot), ref-based clicks, coordinate control (CUA), viewport pinning, CAPTCHA solving (reCAPTCHA, Turnstile, hCaptcha, slider, OCR), Chrome MV3 APIs (tabs/bookmarks/history/downloads/topSites), network snoop (read API JSON instead of DOM), flight-recorder trace (jsonl + HAR + screenshots), OOPIF-aware snapshots, dialog policy, human handoff for login/OTP, device emulation, request routes, stealth via CloakBrowser as the default owned engine with zero exposed CDP ports, and an attached engine that drives the user's own signed-in browser through BrowserSkill (connectBrowserSkill, bskSnapshot, one-click onboarding via bskOnboard). MUST USE for interactive browser work: scraping, blocked/WAF/JS-rendered pages, logins, the user's logged-in sites and open tabs, extension popups, form filling, screenshots, web QA, CAPTCHAs. The ulw-research browsing lane runs on ultimate-browsing, not this skill.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

code-yeongyu/omowright52026년 10월 16일 업데이트

Coordinate-level browser control for UI that snapshots, refs, and locators cannot target - canvas apps, extension popups, OS-drawn dialogs, custom drag surfaces. Read this when a DOM-targeted action fails twice, when the next decision depends on rendered pixels, or when CUA clicks land on the wrong element.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

code-yeongyu/omowright52026년 10월 16일 업데이트

code-yeongyu의 스킬 모두 보기

이 스킬의 문제 신고