phantom-scrape-c2c737 — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited phantom-scrape-c2c737 (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Bypass Cloudflare and anti-bot protections using headless Chrome. When a URL is blocked, don't retry with HTTP clients — launch a real browser.
WebFetch returns 403 or empty contentcurl returns <title>Just a moment...</title> or a Cloudflare challenge pageEnsure Puppeteer is available in the project. If not installed, run:
npm install puppeteerThis downloads a bundled Chromium binary (~200MB). Run in background if needed — install may take a few minutes.
Write and execute a Node.js script using Puppeteer. Follow this pattern:
const puppeteer = require("puppeteer");
(async () => {
const browser = await puppeteer.launch({
headless: "new",
args: ["--no-sandbox", "--disable-setuid-sandbox"],
});
const page = await browser.newPage();
await page.setUserAgent(
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) " +
"AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
);
await page.goto(TARGET_URL, {
waitUntil: "networkidle2",
timeout: 60000,
});
// Detect and wait out Cloudflare challenge
const title = await page.title();
if (
title.includes("Just a moment") ||
title.includes("Attention Required") ||
title.includes("Checking your browser")
) {
await page.waitForFunction(
() =>
!document.title.includes("Just a moment") &&
!document.title.includes("Attention Required") &&
!document.title.includes("Checking your browser"),
{ timeout: 30000 }
);
}
// Extract content
const data = await page.evaluate(() => {
return {
title: document.title,
text: document.body.innerText,
links: Array.from(document.querySelectorAll("a")).map((a) => ({
text: a.textContent.trim(),
href: a.href,
})),
};
});
console.log(JSON.stringify(data, null, 2));
// Screenshot for visual verification
await page.screenshot({ path: "screenshot.png", fullPage: true });
await browser.close();
})();| Setting | Value | Reason |
|---|---|---|
headless | "new" | New headless mode — less detectable than legacy true |
waitUntil | "networkidle2" | Ensures JS-rendered content is fully loaded |
timeout | 60000 | Cloudflare challenges need time to solve |
| User-Agent | Real Chrome string | Prevents immediate headless detection |
If basic Puppeteer gets detected (Turnstile CAPTCHA, advanced fingerprinting), escalate to stealth mode:
npm install puppeteer-extra puppeteer-extra-plugin-stealthconst puppeteer = require("puppeteer-extra");
const StealthPlugin = require("puppeteer-extra-plugin-stealth");
puppeteer.use(StealthPlugin());
// Then launch as normal — stealth patches headless detection vectors:
// WebGL, Canvas, Chrome.runtime, navigator.plugins, etc.
const browser = await puppeteer.launch({ headless: "new" });When scraping across multiple pages, reuse the browser instance and add delays between requests:
const browser = await puppeteer.launch({ headless: "new" });
for (const url of urls) {
const page = await browser.newPage();
await page.goto(url, { waitUntil: "networkidle2", timeout: 30000 });
// ... extract data ...
await page.close();
// Respectful delay between requests
await new Promise((r) => setTimeout(r, 1000 + Math.random() * 2000));
}
await browser.close();browser.close() — orphaned Chrome processes leak memorypage.screenshot() when debugging to see what the browser actually renders~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.