1. ホーム
  2. ジャバスクリプト

[解決済み] chromedriverでSeleniumを使用していることをWebサイトで検出することはできますか?

2022-03-04 16:42:26

質問

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')

stubhubをブラウズすると、1~2回のリクエストでリダイレクトされ、「ブロック」されます。これを調査してみたのですが、ユーザーがSeleniumを使用していることをどうやって見分けるのかが分かりません。

どうやっているんだろう?

FirefoxにSelenium IDEプラグインをインストールし、プラグインだけを追加した状態で通常のFirefoxブラウザでstubhub.comにアクセスするとBANされました。

Fiddlerを使って前後に送信されるHTTPリクエストを表示すると、「偽ブラウザの」リクエストにはしばしばレスポンス・ヘッダーに「no-cache」があることに気づきました。

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

このサイトではフィンガープリントをサーバーにアップロードしていますが、確認したところSeleniumのフィンガープリントはChrome使用時のフィンガープリントと同じでした。

これは、彼らがサーバーに送信するフィンガープリントのペイロードの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":"WidevineContentDecryptionMo
dule","3":"NativeClient","4":"ChromePDFViewer"},"mimeTypes":
{"0":"application/pdf","1":"ShockwaveFlashapplication/x-shockwave-
flash","2":"FutureSplashPlayerapplication/futuresplash","3":"WidevineContent
DecryptionModuleapplication/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":"Trebu
chetMS","5":"Verdana","6":"AndaleMono","7":"DejaVuSansMono","8":"LiberationM
ono","9":"NimbusMonoL","10":"CourierNew","11":"Courier"}}

SeleniumでもChromeでも同じです。

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

解決方法は?

置き換え cdc_ 文字列

を使用することができます。 vim または perl を置き換えるために cdc_ の文字列を chromedriver . 参照 Erti-Chris Eelmaa氏による回答 この文字列の詳細と、それがどのように検出ポイントになるかを知るには .

使用方法 vim または perl を使用すると、ソースコードの再コンパイルやHEXエディタを使用する必要がなくなります。

必ずコピーしてください chromedriver 編集を試みる前に

私たちの目的は cdc_ のような文字列です。 $cdc_lasutopfhvcZLmcfl .

以下のメソッドは chromedriver version 2.41.578706 .


Vimを使う

vim /path/to/chromedriver

上の行を実行した後、おそらくたくさんのちんぷんかんぷんな文字が表示されるでしょう。次のようにしてください。

  1. のインスタンスをすべて置き換えます。 cdc_dog_ と入力することで :%s/cdc_/dog_/g .
    • dog_ はほんの一例です。検索文字列と同じ文字数であれば、何を選んでもかまいません(例. cdc_ ) でなければ chromedriver は失敗します。
  2. 変更を保存して終了するには、次のように入力します。 :wq! をクリックし return .
    • 変更を保存せずに終了する必要がある場合は、次のように入力します。 :q! をクリックし return .

Perlを使う

以下の行は、すべての cdc_ が出現するのは dog_ . クレジット ビックシードゥブリュー :

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

必ず置換文字列(例. dog_ )は、検索文字列と同じ文字数(例. cdc_ ) である場合、それ以外の場合は chromedriver は失敗します。


まとめ

のすべての出現を確認するために cdc_ が置き換えられました。

grep "cdc_" /path/to/chromedriver

出力が返されなければ、置換は成功したことになる。

変更された chromedriver をダブルクリックしてください。ターミナルウィンドウが開くはずです。もし killed が出力されれば、ドライバの変更は成功です。

変更した chromedriver バイナリは chromedriver で、元のバイナリが元の場所から移動されるか、名前が変更されることです。


この方法による私の経験

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