[解決済み] 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や別のネットワークなどを使って、検出されたサイトにアクセスしてみる必要があるかもしれません。
関連
-
HTML+CSS+JavaScriptで簡単な三目並べゲームを作成する。
-
vueが定義するプライベートフィルタと基本的な使い方
-
Vueのクラススタイルの使い方の詳細
-
Vueのフィルタの説明
-
[解決済み] Error : 未定義のプロパティ 'map' を読み取ることができません。
-
[解決済み】ERROR エラーです。スイッチのname属性が指定されていないフォームコントロールの値アクセッサがない
-
[解決済み】<select>で現在選択されている<option>をJavaScriptで取得するにはどうすればよいですか?
-
モジュールのビルドに失敗しました。Error: ENOENT: no such file or directory, scandir 'D:\.... \node_modules
-
OSSアップロードエラーを解決する: net::ERR_SSL_PROTOCOL_ERROR
-
[解決済み] 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 実装 サイバーパンク風ボタン
おすすめ
-
vue3レスポンシブ対応のためのsetup+ref+reactive
-
fetch ネットワークリクエストラッパーの説明例
-
vue3.0プロジェクトのアーキテクチャを構築するための便利なツール
-
JavaScriptの配列共通メソッド解説
-
vueのプロジェクトでモックを使用する方法を知っていますか?
-
[解決済み】リソースの読み込みに失敗した:Bind関数でサーバーが500(Internal Server Error)のステータスで応答した【非公開
-
[解決済み】JavaScript TypeError: null のプロパティ 'style' を読み取ることができない
-
[解決済み] TypeError: $.ajax(...) is not a function?
-
[解決済み】ERROR エラーです。スイッチのname属性が指定されていないフォームコントロールの値アクセッサがない
-
[解決済み】エラー。Ionic使用中にモジュール '../lib/utils/unsupported.js' が見つかりませんでした。