DataDome CAPTCHA
と CapMonster Cloud

CAPTCHAの解決、サイトへの導入、テスト。

DataDome CAPTCHAソリューションの価格

キャプチャ
価格 (USD)
$ 2.20
1000トークン
キャプチャや防御機構が導入済みのサイトを引き継いだのに、ソースコードへアクセスできない? その場合、どの仕組みが入っているのか、設定は正しいのか、どう検証するのかが気になります。

この記事では、よくある疑問にできるだけお答えしました。まず最初のステップは、どのような保護システムが使われているかを特定することです。そのために、代表的なキャプチャやボット対策システムの一覧を参照できます。ここには、どの仕組みが使われているかを素早く見分けるための画面イメージや主な特徴がまとめられています。

もしサイトで DataDome CAPTCHA が使われていることが分かったら、次のステップはその特徴と動作をより詳しく確認することです。同じこの記事の中で、DataDome CAPTCHA をサイトに導入するための手順書も確認できるので、あなたのサイト上でどのように機能しているのかをしっかり理解できます。これにより、現在の保護を正しく把握できるだけでなく、今後の運用や保守も計画的に行えるようになります。

DataDomeとは
DataDomeとは
DataDomeはボットや自動攻撃から保護するシステムで、訪問者の行動やネットワークパラメータを分析し、実際のユーザーと悪意のあるトラフィックを区別して、サイトやアプリケーションの安定した動作を保証します。
Background
DataDome CAPTCHA の例
行動分析
行動分析
ユーザーの行動評価(クリック、スクロール、操作速度)。
JavaScript検証
JavaScript検証
ブラウザと環境の隠れたチェック。
ネットワーク検証
ネットワーク検証
IPアドレス、ヘッダー、プロキシ、既知のボットネットワークの分析。
Challenge
Challenge
CAPTCHA表示(通常はスライダー「右にスライドしてパズルを完成」)システムが疑わしい場合。

CapMonster Cloudを使ったDataDome CAPTCHAの解決方法

DataDomeの保護をテストする際、正しく統合され、疑わしいトラフィックに反応することを確認することが重要です。手動確認の場合、DataDomeで保護されたページを開き、システムが有効であることを確認してください。
ページの過剰な更新や有効なデータなしでのフォーム送信など、疑わしい動作をシミュレートするリクエストを試してください — DataDomeはアクセスをブロックするか、保護ページを表示するはずです。
自動テストやCAPTCHA解決のためCapMonster Cloudのような専用サービスを使用できます — これはCAPTCHAパラメータを受け取り、サーバー上で処理し、解決策を返すツールです。この解決策(トークンやクッキー)をフォームやブラウザに挿入することで、ユーザーの介入なしに検証を完了できます。

CapMonster Cloud API を使った一般的な手順:

タスクの作成タスクの作成
arrow
API リクエストの送信API リクエストの送信
arrow
結果の受信結果の受信
arrow
トークンをページへ適用トークンをページへ適用
arrow
既存ライブラリを使用したDataDome CAPTCHA認識
CapMonster Cloudサービスは、PythonおよびJavaScript(Node.js)用の便利なライブラリを提供しています。
Python
JavaScript
DataDome解決とクッキー挿入
Node.jsでのウェブページ上のCAPTCHA認識フルサイクルの例。可能なアプローチ: HTTPリクエストでHTMLと保護システムのパラメータを取得し、回答を送信して結果を処理する、または自動化ツール(例: Playwright)を使用 — ページを開き、検証を待機し、CapMonster Cloudクライアントでパラメータを送信、結果を取得、ブラウザにクッキーを挿入(テストには正しいデータまたは不正データを使用可能)、結果を確認。

// npx playwright install chromium

import { chromium } from 'playwright';
import { CapMonsterCloudClientFactory, ClientOptions, DataDomeRequest } from '@zennolab_com/capmonstercloud-client';

// CapMonster Cloud APIキーを入力
const API_KEY = 'YOUR_API_KEY';

// あなたのサイトはDataDomeで保護されています
const TARGET_URL = 'https://example.com/';

const USER_AGENT = Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/150.0.0.0 Safari/537.36

// プロキシ設定
const proxy = {
  proxyType: "http",
  proxyAddress: '8.8.8.8',
  proxyPort: 8080,
  proxyLogin: 'proxyLogin',
  proxyPassword: 'proxyPassword'
};

async function main() {

  // ブラウザを起動
  const browser = await chromium.launch({ headless: true });
  const context = await browser.newContext({ userAgent: USER_AGENT });
  const page = await context.newPage();

  // サイトにアクセス
  await page.goto(TARGET_URL, { waitUntil: 'networkidle' });

  // 既存のdatadomeクッキーを検索(ある場合)
  const existingDd = (await context.cookies()).find(c => /datadome|dd_/i.test(c.name));

  // DataDome iframeを検索 -> CAPTCHA URL
  const captchaUrl = await page.evaluate(() =>
    Array.from(document.querySelectorAll('iframe[src]'))
      .find(i => /captcha-delivery\.com\/captcha/i.test(i.src))
      ?.src || null
  );

  console.log(`=== 抽出されたDataDomeパラメータ ===`);
  console.log(`captchaUrl:`, captchaUrl || '見つかりません');
  console.log(`現在のdatadomeクッキー::`, existingDd ? ${existingDd.name}=${existingDd.value}` : 'なし');

  const cm = CapMonsterCloudClientFactory.Create(
    new ClientOptions({ clientKey: API_KEY })
  );

  // CapMonsterにタスク送信
  console.log(`DataDomeタスクをCapMonsterに送信中......`);

  // DataDome解決用タスク送信
  const solve = await cm.Solve(new DataDomeRequest({
    _class: "DataDome",
    websiteURL: TARGET_URL,
    userAgent: USER_AGENT,
    proxy,
    metadata: {
      captchaUrl: captchaUrl || undefined,
      datadomeCookie: existingDd
        ? `${existingDd.name}=${existingDd.value}`
        : undefined
    }
  }));

  const sol = solve?.solution;

  // 解決策からドメインと必要なクッキーを取得
  const host = new URL(TARGET_URL).hostname;
  const domainKey =
    Object.keys(sol.domains).find(d => d.includes(host))
    || Object.keys(sol.domains)[0];

  const cookiesArr = sol.domains[domainKey]?.cookies || [];

  console.log(`\n=== CapMonsterクッキー ===`);
  cookiesArr.forEach(c => console.log(`${c.name}=${c.value}`));

  const ddSolved =
    cookiesArr.find(c => c.name?.toLowerCase() === 'datadome')
    || cookiesArr.find(c => /datadome/i.test(c.name));

  // ブラウザにdatadomeクッキーを設定
  await context.addCookies([{
    name: 'datadome',
    value: ddSolved.value,
    domain: '.' + host,
    path: '/',
    httpOnly: ddSolved.httpOnly ?? true,
    secure: ddSolved.secure ?? true,
    sameSite: ddSolved.sameSite ?? 'Lax'
  }]);

  console.log(`datadomeクッキー設定済み:`, ddSolved.value);

  // クッキー挿入後にサイトを再度開く
  const page2 = await context.newPage();
  const resp2 = await page2.goto(TARGET_URL, { waitUntil: 'domcontentloaded', timeout: 60000 });

  console.log(`クッキー設定後のステータス:: ${resp2?.status()}`);

  await browser.close();
}

main();
  
DataDome CAPTCHAをサイトに接続する方法
サイト上のCAPTCHAの動作や検証ロジックを理解し、再接続や再設定を行うには、このセクションを学習することをおすすめします。保護統合のプロセスが説明され、全ての詳細を迅速に把握できます。

1. アカウントにログインまたは登録し、クライアントサイドおよびサーバーサイドキーを取得します。

重要: 登録には会社の業務用メールを使用する必要があります。

登録後、管理パネルにアクセスできます。

2. パネルでサイト(ドメイン)を追加します。

システムにドメインを追加し、保護パラメータを選択してください:

  • ウェブ保護(HTTPトラフィック保護)
  • Bot detection & mitigation
  • Frequency & behavior analysis
  • Challengeページ(DataDomeチャレンジページ)
  • JS tag configuration

3. サーバーサイド統合を導入します。

Protection APIを使用するか、スタックに応じたモジュール(Node.js / Express, Nginx, Cloudflare, Java (Tomcat/Jetty/Vert.x), Goなど)を選択してください。

公式SDK/middlewareをインストールし、サーバーキーを設定します。

Node.jsでのDataDome統合例:

DataDomeはサーバーをボットや疑わしいリクエストから保護し、必要に応じてchallengeを自動表示します。Expressまたは統合HTTPサーバーNode.jsで使用可能です。

インストール

Expressの場合:

npm install @datadome/module-express

Node.js HTTPモジュールの場合:

npm install @datadome/module-http

Node.js 18以上をサポート。サーバーサイドキーがDataDomeパネルに必要です。

Expressとの統合Expressとの統合
arrow
Node.js HTTPサーバーとの統合Node.js HTTPサーバーとの統合
arrow

モジュール設定

クライアント作成時に設定可能:


const datadomeClient = new DatadomeExpress('YOUR_SERVER_KEY', {
  timeout: 150, // ms単位のタイムアウト、これを過ぎるとリクエストを通す
  urlPatternInclusion: null, // 確認するURL
  urlPatternExclusion: /\.(avi|flv|mka|mkv|mov|mp4|mpeg|mpg|mp3|flac|ogg|ogm|opus|wav|webm|webp|bmp|gif|ico|jpeg|jpg|png|svg|svgz|swf|eot|otf|ttf|woff|woff2|css|less|js|map|json|avif|xml|gz|zip)$/i,
  endpointHost: 'api.datadome.co',
});

高度な機能:

  • DataDomeヘッダーのログ(enrichedHeaders)
  • CSP nonce: app.use(datadomeClient.middleware({ nonce: 'VALUE' }))
  • handlers経由でリクエストメタデータを上書き

HelpIcon

サーバーサイド統合の詳細は公式ドキュメント参照。

4. クライアント側統合を行う。

JSタグをサイトの<head>に挿入:


<head>
  <script>
    window.ddjskey = 'YOUR_DATADOME_JS_KEY';
    window.ddoptions = {
      // ここに設定を追加(任意)
    };
  </script>
  <script src="https://js.datadome.co/tags.js" async></script>
  <!-- 他のhead要素 -->
</head>

YOUR_DATADOME_JS_KEY → Client-Sideキーに置き換え。

スクリプトは<head>の冒頭で読み込むと、DataDomeがリクエストを正しく監視可能です。

CSPを使用している場合、次のディレクティブを追加:

インラインスクリプト用インラインスクリプト用
arrow
外部スクリプト読み込み用外部スクリプト読み込み用
arrow

HelpIcon

クライアント側統合の詳細はDataDome CAPTCHA公式ドキュメント参照。

結果確認

DataDome は、検証に成功すると datadome= クッキーを作成します。このクッキーはユーザーによって自動的に送信され、サーバーはリクエストを許可します。クッキーがない場合や無効な場合、DataDome は再びチャレンジを表示します.

Background
想定されるエラーとデバッグ
Bug Icon
無効なキーまたはドメイン
DataDomeはサイトを正しく保護しておらず、challengeが表示されません。正しいServer-Side Keyを使用しており、ドメインがDataDomeパネルに追加されていることを確認してください。
Bug Icon
リクエスト処理タイムアウト
サーバーがDataDome APIからの応答を待っていません。モジュール設定でtimeout値を増やしてください。
Bug Icon
トークンが空、または無効なパラメータ
サーバーに検証結果を送信中にエラーが発生。クライアントJSタグが正しく設置され、ddtokenを返すことを確認してください。
Bug Icon
Challenge未達成
リクエストが疑わしいとマークされているか、トークンが期限切れです。診断にはモジュールのloggerパラメータでログを有効にし、blockedおよびvalidイベントを追跡してください。
保護の堅牢性チェック
セキュリティと最適化のヒント
<span class="font-bold">Server-Side Key</span>はサーバーにのみ保管し、クライアントには渡さないでください。
ブロックの原因を追跡するために<span class="font-bold">logger</span>や<span class="font-bold">blocked/valid</span>リスナーでイベントログを有効にしてください。
フォームページに<span class="font-bold">プライバシーポリシー</span>と<span class="font-bold">DataDome利用規約</span>へのリンクを配置し、ユーザーへの透明性を確保してください。
まとめ

すでにキャプチャや別の保護システムが導入されているサイトを引き継いだものの、コードにはアクセスできない場合でも心配はいりません!どの技術が使われているかを特定するのはそれほど難しくありません。動作が正しいか確認するには、隔離されたテスト環境で認識サービスCapMonster Cloudを利用し、トークン処理の仕組みと検証ロジックが正しく機能しているかをチェックできます。

DataDome CAPTCHAの場合も、システムを特定し、その挙動を調べて、保護機能が正しく動いていることを確認すれば十分です。この記事では、DataDome CAPTCHAを見分ける方法と、その導入や再設定に関する手順書の見つけ方を紹介しました。これにより、防御を安心して維持し、その動作をしっかりと管理できます。

Conclusion
参考リンク
DocIconDataDome CAPTCHAドキュメントDocIconCapMonster Cloudドキュメント(DataDome CAPTCHA操作)

DataDome に関するよくある質問

最も明確な指標は、サーバー応答内の datadome cookie です:

  1. ブラウザ(Chrome、Firefox)で DataDome で保護されたサイトを開きます。
  2. F12(開発者ツール)を押す → Application タブ → Cookies に移動します。
  3. サイトのドメイン(例:www.example.com)を見つけます。
  4. cookie の中から datadome キーを探します

開発者ツール → Network タブで、サイトのリクエストに geo.captcha-delivery.com への呼び出しが含まれているかも確認できます。このエンドポイントは DataDome の challenge 配信インフラに属します。

公式パッケージをインストールします:

npm install @datadome/module-express

クライアントをインポートして初期化します:

const { DatadomeExpress } = require('@datadome/module-express')

次に

new DatadomeExpress('YOUR_SERVER_SIDE_KEY')

ミドルウェアを接続します:

app.use(datadomeClient.middleware())

ほとんどの場合、リクエストがルートハンドラーに到達する前に分析できるよう、ミドルウェアは保護されたルートの前に登録する必要があります。アプリケーションの構造に応じて、特定のルートやルートグループに選択的にミドルウェアを適用することもできます。

最小構成としてこの例を使用してください:

const { DatadomeExpress } = require('@datadome/module-express');
const express = require('express');
const app = express();

// Initialize DataDome client
const datadomeClient = new DatadomeExpress('YOUR_SERVER_KEY');

// Connect middleware
app.use(datadomeClient.middleware());

// Your routes
app.get('/', (req, res) => {
  res.send('Hello World');
});

// Start server
app.listen(3000, () => {
  console.log('Server running on port 3000');
})

公式モジュールは、高度な統合向けの追加の設定およびカスタマイズオプションもサポートしています。

サーバーサイド統合の詳細は 公式ドキュメントをご覧ください。

DataDome が正しく設定されているか確認するには、次の3つのテストを試してください:

  1. DataDome JS Tag なしで保護されたページにアクセスします。統合が期待どおりに機能していれば、CAPTCHA challenge を受け取るはずです。
  2. k6JMeter などのツールで自動化トラフィックをシミュレートします。DataDome はこのアクティビティを検出し、challenge で応答するはずです。
  3. 別の IP アドレスから解決済みの datadome cookie を再利用します。これは機能せず、DataDome は新しい CAPTCHA challenge を表示するはずです。

DataDome の解決に失敗した場合、最も一般的な原因は次のとおりです:

  • ERROR_CAPTCHA_UNSOLVABLE: createTask パラメータが正しくありません。プロキシが DataDome CAPTCHA によってブロックされている可能性があります。リクエストに使用するプロキシサーバーを変更してください。リクエストで送信するパラメータを再確認してください。エラーが繰り返される場合は、taskId、タスクタイプ (type)、元の画像または入力データ、タスクの日時、リクエスト本文を記載してサポートに連絡してください。
  • ERROR_KEY_DOES_NOT_EXIST: clientKey が正しくないか無効です。CapMonster Cloud アカウントでキーを確認してください。
  • ERROR_PROXY_READ_TIMEOUT: プロキシが遅すぎるか信頼性がありません。別のプロキシを試してください。このエラーは、createTask リクエスト内の誤った metadata.captchaUrl によっても発生する可能性があります。captcha へのリンクを再確認してください。
  • サービスから受け取った cookie がターゲットサイトで機能しない: 解決リクエストと最終リクエストが異なる IP から送信されました。両方に同じ IP を使用してください。また cookie の設定が正しいか確認し、返された datadome cookie がブラウザまたはリクエストヘッダーに正しく設定されていることを確認してください。

HTTP リクエストの場合、保護されたドメインへの後続の各リクエストで、解決済みの値を Cookie リクエストヘッダーに datadome=<value> として含めます。

Puppeteer、Selenium、Playwright などのブラウザ自動化ツールでは、保護されたページを開く前に、フレームワークの組み込み cookie メソッドを使用して datadome cookie を追加します。

例:

  • Playwright では context.addCookies() を使用します。
  • Puppeteer では page.setCookie() を使用します。
  • Selenium では driver.add_cookie() を使用します。

cookie が正しいドメインとパスに設定されていることを確認してください。また、ブラウザが通常のセッション cookie と同様に処理するよう、httpOnly: truesecure: truesameSite: 'Lax' でこれらのメソッドを使用してください。