本文へスキップ
郭立 (leeguoo)

アンチスクレイピング検出が数えているのは、あなたが何回嘘をついたか:本物のブラウザが生まれつき破綻しない理由

ブラウザ自動化に携わる人は、いずれ必ずある落とし穴にはまる。偽のブラウザを必死に真人間のように偽装し、さらに何層にも見破られていく、というものだ。この問題を理解するには、まず CreepJS のような検出が、そもそも「あなたはボットか」を直接判定しているわけではないことを知る必要がある。它はあなたの数十項目のシグナルを集めて相互に照合し、ひとつでも合わなければ嘘として記録する。この記事では、私が実測した本物のフィンガープリント一式から始め、もっとも隠しにくい痕跡、つまり JS 層ではなくプロトコル層にある痕跡まで分解し、パッチを当てることがなぜ負のゲームなのかを説明する。

このページの目次

ブラウザ自動化じどうかをやる人ひとは、いずれ必かならずある落おとし穴あなにはまる。自動化じどうかブラウザを真人間まにんげんのように偽装ぎそうしようとあらゆる手てを尽つくし、サイトに一目ひとめで見破みやぶられ、さらに一層いっそう偽装ぎそうを足たし、また見破みやぶられる。私自身じしんがこのことを理解りかいできたのは、「検出けんしゅつする側がわは結局けっきょく何なにを調しらべているのか」を考かんがえ抜ぬいたところからだった。

まず、直感ちょっかんに反はんする結論けつろんから言いう。CreepJS のような検出けんしゅつは、そもそも「あなたはボットか」を直接ちょくせつ判定はんていしているわけではない。やっているのは別べつのことだ。ブラウザが露出ろしゅつしている数十項目すうじゅっこうもくのシグナルを集あつめ、それらを互たがいに突つき合あわせて、どこが合あわないかを見みる。一箇所いっかしょ合あわなければ、「嘘うそ」をひとつ記録きろくする。嘘うそが多おおいほど、スコアは低ひくくなる。内部ないぶではこれを lies と呼よんでいる。

視点してんを変かえると、多おおくのことが腑ふに落おちる。

左:偽ブラウザ/自動化が CreepJS の検出で webdriver=true、headless、フィンガープリント不一致、Runtime.enable という四つの赤旗を出して失敗;右:本物の Chrome は四項目すべて緑で通過

本物ほんもののブラウザはどんな姿すがたか

私は chrome-use を、この Mac でいま開ひらいている Chrome に接続せつぞくさせ、よく調しらべられるシグナルをいくつか読よんだ。

json
{
  "webdriver": false,
  "gpu": "ANGLE (Apple, ANGLE Metal Renderer: Apple M3, Unspecified Version)",
  "plugins": 5,
  "languages": "en,en-US,ja",
  "timeZone": "Asia/Tokyo"
}

一見いっけんすると平凡へいぼんだが、どの項目こうもくも検出けんしゅつ側がわが注視ちゅうししている点てんだ。

navigator.webdriver は false。W3C の WebDriver 仕様しようでは、ブラウザが自動化じどうか制御せいぎょされているとき、この getter は true を返かえすと定さだめられている。Selenium、Puppeteer、Playwright は既定きていで true だ。ここでは false になっている。なぜなら、実際じっさいにフレームワークが駆動くどうしているわけではなく、私本人ほんにんが使つかっているからだ。

GPU の Apple M3 という文字列もじれつは、WebGL の WEBGL_debug_renderer_info 拡張かくちょうから取得しゅとくした本物ほんもののGPU名ジーピーユーめいだ。ヘッドレス Chrome には本物ほんものの GPU がないため、この項目こうもくはたいてい SwiftShader や llvmpipe、つまりソフトウェアレンダリングになる。ソフトウェアレンダリング自体じたいが違反いはんというわけではない。だが「普通ふつうの Mac だ」と名乗なのるブラウザと並ならべると、矛盾むじゅんになる。

plugins が 5 個こ、時区じくが Asia/Tokyo、言語げんごリストに ja がある。こうした細こまかなシグナルは、単独たんどくで見みても意味いみはない。価値かちがあるのは、それらが**整合せいごうするかどうか**だ。

検出けんしゅつの決きめ手ては相互そうご照合しょうごう

自動化じどうかブラウザが偽装ぎそうするとき、たいてい変かえるのは表層ひょうそうだ。UA を変かえて Mac だと嘘うそをつき、navigator.webdriver を変かえ、スクリプトを注入ちゅうにゅうして headless の痕跡こんせきを覆おおい隠かくす。だが UA は変かえられても、それに連動れんどうする大量たいりょうのものまでは変かえられない。

UA は macOS と言いっているのに、WebGL は llvmpipe、つまり Linux のソフトウェアレンダリングでよく見みる値あたいを返かえす。合あわない。時区じくは東京とうきょうだと主張しゅちょうしているのに、出口でぐち IP はフランクフルトにある。合あわない。画面がめん解像度かいぞうどを手動しゅどうで変かえても、devicePixelRatio と Canvas が実際じっさいにレンダリングしたサイズがまた合あわない。CreepJS はこれらのシグナルを二ふたつずつ検証けんしょうし、矛盾むじゅんごとに嘘うそをひとつ記録きろくする。

だから偽装ぎそうの本当ほんとうの難むずかしさは、「ある一項目いちこうもくを隠かくす」ことではまったくない。その一項目いちこうもくを隠かくしたあと、残のこり数十項目すうじゅっこうもくとも自己じこ整合せいごうしていなければならないことだ。ひとつ変かえると、一連いちれんの漏もれが出でる。これは偽装ぎそうが生うまれつき抱かかえる不利ふりだ。

もっとも隠かくしにくい痕跡こんせきは、JS 層そうにはない

ここまでのものは、まだ JS から読よめるシグナルであり、理論上りろんじょうは hook で潰つぶせる。しかし、もっと下したの層そうにある痕跡こんせきもある。

Chrome DevTools Protocol でブラウザを駆動くどうするとき、いったん Runtime.enable を送おくると、多おおくの CDP ライブラリは既定きていでこれを送おくるが、Chrome は実行じっこうコンテキストや console 呼よび出だしをプロトコル経由けいゆで外そとへ報告ほうこくし始はじめる。rebrowser の検出が利用りようしているのは、まさにこの点てんだ。getter つきのオブジェクトを作つくり、console.debug する。Runtime.enable が有効ゆうこうになっているかぎり、CDP はそのオブジェクトをシリアライズして外そとへ渡わたさなければならない。シリアライズはその getter を発火はっかさせる。getter が反応はんのうした瞬間しゅんかん、ページはその場ばで「Runtime.enable を開ひらいたデバッガが自分じぶんにぶら下さがっている」と知しる。

この痕跡こんせきがつらいのは、それが JS 内ないのどこかの属性ぞくせいではないことだ。hook では消けせない。あなたが選えらんだ駆動くどう方式ほうしきそのものが残のこすものだからだ。rebrowser のパネルには runtimeEnableLeak という項目こうもくが専用せんようにあり、隠密おんみつを謳うたう多おおくの方式ほうしきがここで転ころぶ。

本物ほんもののブラウザがなぜ楽らくなのか

冒頭ぼうとうの項目こうもくに戻もどって見みる。本物ほんものの Chrome の webdriver はもともと false で、GPU はもともと Apple M3 で、時区じく、言語げんご、Canvas はもともと同おなじ実機じっきから出でていて、どこも自己じこ整合せいごうしている。数かぞえるべき嘘うそがない。chrome-use はブラウザ拡張かくちょうと native messaging でそれに接続せつぞくし、--remote-debugging-port を開ひらかず、中継ちゅうけいパスも既定きていでは Runtime.enable を開ひらかない。プロトコル層そうのあの痕跡こんせきすらない。

これは「偽装ぎそうがうまい」のではない。そもそも偽装ぎそうすべきものがないのだ。

さらに見落みおとされがちな層そうがある。パッチを当あてる行為こうい自体じたいも痕跡こんせきを残のこす。navigator.webdriver を hook するそのコードは、属性ぞくせいを上書うわがきするときに property descriptor を変かえ、toString の戻もどり値ちを変かえる。検出けんしゅつ側がわは逆ぎゃくに「この属性ぞくせいは誰だれかに手てを加くわえられていないか」を調しらべればよい。補修ほしゅうすればするほど、手てを加くわえられたと指摘してきできる場所ばしょが増ふえる。本物ほんもののブラウザにはこの負担ふたんがない。パッチを当あてていないからだ。

自分じぶんで比較ひかくしてみる

私の言いうことを信しんじる必要ひつようはない。ふたつのブラウザでそれぞれ一度いちど走はしらせるのがいちばん直接的ちょくせつてきだ。

  • CreepJS: trust score と、列挙れっきょされた lies が具体的ぐたいてきにどれかを見みる。
  • rebrowser-bot-detector: 重点じゅうてんは runtimeEnableLeak と navigatorWebdriver。

普通ふつうのヘッドレス自動化じどうかで一度いちど走はしらせ、さらにあなたが毎日まいにち使つかっているブラウザでも一度いちど走はしらせる。両者りょうしゃの lies リストを並ならべて見みれば、どこが違ちがうのか、私が説明せつめいするまでもない。「本当ほんとうに人間にんげんでなければ通とおらない」作業さぎょう、ログイン状態じょうたいやリスク管理かんりに敏感びんかんな操作そうさをやるなら、丸まるめるべき嘘うそのないブラウザを使つかうほうが、パッチを当あて続つづけて無理むりに支ささえる偽にせブラウザを使つかうより、省はぶける手間てまは少すこしどころではない。

関連ドキュメント(英語):chrome-use · Stealth & Anti-detection、インストール。

同じカテゴリの記事 · AI & Agent

← 前の記事
デスクトップアプリは実はWebページだ:これを理解すると、操作はもはや「デスクトップ自動化」ではなくなる
次の記事 →
エージェント向けブラウザの選び方:Playwright のアプローチと chrome-use は同じものではない

コメント

コメントは即時公開されますが、ポリシー違反時は非表示になる場合があります。

最大 1000 文字。