[解決済み] chromedriverでSeleniumを使用していることをWebサイトで検出することはできますか?
質問
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
上の行を実行した後、おそらくたくさんのちんぷんかんぷんな文字が表示されるでしょう。次のようにしてください。
-
のインスタンスをすべて置き換えます。
cdc_
をdog_
と入力することで:%s/cdc_/dog_/g
.-
dog_
はほんの一例です。検索文字列と同じ文字数であれば、何を選んでもかまいません(例.cdc_
) でなければchromedriver
は失敗します。
-
-
変更を保存して終了するには、次のように入力します。
: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や別のネットワークなどを使って、検出されたサイトにアクセスしてみる必要があるかもしれません。
関連
-
[解決済み】Angular JS Uncaught Error。[インジェクター:モジュラー]。
-
[解決済み】JavaScriptのisset()に相当するもの
-
[解決済み】webpack-dev-serverにリモート接続すると、「Invalid Host header」というメッセージが表示されます。
-
[解決済み】ある要素を別の要素に移動させるには?
-
[解決済み】React.jsの配列の子要素のユニークキーを理解する
-
[解決済み】SyntaxError: JSON の位置 1 に予期しないトークン o があります。
-
[解決済み】Uncaught SyntaxError: JSON の位置 0 に予期しないトークン u があります。
-
[解決済み】FirefoxでGoogle Maps V3をリモートで使用すると「googleが定義されていません」と表示される。
-
[解決済み】中央値の計算 - javascript
-
[解決済み] encodeURI / encodeURIComponentの代わりにescapeを使用するのはどのような場合ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Heroku:ノードアプリで「このアプリにはデフォルトの言語が検出されませんでした」エラーがスローされる
-
[解決済み】Uncaught ReferenceError: angular is not defined - AngularJSが動作しない。
-
[解決済み】XMLHttpRequestモジュールが定義されていない/見つからない
-
[解決済み】JavaScriptのgetElementByNameが機能しない
-
[解決済み] React with ES7: Uncaught TypeError: Cannot read property 'state' of undefined [duplicate] (未定義のプロパティ'state'を読み込むことはできません。
-
[解決済み】JavaScript ランタイムエラー:'$'が未定義です。
-
[解決済み】JavaScriptで相対URLへのリダイレクトを行う
-
[解決済み】'useState' が定義されていない no-undef React
-
[解決済み】HTMLの最初の行に予期しないトークン<がある。
-
[解決済み】 \u003C とは何ですか?