Cloudflare の DDoS protection を Puppeteer でスルーする方法

前提

  • 2021/02/21 現在の情報です
  • DDoS protection にも様々な形態があります

結論

Puppeteer は使いません*1Playwright を使います。

さらに、内部エンジンとして firefox を用います。

具体例

Cloudflare の DDoS protection が設定されている URL を https://ddos-protection.example.com/ と仮定します。

このとき、以下のコードで実行すれば、DDoS protection をすり抜けてページにアクセスできます*2。なお、PlaywrightNpmYarn でインストール済みとします。

const playwright = require('playwright');

(async () => {
  for (const browserType of ['firefox']) {
    const browser = await playwright[browserType].launch();
    const context = await browser.newContext();
    const page = await context.newPage();

    await page.goto('https://ddos-protection.example.com/')
    // page.waitForNavigationが重要なポイントその1です
    await page.waitForNavigation('load');

    // page.waitForSelectorが重要なポイントその2です
    // 遷移先ページに存在する要素を指定します
    // これがないと Protection 突破後、完全にページが切り替わる前に次の処理が走ってしまいます
    await page.waitForSelector('div.foooooo')

    // DDoS protection をすり抜けたことを確認
    await page.screenshot({ path: `ddos-protection-passed.png` });
    await browser.close();
  }
})();

ここで、 for (const browserType of ['firefox']) {firefox の部分を chromium などに変えて比較してみましょう。

chromium などの場合は、キャプチャされた画像は Checking your browser before accessing .... という画像になっているはずです。

*1:標題が大嘘になってしまいますが

*2:page.waitForNavigation の部分以外は公式ドキュメントのサンプルコードのままです

Powered by はてなブログ