Browser が 自動で操作されているか判断する Navigator.webdriver について



BrowserがSelenium等のBrowser自動操作ツールによって操作されているかを判断するための、JavaScript APIとして、Navigator.webdriver - Web API | MDN がある。
以下の場合にnavigator.webdriverプロパティがtrueになる。
MDNの文書を引用する。
Chrome
--enable-automation または --headless フラグが使用されているとき。
Firefox
設定の marionette.enabled または --marionette フラグが渡されたとき。
自動操作されていることが判定できるのでいくつかAPIを使うことで有用なケースが浮かんだので、備忘録として残す。
ロボットからのアクセスを禁止する
ドキュメントを見る限り、自動操作ツール側でフラグを使用しない限り(デフォルトでは間違いなく使用すると思う)自動操作ツールでのアクセスかどうかの検知に使用できる。navigatorオブジェクトが未定義であることも考慮すると、自動操作かどうかの判定は以下のようになる。
let isAutomated = typeof navigator !== 'undefined' && navigator.webdriver;
ただ、抜け道はいくつかありそうで、以下の記事を見つけた。
It is not possible to detect and block Chrome headless
Browser ではないスクレイピングを防ごうと思うと、ユーザーエージェントを判断したり考慮事項は多い。
ロボットのアクセスをWeb解析ツールからの除外
Google Analytics等は除外していそうだが、自動操作ツールのアクセスを明示的に除外したい場合、このフラグを使って navigator.webdriver
が true
になる場合は、記録の対象外とすることができる。
課金対象のマーケティングツールからの除外
基本的に、Google Analyticsのアクセスの除外とやることは同じだが、バナー表示ツールなどでバナーの表示数で課金される、または表示数で制限を設けるツールがある。自動操作ツールのアクセス時はこれらのツールの対象外とすることで、課金額を節約、リアルユーザに対して表示する確率を高められる。
RPA ツールの操作補助
Browserの操作というと、RPAツールも対象となる。
navigator.webdriver
のみの制御だと不安だが、navigator.webdriver
とある特定のCookieがあるとRPA向けのショートカットが表示される。
または、RPAツールの操作の邪魔になる処理をOFFにする等の用途が考えられる。