[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71BDBGCCM9JCNSMP0BDMP2T":3,"skill-same:01M71BDBGCCM9JCNSMP0BDMP2T":59},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":32,"linkOnly":33,"markdownContent":34,"markdownBody":35,"frontMatter":36,"refName":37,"commitSha":38,"skillDirectory":39,"forksCount":40,"repositoryHtmlUrl":41,"repositoryHomepageUrl":42,"ownerHtmlUrl":43,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":44,"install":45,"resources":58},"01M71BDBGCCM9JCNSMP0BDMP2T","scrape-cloudflare-site",null,"Fetch web pages (e.g. novel chapters) that return a Cloudflare \"Just a moment\" page to curl or headless Chrome.","agentforce314\u002Fclawcodex","agentforce314","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F273884145?v=4","01M71BD6XFN30RH9ZYF9RZARGV","01M71BD6Y206V5GKMW18YF52SX",927,"MIT","https:\u002F\u002Fgithub.com\u002Fagentforce314\u002Fclawcodex\u002Fblob\u002Fmain\u002Fdocs\u002Fexamples\u002Fskills\u002Fscrape-cloudflare-site\u002FSKILL.md",[],[18,19,20,21,22,23,24,25,26,27,28,29,30,31],"scrape cloudflare site","cloudflare","site","scrape","fetch","novel","curl","web","headless","headless chrome","just","page","pages","chrome","2026-11-10 10:12:30",false,"---\nname: scrape-cloudflare-site\ndescription: Fetch web pages (e.g. novel chapters) that return a Cloudflare \"Just a moment\" page to curl or headless Chrome.\n---\n\n# Scraping pages behind Cloudflare\n\nDo NOT try direct curl or headless Chrome first; both get the challenge page and waste turns.\n\n1. Fetch through the reader proxy: `curl -s \"https:\u002F\u002Fr.jina.ai\u002F\u003Cfull original URL>\"`. The real text follows a `Markdown Content:` marker.\n2. Write ONE Python script that loops over all pages and saves each to disk, rather than one tool call per page. Skip files already saved so reruns resume.\n3. Sleep ~1s between requests. A ~240-byte body or `RateLimitTriggeredError` means HTTP 429: wait 10-30s and retry.\n4. Multi-page chapters may continue at `\u003Cname>_2.html`; fetch and join them.\n5. After the loop, print count and byte size per file; re-fetch any that are tiny.\n6. If the proxy returns a 403 `AbuseAlleviationError` saying \"blocked until \u003Ctime>\", STOP. Do not poll or loop; every retry extends the block. Tell the user the time and finish.\n","# Scraping pages behind Cloudflare\n\nDo NOT try direct curl or headless Chrome first; both get the challenge page and waste turns.\n\n1. Fetch through the reader proxy: `curl -s \"https:\u002F\u002Fr.jina.ai\u002F\u003Cfull original URL>\"`. The real text follows a `Markdown Content:` marker.\n2. Write ONE Python script that loops over all pages and saves each to disk, rather than one tool call per page. Skip files already saved so reruns resume.\n3. Sleep ~1s between requests. A ~240-byte body or `RateLimitTriggeredError` means HTTP 429: wait 10-30s and retry.\n4. Multi-page chapters may continue at `\u003Cname>_2.html`; fetch and join them.\n5. After the loop, print count and byte size per file; re-fetch any that are tiny.\n6. If the proxy returns a 403 `AbuseAlleviationError` saying \"blocked until \u003Ctime>\", STOP. Do not poll or loop; every retry extends the block. Tell the user the time and finish.\n",{"name":5,"description":7},"main","cd3108710319b9e68d55b6213a77123ef53bde61","docs\u002Fexamples\u002Fskills\u002Fscrape-cloudflare-site",166,"https:\u002F\u002Fgithub.com\u002Fagentforce314\u002Fclawcodex","https:\u002F\u002Fclawcodex.app","https:\u002F\u002Fgithub.com\u002Fagentforce314","2026-11-08 17:09:56",{"source":8,"skillName":5,"commands":46,"prompt":56,"zipAvailable":57},[47,50,53],{"tool":48,"command":49},"npx","npx skills add agentforce314\u002Fclawcodex --skill scrape-cloudflare-site",{"tool":51,"command":52},"bunx","bunx skills add agentforce314\u002Fclawcodex --skill scrape-cloudflare-site",{"tool":54,"command":55},"pnpm","pnpm dlx skills add agentforce314\u002Fclawcodex --skill scrape-cloudflare-site","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fagentforce314\u002Fclawcodex\u002Fblob\u002Fmain\u002Fdocs\u002Fexamples\u002Fskills\u002Fscrape-cloudflare-site\u002FSKILL.md",true,[],[60,78,98,115],{"skillNo":61,"name":62,"nameZh":6,"description":63,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":64,"categories":65,"keywords":71,"publishedAt":32},"01M71BDGWAAJBEQMK7ZRC4K3WW","lint-py","Run lints on Python files.","https:\u002F\u002Fgithub.com\u002Fagentforce314\u002Fclawcodex\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fskills\u002Flint-py\u002FSKILL.md",[66],{"categoryNo":67,"categoryName":68,"taxonomyType":69,"taxonomyTypeDesc":70},"01JBSEEDCAT000000000000007","代码审查","SCENARIO","使用场景",[72,73,74,75,76,77],"lint py","lint","run","python","Bash","files",{"skillNo":79,"name":80,"nameZh":6,"description":81,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":82,"categories":83,"keywords":87,"publishedAt":32},"01M71BDF39FM007N3977FX9Y2V","add-component","Scaffold a new React component.","https:\u002F\u002Fgithub.com\u002Fagentforce314\u002Fclawcodex\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fskills\u002Ffrontend\u002Fadd-component\u002FSKILL.md",[84],{"categoryNo":85,"categoryName":86,"taxonomyType":69,"taxonomyTypeDesc":70},"01JBSEEDCAT000000000000009","前端开发",[88,89,90,91,92,93,94,95,96,97],"add component","component","add","react","scaffold","user","when","new","name","react component",{"skillNo":99,"name":100,"nameZh":6,"description":101,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":102,"categories":103,"keywords":104,"publishedAt":32},"01M71BDDFEA4V0KJQ2SDHAVQ7S","commit-helper","Generate a conventional-commit message from staged changes.","https:\u002F\u002Fgithub.com\u002Fagentforce314\u002Fclawcodex\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fskills\u002Fcommit-helper\u002FSKILL.md",[],[105,106,107,76,108,109,110,111,112,113,114],"commit","helper","commit helper","commit message","staged","read","scope","generate","message","changes",{"skillNo":116,"name":117,"nameZh":6,"description":118,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":119,"categories":120,"keywords":121,"publishedAt":32},"01M71BD9M8SMXJGTDCC9X6VMEB","epub-ebooklib","Build an EPUB with Python ebooklib without producing empty chapters; use whenever creating .epub files.","https:\u002F\u002Fgithub.com\u002Fagentforce314\u002Fclawcodex\u002Fblob\u002Fmain\u002Fdocs\u002Fexamples\u002Fskills\u002Fepub-ebooklib\u002FSKILL.md",[],[122,123,124,125,77,75,126,127],"epub ebooklib","epub","empty","use","build","with"]