[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CTAWJRV4YPTNMMACJSHFS6":3,"skill-same:01M6CTAWJRV4YPTNMMACJSHFS6":97},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":23,"publishedAt":44,"linkOnly":45,"markdownContent":46,"markdownBody":47,"frontMatter":48,"refName":51,"commitSha":52,"skillDirectory":53,"forksCount":54,"repositoryHtmlUrl":55,"repositoryHomepageUrl":55,"ownerHtmlUrl":56,"ownerBlogUrl":6,"ownerDescription":57,"updatedAt":58,"install":59,"resources":72},"01M6CTAWJRV4YPTNMMACJSHFS6","go-rod-master",null,"Comprehensive guide for browser automation and web scraping with go-rod (Chrome DevTools Protocol) including stealth anti-bot-detection patterns.","Sam-06060\u002Fjarvis-assistant","Sam-06060","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F208600848?v=4","01M6CRKT7C7FXD21V6HXF293S0","Samson Frank Ganta","01M6CRKTBEKYFD8YX5Z1GT99EE",6,"Apache-2.0","https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fmodules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fgo-rod-master\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43],"go rod master","go","master","devtools","patterns","guide","scraping","web scraping","detection","chrome devtools","https","bot","browser","protocol","web","chrome","automation","github","safe","browser automation","2026-11-10 10:12:30",false,"---\nname: go-rod-master\ndescription: \"Comprehensive guide for browser automation and web scraping with go-rod (Chrome DevTools Protocol) including stealth anti-bot-detection patterns.\"\nrisk: safe\nsource: \"https:\u002F\u002Fgithub.com\u002Fgo-rod\u002Frod\"\ndate_added: \"2026-02-27\"\n---\n\n# Go-Rod Browser Automation Master\n\n## Overview\n\n[Rod](https:\u002F\u002Fgithub.com\u002Fgo-rod\u002Frod) is a high-level Go driver built directly on the [Chrome DevTools Protocol](https:\u002F\u002Fchromedevtools.github.io\u002Fdevtools-protocol\u002F) for browser automation and web scraping. Unlike wrappers around other tools, Rod communicates with the browser natively via CDP, providing thread-safe operations, chained context design for timeouts\u002Fcancellation, auto-wait for elements, correct iframe\u002Fshadow DOM handling, and zero zombie browser processes.\n\nThe companion library [go-rod\u002Fstealth](https:\u002F\u002Fgithub.com\u002Fgo-rod\u002Fstealth) injects anti-bot-detection evasions based on [puppeteer-extra stealth](https:\u002F\u002Fgithub.com\u002Fnichochar\u002Fpuppeteer-extra\u002Ftree\u002Fmaster\u002Fpackages\u002Fextract-stealth-evasions), hiding headless browser fingerprints from detection systems.\n\n## When to Use This Skill\n\n- Use when the user asks to **scrape**, **automate**, or **test** a website using Go.\n- Use when the user needs a **headless browser** for dynamic\u002FSPA content (React, Vue, Angular).\n- Use when the user mentions **stealth**, **anti-bot**, **avoiding detection**, **Cloudflare**, or **bot detection bypass**.\n- Use when the user wants to work with the **Chrome DevTools Protocol (CDP)** directly from Go.\n- Use when the user needs to **intercept** or **hijack** network requests in a browser context.\n- Use when the user asks about **concurrent browser scraping** or **page pooling** in Go.\n- Use when the user is migrating from **chromedp** or **Playwright Go** and wants a simpler API.\n\n## Safety & Risk\n\n**Risk Level: ? Safe**\n\n- **Read-Only by Default:** Default behavior is navigating and reading page content (scraping\u002Ftesting).\n- **Isolated Contexts:** Browser contexts are sandboxed; cookies and storage do not persist unless explicitly saved.\n- **Resource Cleanup:** Designed around Go's `defer` pattern — browsers and pages close automatically.\n- **No External Mutations:** Does not modify external state unless the script explicitly submits forms or POSTs data.\n\n## Installation\n\n```bash\n# Core rod library\ngo get github.com\u002Fgo-rod\u002Frod@latest\n\n# Stealth anti-detection plugin (ALWAYS include for production scraping)\ngo get github.com\u002Fgo-rod\u002Fstealth@latest\n```\n\nRod auto-downloads a compatible Chromium binary on first run. To pre-download:\n\n```bash\ngo run github.com\u002Fnichochar\u002Fgo-rod.github.io\u002Fcmd\u002Flauncher@latest\n```\n\n## Core Concepts\n\n### Browser Lifecycle\n\nRod manages three layers: **Browser → Page → Element**.\n\n```go\n\u002F\u002F Launch and connect to a browser\nbrowser := rod.New().MustConnect()\ndefer browser.MustClose()\n\n\u002F\u002F Create a page (tab)\npage := browser.MustPage(\"https:\u002F\u002Fexample.com\")\n\n\u002F\u002F Find an element\nel := page.MustElement(\"h1\")\nfmt.Println(el.MustText())\n```\n\n### Must vs Error Patterns\n\nRod provides two API styles for every operation:\n\n| Style | Method | Use Case |\n|:------|:-------|:---------|\n| **Must** | `MustElement()`, `MustClick()`, `MustText()` | Scripting, debugging, prototyping. Panics on error. |\n| **Error** | `Element()`, `Click()`, `Text()` | Production code. Returns `error` for explicit handling. |\n\n**Production pattern:**\n\n```go\nel, err := page.Element(\"#login-btn\")\nif err != nil {\n    return fmt.Errorf(\"login button not found: %w\", err)\n}\nif err := el.Click(proto.InputMouseButtonLeft, 1); err != nil {\n    return fmt.Errorf(\"click failed: %w\", err)\n}\n```\n\n**Scripting pattern with Try:**\n\n```go\nerr := rod.Try(func() {\n    page.MustElement(\"#login-btn\").MustClick()\n})\nif errors.Is(err, context.DeadlineExceeded) {\n    log.Println(\"timeout finding login button\")\n}\n```\n\n### Context & Timeout\n\nRod uses Go's `context.Context` for cancellation and timeouts. Context propagates recursively to all child operations.\n\n```go\n\u002F\u002F Set a 5-second timeout for the entire operation chain\npage.Timeout(5 * time.Second).\n    MustWaitLoad().\n    MustElement(\"title\").\n    CancelTimeout(). \u002F\u002F subsequent calls are not bound by the 5s timeout\n    Timeout(30 * time.Second).\n    MustText()\n```\n\n### Element Selectors\n\nRod supports multiple selector strategies:\n\n```go\n\u002F\u002F CSS selector (most common)\npage.MustElement(\"div.content > p.intro\")\n\n\u002F\u002F CSS selector with text regex matching\npage.MustElementR(\"button\", \"Submit|Send\")\n\n\u002F\u002F XPath\npage.MustElementX(\"\u002F\u002Fdiv[@class='content']\u002F\u002Fp\")\n\n\u002F\u002F Search across iframes and shadow DOM (like DevTools Ctrl+F)\npage.MustSearch(\".deeply-nested-element\")\n```\n\n### Auto-Wait\n\nRod automatically retries element queries until the element appears or the context times out. You do not need manual sleeps:\n\n```go\n\u002F\u002F This will automatically wait until the element exists\nel := page.MustElement(\"#dynamic-content\")\n\n\u002F\u002F Wait until the element is stable (position\u002Fsize not changing)\nel.MustWaitStable().MustClick()\n\n\u002F\u002F Wait until page has no pending network requests\nwait := page.MustWaitRequestIdle()\npage.MustElement(\"#search\").MustInput(\"query\")\nwait()\n```\n\n---\n\n## Stealth & Anti-Bot Detection (go-rod\u002Fstealth)\n\n> **IMPORTANT:** For any production scraping or automation against real websites, ALWAYS use `stealth.MustPage()` instead of `browser.MustPage()`. This is the single most important step for avoiding bot detection.\n\n### How Stealth Works\n\nThe `go-rod\u002Fstealth` package injects JavaScript evasions into every new page that:\n\n- **Remove `navigator.webdriver`** — the primary headless detection signal.\n- **Spoof WebGL vendor\u002Frenderer** — presents real GPU info (e.g., \"Intel Inc.\" \u002F \"Intel Iris OpenGL Engine\") instead of headless markers like \"Google SwiftShader\".\n- **Fix Chrome plugin array** — reports proper `PluginArray` type with realistic plugin count.\n- **Patch permissions API** — returns `\"prompt\"` instead of bot-revealing values.\n- **Set realistic languages** — reports `en-US,en` instead of empty arrays.\n- **Fix broken image dimensions** — headless browsers report 0x0; stealth fixes this to 16x16.\n\n### Usage\n\n**Creating a stealth page (recommended for all production use):**\n\n```go\nimport (\n    \"github.com\u002Fgo-rod\u002Frod\"\n    \"github.com\u002Fgo-rod\u002Fstealth\"\n)\n\nbrowser := rod.New().MustConnect()\ndefer browser.MustClose()\n\n\u002F\u002F Use stealth.MustPage instead of browser.MustPage\npage := stealth.MustPage(browser)\npage.MustNavigate(\"https:\u002F\u002Fbot.sannysoft.com\")\n```\n\n**With error handling:**\n\n```go\npage, err := stealth.Page(browser)\nif err != nil {\n    return fmt.Errorf(\"failed to create stealth page: %w\", err)\n}\npage.MustNavigate(\"https:\u002F\u002Fexample.com\")\n```\n\n**Using stealth.JS directly (advanced — for custom page creation):**\n\n```go\n\u002F\u002F If you need to create the page yourself (e.g., with specific options),\n\u002F\u002F inject stealth.JS manually via EvalOnNewDocument\npage := browser.MustPage()\npage.MustEvalOnNewDocument(stealth.JS)\npage.MustNavigate(\"https:\u002F\u002Fexample.com\")\n```\n\n### Verifying Stealth\n\nNavigate to a bot detection test page to verify evasions:\n\n```go\npage := stealth.MustPage(browser)\npage.MustNavigate(\"https:\u002F\u002Fbot.sannysoft.com\")\npage.MustScreenshot(\"stealth_test.png\")\n```\n\nExpected results for a properly stealth-configured browser:\n- **WebDriver**: `missing (passed)`\n- **Chrome**: `present (passed)`\n- **Plugins Length**: `3` (not `0`)\n- **Languages**: `en-US,en`\n\n---\n\n## Implementation Guidelines\n\n### 1. Launcher Configuration\n\nUse the `launcher` package to customize browser launch flags:\n\n```go\nimport \"github.com\u002Fgo-rod\u002Frod\u002Flib\u002Flauncher\"\n\nurl := launcher.New().\n    Headless(true).             \u002F\u002F false for debugging\n    Proxy(\"127.0.0.1:8080\").    \u002F\u002F upstream proxy\n    Set(\"disable-gpu\", \"\").     \u002F\u002F custom Chrome flag\n    Delete(\"use-mock-keychain\"). \u002F\u002F remove a default flag\n    MustLaunch()\n\nbrowser := rod.New().ControlURL(url).MustConnect()\ndefer browser.MustClose()\n```\n\n**Debugging mode (visible browser + slow motion):**\n\n```go\nl := launcher.New().\n    Headless(false).\n    Devtools(true)\ndefer l.Cleanup()\n\nbrowser := rod.New().\n    ControlURL(l.MustLaunch()).\n    Trace(true).\n    SlowMotion(2 * time.Second).\n    MustConnect()\n```\n\n### 2. Proxy Support\n\n```go\n\u002F\u002F Set proxy at launch\nurl := launcher.New().\n    Proxy(\"socks5:\u002F\u002F127.0.0.1:1080\").\n    MustLaunch()\n\nbrowser := rod.New().ControlURL(url).MustConnect()\n\n\u002F\u002F Handle proxy authentication\ngo browser.MustHandleAuth(\"username\", \"password\")()\n\n\u002F\u002F Ignore SSL certificate errors (for MITM proxies)\nbrowser.MustIgnoreCertErrors(true)\n```\n\n### 3. Input Simulation\n\n```go\nimport \"github.com\u002Fgo-rod\u002Frod\u002Flib\u002Finput\"\n\n\u002F\u002F Type into an input field (replaces existing value)\npage.MustElement(\"#email\").MustInput(\"user@example.com\")\n\n\u002F\u002F Simulate keyboard keys\npage.Keyboard.MustType(input.Enter)\n\n\u002F\u002F Press key combinations\npage.Keyboard.MustPress(input.ControlLeft)\npage.Keyboard.MustType(input.KeyA)\npage.Keyboard.MustRelease(input.ControlLeft)\n\n\u002F\u002F Mouse click at coordinates\npage.Mouse.MustClick(input.MouseLeft)\npage.Mouse.MustMoveTo(100, 200)\n```\n\n### 4. Network Request Interception (Hijacking)\n\n```go\nrouter := browser.HijackRequests()\ndefer router.MustStop()\n\n\u002F\u002F Block all image requests\nrouter.MustAdd(\"*.png\", func(ctx *rod.Hijack) {\n    ctx.Response.Fail(proto.NetworkErrorReasonBlockedByClient)\n})\n\n\u002F\u002F Modify request headers\nrouter.MustAdd(\"*api.example.com*\", func(ctx *rod.Hijack) {\n    ctx.Request.Req().Header.Set(\"Authorization\", \"Bearer token123\")\n    ctx.MustLoadResponse()\n})\n\n\u002F\u002F Modify response body\nrouter.MustAdd(\"*.js\", func(ctx *rod.Hijack) {\n    ctx.MustLoadResponse()\n    ctx.Response.SetBody(ctx.Response.Body() + \"\\n\u002F\u002F injected\")\n})\n\ngo router.Run()\n```\n\n### 5. Waiting Strategies\n\n```go\n\u002F\u002F Wait for page load event\npage.MustWaitLoad()\n\n\u002F\u002F Wait for no pending network requests (AJAX idle)\nwait := page.MustWaitRequestIdle()\npage.MustElement(\"#search\").MustInput(\"query\")\nwait()\n\n\u002F\u002F Wait for element to be stable (not animating)\npage.MustElement(\".modal\").MustWaitStable().MustClick()\n\n\u002F\u002F Wait for element to become invisible\npage.MustElement(\".loading\").MustWaitInvisible()\n\n\u002F\u002F Wait for JavaScript condition\npage.MustWait(`() => document.title === 'Ready'`)\n\n\u002F\u002F Wait for specific navigation\u002Fevent\nwait := page.WaitEvent(&proto.PageLoadEventFired{})\npage.MustNavigate(\"https:\u002F\u002Fexample.com\")\nwait()\n```\n\n### 6. Race Selectors (Multiple Outcomes)\n\nHandle pages where the result can be one of several outcomes (e.g., login success vs error):\n\n```go\npage.MustElement(\"#username\").MustInput(\"user\")\npage.MustElement(\"#password\").MustInput(\"pass\").MustType(input.Enter)\n\n\u002F\u002F Race between success and error selectors\nelm := page.Race().\n    Element(\".dashboard\").MustHandle(func(e *rod.Element) {\n        fmt.Println(\"Login successful:\", e.MustText())\n    }).\n    Element(\".error-message\").MustDo()\n\nif elm.MustMatches(\".error-message\") {\n    log.Fatal(\"Login failed:\", elm.MustText())\n}\n```\n\n### 7. Screenshots & PDF\n\n```go\n\u002F\u002F Full-page screenshot\npage.MustScreenshot(\"page.png\")\n\n\u002F\u002F Custom screenshot (JPEG, specific region)\nimg, _ := page.Screenshot(true, &proto.PageCaptureScreenshot{\n    Format:  proto.PageCaptureScreenshotFormatJpeg,\n    Quality: gson.Int(90),\n    Clip: &proto.PageViewport{\n        X: 0, Y: 0, Width: 1280, Height: 800, Scale: 1,\n    },\n})\nutils.OutputFile(\"screenshot.jpg\", img)\n\n\u002F\u002F Scroll screenshot (captures full scrollable page)\nimg, _ := page.MustWaitStable().ScrollScreenshot(nil)\nutils.OutputFile(\"full_page.jpg\", img)\n\n\u002F\u002F PDF export\npage.MustPDF(\"output.pdf\")\n```\n\n### 8. Concurrent Page Pool\n\n```go\npool := rod.NewPagePool(5) \u002F\u002F max 5 concurrent pages\n\ncreate := func() *rod.Page {\n    return browser.MustIncognito().MustPage()\n}\n\nvar wg sync.WaitGroup\nfor _, url := range urls {\n    wg.Add(1)\n    go func(u string) {\n        defer wg.Done()\n\n        page := pool.MustGet(create)\n        defer pool.Put(page)\n\n        page.MustNavigate(u).MustWaitLoad()\n        fmt.Println(page.MustInfo().Title)\n    }(url)\n}\nwg.Wait()\n\npool.Cleanup(func(p *rod.Page) { p.MustClose() })\n```\n\n### 9. Event Handling\n\n```go\n\u002F\u002F Listen for console.log output\ngo page.EachEvent(func(e *proto.RuntimeConsoleAPICalled) {\n    if e.Type == proto.RuntimeConsoleAPICalledTypeLog {\n        fmt.Println(page.MustObjectsToJSON(e.Args))\n    }\n})()\n\n\u002F\u002F Wait for a specific event before proceeding\nwait := page.WaitEvent(&proto.PageLoadEventFired{})\npage.MustNavigate(\"https:\u002F\u002Fexample.com\")\nwait()\n```\n\n### 10. File Download\n\n```go\nwait := browser.MustWaitDownload()\n\npage.MustElementR(\"a\", \"Download PDF\").MustClick()\n\ndata := wait()\nutils.OutputFile(\"downloaded.pdf\", data)\n```\n\n### 11. JavaScript Evaluation\n\n```go\n\u002F\u002F Execute JS on the page\npage.MustEval(`() => console.log(\"hello\")`)\n\n\u002F\u002F Pass parameters and get return value\nresult := page.MustEval(`(a, b) => a + b`, 1, 2)\nfmt.Println(result.Int()) \u002F\u002F 3\n\n\u002F\u002F Eval on a specific element (\"this\" = the DOM element)\ntitle := page.MustElement(\"title\").MustEval(`() => this.innerText`).String()\n\n\u002F\u002F Direct CDP calls for features Rod doesn't wrap\nproto.PageSetAdBlockingEnabled{Enabled: true}.Call(page)\n```\n\n### 12. Loading Chrome Extensions\n\n```go\nextPath, _ := filepath.Abs(\".\u002Fmy-extension\")\n\nu := launcher.New().\n    Set(\"load-extension\", extPath).\n    Headless(false). \u002F\u002F extensions require headed mode\n    MustLaunch()\n\nbrowser := rod.New().ControlURL(u).MustConnect()\n```\n\n---\n\n## Examples\n\nSee the `examples\u002F` directory for complete, runnable Go files:\n- `examples\u002Fbasic_scrape.go` — Minimal scraping example\n- `examples\u002Fstealth_page.go` — Anti-detection with go-rod\u002Fstealth\n- `examples\u002Frequest_hijacking.go` — Intercepting and modifying network requests\n- `examples\u002Fconcurrent_pages.go` — Page pool for concurrent scraping\n\n---\n\n## Best Practices\n\n- ✅ **ALWAYS use `stealth.MustPage(browser)`** instead of `browser.MustPage()` for real-world sites.\n- ✅ **ALWAYS `defer browser.MustClose()`** immediately after connecting.\n- ✅ Use the error-returning API (not `Must*`) in production code.\n- ✅ Set explicit timeouts with `.Timeout()` — never rely on defaults for production.\n- ✅ Use `browser.MustIncognito().MustPage()` for isolated sessions.\n- ✅ Use `PagePool` for concurrent scraping instead of spawning unlimited pages.\n- ✅ Use `MustWaitStable()` before clicking elements that might be animating.\n- ✅ Use `MustWaitRequestIdle()` after actions that trigger AJAX calls.\n- ✅ Use `launcher.New().Headless(false).Devtools(true)` for debugging.\n- ❌ **NEVER** use `time.Sleep()` for waiting — use Rod's built-in wait methods.\n- ❌ **NEVER** create a new `Browser` per task — create one Browser, use multiple `Page` instances.\n- ❌ **NEVER** use `browser.MustPage()` for production scraping — use `stealth.MustPage()`.\n- ❌ **NEVER** ignore errors in production — always handle them explicitly.\n- ❌ **NEVER** forget to defer-close browsers, pages, and hijack routers.\n\n## Common Pitfalls\n\n- **Problem:** Element not found even though it exists on the page.\n  **Solution:** The element may be inside an iframe or shadow DOM. Use `page.MustSearch()` instead of `page.MustElement()` — it searches across all iframes and shadow DOMs.\n\n- **Problem:** Click doesn't work because the element is animating.\n  **Solution:** Call `el.MustWaitStable()` before `el.MustClick()`.\n\n- **Problem:** Bot detection despite using stealth.\n  **Solution:** Combine `stealth.MustPage()` with: randomized viewport sizes, realistic User-Agent strings, human-like input delays between keystrokes, and random idle behaviors (scroll, hover).\n\n- **Problem:** Browser process leaks (zombie processes).\n  **Solution:** Always `defer browser.MustClose()`. Rod uses [leakless](https:\u002F\u002Fgithub.com\u002Fysmood\u002Fleakless) to kill zombies after main process crash, but explicit cleanup is preferred.\n\n- **Problem:** Timeout errors on slow pages.\n  **Solution:** Use chained context: `page.Timeout(30 * time.Second).MustWaitLoad()`. For AJAX-heavy pages, use `MustWaitRequestIdle()` instead of `MustWaitLoad()`.\n\n- **Problem:** HijackRequests router not intercepting requests.\n  **Solution:** You must call `go router.Run()` after setting up routes, and `defer router.MustStop()` for cleanup.\n\n## Limitations\n\n- **CAPTCHAs:** Rod does not include CAPTCHA solving. External services (2captcha, etc.) must be integrated separately.\n- **Extreme Anti-Bot:** While `go-rod\u002Fstealth` handles common detection (WebDriver, plugin fingerprints, WebGL), extremely strict systems (some Cloudflare configurations, Akamai Bot Manager) may still detect automation. Additional measures (residential proxies, human-like behavioral patterns) may be needed.\n- **DRM Content:** Cannot interact with DRM-protected media (e.g., Widevine).\n- **Resource Usage:** Each browser instance consumes significant RAM (~100-300MB+). Use `PagePool` and limit concurrency on memory-constrained systems.\n- **Extensions in Headless:** Chrome extensions do not work in headless mode. Use `Headless(false)` with XVFB for server environments.\n- **Platform:** Requires a Chromium-compatible browser. Does not support Firefox or Safari.\n\n## Documentation References\n\n- [Official Documentation](https:\u002F\u002Fgo-rod.github.io\u002F) — Guides, tutorials, FAQ\n- [Go API Reference](https:\u002F\u002Fpkg.go.dev\u002Fgithub.com\u002Fgo-rod\u002Frod) — Complete type and method documentation\n- [go-rod\u002Fstealth](https:\u002F\u002Fgithub.com\u002Fgo-rod\u002Fstealth) — Anti-bot detection plugin\n- [Examples (source)](https:\u002F\u002Fgithub.com\u002Fgo-rod\u002Frod\u002Fblob\u002Fmain\u002Fexamples_test.go) — Official example tests\n- [Rod vs Chromedp Comparison](https:\u002F\u002Fgithub.com\u002Fnichochar\u002Fgo-rod.github.io\u002Fblob\u002Fmain\u002Flib\u002Fexamples\u002Fcompare-chromedp) — Migration reference\n- [Chrome DevTools Protocol Docs](https:\u002F\u002Fchromedevtools.github.io\u002Fdevtools-protocol\u002F) — Underlying protocol reference\n- [Chrome CLI Flags Reference](https:\u002F\u002Fpeter.sh\u002Fexperiments\u002Fchromium-command-line-switches) — Launcher flag documentation\n- `references\u002Fapi-reference.md` — Quick-reference cheat sheet\n","# Go-Rod Browser Automation Master\n\n## Overview\n\n[Rod](https:\u002F\u002Fgithub.com\u002Fgo-rod\u002Frod) is a high-level Go driver built directly on the [Chrome DevTools Protocol](https:\u002F\u002Fchromedevtools.github.io\u002Fdevtools-protocol\u002F) for browser automation and web scraping. Unlike wrappers around other tools, Rod communicates with the browser natively via CDP, providing thread-safe operations, chained context design for timeouts\u002Fcancellation, auto-wait for elements, correct iframe\u002Fshadow DOM handling, and zero zombie browser processes.\n\nThe companion library [go-rod\u002Fstealth](https:\u002F\u002Fgithub.com\u002Fgo-rod\u002Fstealth) injects anti-bot-detection evasions based on [puppeteer-extra stealth](https:\u002F\u002Fgithub.com\u002Fnichochar\u002Fpuppeteer-extra\u002Ftree\u002Fmaster\u002Fpackages\u002Fextract-stealth-evasions), hiding headless browser fingerprints from detection systems.\n\n## When to Use This Skill\n\n- Use when the user asks to **scrape**, **automate**, or **test** a website using Go.\n- Use when the user needs a **headless browser** for dynamic\u002FSPA content (React, Vue, Angular).\n- Use when the user mentions **stealth**, **anti-bot**, **avoiding detection**, **Cloudflare**, or **bot detection bypass**.\n- Use when the user wants to work with the **Chrome DevTools Protocol (CDP)** directly from Go.\n- Use when the user needs to **intercept** or **hijack** network requests in a browser context.\n- Use when the user asks about **concurrent browser scraping** or **page pooling** in Go.\n- Use when the user is migrating from **chromedp** or **Playwright Go** and wants a simpler API.\n\n## Safety & Risk\n\n**Risk Level: ? Safe**\n\n- **Read-Only by Default:** Default behavior is navigating and reading page content (scraping\u002Ftesting).\n- **Isolated Contexts:** Browser contexts are sandboxed; cookies and storage do not persist unless explicitly saved.\n- **Resource Cleanup:** Designed around Go's `defer` pattern — browsers and pages close automatically.\n- **No External Mutations:** Does not modify external state unless the script explicitly submits forms or POSTs data.\n\n## Installation\n\n```bash\n# Core rod library\ngo get github.com\u002Fgo-rod\u002Frod@latest\n\n# Stealth anti-detection plugin (ALWAYS include for production scraping)\ngo get github.com\u002Fgo-rod\u002Fstealth@latest\n```\n\nRod auto-downloads a compatible Chromium binary on first run. To pre-download:\n\n```bash\ngo run github.com\u002Fnichochar\u002Fgo-rod.github.io\u002Fcmd\u002Flauncher@latest\n```\n\n## Core Concepts\n\n### Browser Lifecycle\n\nRod manages three layers: **Browser → Page → Element**.\n\n```go\n\u002F\u002F Launch and connect to a browser\nbrowser := rod.New().MustConnect()\ndefer browser.MustClose()\n\n\u002F\u002F Create a page (tab)\npage := browser.MustPage(\"https:\u002F\u002Fexample.com\")\n\n\u002F\u002F Find an element\nel := page.MustElement(\"h1\")\nfmt.Println(el.MustText())\n```\n\n### Must vs Error Patterns\n\nRod provides two API styles for every operation:\n\n| Style | Method | Use Case |\n|:------|:-------|:---------|\n| **Must** | `MustElement()`, `MustClick()`, `MustText()` | Scripting, debugging, prototyping. Panics on error. |\n| **Error** | `Element()`, `Click()`, `Text()` | Production code. Returns `error` for explicit handling. |\n\n**Production pattern:**\n\n```go\nel, err := page.Element(\"#login-btn\")\nif err != nil {\n    return fmt.Errorf(\"login button not found: %w\", err)\n}\nif err := el.Click(proto.InputMouseButtonLeft, 1); err != nil {\n    return fmt.Errorf(\"click failed: %w\", err)\n}\n```\n\n**Scripting pattern with Try:**\n\n```go\nerr := rod.Try(func() {\n    page.MustElement(\"#login-btn\").MustClick()\n})\nif errors.Is(err, context.DeadlineExceeded) {\n    log.Println(\"timeout finding login button\")\n}\n```\n\n### Context & Timeout\n\nRod uses Go's `context.Context` for cancellation and timeouts. Context propagates recursively to all child operations.\n\n```go\n\u002F\u002F Set a 5-second timeout for the entire operation chain\npage.Timeout(5 * time.Second).\n    MustWaitLoad().\n    MustElement(\"title\").\n    CancelTimeout(). \u002F\u002F subsequent calls are not bound by the 5s timeout\n    Timeout(30 * time.Second).\n    MustText()\n```\n\n### Element Selectors\n\nRod supports multiple selector strategies:\n\n```go\n\u002F\u002F CSS selector (most common)\npage.MustElement(\"div.content > p.intro\")\n\n\u002F\u002F CSS selector with text regex matching\npage.MustElementR(\"button\", \"Submit|Send\")\n\n\u002F\u002F XPath\npage.MustElementX(\"\u002F\u002Fdiv[@class='content']\u002F\u002Fp\")\n\n\u002F\u002F Search across iframes and shadow DOM (like DevTools Ctrl+F)\npage.MustSearch(\".deeply-nested-element\")\n```\n\n### Auto-Wait\n\nRod automatically retries element queries until the element appears or the context times out. You do not need manual sleeps:\n\n```go\n\u002F\u002F This will automatically wait until the element exists\nel := page.MustElement(\"#dynamic-content\")\n\n\u002F\u002F Wait until the element is stable (position\u002Fsize not changing)\nel.MustWaitStable().MustClick()\n\n\u002F\u002F Wait until page has no pending network requests\nwait := page.MustWaitRequestIdle()\npage.MustElement(\"#search\").MustInput(\"query\")\nwait()\n```\n\n---\n\n## Stealth & Anti-Bot Detection (go-rod\u002Fstealth)\n\n> **IMPORTANT:** For any production scraping or automation against real websites, ALWAYS use `stealth.MustPage()` instead of `browser.MustPage()`. This is the single most important step for avoiding bot detection.\n\n### How Stealth Works\n\nThe `go-rod\u002Fstealth` package injects JavaScript evasions into every new page that:\n\n- **Remove `navigator.webdriver`** — the primary headless detection signal.\n- **Spoof WebGL vendor\u002Frenderer** — presents real GPU info (e.g., \"Intel Inc.\" \u002F \"Intel Iris OpenGL Engine\") instead of headless markers like \"Google SwiftShader\".\n- **Fix Chrome plugin array** — reports proper `PluginArray` type with realistic plugin count.\n- **Patch permissions API** — returns `\"prompt\"` instead of bot-revealing values.\n- **Set realistic languages** — reports `en-US,en` instead of empty arrays.\n- **Fix broken image dimensions** — headless browsers report 0x0; stealth fixes this to 16x16.\n\n### Usage\n\n**Creating a stealth page (recommended for all production use):**\n\n```go\nimport (\n    \"github.com\u002Fgo-rod\u002Frod\"\n    \"github.com\u002Fgo-rod\u002Fstealth\"\n)\n\nbrowser := rod.New().MustConnect()\ndefer browser.MustClose()\n\n\u002F\u002F Use stealth.MustPage instead of browser.MustPage\npage := stealth.MustPage(browser)\npage.MustNavigate(\"https:\u002F\u002Fbot.sannysoft.com\")\n```\n\n**With error handling:**\n\n```go\npage, err := stealth.Page(browser)\nif err != nil {\n    return fmt.Errorf(\"failed to create stealth page: %w\", err)\n}\npage.MustNavigate(\"https:\u002F\u002Fexample.com\")\n```\n\n**Using stealth.JS directly (advanced — for custom page creation):**\n\n```go\n\u002F\u002F If you need to create the page yourself (e.g., with specific options),\n\u002F\u002F inject stealth.JS manually via EvalOnNewDocument\npage := browser.MustPage()\npage.MustEvalOnNewDocument(stealth.JS)\npage.MustNavigate(\"https:\u002F\u002Fexample.com\")\n```\n\n### Verifying Stealth\n\nNavigate to a bot detection test page to verify evasions:\n\n```go\npage := stealth.MustPage(browser)\npage.MustNavigate(\"https:\u002F\u002Fbot.sannysoft.com\")\npage.MustScreenshot(\"stealth_test.png\")\n```\n\nExpected results for a properly stealth-configured browser:\n- **WebDriver**: `missing (passed)`\n- **Chrome**: `present (passed)`\n- **Plugins Length**: `3` (not `0`)\n- **Languages**: `en-US,en`\n\n---\n\n## Implementation Guidelines\n\n### 1. Launcher Configuration\n\nUse the `launcher` package to customize browser launch flags:\n\n```go\nimport \"github.com\u002Fgo-rod\u002Frod\u002Flib\u002Flauncher\"\n\nurl := launcher.New().\n    Headless(true).             \u002F\u002F false for debugging\n    Proxy(\"127.0.0.1:8080\").    \u002F\u002F upstream proxy\n    Set(\"disable-gpu\", \"\").     \u002F\u002F custom Chrome flag\n    Delete(\"use-mock-keychain\"). \u002F\u002F remove a default flag\n    MustLaunch()\n\nbrowser := rod.New().ControlURL(url).MustConnect()\ndefer browser.MustClose()\n```\n\n**Debugging mode (visible browser + slow motion):**\n\n```go\nl := launcher.New().\n    Headless(false).\n    Devtools(true)\ndefer l.Cleanup()\n\nbrowser := rod.New().\n    ControlURL(l.MustLaunch()).\n    Trace(true).\n    SlowMotion(2 * time.Second).\n    MustConnect()\n```\n\n### 2. Proxy Support\n\n```go\n\u002F\u002F Set proxy at launch\nurl := launcher.New().\n    Proxy(\"socks5:\u002F\u002F127.0.0.1:1080\").\n    MustLaunch()\n\nbrowser := rod.New().ControlURL(url).MustConnect()\n\n\u002F\u002F Handle proxy authentication\ngo browser.MustHandleAuth(\"username\", \"password\")()\n\n\u002F\u002F Ignore SSL certificate errors (for MITM proxies)\nbrowser.MustIgnoreCertErrors(true)\n```\n\n### 3. Input Simulation\n\n```go\nimport \"github.com\u002Fgo-rod\u002Frod\u002Flib\u002Finput\"\n\n\u002F\u002F Type into an input field (replaces existing value)\npage.MustElement(\"#email\").MustInput(\"user@example.com\")\n\n\u002F\u002F Simulate keyboard keys\npage.Keyboard.MustType(input.Enter)\n\n\u002F\u002F Press key combinations\npage.Keyboard.MustPress(input.ControlLeft)\npage.Keyboard.MustType(input.KeyA)\npage.Keyboard.MustRelease(input.ControlLeft)\n\n\u002F\u002F Mouse click at coordinates\npage.Mouse.MustClick(input.MouseLeft)\npage.Mouse.MustMoveTo(100, 200)\n```\n\n### 4. Network Request Interception (Hijacking)\n\n```go\nrouter := browser.HijackRequests()\ndefer router.MustStop()\n\n\u002F\u002F Block all image requests\nrouter.MustAdd(\"*.png\", func(ctx *rod.Hijack) {\n    ctx.Response.Fail(proto.NetworkErrorReasonBlockedByClient)\n})\n\n\u002F\u002F Modify request headers\nrouter.MustAdd(\"*api.example.com*\", func(ctx *rod.Hijack) {\n    ctx.Request.Req().Header.Set(\"Authorization\", \"Bearer token123\")\n    ctx.MustLoadResponse()\n})\n\n\u002F\u002F Modify response body\nrouter.MustAdd(\"*.js\", func(ctx *rod.Hijack) {\n    ctx.MustLoadResponse()\n    ctx.Response.SetBody(ctx.Response.Body() + \"\\n\u002F\u002F injected\")\n})\n\ngo router.Run()\n```\n\n### 5. Waiting Strategies\n\n```go\n\u002F\u002F Wait for page load event\npage.MustWaitLoad()\n\n\u002F\u002F Wait for no pending network requests (AJAX idle)\nwait := page.MustWaitRequestIdle()\npage.MustElement(\"#search\").MustInput(\"query\")\nwait()\n\n\u002F\u002F Wait for element to be stable (not animating)\npage.MustElement(\".modal\").MustWaitStable().MustClick()\n\n\u002F\u002F Wait for element to become invisible\npage.MustElement(\".loading\").MustWaitInvisible()\n\n\u002F\u002F Wait for JavaScript condition\npage.MustWait(`() => document.title === 'Ready'`)\n\n\u002F\u002F Wait for specific navigation\u002Fevent\nwait := page.WaitEvent(&proto.PageLoadEventFired{})\npage.MustNavigate(\"https:\u002F\u002Fexample.com\")\nwait()\n```\n\n### 6. Race Selectors (Multiple Outcomes)\n\nHandle pages where the result can be one of several outcomes (e.g., login success vs error):\n\n```go\npage.MustElement(\"#username\").MustInput(\"user\")\npage.MustElement(\"#password\").MustInput(\"pass\").MustType(input.Enter)\n\n\u002F\u002F Race between success and error selectors\nelm := page.Race().\n    Element(\".dashboard\").MustHandle(func(e *rod.Element) {\n        fmt.Println(\"Login successful:\", e.MustText())\n    }).\n    Element(\".error-message\").MustDo()\n\nif elm.MustMatches(\".error-message\") {\n    log.Fatal(\"Login failed:\", elm.MustText())\n}\n```\n\n### 7. Screenshots & PDF\n\n```go\n\u002F\u002F Full-page screenshot\npage.MustScreenshot(\"page.png\")\n\n\u002F\u002F Custom screenshot (JPEG, specific region)\nimg, _ := page.Screenshot(true, &proto.PageCaptureScreenshot{\n    Format:  proto.PageCaptureScreenshotFormatJpeg,\n    Quality: gson.Int(90),\n    Clip: &proto.PageViewport{\n        X: 0, Y: 0, Width: 1280, Height: 800, Scale: 1,\n    },\n})\nutils.OutputFile(\"screenshot.jpg\", img)\n\n\u002F\u002F Scroll screenshot (captures full scrollable page)\nimg, _ := page.MustWaitStable().ScrollScreenshot(nil)\nutils.OutputFile(\"full_page.jpg\", img)\n\n\u002F\u002F PDF export\npage.MustPDF(\"output.pdf\")\n```\n\n### 8. Concurrent Page Pool\n\n```go\npool := rod.NewPagePool(5) \u002F\u002F max 5 concurrent pages\n\ncreate := func() *rod.Page {\n    return browser.MustIncognito().MustPage()\n}\n\nvar wg sync.WaitGroup\nfor _, url := range urls {\n    wg.Add(1)\n    go func(u string) {\n        defer wg.Done()\n\n        page := pool.MustGet(create)\n        defer pool.Put(page)\n\n        page.MustNavigate(u).MustWaitLoad()\n        fmt.Println(page.MustInfo().Title)\n    }(url)\n}\nwg.Wait()\n\npool.Cleanup(func(p *rod.Page) { p.MustClose() })\n```\n\n### 9. Event Handling\n\n```go\n\u002F\u002F Listen for console.log output\ngo page.EachEvent(func(e *proto.RuntimeConsoleAPICalled) {\n    if e.Type == proto.RuntimeConsoleAPICalledTypeLog {\n        fmt.Println(page.MustObjectsToJSON(e.Args))\n    }\n})()\n\n\u002F\u002F Wait for a specific event before proceeding\nwait := page.WaitEvent(&proto.PageLoadEventFired{})\npage.MustNavigate(\"https:\u002F\u002Fexample.com\")\nwait()\n```\n\n### 10. File Download\n\n```go\nwait := browser.MustWaitDownload()\n\npage.MustElementR(\"a\", \"Download PDF\").MustClick()\n\ndata := wait()\nutils.OutputFile(\"downloaded.pdf\", data)\n```\n\n### 11. JavaScript Evaluation\n\n```go\n\u002F\u002F Execute JS on the page\npage.MustEval(`() => console.log(\"hello\")`)\n\n\u002F\u002F Pass parameters and get return value\nresult := page.MustEval(`(a, b) => a + b`, 1, 2)\nfmt.Println(result.Int()) \u002F\u002F 3\n\n\u002F\u002F Eval on a specific element (\"this\" = the DOM element)\ntitle := page.MustElement(\"title\").MustEval(`() => this.innerText`).String()\n\n\u002F\u002F Direct CDP calls for features Rod doesn't wrap\nproto.PageSetAdBlockingEnabled{Enabled: true}.Call(page)\n```\n\n### 12. Loading Chrome Extensions\n\n```go\nextPath, _ := filepath.Abs(\".\u002Fmy-extension\")\n\nu := launcher.New().\n    Set(\"load-extension\", extPath).\n    Headless(false). \u002F\u002F extensions require headed mode\n    MustLaunch()\n\nbrowser := rod.New().ControlURL(u).MustConnect()\n```\n\n---\n\n## Examples\n\nSee the `examples\u002F` directory for complete, runnable Go files:\n- `examples\u002Fbasic_scrape.go` — Minimal scraping example\n- `examples\u002Fstealth_page.go` — Anti-detection with go-rod\u002Fstealth\n- `examples\u002Frequest_hijacking.go` — Intercepting and modifying network requests\n- `examples\u002Fconcurrent_pages.go` — Page pool for concurrent scraping\n\n---\n\n## Best Practices\n\n- ✅ **ALWAYS use `stealth.MustPage(browser)`** instead of `browser.MustPage()` for real-world sites.\n- ✅ **ALWAYS `defer browser.MustClose()`** immediately after connecting.\n- ✅ Use the error-returning API (not `Must*`) in production code.\n- ✅ Set explicit timeouts with `.Timeout()` — never rely on defaults for production.\n- ✅ Use `browser.MustIncognito().MustPage()` for isolated sessions.\n- ✅ Use `PagePool` for concurrent scraping instead of spawning unlimited pages.\n- ✅ Use `MustWaitStable()` before clicking elements that might be animating.\n- ✅ Use `MustWaitRequestIdle()` after actions that trigger AJAX calls.\n- ✅ Use `launcher.New().Headless(false).Devtools(true)` for debugging.\n- ❌ **NEVER** use `time.Sleep()` for waiting — use Rod's built-in wait methods.\n- ❌ **NEVER** create a new `Browser` per task — create one Browser, use multiple `Page` instances.\n- ❌ **NEVER** use `browser.MustPage()` for production scraping — use `stealth.MustPage()`.\n- ❌ **NEVER** ignore errors in production — always handle them explicitly.\n- ❌ **NEVER** forget to defer-close browsers, pages, and hijack routers.\n\n## Common Pitfalls\n\n- **Problem:** Element not found even though it exists on the page.\n  **Solution:** The element may be inside an iframe or shadow DOM. Use `page.MustSearch()` instead of `page.MustElement()` — it searches across all iframes and shadow DOMs.\n\n- **Problem:** Click doesn't work because the element is animating.\n  **Solution:** Call `el.MustWaitStable()` before `el.MustClick()`.\n\n- **Problem:** Bot detection despite using stealth.\n  **Solution:** Combine `stealth.MustPage()` with: randomized viewport sizes, realistic User-Agent strings, human-like input delays between keystrokes, and random idle behaviors (scroll, hover).\n\n- **Problem:** Browser process leaks (zombie processes).\n  **Solution:** Always `defer browser.MustClose()`. Rod uses [leakless](https:\u002F\u002Fgithub.com\u002Fysmood\u002Fleakless) to kill zombies after main process crash, but explicit cleanup is preferred.\n\n- **Problem:** Timeout errors on slow pages.\n  **Solution:** Use chained context: `page.Timeout(30 * time.Second).MustWaitLoad()`. For AJAX-heavy pages, use `MustWaitRequestIdle()` instead of `MustWaitLoad()`.\n\n- **Problem:** HijackRequests router not intercepting requests.\n  **Solution:** You must call `go router.Run()` after setting up routes, and `defer router.MustStop()` for cleanup.\n\n## Limitations\n\n- **CAPTCHAs:** Rod does not include CAPTCHA solving. External services (2captcha, etc.) must be integrated separately.\n- **Extreme Anti-Bot:** While `go-rod\u002Fstealth` handles common detection (WebDriver, plugin fingerprints, WebGL), extremely strict systems (some Cloudflare configurations, Akamai Bot Manager) may still detect automation. Additional measures (residential proxies, human-like behavioral patterns) may be needed.\n- **DRM Content:** Cannot interact with DRM-protected media (e.g., Widevine).\n- **Resource Usage:** Each browser instance consumes significant RAM (~100-300MB+). Use `PagePool` and limit concurrency on memory-constrained systems.\n- **Extensions in Headless:** Chrome extensions do not work in headless mode. Use `Headless(false)` with XVFB for server environments.\n- **Platform:** Requires a Chromium-compatible browser. Does not support Firefox or Safari.\n\n## Documentation References\n\n- [Official Documentation](https:\u002F\u002Fgo-rod.github.io\u002F) — Guides, tutorials, FAQ\n- [Go API Reference](https:\u002F\u002Fpkg.go.dev\u002Fgithub.com\u002Fgo-rod\u002Frod) — Complete type and method documentation\n- [go-rod\u002Fstealth](https:\u002F\u002Fgithub.com\u002Fgo-rod\u002Fstealth) — Anti-bot detection plugin\n- [Examples (source)](https:\u002F\u002Fgithub.com\u002Fgo-rod\u002Frod\u002Fblob\u002Fmain\u002Fexamples_test.go) — Official example tests\n- [Rod vs Chromedp Comparison](https:\u002F\u002Fgithub.com\u002Fnichochar\u002Fgo-rod.github.io\u002Fblob\u002Fmain\u002Flib\u002Fexamples\u002Fcompare-chromedp) — Migration reference\n- [Chrome DevTools Protocol Docs](https:\u002F\u002Fchromedevtools.github.io\u002Fdevtools-protocol\u002F) — Underlying protocol reference\n- [Chrome CLI Flags Reference](https:\u002F\u002Fpeter.sh\u002Fexperiments\u002Fchromium-command-line-switches) — Launcher flag documentation\n- `references\u002Fapi-reference.md` — Quick-reference cheat sheet\n",{"name":5,"risk":42,"source":49,"date_added":50,"description":7},"https:\u002F\u002Fgithub.com\u002Fgo-rod\u002Frod","2026-02-27","main","a50a3aa6b39fb0e1b7db88bef1bfc9c93606e126","modules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fgo-rod-master",0,"https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant","https:\u002F\u002Fgithub.com\u002FSam-06060","Mobile Application Developer | Kotlin | Flutter, KMP, Swfit, Android,Swift UI | Building at Saar It Resources | Creator of Jarvis (AI Assistant)","2026-06-23 05:13:38",{"source":8,"skillName":5,"commands":60,"prompt":70,"zipAvailable":71},[61,64,67],{"tool":62,"command":63},"npx","npx skills add Sam-06060\u002Fjarvis-assistant --skill go-rod-master",{"tool":65,"command":66},"bunx","bunx skills add Sam-06060\u002Fjarvis-assistant --skill go-rod-master",{"tool":68,"command":69},"pnpm","pnpm dlx skills add Sam-06060\u002Fjarvis-assistant --skill go-rod-master","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fmodules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fgo-rod-master\u002FSKILL.md",true,[73,79,83,87,91],{"path":74,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":77,"sourceHtmlUrl":78},"examples\u002Fbasic_scrape.go","SCRIPT","脚本",1288,"https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fmodules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fgo-rod-master\u002Fexamples\u002Fbasic_scrape.go",{"path":80,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":81,"sourceHtmlUrl":82},"examples\u002Fconcurrent_pages.go",1806,"https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fmodules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fgo-rod-master\u002Fexamples\u002Fconcurrent_pages.go",{"path":84,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":85,"sourceHtmlUrl":86},"examples\u002Frequest_hijacking.go",2436,"https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fmodules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fgo-rod-master\u002Fexamples\u002Frequest_hijacking.go",{"path":88,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":89,"sourceHtmlUrl":90},"examples\u002Fstealth_page.go",2861,"https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fmodules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fgo-rod-master\u002Fexamples\u002Fstealth_page.go",{"path":92,"resourceType":93,"resourceTypeDesc":94,"sizeBytes":95,"sourceHtmlUrl":96},"references\u002Fapi-reference.md","REFERENCE","参考文档",6279,"https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fmodules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fgo-rod-master\u002Freferences\u002Fapi-reference.md",[98,109,125,149,168,194],{"skillNo":99,"name":100,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":101,"categories":102,"keywords":106,"publishedAt":44},"01M6GDRVS6FXX3ESH0C9DW01C0","test_skill","https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fscratch\u002Ftest_skill\u002FSKILL.md",[103],{"categoryNo":104,"categoryName":105,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量",[107,108],"Test Skill","test",{"skillNo":110,"name":111,"nameZh":6,"description":112,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":113,"categories":114,"keywords":115,"publishedAt":44},"01M6GDRQ40HX22MA6XWC31RHHK","zustand-store-ts","Create Zustand stores following established patterns with proper TypeScript types and middleware.","https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fmodules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fzustand-store-ts\u002FSKILL.md",[],[116,117,118,119,120,121,28,122,123,124],"zustand store ts","zustand","store","with","types","middleware","community","create","typescript",{"skillNo":126,"name":127,"nameZh":6,"description":128,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":129,"categories":130,"keywords":132,"publishedAt":44},"01M6GDRKEA0WE670SPFWX5GKCN","zoom-automation","Automate Zoom meeting creation, management, recordings, webinars, and participant tracking via Rube MCP (Composio). Always search tools first for current schemas.","https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fmodules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fzoom-automation\u002FSKILL.md",[131],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[40,133,134,135,136,137,138,139,140,141,142,143,144,145,122,146,147,148],"zoom automation","zoom","first","Tools","search","MCP","via","meeting","automate","critical","creation","webinars","composio","recordings","management","tracking",{"skillNo":150,"name":151,"nameZh":6,"description":152,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":153,"categories":154,"keywords":156,"publishedAt":44},"01M6GDRFS1452PC71JQ38S24HR","zoho-crm-automation","Automate Zoho CRM tasks via Rube MCP (Composio): create\u002Fupdate records, search contacts, manage leads, and convert leads. Always search tools first for current schemas.","https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fmodules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fzoho-crm-automation\u002FSKILL.md",[155],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[157,40,158,159,160,161,162,122,137,163,145,164,142,141,136,165,123,166,138,167],"crm automation","zoho crm","crm","zoho crm automation","zoho","leads","contacts","records","update","tasks","manage",{"skillNo":169,"name":170,"nameZh":6,"description":171,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":172,"categories":173,"keywords":177,"publishedAt":44},"01M6GDRCKQBAVTGHX5XBH26KPZ","zod-validation-expert","Expert in Zod — TypeScript-first schema validation. Covers parsing, custom errors, refinements, type inference, and integration with React Hook Form, Next.js, and tRPC.","https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fmodules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fzod-validation-expert\u002FSKILL.md",[174],{"categoryNo":175,"categoryName":176,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000009","前端开发",[178,179,180,181,182,124,42,183,184,185,186,187,119,188,189,190,191,122,192,193],"expert","zod","zod validation expert","validation","react","parsing","errors","schema validation","react hook form","hook","trpc","form","type","next","schema","Next.js",{"skillNo":195,"name":196,"nameZh":6,"description":197,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":198,"categories":199,"keywords":201,"publishedAt":44},"01M6GDR658B08K4MY0RWD4A6EH","zeroize-audit","Detects missing zeroization of sensitive data in source code and identifies zeroization removed by compiler optimizations, with assembly-level analysis, and control-flow verification. Use for auditing C\u002FC++\u002FRust code handling secrets, keys, passwords, or other sensitive data.","https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fmodules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fzeroize-audit\u002FSKILL.md",[200],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[202,203,204,205,206,207,208,209,122,210,211,212,213,214,215,216,217,218,219,138],"zeroize audit","audit","write","passwords","get","project","c++","activate","assembly","read","Bash","secrets","analysis","data","flow","verification","code","rust"]