chromedriverでSeleniumを使用していることをWebサイトで検出できますか?

408
Ryan Weinstein 2015-10-20 14:08.

ChromedriverでSeleniumをテストしてきましたが、自動化がまったく行われていなくても、一部のページでSeleniumを使用していることを検出できることに気付きました。SeleniumとXephyrを介してChromeを使用して手動でブラウジングしている場合でも、疑わしいアクティビティが検出されたというページが表示されることがよくあります。ユーザーエージェントとブラウザのフィンガープリントを確認しましたが、これらはすべて通常のChromeブラウザとまったく同じです。

通常のChromeでこれらのサイトを参照すると、すべて正常に機能しますが、Seleniumを使用した瞬間に検出されます。

理論的には、chromedriverとchromeは、どのWebサーバーでも文字通りまったく同じように見えるはずですが、どういうわけか、それらはそれを検出できます。

テストコードが必要な場合は、これを試してください。

from pyvirtualdisplay import Display
from selenium import webdriver

display = Display(visible=1, size=(1600, 902))
display.start()
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--disable-extensions')
chrome_options.add_argument('--profile-directory=Default')
chrome_options.add_argument("--incognito")
chrome_options.add_argument("--disable-plugins-discovery");
chrome_options.add_argument("--start-maximized")
driver = webdriver.Chrome(chrome_options=chrome_options)
driver.delete_all_cookies()
driver.set_window_size(800,800)
driver.set_window_position(0,0)
print 'arguments done'
driver.get('http://stubhub.com')

スタブハブを閲覧すると、1つまたは2つのリクエスト内でリダイレクトされて「ブロック」されます。私はこれを調査してきましたが、ユーザーがSeleniumを使用していることをどのように判断できるのかわかりません。

どうやってやっているの?

更新の編集:

FirefoxにSeleniumIDEプラグインをインストールしましたが、追加のプラグインのみを使用して通常のfirefoxブラウザーでstubhub.comにアクセスすると、禁止されました。

編集:

Fiddlerを使用して送受信されているHTTPリクエストを表示すると、「偽のブラウザ」のリクエストの応答ヘッダーに「no-cache」が含まれていることがよくあります。

編集:

このような結果JavaScriptからSeleniumWebdriverページにいることを検出する方法はありますかますか?Webdriverを使用していることを検出する方法はないはずです。しかし、この証拠はそうではないことを示唆しています。

編集:

サイトはサーバーに指紋をアップロードしますが、確認したところ、セレンの指紋はクロムを使用した場合の指紋と同じです。

編集:

これは、サーバーに送信する指紋ペイロードの1つです。

{"appName":"Netscape","platform":"Linuxx86_64","cookies":1,"syslang":"en-US","userlang":"en-US","cpu":"","productSub":"20030107","setTimeout":1,"setInterval":1,"plugins":{"0":"ChromePDFViewer","1":"ShockwaveFlash","2":"WidevineContentDecryptionModule","3":"NativeClient","4":"ChromePDFViewer"},"mimeTypes":{"0":"application/pdf","1":"ShockwaveFlashapplication/x-shockwave-flash","2":"FutureSplashPlayerapplication/futuresplash","3":"WidevineContentDecryptionModuleapplication/x-ppapi-widevine-cdm","4":"NativeClientExecutableapplication/x-nacl","5":"PortableNativeClientExecutableapplication/x-pnacl","6":"PortableDocumentFormatapplication/x-google-chrome-pdf"},"screen":{"width":1600,"height":900,"colorDepth":24},"fonts":{"0":"monospace","1":"DejaVuSerif","2":"Georgia","3":"DejaVuSans","4":"TrebuchetMS","5":"Verdana","6":"AndaleMono","7":"DejaVuSansMono","8":"LiberationMono","9":"NimbusMonoL","10":"CourierNew","11":"Courier"}}

セレンとクロムで同じ

編集:

VPNは1回の使用で機能しますが、最初のページを読み込んだ後に検出されます。明らかに、Seleniumを検出するためにいくつかのjavascriptが実行されています。

19 answers

78
colossatr0n 2018-08-31 17:49.

Macユーザーの場合

cdc_VimまたはPerlを使用した変数の置き換え

あなたは使用することができますvim@Vic SeedoubleyewがERTI-クリスEelmaa @での回答で指摘したように、またはperl交換するために、cdc_変数をchromedriverその変数についての詳細を学ぶためにERTI-クリスEelmaa @で記事を参照してください)。ソースコードを再コンパイルしたり、16進エディターを使用しvimたりperlする必要がないようにする。chromedriver編集する前に、必ずオリジナルのコピーを作成してください。また、以下の方法はでテストされましたchromedriver version 2.41.578706


Vimの使用

vim /path/to/chromedriver

上記の行を実行した後、おそらく意味不明な言葉がたくさん表示されます。以下をせよ:

  1. cdc_入力して/cdc_を押して検索しますreturn
  2. を押して編集を有効にしaます。
  3. 任意の量を$cdc_lasutopfhvcZLmcfl削除し、削除されたものを同じ量の文字に置き換えます。そうしないと、chromedriver失敗します。
  4. 編集が終わったら、を押しescます。
  5. 変更を保存して終了するには、と入力して:wq!を押しreturnます。
  6. 変更を保存したくないが終了したい場合は、を入力して:q!を押しreturnます。
  7. 完了です。

変更された場所に移動し、chromedriverダブルクリックします。terminalウィンドウが開くはずです。killed出力に表示されない場合は、ドライバーを正常に変更しています。


Perlの使用

以下の行は次のように置き換えcdc_られdog_ます:

perl -pi -e 's/cdc_/dog_/g' /path/to/chromedriver

置換文字列の文字数が検索文字列と同じであることを確認してくださいchromedriver。そうでない場合、は失敗します。

Perlの説明

s///g 文字列を検索し、それをグローバルに別の文字列に置き換える(すべての出現箇所を置き換える)ことを示します。

例えば、 s/string/replacment/g

そう、

s/// 文字列の検索と置換を示します。

cdc_ 検索文字列です。

dog_ 置換文字列です。

g はグローバルキーであり、文字列のすべての出現箇所を置き換えます。

Perlの置き換えが機能したかどうかを確認する方法

次の行は、検索文字列が出現するたびに出力されますcdc_

perl -ne 'while(/cdc_/g){print "$&\n";}' /path/to/chromedriver

これが何も返さない場合cdc_は、置き換えられています。

逆に、これを使用することができます:

perl -ne 'while(/dog_/g){print "$&\n";}' /path/to/chromedriver

置換文字列、dog_chromedriverバイナリに含まれているかどうかを確認します。そうである場合、置換文字列がコンソールに出力されます。

変更された場所に移動し、chromedriverダブルクリックします。terminalウィンドウが開くはずです。killed出力に表示されない場合は、ドライバーを正常に変更しています。


まとめ

chromedriverバイナリを変更した後、変更されたchromedriverバイナリの名前がchromedriver、であること、および元のバイナリが元の場所から移動されたか、名前が変更されていることを確認してください。


この方法での私の経験

以前、ログインしようとしたときにWebサイトで検出されていましたがcdc_、同じサイズの文字列に置き換えた後、ログインできました。他の人が言っているように、すでに検出されている場合は、この方法を使用した後でも、他の多くの理由があります。そのため、VPN、別のネットワーク、またはあなたが持っているものを使用して、あなたを検出していたサイトにアクセスしてみる必要があるかもしれません。

162
Erti-Chris Eelmaa 2016-12-20 00:14.

基本的に、セレン検出が機能する方法は、セレンで実行したときに表示される事前定義されたjavascript変数をテストすることです。ボット検出スクリプトは、通常、何も言葉を含む(ウィンドウオブジェクトの)変数のいずれかで「セレン」/「webdriverを」、とも呼ばれる文書変数に見える$cdc_とし$wdc_。もちろん、これはすべて、使用しているブラウザによって異なります。すべての異なるブラウザは異なるものを公開します。

私はchromeを使用していたので、$cdc_ドキュメント変数として存在しなくなったことを確認するだけで、出来上がり(chromedriverソースコードをダウンロードし、chromedriverを変更して、$cdc_別の名前で再コンパイルします)。

これは私がchromedriverで変更した関数です:

call_function.js:

function getPageCache(opt_doc) {
  var doc = opt_doc || document;
  //var key = '$cdc_asdjflasutopfhvcZLmcfl_';
  var key = 'randomblabla_';
  if (!(key in doc))
    doc[key] = new Cache();
  return doc[key];
}

(コメントに注意してください、私が$cdc_したすべては私が向けましたrandomblabla_

これは、ボットネットワークが使用する可能性のあるいくつかの手法を示す擬似コードです。

runBotDetection = function () {
    var documentDetectionKeys = [
        "__webdriver_evaluate",
        "__selenium_evaluate",
        "__webdriver_script_function",
        "__webdriver_script_func",
        "__webdriver_script_fn",
        "__fxdriver_evaluate",
        "__driver_unwrapped",
        "__webdriver_unwrapped",
        "__driver_evaluate",
        "__selenium_unwrapped",
        "__fxdriver_unwrapped",
    ];

    var windowDetectionKeys = [
        "_phantom",
        "__nightmare",
        "_selenium",
        "callPhantom",
        "callSelenium",
        "_Selenium_IDE_Recorder",
    ];

    for (const windowDetectionKey in windowDetectionKeys) {
        const windowDetectionKeyValue = windowDetectionKeys[windowDetectionKey];
        if (window[windowDetectionKeyValue]) {
            return true;
        }
    };
    for (const documentDetectionKey in documentDetectionKeys) {
        const documentDetectionKeyValue = documentDetectionKeys[documentDetectionKey];
        if (window['document'][documentDetectionKeyValue]) {
            return true;
        }
    };

    for (const documentKey in window['document']) {
        if (documentKey.match(/\$[a-z]dc_/) && window['document'][documentKey]['cache_']) {
            return true;
        }
    }

    if (window['external'] && window['external'].toString() && (window['external'].toString()['indexOf']('Sequentum') != -1)) return true;

    if (window['document']['documentElement']['getAttribute']('selenium')) return true;
    if (window['document']['documentElement']['getAttribute']('webdriver')) return true;
    if (window['document']['documentElement']['getAttribute']('driver')) return true;

    return false;
};

ユーザー@szxによると、16進エディターでchromedriver.exeを開くだけで、実際にコンパイルせずに手動で置換することもできます。

107
alecxe 2015-10-29 13:39.

質問と投稿された回答ですでに理解しているように、ここでは「DistilNetworks」と呼ばれるアンチWebスクレイピングとボット検出サービスが機能しています。そして、会社のCEOのインタビューによると:

彼らは新しいボットを作成できますが、使用しているツールであるSeleniumを識別する方法を見つけたため、そのボットを何度繰り返してもSeleniumをブロックしています。現在、Pythonとさまざまなテクノロジーを使用してこれを行っています。あるタイプのボットからパターンが出現するのを確認したら、それらが使用するテクノロジーをリバースエンジニアリングし、悪意のあるものとして識別します。

彼らがセレンをどれだけ正確に検出しているかを理解するには、時間と追加の課題が必要ですが、現時点で確実に言えることは次のとおりです。

  • これは、セレンで実行するアクションとは関係ありません。サイトに移動すると、すぐに検出されて禁止されます。アクション間に人為的なランダムな遅延を追加しようとしましたが、ページが読み込まれた後に一時停止してください-何も役に立ちませんでした
  • それはブラウザの指紋でもありません-クリーンなプロファイルで複数のブラウザで試してみましたが、シークレットモードではありません-何も役に立ちませんでした
  • インタビューのヒントによると、これは「リバースエンジニアリング」だったので、これはブラウザで実行されているJSコードで行われていると思われます。これは、セレンWebドライバを介して自動化されたブラウザであることを示しています。

明らかに次の理由から、回答として投稿することにしました。

chromedriverでSeleniumを使用していることをWebサイトで検出できますか?

はい。


また、私が実験していないのは、古いセレンと古いブラウザバージョンです。理論的には、DistilNetworksボット検出器が現在依存している特定の時点でセレンに実装/追加されたものがある可能性があります。次に、これが当てはまる場合、関連する変更が行われたポイント/バージョンを検出し(ええ、検出器を検出しましょう)、変更ログと変更セットを調べます。これにより、どこを見ればよいかについての詳細情報が得られる可能性があります。そして、彼らはWebdriverを利用したブラウザを検出するために何を使用していますか。テストする必要があるのは単なる理論です。

26
aianitro 2016-09-12 13:21.

wellsfargo.comでの実装方法の例:

try {
 if (window.document.documentElement.getAttribute("webdriver")) return !+[]
} catch (IDLMrxxel) {}
try {
 if ("_Selenium_IDE_Recorder" in window) return !+""
} catch (KknKsUayS) {}
try {
 if ("__webdriver_script_fn" in document) return !+""
18
ShayanKM 2018-12-06 02:56.

JavaScriptの結果を難読化する

chromedriverのソースコードを確認しました。これにより、いくつかのjavascriptファイルがブラウザに挿入されます。
このリンクのすべてのJavaScriptファイルはWebページに挿入されます: https //chromium.googlesource.com/chromium/src/+/master/chrome/test/chromedriver/js/

そこで、リバースエンジニアリングを使用し、16進編集によってjsファイルを難読化しました。これで、セレンの活動を明らかにするために、JavaScript変数、関数名、固定文字列が使用されなくなったと確信しました。しかし、それでもいくつかのサイトとreCaptchaはセレンを検出します!
たぶん彼らはchromedriverjsの実行によって引き起こされた変更をチェックします:)


編集1:

Chromeの「ナビゲーター」パラメーターの変更

'navigator'には、chromedriverの使用法を簡単に明らかにするいくつかのパラメーターがあることを発見しました。これらはパラメータです:

  • 「navigator.webdriver」非自動モードでは、「未定義」です。自動モードでは、「true」です。
  • 「navigator.plugins」ヘッドレスクロームの長さは0です。そこで、プラグインの長さチェックプロセスをだますために、いくつかの偽の要素を追加しました。
  • " navigator.languages"はデフォルトのクロム値 '["en-US"、 "en"、 "es"]'に設定されました。

だから私が必要としたのは、Webページでjavascriptを実行するためのChrome拡張機能でした。記事で提供されているSeleniumを使用したJavascriptNavigatorオブジェクトの変更を使用して拡張機能を作成し、Seleniumでの拡張機能の使用(Python)を使用してzip形式の拡張機能をプロジェクトに追加しました。値を正常に変更しました。しかし、それでも何も変わりません!

これらのような他の変数は見つかりませんでしたが、それらが存在しないという意味ではありません。それでもreCaptchaはchromedriverを検出するので、変更する変数がもっとあるはずです。次のステップは、私はしたくないことを検出サービスのリバースエンジニアリングする必要があります。

では、この自動化プロセスにもっと時間を費やしたり、別の方法を探したりする価値があるかどうかわかりません。

15
DebanjanB 2020-06-23 07:29.

Seleniumとは何ですか?WebDriverとは何ですか?制御されたChromeDriverがChromeまたはChromiumを必要としないのはなぜですか?によって駆動されていることが検出されたWebサイトについて、多くの分析と議論が行われています。これが私の2セントです:

記事によると、さまざまなWebページまたはサービスをさまざまなブラウザに提供するユーザーエージェント使用したブラウザ検出は、通常、最良のアイデアの1つではありません。Webは、ユーザーが使用しているブラウザーやデバイスに関係なく、すべての人がアクセスできるようになっています。特定のブラウザをターゲットにするのではなく、機能の可用性に基づいて徐々にそれ自体を強化するWebサイトを開発するためのベストプラクティスが概説されています。

ただし、ブラウザーと標準は完全ではなく、一部のWebサイトがブラウザーを検出し、ブラウザーがSeleniumで制御されるセレンのChromeDriverとWebDriverの違いは何ですか?によって駆動されている場合は、まだいくつかのエッジケースがあります。ブラウザはさまざまな方法で検出でき、一般的に使用されるメカニズムは次のとおりです。

関連する詳細な説明recaptcha 3は、私がセレン/クロムドライバーを使用していることをどのように認識しますか?ことができますrecaptcha 3は、私がセレン/クロムドライバーを使用していることをどのように認識しますか?

  • 用語の検出HeadlessChromeを内部にヘッドレスクロームのUserAgent

関連する詳細な説明はLinuxでヘッドレスChromeを使用して拒否されたページにアクセスし、ヘッド付きChromeはPythonを介してSeleniumを使用するWindowsで動作します

関連する詳細な説明は、「Seleniumを使用してChaseサイトのログインを自動化できません

  • 使用してボットManagerサービスをからアカマイ

SeleniumとPythonを使用して値が渡されると、動的ドロップダウンにhttps://www.nseindia.com/の自動提案が表示されません。で、関連する詳細な説明を見つけることができます。SeleniumとPythonを使用して値が渡されると、動的ドロップダウンにhttps://www.nseindia.com/の自動提案が表示されません。

  • 使用してボット保護サービスをからDatadome

DataDomeを使用しているWebサイトは、SeleniumとPythonを使用してスクレイピング中にキャプチャがブロックされますしてDataDomeを使用しているWebサイトは、SeleniumとPythonを使用してスクレイピング中にキャプチャがブロックされます関連する詳細なディスカッションを見つけることができますDataDomeを使用しているWebサイトは、SeleniumとPythonを使用してスクレイピング中にキャプチャがブロックされます

ただし、ユーザーエージェントを使用してブラウザーを検出するのは簡単に見えますが、それをうまく行うのは実際には少し難しいです。

:この時点で言及する価値があります:ユーザーエージェントスニッフィングを使用することはめったに良い考えではありません。特定の問題に対処するには、常により優れた、より広く互換性のある方法があります。


ブラウザ検出に関する考慮事項

ブラウザの検出の背後にある考え方は、次のいずれかになります。

  • Webブラウザの特定のバリアントまたは特定のバージョンの特定のバグを回避しようとしています。
  • 一部のブラウザがまだサポートしていない特定の機能の存在を確認しようとしています。
  • 使用しているブラウザに応じて異なるHTMLを提供しようとしています。

UserAgentsによるブラウザ検出の代替手段

ブラウザ検出の代替手段のいくつかは次のとおりです。

  • ブラウザが機能のAPIをどのように実装しているかを検出し、そこからどのように使用するかを決定するためのテストを実装します。例として、正規表現でのChromeのフラグなしの実験的なルックビハインドサポートがあります
  • プログレッシブエンハンスメントの設計手法を採用します。これには、ボトムアップアプローチを使用して、より単純なレイヤーから開始し、それぞれがより多くの機能を使用する連続するレイヤーでサイトの機能を向上させる、レイヤーでのWebサイトの開発が含まれます。
  • グレースフルデグラデーションのトップダウンアプローチを採用し、必要すべての機能を使用して可能な限り最高のサイトを構築し、それを微調整して古いブラウザーで機能するようにします。

解決

Selenium駆動のWebDriverが検出されないようにするために、ニッチなアプローチには、以下のアプローチのいずれか/すべてが含まれます。

  • 回転のUserAgentをあなたのすべての実行中にテストスイート使用してfake_useragent、以下のようにモジュール:

    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    from fake_useragent import UserAgent
    
    options = Options()
    ua = UserAgent()
    userAgent = ua.random
    print(userAgent)
    options.add_argument(f'user-agent={userAgent}')
    driver = webdriver.Chrome(chrome_options=options, executable_path=r'C:\WebDrivers\ChromeDriver\chromedriver_win32\chromedriver.exe')
    driver.get("https://www.google.co.in")
    driver.quit()
    

SeleniumでGoogleChromeユーザーエージェントを変更する方法は?する方法で、関連する詳細な説明を見つけることができますSeleniumでGoogleChromeユーザーエージェントを変更する方法は?

  • 次のように使用して、各テストUserAgentをローテーションします。Network.setUserAgentOverrideexecute_cdp_cmd()

    from selenium import webdriver
    
    driver = webdriver.Chrome(executable_path=r'C:\WebDrivers\chromedriver.exe')
    print(driver.execute_script("return navigator.userAgent;"))
    # Setting user agent as Chrome/83.0.4103.97
    driver.execute_cdp_cmd('Network.setUserAgentOverride', {"userAgent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36'})
    print(driver.execute_script("return navigator.userAgent;"))
    

関連する詳細な説明は、SeleniumとPythonを使用してユーザーエージェントを変更する方法

  • Webdriverのプロパティ値を次のように変更します。navigatorundefined

    driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
      "source": """
        Object.defineProperty(navigator, 'webdriver', {
          get: () => undefined
        })
      """
    })
    

関連する詳細な説明は、Selenium webdriver:seleniumの検出を防ぐためにnavigator.webdriverフラグを変更

  • 値を変更navigator.pluginsnavigator.languagesWebGLのヘアライン機能画像の欠落など

関連する詳細な説明検出できないバージョンのSeleniumWebdriverはありますか?

関連する詳細な説明はSeleniumとPythonでGoogleのキャプチャをバイパスする方法は?するSeleniumとPythonでGoogleのキャプチャをバイパスする方法は?


reCAPTCHAへの対処

2captcharecaptcha-v3を扱っている間、私はロボットはないというテキスト関連付けられたチェックボックスをクリックするのではなく、を抽出して使用することで認証を取得する方が簡単な場合がありdata-sitekeyます。

関連する詳細な説明はSeleniumおよびPythonリクエストを使用してプログラムで有効な応答を取得するために、ReCaptcha V2の32ビットデータサイトキーを識別する方法は?

14
Kobi K 2015-10-29 06:39.

クロムの特定のユーザープロファイルでセレンを使用してみてください。そうすれば、特定のユーザーとして使用して、必要なものを定義できます。そうすることで、「実際の」ユーザーとして実行されます。プロセスエクスプローラーでクロムプロセスを確認してください。タグとの違いがわかります。

例えば:

username = os.getenv("USERNAME")
userProfile = "C:\\Users\\" + username + "\\AppData\\Local\\Google\\Chrome\\User Data\\Default"
options = webdriver.ChromeOptions()
options.add_argument("user-data-dir={}".format(userProfile))
# add here any tag you want.
options.add_experimental_option("excludeSwitches", ["ignore-certificate-errors", "safebrowsing-disable-download-protection", "safebrowsing-disable-auto-update", "disable-client-side-phishing-detection"])
chromedriver = "C:\Python27\chromedriver\chromedriver.exe"
os.environ["webdriver.chrome.driver"] = chromedriver
browser = webdriver.Chrome(executable_path=chromedriver, chrome_options=options)

クロームタグリストはこちら

13
bryce 2017-01-28 13:05.

partial interface Navigator { readonly attribute boolean webdriver; };

ナビゲーターインターフェイスのwebdriverIDL属性は、webdriver-activeフラグの値を返す必要があります。これは最初はfalseです。

このプロパティにより、Webサイトは、ユーザーエージェントがWebDriverによって制御されていることを確認でき、サービス拒否攻撃を軽減するために使用できます。

2017 W3C Editor's Draft ofWebDriverから直接引用。これは、少なくとも、セレンのドライバーの将来の反復が誤用を防ぐために識別可能であることを強く意味します。結局のところ、ソースコードがないと、特定のChromeドライバーを正確に検出できる原因を特定するのは困難です。

8
deamentiaemundi 2015-10-28 13:44.

Firefoxはwindow.navigator.webdriver === true、Webドライバーを使用している場合に設定されると言われています。これは古い仕様の1つ(例:archive.org)によるものでしたが、付録の非常にあいまいな表現を除いて、新しい仕様では見つかりませんでした。

それのテストはファイルfingerprint_test.jsのセレンコードにあり、最後のコメントは「現在Firefoxでのみ実装されています」と言っていますが、いくつかの簡単な操作でその方向のコードを特定することはできませんgrepでした。現在(41.0.2)FirefoxリリースツリーにもChromiumツリーにもありません。

また、2015年1月のFirefoxドライバーb82512999938でのフィンガープリントに関する古いコミットに対するコメントを見つけました。そのコードはまだSeleniumGITにあります-マスターは昨日ダウンロードさjavascript/firefox-driver/extension/content/server.jsれ、現在のw3cWebドライバー仕様のわずかに異なる言葉の付録にリンクするコメントが付いています。

8
FDG 2019-01-29 04:47.

@ Erti-Chris Eelmaaのすばらしい答えに加えて、煩わしくwindow.navigator.webdriver、読み取り専用です。値を変更した場合のイベントfalseには、まだがありtrueます。そのため、自動化されたソフトウェアによって駆動されるブラウザを引き続き検出できます。 MDN

変数は--enable-automationchromeのフラグによって管理されます。chromedriverはそのフラグでchromeを起動し、chromeはをに設定window.navigator.webdrivertrueます。あなたはここでそれを見つけることができます。「スイッチの除外」にフラグを追加する必要があります。たとえば(golang):

package main

import (
    "github.com/tebeka/selenium"
    "github.com/tebeka/selenium/chrome"
)

func main() {

caps := selenium.Capabilities{
    "browserName": "chrome",
}

chromeCaps := chrome.Capabilities{
    Path:            "/path/to/chrome-binary",
    ExcludeSwitches: []string{"enable-automation"},
}
caps.AddChrome(chromeCaps)

wd, err := selenium.NewRemote(caps, fmt.Sprintf("http://localhost:%d/wd/hub", 4444))
}
8
Adi Ohana 2019-04-04 05:12.

私が見つけたもう1つのことは、一部のWebサイトがユーザーエージェントをチェックするプラットフォームを使用していることです。値に「HeadlessChrome」が含まれている場合、ヘッドレスモードを使用すると動作がおかしくなる可能性があります。

そのための回避策は、たとえばJavaでユーザーエージェントの値をオーバーライドすることです。

chromeOptions.addArguments("--user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36");
6
Bassel Samman 2015-10-24 13:28.

Webアプリケーションファイアウォールの背後にあるようです。modsecurityとowaspを見て、それらがどのように機能するかを確認してください。実際には、あなたが求めているのは、ボット検出の回避を行う方法です。それはセレンWebドライバーの目的ではありません。これは、他のWebアプリケーションにヒットしないようにWebアプリケーションをテストするためのものです。可能ですが、基本的には、WAFがルールセットで何を探すかを確認し、可能であればセレンでそれを具体的に回避する必要があります。それでも、使用しているWAFがわからないため、機能しない可能性があります。あなたは正しい最初のステップを実行しました。それはユーザーエージェントを偽造することです。それでもうまくいかなかった場合は、WAFが導入されているので、もっと注意が必要です。

編集:他の答えから取られたポイント。最初に、ユーザーエージェントが実際に正しく設定されていることを確認してください。たぶん、それはローカルWebサーバーにヒットするか、発信するトラフィックを盗聴します。

6
M3RS 2018-04-12 08:41.

私が見たボット検出は、以下の回答で読んだものよりも洗練されているか、少なくとも異なっているようです。

実験1:

  1. PythonコンソールからSeleniumを使用してブラウザーとWebページを開きます。
  2. マウスは、ページが読み込まれるとリンクが表示されることがわかっている特定の場所にすでにあります。マウスを動かすことはありません。
  3. マウスの左ボタンを1回押します(これは、Pythonが実行されているコンソールからブラウザーにフォーカスを移すために必要です)。
  4. マウスの左ボタンをもう一度押します(カーソルが特定のリンクの上にあることを思い出してください)。
  5. リンクは正常に開きます。

実験2:

  1. 以前と同じように、PythonコンソールからSeleniumを使用してブラウザーとWebページを開きます。

  2. 今回は、マウスでクリックする代わりに、(Pythonコンソールで)Seleniumを使用して、ランダムなオフセットで同じ要素をクリックします。

  3. リンクが開きませんが、サインアップページに移動します。

影響:

  • Seleniumを介してWebブラウザーを開くことは、私が人間のように見えることを妨げるものではありません。
  • 人間のようにマウスを動かすことは、人間として分類される必要はありません
  • オフセットのあるSeleniumを介して何かをクリックしても、アラームが発生します

不思議なようですが、ブラウザ自体がSelenium経由で開かれたかどうかは気にせず、アクションがSeleniumから発生したものかどうかを判断できると思います。または、ウィンドウにフォーカスがあるかどうかを判断できますか?誰かが何か洞察を持っているかどうか聞くのは興味深いでしょう。

5
lfaraone 2015-10-26 12:01.

すべての適切なデータを送信している場合でも(たとえば、Seleniumが拡張機能として表示されない、妥当な解像度/ビット深度があるなど)、訪問者の行動をプロファイルして、次のことを判断するためのサービスやツールが多数あります。アクターはユーザーまたは自動システムです。

たとえば、サイトにアクセスしてすぐに、マウスを関連するボタンに直接移動することで、1秒以内に何らかのアクションを実行することは、ユーザーが実際に行うことのないことです。

https://panopticlick.eff.org/などのサイトを使用してブラウザの一意性を確認することもデバッグツールとして役立つ場合があります。また、Seleniumで実行していることを示す特定のパラメーターがあるかどうかを確認するのにも役立ちます。

4
PC3TJ 2015-10-28 18:10.

次のコードでhtmlページを記述します。DOMでは、seleniumがouterHTMLにwebdriver属性を適用していることがわかります。

<html>
<head>
  <script type="text/javascript">
  <!--
    function showWindow(){
      javascript:(alert(document.documentElement.outerHTML));
    }
  //-->
  </script>
</head>
<body>
  <form>
    <input type="button" value="Show outerHTML" onclick="showWindow()">
  </form>
</body>
</html>

4
Néstor 2017-08-22 23:52.

一部のサイトはこれを検出しています:

function d() {
try {
    if (window.document.$cdc_asdjflasutopfhvcZLmcfl_.cache_)
        return !0
} catch (e) {}

try {
    //if (window.document.documentElement.getAttribute(decodeURIComponent("%77%65%62%64%72%69%76%65%72")))
    if (window.document.documentElement.getAttribute("webdriver"))
        return !0
} catch (e) {}

try {
    //if (decodeURIComponent("%5F%53%65%6C%65%6E%69%75%6D%5F%49%44%45%5F%52%65%63%6F%72%64%65%72") in window)
    if ("_Selenium_IDE_Recorder" in window)
        return !0
} catch (e) {}

try {
    //if (decodeURIComponent("%5F%5F%77%65%62%64%72%69%76%65%72%5F%73%63%72%69%70%74%5F%66%6E") in document)
    if ("__webdriver_script_fn" in document)
        return !0
} catch (e) {}
3
pguardiario 2018-12-02 15:32.

Seleniumでそれを行う最も簡単な方法は、ブラウザーのフィンガープリントを送り返すXHRをインターセプトすることだと私には思えます。

ただし、これはSeleniumのみの問題であるため、他のものを使用する方がよいでしょう。セレンは、このようなことをそれほど難しくするのではなく、簡単にすることになっています。

3
Juliagu 2019-05-04 04:36.

javascriptの「key」変数を次のように変更していることがわかりました。

//Fools the website into believing a human is navigating it
        ((JavascriptExecutor)driver).executeScript("window.key = \"blahblah\";");

多くのサイトがSeleniumによって廃棄されないようにするためにこの変数をチェックするため、GoogleChromeと一緒にSeleniumWebdriverを使用する場合に一部のWebサイトで機能します。

1
Sergiy Matvienko 2020-01-11 01:57.

パラメータ「enable-automation」の使用を試みることができます

var options = new ChromeOptions();

// hide selenium
options.AddExcludedArguments(new List<string>() { "enable-automation" });

var driver = new ChromeDriver(ChromeDriverService.CreateDefaultService(), options);

ただし、この機能はChromeDriver79.0.3945.16で修正されていることを警告したいと思います。したがって、おそらく古いバージョンのクロムを使用する必要があります。

また、別のオプションとして、Chromeの代わりにInternetExplorerDriverを使用してみることができます。私の場合、IEはハッキングなしではまったくブロックしません。

詳細については、こちらをご覧ください。

Selenium webdriver:seleniumの検出を防ぐためにnavigator.webdriverフラグを変更

Chromev76内の「Chromeは自動化されたソフトウェアによって制御されています」情報バーを非表示にできません

Related questions

MORE COOL STUFF

Reba McEntire は、彼女が息子の Shelby Blackstock と共有する「楽しい」クリスマスの伝統を明らかにしました:「私たちはたくさん笑います」

Reba McEntire は、彼女が息子の Shelby Blackstock と共有する「楽しい」クリスマスの伝統を明らかにしました:「私たちはたくさん笑います」

Reba McEntire が息子の Shelby Blackstock と共有しているクリスマスの伝統について学びましょう。

メーガン・マークルは、自然な髪のスタイリングをめぐってマライア・キャリーと結ばれました

メーガン・マークルは、自然な髪のスタイリングをめぐってマライア・キャリーと結ばれました

メーガン・マークルとマライア・キャリーが自然な髪の上でどのように結合したかについて、メーガンの「アーキタイプ」ポッドキャストのエピソードで学びましょう.

ハリー王子は家族との関係を修復できるという「希望を持っている」:「彼は父親と兄弟を愛している」

ハリー王子は家族との関係を修復できるという「希望を持っている」:「彼は父親と兄弟を愛している」

ハリー王子が家族、特にチャールズ王とウィリアム王子との関係について望んでいると主張したある情報源を発見してください。

ワイノナ・ジャッドは、パニックに陥った休暇の瞬間に、彼女がジャッド家の家長であることを認識しました

ワイノナ・ジャッドは、パニックに陥った休暇の瞬間に、彼女がジャッド家の家長であることを認識しました

ワイノナ・ジャッドが、母親のナオミ・ジャッドが亡くなってから初めての感謝祭のお祝いを主催しているときに、彼女が今では家長であることをどのように認識したかを学びましょう.

セントヘレナのジェイコブのはしごを登るのは、気弱な人向けではありません

セントヘレナのジェイコブのはしごを登るのは、気弱な人向けではありません

セント ヘレナ島のジェイコブズ ラダーは 699 段の真っ直ぐ上る階段で、頂上に到達すると証明書が発行されるほどの難易度です。

The Secrets of Airline Travel Quiz

The Secrets of Airline Travel Quiz

Air travel is far more than getting from point A to point B safely. How much do you know about the million little details that go into flying on airplanes?

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

バイオニック読書はあなたをより速く読むことができますか?

バイオニック読書はあなたをより速く読むことができますか?

BionicReadingアプリの人気が爆発的に高まっています。しかし、それは本当にあなたを速読術にすることができますか?

オーケーグッド770HPランボルギーニセンテナリオは十分に正気ではない

オーケーグッド770HPランボルギーニセンテナリオは十分に正気ではない

ランボルギーニの創設者であるフェルッチオランボルギーニが100歳になるのは毎日ではありません(そうです、彼は死んでいて、まだ死んでいると思います。

彼らが買った1台の車からAppleの車の計画について私たちが推測できること

彼らが買った1台の車からAppleの車の計画について私たちが推測できること

Appleが自動車分野に参入するという噂はかなり前から渦巻いており、AppleウォッチャーがSixtyEight Researchという会社がAppleの自動車研究開発のシェル会社である可能性が高いと判断したとき、その渦巻きは本当に渦巻いた。また、会社が購入した車は1台だけであることが知られており、その車はAppleが何を考えているかについての手がかりでいっぱいになる可能性があることも伝えています。

天文学者は太陽系の9番目の惑星の新しい証拠を見つけます

天文学者は太陽系の9番目の惑星の新しい証拠を見つけます

太陽系の外側にある架空の大きな物体である惑星Xの探索は、何十年にもわたって人間を魅了してきました。その検索の最新の章は、地球の10倍の大きさで、公転周期が15であるほど遠くにある惑星を指しています。

キャムニュートン、ゴッドダム

キャムニュートン、ゴッドダム

カムニュートンは昨日、簡単な265ヤードと3回のタッチダウンでファルコンズを引き裂き、別の素晴らしいゲームをしました。その日のハイライトは、上のタッチダウンスローでした。これは、視聴するたびにばかげているだけです。

米国のフィギュア スケートは、チーム イベントでの最終決定の欠如に「苛立ち」、公正な裁定を求める

米国のフィギュア スケートは、チーム イベントでの最終決定の欠如に「苛立ち」、公正な裁定を求める

ロシアのフィギュアスケーター、カミラ・バリエバが関与したドーピング事件が整理されているため、チームは2022年北京冬季オリンピックで獲得したメダルを待っています。

Amazonの買い物客は、わずか10ドルのシルクの枕カバーのおかげで、「甘やかされた赤ちゃんのように」眠れると言っています

Amazonの買い物客は、わずか10ドルのシルクの枕カバーのおかげで、「甘やかされた赤ちゃんのように」眠れると言っています

何千人ものAmazonの買い物客がMulberry Silk Pillowcaseを推奨しており、現在販売中. シルクの枕カバーにはいくつかの色があり、髪を柔らかく肌を透明に保ちます。Amazonで最大46%オフになっている間にシルクの枕カバーを購入してください

パデュー大学の教授が覚醒剤を扱った疑いで逮捕され、女性に性的好意を抱かせる

パデュー大学の教授が覚醒剤を扱った疑いで逮捕され、女性に性的好意を抱かせる

ラファイエット警察署は、「不審な男性が女性に近づいた」という複数の苦情を受けて、12 月にパデュー大学の教授の捜査を開始しました。

コンセプト ドリフト: AI にとって世界の変化は速すぎる

コンセプト ドリフト: AI にとって世界の変化は速すぎる

私たちの周りの世界と同じように、言語は常に変化しています。以前の時代では、言語の変化は数年または数十年にわたって発生していましたが、現在では数日または数時間で変化する可能性があります。

SF攻撃で91歳のアジア人女性が殴られ、コンクリートに叩きつけられた

犯罪擁護派のオークランドが暴力犯罪者のロミオ・ロレンゾ・パーハムを釈放

SF攻撃で91歳のアジア人女性が殴られ、コンクリートに叩きつけられた

認知症を患っている 91 歳のアジア人女性が最近、47 番街のアウター サンセット地区でロメオ ロレンゾ パーハムに襲われました。伝えられるところによると、被害者はサンフランシスコの通りを歩いていたところ、容疑者に近づき、攻撃を受け、暴行を受けました。

ℝ

“And a river went out of Eden to water the garden, and from thence it was parted and became into four heads” Genesis 2:10. ? The heart is located in the middle of the thoracic cavity, pointing eastward.

メリック・ガーランドはアメリカに失敗しましたか?

バイデン大統領の任期の半分以上です。メリック・ガーランドは何を待っていますか?

メリック・ガーランドはアメリカに失敗しましたか?

人々にチャンスを与えることは、人生で少し遅すぎると私は信じています。寛大に。

Language