[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6G87GSZ8JFCKD8KF16GPC5Y":3,"skill-same:01M6G87GSZ8JFCKD8KF16GPC5Y":87},{"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":28,"publishedAt":49,"linkOnly":50,"markdownContent":51,"markdownBody":52,"frontMatter":53,"refName":65,"commitSha":66,"skillDirectory":67,"forksCount":68,"repositoryHtmlUrl":69,"repositoryHomepageUrl":6,"ownerHtmlUrl":70,"ownerBlogUrl":6,"ownerDescription":71,"updatedAt":72,"install":73,"resources":86},"01M6G87GSZ8JFCKD8KF16GPC5Y","har-derived-api-client",null,"Record a site's XHR into a HAR, derive an HTTP client.","zapabob\u002FSkills","zapabob","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F130830376?v=4","01M6DBMYZAGRTFQDSQYW3W764P","峯岸 亮","01M6DBMZ3GKDSJ01NZ9XTZD7JD",2,"MIT","https:\u002F\u002Fgithub.com\u002Fzapabob\u002FSkills\u002Fblob\u002Fmain\u002Farchive\u002Fskill-md-reviewed\u002Fsha256\u002F62\u002F62b411a3c5ba57488bc75ed891bc315aa13abfd35bd30ef1285df12996546708\u002FSKILL.md",[18,23],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000010","后端与接口","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":26,"taxonomyTypeDesc":27},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48],"api","har derived api client","client","api client","windows","http","development","browser","engineering","reverse-engineering","macos","web","site","hermes","hermes agent","web-development","record","playwright","http client","linux","2026-11-10 10:12:30",false,"---\nname: har-derived-api-client\ndescription: Record a site's XHR into a HAR, derive an HTTP client.\nversion: 0.1.0\nauthor: Hermes Agent\nlicense: MIT\nplatforms: [linux, macos, windows]\nmetadata:\n  hermes:\n    tags: [Browser, HAR, API, Reverse-Engineering, Playwright]\n    category: web-development\n---\n\n# HAR-Derived API Client\n\nDrive a website once with a real browser while recording its network traffic\nto a HAR file, then distill that HAR into the site's private JSON API so you\ncan call it directly with plain HTTP — far cheaper and faster than\nbrowser-controlling the page on every request. Credit: trick by Jared Longster,\npopularized by Dax (thdxr). This captures and replays; it does NOT bypass\nauth, solve CAPTCHAs, or defeat bot-detection — if the site needs a logged-in\nsession, you carry its headers\u002Fcookies forward, you don't forge them.\n\nThe scripts are stdlib-plus-Playwright: capture needs Playwright, derivation\nis pure stdlib, replay needs only `requests`\u002F`httpx` (or `curl`).\n\nCovers **every Hermes browser pathway**: the default local `browser_navigate`\nbackend, plus the cloud\u002Fremote backends (Browserbase, Browser-Use, Firecrawl)\nand any `\u002Fbrowser connect` CDP endpoint. There are two capture scripts — one\nfor a browser you launch, one for a browser you attach to over CDP — because\nHAR recording works differently in each case (see How to Run).\n\n## When to Use\n\n- \"Build a CLI\u002Fclient for \u003Cwebsite>\" — derive its API instead of scripting clicks.\n- \"This site has no public API but the page clearly fetches JSON.\"\n- You're about to loop `browser_navigate` for the same query repeatedly — stop and derive the endpoint once.\n- Reverse-engineering an autocomplete, search, feed, or checkout XHR.\n- You captured a session on a cloud backend (Browserbase \u002F Browser-Use \u002F Firecrawl) or via `\u002Fbrowser connect` and want the API without re-renting the browser.\n\n## Prerequisites\n\n- Playwright + a browser binary (capture step only):\n  - `pip install playwright` then `playwright install chromium`\n  - (If a system Playwright already has browsers under `~\u002F.cache\u002Fms-playwright`, reuse it.)\n- `requests` or `httpx` for the replay step (stdlib `urllib` also works).\n- No API keys. Any keys\u002Ftokens the client needs are the ones the HAR captured.\n- For the CDP path (`har_capture_cdp.py`): a reachable CDP endpoint. On Hermes,\n  run `\u002Fbrowser connect` to print the active endpoint, or read `BROWSER_CDP_URL`\n  \u002F `browser.cdp_url` in config. Cloud backends expose it as `cdpUrl`\u002F`connectUrl`.\n\n## How to Run\n\nScripts under this skill's `scripts\u002F`, invoked through the `terminal` tool.\n**Pick the capturer by pathway** — this is the part that trips people up:\n\n| Browser pathway | How Hermes reaches it | Capturer |\n|---|---|---|\n| Local `browser_navigate` (default, agent-browser\u002FPlaywright) | launched locally | `har_capture.py` |\n| Camofox (`CAMOFOX_URL` set) | local REST\u002FCDP | `har_capture_cdp.py` if it exposes CDP, else drive it yourself |\n| Browserbase \u002F Browser-Use \u002F Firecrawl (cloud) | **CDP** (`cdpUrl`) | `har_capture_cdp.py` |\n| `\u002Fbrowser connect \u003Curl>` \u002F `BROWSER_CDP_URL` | **CDP** | `har_capture_cdp.py` |\n\nRule of thumb: **if Hermes *launched* the browser, use `har_capture.py`; if it\n*connected to* one over CDP, use `har_capture_cdp.py`.** `har_capture.py` uses\nPlaywright's `record_har_path`, which only works on a locally-owned context.\n`har_capture_cdp.py` attaches with `connect_over_cdp()` and assembles the HAR\nfrom `page.on(\"request\"\u002F\"response\")` events, because `record_har_path` is\nunavailable on a connected browser.\n\nThen, for either path:\n\n- `har_to_client.py` — filters the HAR to XHR\u002Ffetch\u002FJSON, groups by endpoint, and prints params, headers, bodies, and replay hints (User-Agent \u002F cookie \u002F auth).\n\nResolve paths against this skill's directory. Canonical loop:\n\n```bash\n# 1a. Capture, LOCAL browser (Hermes launched it)\npython3 scripts\u002Fhar_capture.py \"https:\u002F\u002FSITE\u002F\" out.har \\\n  --action \"fill:input[name=search]:my query\" --action \"sleep:3\" --wait 2\n\n# 1b. Capture, CDP browser (cloud backend or \u002Fbrowser connect)\n#     get the endpoint from \u002Fbrowser connect or BROWSER_CDP_URL\npython3 scripts\u002Fhar_capture_cdp.py \"ws:\u002F\u002FHOST\u002Fdevtools\u002Fbrowser\u002F...\" out.har \\\n  --goto \"https:\u002F\u002FSITE\u002F\" --action \"fill:input[name=search]:my query\" \\\n  --action \"sleep:3\" --wait 2\n\n# 2. Derive — read the endpoints out of the HAR\npython3 scripts\u002Fhar_to_client.py out.har --host SITE --max-body 400\n\n# 3. Replay — write a tiny client from the printed endpoint (see Procedure)\n```\n\n## Quick Reference\n\n```\nhar_capture.py \u003Curl> \u003Cout.har> [--wait S] [--headed] [--action SPEC ...]\n  action SPEC:  fill:SELECTOR:TEXT | press:SELECTOR:KEY | click:SELECTOR\n                goto:URL | sleep:SECONDS      (run in order after page load)\n  use when Hermes LAUNCHED the browser (local browser_navigate default)\n\nhar_capture_cdp.py \u003Ccdp_url> \u003Cout.har> [--goto URL] [--wait S] [--action SPEC ...]\n  same action SPEC; attaches to an existing CDP browser and does NOT close it\n  use for cloud backends (Browserbase\u002FBrowser-Use\u002FFirecrawl) & \u002Fbrowser connect\n\nhar_to_client.py \u003Cin.har> [--host SUBSTR] [--include-static] [--max-body N]\n  default: keeps only XHR\u002Ffetch\u002FJSON; --host narrows to one domain\n  prints per endpoint: query params, non-boring req headers, req body sample,\n                       response status\u002Fcontent-type + body sample\n  prints \"### Replay hints\": the browser User-Agent, cookie\u002Fauth presence\n```\n\n## Procedure\n\n0. **Pick the capturer by pathway** (see How to Run table). Launched-locally → `har_capture.py`; reached over CDP → `har_capture_cdp.py`. On Hermes, `\u002Fbrowser connect` tells you the CDP endpoint when a cloud\u002Fremote backend is active.\n1. **Find the interaction.** Open the site with `browser_navigate` (or `--headed` capture) to see which selector to type into \u002F click, and confirm a JSON XHR fires in devtools\u002Fnetwork.\n2. **Capture the HAR** via the `terminal` tool. Order `--action` to reach the request: `fill` the box, then `sleep` long enough for the debounced XHR, and always leave `--wait` at the end so late responses flush. Both capturers embed response bodies, so the derived client sees real payload shapes.\n3. **Derive** with `har_to_client.py --host \u003Cdomain>`. Read off: the method, the URL\u002Fpath template (numeric\u002FUUID segments collapse to `{id}`), query params, request-body JSON, and the `### Replay hints` block.\n4. **Write the client.** Recreate the request exactly — same method, path, query params, body. Send the headers the site actually needs: at minimum copy the **User-Agent** from the replay hints. If hints report cookies or an auth\u002Ftoken header, resend those too.\n5. **Test browserless.** Run the client with the `terminal` tool and confirm it returns the same data the browser saw. This is the payoff: no browser in the loop.\n6. **(Optional) Wrap as a CLI** — a small `argparse` script over the derived call, e.g. `search.py \"frank herbert\"`.\n\nWorked example (Wikipedia search-title, derived + replayed live):\n\n```python\nimport requests\nr = requests.get(\n    \"https:\u002F\u002Fen.wikipedia.org\u002Fw\u002Frest.php\u002Fv1\u002Fsearch\u002Ftitle\",\n    params={\"q\": \"frank herbert\", \"limit\": 5},\n    headers={\"accept\": \"application\u002Fjson\",\n             \"User-Agent\": \"Mozilla\u002F5.0 ... Chrome\u002F131 Safari\u002F537.36\"},  # from HAR\n    timeout=15,\n)\nfor p in r.json()[\"pages\"]:\n    print(p[\"title\"], \"-\", p.get(\"description\"))\n```\n\n## Pitfalls\n\n- **Default library User-Agent gets 403.** Many sites (Wikipedia, Cloudflare-fronted APIs) reject `python-requests\u002Fx.y`. Always send the browser UA from the replay hints. This is the #1 reason a derived client fails when the browser succeeded.\n- **A failed `--action` aborts before the HAR flushes** — you get no file. If capture errors on a selector, the run produced nothing; fix the selector (use `--headed` to watch) and rerun. Don't debug a missing HAR.\n- **Server-rendered pages have no XHR** to derive — `har_to_client.py` prints \"No API-looking entries\". The data came in the HTML; scrape it or find the interaction that does fetch JSON.\n- **Debounced\u002Ftypeahead XHRs need a real pause.** Add `--action \"sleep:3\"` after `fill`; typing alone won't have fired the request when the HAR closes.\n- **Auth\u002Fsession endpoints** need the captured `Cookie`\u002F`Authorization` header, and those expire. The derived client is only as durable as the credential; re-capture when it 401s. HARs contain live secrets — treat `out.har` as sensitive and delete it after deriving.\n- **`record_har_content=\"embed\"` makes big HARs.** Use `--max-body` to cap what's printed; the file itself can be large for media-heavy pages.\n- **Endpoints shift.** Sites change private APIs without notice. Re-run the capture→derive loop when a client breaks rather than patching URLs by hand.\n- **Wrong capturer = empty\u002Fno HAR.** `har_capture.py` on a cloud\u002FCDP backend records nothing (it launches its own local browser instead of the one you meant). `har_capture_cdp.py` needs the endpoint; on Hermes get it from `\u002Fbrowser connect` or `BROWSER_CDP_URL`. Match the capturer to the pathway (How to Run table).\n- **Headless-Chrome UA is a weak tell.** Local\u002Fagent-browser capture yields a `HeadlessChrome\u002F...` User-Agent; some sites sniff the \"Headless\" token. Cloud backends (Browserbase\u002FBrowser-Use) send a real desktop-Chrome UA, so a client derived from a cloud capture replays more reliably. If a headless-derived client 403s where the browser didn't, swap the \"Headless\" UA for a normal Chrome UA string before assuming the endpoint changed.\n- **CDP capture doesn't close the browser.** `har_capture_cdp.py` attaches to a browser it doesn't own and leaves it running — correct for cloud\u002Fremote sessions Hermes manages. Don't add a close; let the owning backend tear it down.\n\n## Verification\n\nEnd-to-end proof against a live site with no API key:\n\n```bash\npython3 scripts\u002Fhar_capture.py \"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FMain_Page\" \u002Ftmp\u002Fwiki.har \\\n  --action \"fill:input[name=search]:dune messiah\" --action \"sleep:3\" --wait 2\npython3 scripts\u002Fhar_to_client.py \u002Ftmp\u002Fwiki.har --host wikipedia.org --max-body 200\n```\n\nExpect the derivation to print `GET https:\u002F\u002Fen.wikipedia.org\u002Fw\u002Frest.php\u002Fv1\u002Fsearch\u002Ftitle`\nwith `q` and `limit` params and a JSON `pages` response — then replay it with the\nProcedure snippet and confirm matching titles come back over plain HTTP.\n","# HAR-Derived API Client\n\nDrive a website once with a real browser while recording its network traffic\nto a HAR file, then distill that HAR into the site's private JSON API so you\ncan call it directly with plain HTTP — far cheaper and faster than\nbrowser-controlling the page on every request. Credit: trick by Jared Longster,\npopularized by Dax (thdxr). This captures and replays; it does NOT bypass\nauth, solve CAPTCHAs, or defeat bot-detection — if the site needs a logged-in\nsession, you carry its headers\u002Fcookies forward, you don't forge them.\n\nThe scripts are stdlib-plus-Playwright: capture needs Playwright, derivation\nis pure stdlib, replay needs only `requests`\u002F`httpx` (or `curl`).\n\nCovers **every Hermes browser pathway**: the default local `browser_navigate`\nbackend, plus the cloud\u002Fremote backends (Browserbase, Browser-Use, Firecrawl)\nand any `\u002Fbrowser connect` CDP endpoint. There are two capture scripts — one\nfor a browser you launch, one for a browser you attach to over CDP — because\nHAR recording works differently in each case (see How to Run).\n\n## When to Use\n\n- \"Build a CLI\u002Fclient for \u003Cwebsite>\" — derive its API instead of scripting clicks.\n- \"This site has no public API but the page clearly fetches JSON.\"\n- You're about to loop `browser_navigate` for the same query repeatedly — stop and derive the endpoint once.\n- Reverse-engineering an autocomplete, search, feed, or checkout XHR.\n- You captured a session on a cloud backend (Browserbase \u002F Browser-Use \u002F Firecrawl) or via `\u002Fbrowser connect` and want the API without re-renting the browser.\n\n## Prerequisites\n\n- Playwright + a browser binary (capture step only):\n  - `pip install playwright` then `playwright install chromium`\n  - (If a system Playwright already has browsers under `~\u002F.cache\u002Fms-playwright`, reuse it.)\n- `requests` or `httpx` for the replay step (stdlib `urllib` also works).\n- No API keys. Any keys\u002Ftokens the client needs are the ones the HAR captured.\n- For the CDP path (`har_capture_cdp.py`): a reachable CDP endpoint. On Hermes,\n  run `\u002Fbrowser connect` to print the active endpoint, or read `BROWSER_CDP_URL`\n  \u002F `browser.cdp_url` in config. Cloud backends expose it as `cdpUrl`\u002F`connectUrl`.\n\n## How to Run\n\nScripts under this skill's `scripts\u002F`, invoked through the `terminal` tool.\n**Pick the capturer by pathway** — this is the part that trips people up:\n\n| Browser pathway | How Hermes reaches it | Capturer |\n|---|---|---|\n| Local `browser_navigate` (default, agent-browser\u002FPlaywright) | launched locally | `har_capture.py` |\n| Camofox (`CAMOFOX_URL` set) | local REST\u002FCDP | `har_capture_cdp.py` if it exposes CDP, else drive it yourself |\n| Browserbase \u002F Browser-Use \u002F Firecrawl (cloud) | **CDP** (`cdpUrl`) | `har_capture_cdp.py` |\n| `\u002Fbrowser connect \u003Curl>` \u002F `BROWSER_CDP_URL` | **CDP** | `har_capture_cdp.py` |\n\nRule of thumb: **if Hermes *launched* the browser, use `har_capture.py`; if it\n*connected to* one over CDP, use `har_capture_cdp.py`.** `har_capture.py` uses\nPlaywright's `record_har_path`, which only works on a locally-owned context.\n`har_capture_cdp.py` attaches with `connect_over_cdp()` and assembles the HAR\nfrom `page.on(\"request\"\u002F\"response\")` events, because `record_har_path` is\nunavailable on a connected browser.\n\nThen, for either path:\n\n- `har_to_client.py` — filters the HAR to XHR\u002Ffetch\u002FJSON, groups by endpoint, and prints params, headers, bodies, and replay hints (User-Agent \u002F cookie \u002F auth).\n\nResolve paths against this skill's directory. Canonical loop:\n\n```bash\n# 1a. Capture, LOCAL browser (Hermes launched it)\npython3 scripts\u002Fhar_capture.py \"https:\u002F\u002FSITE\u002F\" out.har \\\n  --action \"fill:input[name=search]:my query\" --action \"sleep:3\" --wait 2\n\n# 1b. Capture, CDP browser (cloud backend or \u002Fbrowser connect)\n#     get the endpoint from \u002Fbrowser connect or BROWSER_CDP_URL\npython3 scripts\u002Fhar_capture_cdp.py \"ws:\u002F\u002FHOST\u002Fdevtools\u002Fbrowser\u002F...\" out.har \\\n  --goto \"https:\u002F\u002FSITE\u002F\" --action \"fill:input[name=search]:my query\" \\\n  --action \"sleep:3\" --wait 2\n\n# 2. Derive — read the endpoints out of the HAR\npython3 scripts\u002Fhar_to_client.py out.har --host SITE --max-body 400\n\n# 3. Replay — write a tiny client from the printed endpoint (see Procedure)\n```\n\n## Quick Reference\n\n```\nhar_capture.py \u003Curl> \u003Cout.har> [--wait S] [--headed] [--action SPEC ...]\n  action SPEC:  fill:SELECTOR:TEXT | press:SELECTOR:KEY | click:SELECTOR\n                goto:URL | sleep:SECONDS      (run in order after page load)\n  use when Hermes LAUNCHED the browser (local browser_navigate default)\n\nhar_capture_cdp.py \u003Ccdp_url> \u003Cout.har> [--goto URL] [--wait S] [--action SPEC ...]\n  same action SPEC; attaches to an existing CDP browser and does NOT close it\n  use for cloud backends (Browserbase\u002FBrowser-Use\u002FFirecrawl) & \u002Fbrowser connect\n\nhar_to_client.py \u003Cin.har> [--host SUBSTR] [--include-static] [--max-body N]\n  default: keeps only XHR\u002Ffetch\u002FJSON; --host narrows to one domain\n  prints per endpoint: query params, non-boring req headers, req body sample,\n                       response status\u002Fcontent-type + body sample\n  prints \"### Replay hints\": the browser User-Agent, cookie\u002Fauth presence\n```\n\n## Procedure\n\n0. **Pick the capturer by pathway** (see How to Run table). Launched-locally → `har_capture.py`; reached over CDP → `har_capture_cdp.py`. On Hermes, `\u002Fbrowser connect` tells you the CDP endpoint when a cloud\u002Fremote backend is active.\n1. **Find the interaction.** Open the site with `browser_navigate` (or `--headed` capture) to see which selector to type into \u002F click, and confirm a JSON XHR fires in devtools\u002Fnetwork.\n2. **Capture the HAR** via the `terminal` tool. Order `--action` to reach the request: `fill` the box, then `sleep` long enough for the debounced XHR, and always leave `--wait` at the end so late responses flush. Both capturers embed response bodies, so the derived client sees real payload shapes.\n3. **Derive** with `har_to_client.py --host \u003Cdomain>`. Read off: the method, the URL\u002Fpath template (numeric\u002FUUID segments collapse to `{id}`), query params, request-body JSON, and the `### Replay hints` block.\n4. **Write the client.** Recreate the request exactly — same method, path, query params, body. Send the headers the site actually needs: at minimum copy the **User-Agent** from the replay hints. If hints report cookies or an auth\u002Ftoken header, resend those too.\n5. **Test browserless.** Run the client with the `terminal` tool and confirm it returns the same data the browser saw. This is the payoff: no browser in the loop.\n6. **(Optional) Wrap as a CLI** — a small `argparse` script over the derived call, e.g. `search.py \"frank herbert\"`.\n\nWorked example (Wikipedia search-title, derived + replayed live):\n\n```python\nimport requests\nr = requests.get(\n    \"https:\u002F\u002Fen.wikipedia.org\u002Fw\u002Frest.php\u002Fv1\u002Fsearch\u002Ftitle\",\n    params={\"q\": \"frank herbert\", \"limit\": 5},\n    headers={\"accept\": \"application\u002Fjson\",\n             \"User-Agent\": \"Mozilla\u002F5.0 ... Chrome\u002F131 Safari\u002F537.36\"},  # from HAR\n    timeout=15,\n)\nfor p in r.json()[\"pages\"]:\n    print(p[\"title\"], \"-\", p.get(\"description\"))\n```\n\n## Pitfalls\n\n- **Default library User-Agent gets 403.** Many sites (Wikipedia, Cloudflare-fronted APIs) reject `python-requests\u002Fx.y`. Always send the browser UA from the replay hints. This is the #1 reason a derived client fails when the browser succeeded.\n- **A failed `--action` aborts before the HAR flushes** — you get no file. If capture errors on a selector, the run produced nothing; fix the selector (use `--headed` to watch) and rerun. Don't debug a missing HAR.\n- **Server-rendered pages have no XHR** to derive — `har_to_client.py` prints \"No API-looking entries\". The data came in the HTML; scrape it or find the interaction that does fetch JSON.\n- **Debounced\u002Ftypeahead XHRs need a real pause.** Add `--action \"sleep:3\"` after `fill`; typing alone won't have fired the request when the HAR closes.\n- **Auth\u002Fsession endpoints** need the captured `Cookie`\u002F`Authorization` header, and those expire. The derived client is only as durable as the credential; re-capture when it 401s. HARs contain live secrets — treat `out.har` as sensitive and delete it after deriving.\n- **`record_har_content=\"embed\"` makes big HARs.** Use `--max-body` to cap what's printed; the file itself can be large for media-heavy pages.\n- **Endpoints shift.** Sites change private APIs without notice. Re-run the capture→derive loop when a client breaks rather than patching URLs by hand.\n- **Wrong capturer = empty\u002Fno HAR.** `har_capture.py` on a cloud\u002FCDP backend records nothing (it launches its own local browser instead of the one you meant). `har_capture_cdp.py` needs the endpoint; on Hermes get it from `\u002Fbrowser connect` or `BROWSER_CDP_URL`. Match the capturer to the pathway (How to Run table).\n- **Headless-Chrome UA is a weak tell.** Local\u002Fagent-browser capture yields a `HeadlessChrome\u002F...` User-Agent; some sites sniff the \"Headless\" token. Cloud backends (Browserbase\u002FBrowser-Use) send a real desktop-Chrome UA, so a client derived from a cloud capture replays more reliably. If a headless-derived client 403s where the browser didn't, swap the \"Headless\" UA for a normal Chrome UA string before assuming the endpoint changed.\n- **CDP capture doesn't close the browser.** `har_capture_cdp.py` attaches to a browser it doesn't own and leaves it running — correct for cloud\u002Fremote sessions Hermes manages. Don't add a close; let the owning backend tear it down.\n\n## Verification\n\nEnd-to-end proof against a live site with no API key:\n\n```bash\npython3 scripts\u002Fhar_capture.py \"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FMain_Page\" \u002Ftmp\u002Fwiki.har \\\n  --action \"fill:input[name=search]:dune messiah\" --action \"sleep:3\" --wait 2\npython3 scripts\u002Fhar_to_client.py \u002Ftmp\u002Fwiki.har --host wikipedia.org --max-body 200\n```\n\nExpect the derivation to print `GET https:\u002F\u002Fen.wikipedia.org\u002Fw\u002Frest.php\u002Fv1\u002Fsearch\u002Ftitle`\nwith `q` and `limit` params and a JSON `pages` response — then replay it with the\nProcedure snippet and confirm matching titles come back over plain HTTP.\n",{"name":5,"author":54,"license":15,"version":55,"metadata":56,"platforms":64,"description":7},"Hermes Agent","0.1.0",{"hermes":57},{"tags":58,"category":44},[59,60,61,62,63],"Browser","HAR","API","Reverse-Engineering","Playwright",[48,39,33],"main","0d1434f89f4bc6b07e9d272accd8c1013768820f","archive\u002Fskill-md-reviewed\u002Fsha256\u002F62\u002F62b411a3c5ba57488bc75ed891bc315aa13abfd35bd30ef1285df12996546708",0,"https:\u002F\u002Fgithub.com\u002Fzapabob\u002FSkills","https:\u002F\u002Fgithub.com\u002Fzapabob","The Open University of JAPAN　2019-now\r\n\r\nTokyo University of Science　2007-2010","2026-10-26 16:29:01",{"source":8,"skillName":5,"commands":74,"prompt":84,"zipAvailable":85},[75,78,81],{"tool":76,"command":77},"npx","npx skills add zapabob\u002FSkills --skill har-derived-api-client",{"tool":79,"command":80},"bunx","bunx skills add zapabob\u002FSkills --skill har-derived-api-client",{"tool":82,"command":83},"pnpm","pnpm dlx skills add zapabob\u002FSkills --skill har-derived-api-client","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fzapabob\u002FSkills\u002Fblob\u002Fmain\u002Farchive\u002Fskill-md-reviewed\u002Fsha256\u002F62\u002F62b411a3c5ba57488bc75ed891bc315aa13abfd35bd30ef1285df12996546708\u002FSKILL.md",true,[],[88,112,146,173,200,216],{"skillNo":89,"name":90,"nameZh":6,"description":91,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":92,"categories":93,"keywords":99,"publishedAt":49},"01M6GJTE1GESGGF9K028Y7753E","xurl","X\u002FTwitter via xurl CLI: post, search, DM, media, v2 API.","https:\u002F\u002Fgithub.com\u002Fzapabob\u002FSkills\u002Fblob\u002Fmain\u002Fregistry\u002Fskills\u002Fxurl\u002Fvariants\u002Fhermes-agent\u002FSKILL.md",[94,95,98],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":96,"categoryName":97,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":24,"categoryName":25,"taxonomyType":26,"taxonomyTypeDesc":27},[90,100,39,101,102,48,33,103,104,105,106,29,107,42,43,108,65,109,110,111],"openclaw","cli","github","official","search","https","social-media","Media","twitter","social","via","post",{"skillNo":113,"name":114,"nameZh":6,"description":115,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":116,"categories":117,"keywords":129,"publishedAt":49},"01M6GJT8S1PXQ8WPXT1HSNBWH2","writing-plans","Write implementation plans: bite-sized tasks, paths, code.","https:\u002F\u002Fgithub.com\u002Fzapabob\u002FSkills\u002Fblob\u002Fmain\u002Fregistry\u002Fskills\u002Fwriting-plans\u002Fvariants\u002Fhermes-agent\u002FSKILL.md",[118,121,124,125,126],{"categoryNo":119,"categoryName":120,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000015","视觉设计",{"categoryNo":122,"categoryName":123,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000018","写作与文案",{"categoryNo":96,"categoryName":97,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":24,"categoryName":25,"taxonomyType":26,"taxonomyTypeDesc":27},{"categoryNo":127,"categoryName":128,"taxonomyType":26,"taxonomyTypeDesc":27},"01JBSEEDCAT000000000000036","内容创作者",[130,131,132,133,39,134,48,135,33,136,137,35,138,139,140,141,142,143,144,145],"writing","writing plans","plans","design","review","workflow","documentation","tasks","code","planning","code-review","subagent","write","superpowers","paths","test-driven-development",{"skillNo":147,"name":148,"nameZh":6,"description":149,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":150,"categories":151,"keywords":155,"publishedAt":49},"01M6GJST0H5X7WHBJ3BZK0DVKH","whisper","OpenAI's general-purpose speech recognition model. Supports 99 languages, transcription, translation to English, and language identification. Six model sizes from tiny (39M params) to large (1550M params). Use for speech-to-text, podcast transcription, or multilingual audio processing. Best for robust, multilingual ASR.","https:\u002F\u002Fgithub.com\u002Fzapabob\u002FSkills\u002Fblob\u002Fmain\u002Fregistry\u002Fskills\u002Fwhisper\u002Fvariants\u002Fhermes-agent-optional\u002FSKILL.md",[152],{"categoryNo":153,"categoryName":154,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000016","图像与多媒体",[148,39,48,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172],"openai","speech","multimodal","Transformers","ASR","Audio","text","model","speech recognition","use","general","multilingual","translation","english","identification","processing","Audio Processing",{"skillNo":174,"name":175,"nameZh":6,"description":176,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":177,"categories":178,"keywords":182,"publishedAt":49},"01M6GJSMRQ8EETZTYMG72P70EA","weights-and-biases","W&B: log ML experiments, sweeps, model registry, dashboards.","https:\u002F\u002Fgithub.com\u002Fzapabob\u002FSkills\u002Fblob\u002Fmain\u002Fregistry\u002Fskills\u002Fweights-and-biases\u002Fvariants\u002Fhermes-agent\u002FSKILL.md",[179],{"categoryNo":180,"categoryName":181,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000013","分析与可视化",[183,39,184,185,33,186,187,188,189,190,191,163,192,193,194,195,196,197,198,199],"weights and biases","tensorflow","experiments","pytorch","visualization","registry","real-time","tuning","dashboards","experiment","log","time","Experiment Tracking","Model Registry","Hyperparameter Tuning","WandB","Real-Time Visualization",{"skillNo":201,"name":202,"nameZh":6,"description":203,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":204,"categories":205,"keywords":207,"publishedAt":49},"01M6GJS19KDPRY112JTR326S06","watchers","Poll RSS, JSON APIs, and GitHub with watermark dedup.","https:\u002F\u002Fgithub.com\u002Fzapabob\u002FSkills\u002Fblob\u002Fmain\u002Fregistry\u002Fskills\u002Fwatchers\u002Fvariants\u002Fhermes-agent-optional\u002FSKILL.md",[206],{"categoryNo":96,"categoryName":97,"taxonomyType":21,"taxonomyTypeDesc":22},[202,39,208,102,48,209,34,210,211,212,213,42,43,214,215],"terminal","automation","monitoring","cron","json","rss","devops","with",{"skillNo":217,"name":218,"nameZh":6,"description":219,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":220,"categories":221,"keywords":224,"publishedAt":49},"01M6GJRHJD2A6Q830SWF9W48BC","serving-llms-vllm","vLLM: high-throughput LLM serving, OpenAI API, quantization.","https:\u002F\u002Fgithub.com\u002Fzapabob\u002FSkills\u002Fblob\u002Fmain\u002Fregistry\u002Fskills\u002Fvllm\u002Fvariants\u002Fhermes-agent\u002FSKILL.md",[222,223],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":24,"categoryName":25,"taxonomyType":26,"taxonomyTypeDesc":27},[225,226,227,48,228,156,229,230,231,159,232,29,233,234,235,236,237,238,239,240],"llms","vLLM","serving llms vllm","research","openai api","tensor","Inference Serving","Production","llm serving","High Throughput","PagedAttention","Continuous Batching","Quantization","Tensor Parallelism","high-throughput","throughput"]