[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6DS1BFCWCMCC6VA27X89THP":3,"skill-same:01M6DS1BFCWCMCC6VA27X89THP":80},{"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":27,"publishedAt":42,"linkOnly":43,"markdownContent":44,"markdownBody":45,"frontMatter":46,"refName":47,"commitSha":48,"skillDirectory":49,"forksCount":50,"repositoryHtmlUrl":51,"repositoryHomepageUrl":6,"ownerHtmlUrl":52,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":53,"install":54,"resources":67},"01M6DS1BFCWCMCC6VA27X89THP","gtm-blog-scraper",null,"Scrape blog posts via RSS feeds (free, no API key) with Apify fallback for JS-heavy sites. Use when you need to monitor competitor blogs, track industry content, or aggregate blog posts by keyword.","AntifragileTech\u002Fantifragile-claude-code","AntifragileTech","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F174357194?v=4","01M6DQCYMK4CDSQQAN0ZC72NTV","01M6DQCYS9YPW1WKMQ5TJMPQ43",9,"MIT","https:\u002F\u002Fgithub.com\u002FAntifragileTech\u002Fantifragile-claude-code\u002Fblob\u002Fmaster\u002Fassets\u002Fskills\u002Fgtm\u002Fgtm-blog-scraper\u002FSKILL.md",[17,22],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000018","写作与文案","SCENARIO","使用场景",{"categoryNo":23,"categoryName":24,"taxonomyType":25,"taxonomyTypeDesc":26},"01JBSEEDCAT000000000000036","内容创作者","PROFESSION","适用职业",[28,29,30,31,32,33,34,35,36,37,38,39,40,41],"blog","gtm","gtm blog scraper","monitor","content","feeds","api","scrape","js","rss","use","fallback","free","sites","2026-11-10 10:12:30",false,"---\nname: gtm-blog-scraper\ndescription: >\n  Scrape blog posts via RSS feeds (free, no API key) with Apify fallback for\n  JS-heavy sites. Use when you need to monitor competitor blogs, track industry\n  content, or aggregate blog posts by keyword.\n---\n\n# Blog Scraper\n\nScrape blog posts via RSS\u002FAtom feeds (free) with optional Apify fallback for JS-heavy sites.\n\n## Quick Start\n\nFor RSS mode (free), only dependency is `pip install requests`. No API key needed.\n\n```bash\n# Scrape a blog's RSS feed\npython3 skills\u002Fblog-scraper\u002Fscripts\u002Fscrape_blogs.py \\\n  --urls \"https:\u002F\u002Fgrowthx.ai\u002Fblog\" --days 30\n\n# Multiple blogs with keyword filter\npython3 skills\u002Fblog-scraper\u002Fscripts\u002Fscrape_blogs.py \\\n  --urls \"https:\u002F\u002Fblog1.com,https:\u002F\u002Fblog2.com\" --keywords \"AI,marketing\" --output summary\n\n# Force Apify for JS-heavy sites\npython3 skills\u002Fblog-scraper\u002Fscripts\u002Fscrape_blogs.py \\\n  --urls \"https:\u002F\u002Fexample.com\" --mode apify\n```\n\n## How It Works\n\n### Auto Mode (default)\n1. For each URL, tries to discover an RSS\u002FAtom feed:\n   - Checks HTML `\u003Clink rel=\"alternate\">` tags\n   - Probes common paths: `\u002Ffeed`, `\u002Frss`, `\u002Fatom.xml`, `\u002Ffeed.xml`, `\u002Frss.xml`, `\u002Fblog\u002Ffeed`, `\u002Findex.xml`\n2. Parses discovered feeds (supports RSS 2.0 and Atom)\n3. If any URLs fail, falls back to Apify `jupri\u002Frss-xml-scraper` (if token available)\n4. Applies date and keyword filtering client-side\n\n### RSS Mode\nOnly tries RSS feeds, no Apify fallback.\n\n### Apify Mode\nUses Apify actor directly, skipping RSS discovery.\n\n## CLI Reference\n\n| Flag | Default | Description |\n|------|---------|-------------|\n| `--urls` | *required* | Blog URL(s), comma-separated |\n| `--keywords` | none | Keywords to filter (comma-separated, OR logic) |\n| `--days` | 30 | Only include posts from last N days |\n| `--max-posts` | 50 | Max posts to return |\n| `--mode` | auto | `auto` (RSS + fallback), `rss` (RSS only), `apify` (Apify only) |\n| `--output` | json | Output format: `json` or `summary` |\n| `--token` | env var | Apify token (only needed for Apify mode\u002Ffallback) |\n| `--timeout` | 300 | Max seconds for Apify run |\n\n## Cost\n\n- **RSS mode:** Free (no API, no tokens)\n- **Apify mode:** Uses `jupri\u002Frss-xml-scraper` — minimal Apify credits\n","# Blog Scraper\n\nScrape blog posts via RSS\u002FAtom feeds (free) with optional Apify fallback for JS-heavy sites.\n\n## Quick Start\n\nFor RSS mode (free), only dependency is `pip install requests`. No API key needed.\n\n```bash\n# Scrape a blog's RSS feed\npython3 skills\u002Fblog-scraper\u002Fscripts\u002Fscrape_blogs.py \\\n  --urls \"https:\u002F\u002Fgrowthx.ai\u002Fblog\" --days 30\n\n# Multiple blogs with keyword filter\npython3 skills\u002Fblog-scraper\u002Fscripts\u002Fscrape_blogs.py \\\n  --urls \"https:\u002F\u002Fblog1.com,https:\u002F\u002Fblog2.com\" --keywords \"AI,marketing\" --output summary\n\n# Force Apify for JS-heavy sites\npython3 skills\u002Fblog-scraper\u002Fscripts\u002Fscrape_blogs.py \\\n  --urls \"https:\u002F\u002Fexample.com\" --mode apify\n```\n\n## How It Works\n\n### Auto Mode (default)\n1. For each URL, tries to discover an RSS\u002FAtom feed:\n   - Checks HTML `\u003Clink rel=\"alternate\">` tags\n   - Probes common paths: `\u002Ffeed`, `\u002Frss`, `\u002Fatom.xml`, `\u002Ffeed.xml`, `\u002Frss.xml`, `\u002Fblog\u002Ffeed`, `\u002Findex.xml`\n2. Parses discovered feeds (supports RSS 2.0 and Atom)\n3. If any URLs fail, falls back to Apify `jupri\u002Frss-xml-scraper` (if token available)\n4. Applies date and keyword filtering client-side\n\n### RSS Mode\nOnly tries RSS feeds, no Apify fallback.\n\n### Apify Mode\nUses Apify actor directly, skipping RSS discovery.\n\n## CLI Reference\n\n| Flag | Default | Description |\n|------|---------|-------------|\n| `--urls` | *required* | Blog URL(s), comma-separated |\n| `--keywords` | none | Keywords to filter (comma-separated, OR logic) |\n| `--days` | 30 | Only include posts from last N days |\n| `--max-posts` | 50 | Max posts to return |\n| `--mode` | auto | `auto` (RSS + fallback), `rss` (RSS only), `apify` (Apify only) |\n| `--output` | json | Output format: `json` or `summary` |\n| `--token` | env var | Apify token (only needed for Apify mode\u002Ffallback) |\n| `--timeout` | 300 | Max seconds for Apify run |\n\n## Cost\n\n- **RSS mode:** Free (no API, no tokens)\n- **Apify mode:** Uses `jupri\u002Frss-xml-scraper` — minimal Apify credits\n",{"name":5,"description":7},"master","c73386b305dec167db7654e0e6feacb462d4f9dc","assets\u002Fskills\u002Fgtm\u002Fgtm-blog-scraper",1,"https:\u002F\u002Fgithub.com\u002FAntifragileTech\u002Fantifragile-claude-code","https:\u002F\u002Fgithub.com\u002FAntifragileTech","2026-10-02 14:22:14",{"source":8,"skillName":5,"commands":55,"prompt":65,"zipAvailable":66},[56,59,62],{"tool":57,"command":58},"npx","npx skills add AntifragileTech\u002Fantifragile-claude-code --skill gtm-blog-scraper",{"tool":60,"command":61},"bunx","bunx skills add AntifragileTech\u002Fantifragile-claude-code --skill gtm-blog-scraper",{"tool":63,"command":64},"pnpm","pnpm dlx skills add AntifragileTech\u002Fantifragile-claude-code --skill gtm-blog-scraper","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FAntifragileTech\u002Fantifragile-claude-code\u002Fblob\u002Fmaster\u002Fassets\u002Fskills\u002Fgtm\u002Fgtm-blog-scraper\u002FSKILL.md",true,[68,74],{"path":69,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":72,"sourceHtmlUrl":73},"scripts\u002Fscrape_blogs.py","SCRIPT","脚本",15059,"https:\u002F\u002Fgithub.com\u002FAntifragileTech\u002Fantifragile-claude-code\u002Fblob\u002Fmaster\u002Fassets\u002Fskills\u002Fgtm\u002Fgtm-blog-scraper\u002Fscripts\u002Fscrape_blogs.py",{"path":75,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":78,"sourceHtmlUrl":79},"skill.meta.json","REFERENCE","参考文档",249,"https:\u002F\u002Fgithub.com\u002FAntifragileTech\u002Fantifragile-claude-code\u002Fblob\u002Fmaster\u002Fassets\u002Fskills\u002Fgtm\u002Fgtm-blog-scraper\u002Fskill.meta.json",[81,98,113,128,141,154],{"skillNo":82,"name":83,"nameZh":6,"description":84,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":85,"categories":86,"keywords":92,"publishedAt":42},"01M6DT9Q6VYA615SCXR757TZZ7","writing-skills","Use when creating new skills, editing existing skills, or verifying skills work before deployment","https:\u002F\u002Fgithub.com\u002FAntifragileTech\u002Fantifragile-claude-code\u002Fblob\u002Fmaster\u002Fassets\u002Fskills\u002Fthinking\u002Fwriting-skills\u002FSKILL.md",[87,90,91],{"categoryNo":88,"categoryName":89,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":23,"categoryName":24,"taxonomyType":25,"taxonomyTypeDesc":26},[93,94,38,95,96,97],"writing skills","writing","editing","work","deployment",{"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":106,"publishedAt":42},"01M6DT9GFHDNY90P41WGAE1TV0","writing-plans","Use when you have a spec or requirements for a multi-step task, before touching code","https:\u002F\u002Fgithub.com\u002FAntifragileTech\u002Fantifragile-claude-code\u002Fblob\u002Fmaster\u002Fassets\u002Fskills\u002Fthinking\u002Fwriting-plans\u002FSKILL.md",[104,105],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":23,"categoryName":24,"taxonomyType":25,"taxonomyTypeDesc":26},[107,108,94,109,110,38,111,112],"plans","writing plans","requirements","task","code","spec",{"skillNo":114,"name":115,"nameZh":6,"description":116,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":117,"categories":118,"keywords":121,"publishedAt":42},"01M6DT9C6PFGD86WS3HY7YE3XG","docs:write-concisely","Apply writing rules to any documentation that humans will read. Makes your writing clearer, stronger, and more professional.","https:\u002F\u002Fgithub.com\u002FAntifragileTech\u002Fantifragile-claude-code\u002Fblob\u002Fmaster\u002Fassets\u002Fskills\u002Fthinking\u002Fwrite-concisely\u002FSKILL.md",[119,120],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":23,"categoryName":24,"taxonomyType":25,"taxonomyTypeDesc":26},[122,123,124,125,126,127,94],"docs:write concisely","write","docs","read","Rules","documentation",{"skillNo":129,"name":130,"nameZh":6,"description":131,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":132,"categories":133,"keywords":134,"publishedAt":42},"01M6DT98AWQ27P0N1CG97WAG66","kaizen:why","Iterative Five Whys root cause analysis drilling from symptoms to fundamentals","https:\u002F\u002Fgithub.com\u002FAntifragileTech\u002Fantifragile-claude-code\u002Fblob\u002Fmaster\u002Fassets\u002Fskills\u002Fthinking\u002Fwhy\u002FSKILL.md",[],[130,135,136,137,138,139,140],"why","kaizen","issue","five whys","analysis","root cause analysis",{"skillNo":142,"name":143,"nameZh":6,"description":144,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":145,"categories":146,"keywords":147,"publishedAt":42},"01M6DT93EH25NAX19R3WGE1P53","verification-loop","A comprehensive verification system for Claude Code sessions.","https:\u002F\u002Fgithub.com\u002FAntifragileTech\u002Fantifragile-claude-code\u002Fblob\u002Fmaster\u002Fassets\u002Fskills\u002Fthinking\u002Fverification-loop\u002FSKILL.md",[],[148,149,150,151,111,152,153],"verification loop","verification","loop","sessions","claude code sessions","system",{"skillNo":155,"name":156,"nameZh":6,"description":157,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":158,"categories":159,"keywords":160,"publishedAt":42},"01M6DT90GW7Z7VCN98P9DVYSNC","verification-before-completion","Use when about to claim work is complete, fixed, or passing, before committing or creating PRs - requires running verification commands and confirming output before making any success claims; evidence before assertions always","https:\u002F\u002Fgithub.com\u002FAntifragileTech\u002Fantifragile-claude-code\u002Fblob\u002Fmaster\u002Fassets\u002Fskills\u002Fthinking\u002Fverification-before-completion\u002FSKILL.md",[],[161,149,162,96,38,163,164,165],"verification before completion","commands","evidence","claim","complete"]