これは私の最初のスタックオーバーフローの質問なので、ご容赦ください。
私は this SOの質問を読みました。疑問に思うのですが、chromedriverを完全に検出不可能にすることは可能ですか?
私自身の好奇心のために、説明した方法をテストしたところ、完全に匿名のブラウザを作成することはできなかったことがわかりました。
私はドライバーのドキュメントを読んで、これを見つけました:
partial interface Navigator { readonly attribute boolean webdriver; };
ナビゲーターインターフェースのwebdriver IDL属性は、webdriver-activeフラグの値を返す必要があります。これは最初はfalseです。
このプロパティにより、WebサイトはユーザーエージェントがWebDriverの制御下にあると判断でき、サービス拒否攻撃を緩和するために使用できます。
ただし、これらのタグがブラウザコンソールまたはソースコードでどこにあるかわかりません。
これがchromedriverの検出の原因であると想像しますが、ソースコードをくまなく調べた後、このインターフェイスを見つけることができませんでした。その結果、この機能が現在のChromedriverに含まれているかどうか疑問に思いました。そうでない場合でも、現在のChromedriverがウェブサイトや distill などの他のサービスで検出可能であることはわかっています。
ChromeDriverを検出できないDistilチェックポイント(これは stackoverflow post で適切に説明されています)を使用するには、ブラウザでウィンドウまたはドキュメントプロトタイプに変数が含まれていないことを確認する必要があります。あなたが言及するように、ウェブドライバーを使用しています。
ChromeDriverおよびChrome=と一緒にソフトウェアをSeleniumとして使用して、バイナリにいくつかの修正を加える限り使用できます。この方法は、ヘッドレスバージョンを使用する場合にのみ適用されます。 、ウィンドウ/レンダリングテストに合格するには、追加の測定を行う必要があります ここで説明 。
1。修正Chromeバイナリ、または古いバージョンを使用
最初に、navigator.webdriver
がTrueに設定されていることに対処しましょう。これは、ブラウザの「NavigatorAutomationInformation」の一部としてW3Cプロトコル here によって定義されており、ナビゲーターインターフェースを拡張しています。それを削除するには?そのプロジェクトには多くのファイル、サードパーティのもの、点滅するWebランタイムなどがあります。そのため、これがどのように機能するかを理解しようとするのではなく、Chromiumはオープンソースです。それ。 リンクはこちら 。これらのファイルに注意してください。
third_party/WebKit/Source/core/frame/Navigator.h
:コードの行を保持します。
`bool webdriver() const { return true; }`
This method is supossed to always return true, as you can see.
ナビゲーターの拡張機能を含むthird_party/WebKit/Source/core/frame/Navigator.idl
には、
`Navigator implements NavigatorAutomationInformation;`
which is being commited. Interesting, isn't it?
third_party/WebKit/Source/core/frame/NavigatorAutomationInformation.idl
には拡張自体が含まれ、読み取り専用変数webdriver
が含まれます。
`[
NoInterfaceObject, // Always used on target of 'implements'
Exposed=(Window),
RuntimeEnabled=AutomationControlled
] interface NavigatorAutomationInformation {
readonly attribute boolean webdriver;
};`
この機能を取り除くには、この機能でNavigator
を拡張するNavigator.idl
の行にコメントし、ソースをコンパイルするだけです( linuxでのコンパイル )。ただし、これはほとんどすべてのコンピューターにとって面倒な作業であり、数時間かかる場合があります。コミットの日付を見ると、それは2017年10月でしたので、オプションは任意のバージョンをダウンロードすることです/ Chromeその日付より前にリリースされた。ミラーを検索するには、inurl:/deb/pool/main/g/google-chrome-stable/
でグーグルできます。
2。 ChromeDriverを修正する
Distilは正規表現ルール「/\$ [a-z] dc_ /」をウィンドウ変数と照合し、ChromeDriverは前述のように1つ追加します here はその条件を満たすものです。彼らが言及するように、ソースコードの中でcall_function.js
を編集し、変数var key = '$cdc_asdjflasutopfhvcZLmcfl_';
を再定義する必要があります。他のもので。また、おそらくもっと簡単な方法として、16進エディタを使用して既存のバイナリを更新できます。
古いバージョンのChrome-たぶん使用したと思います-)を使用することに決めた場合は、適切なバージョンのChromeDriverを使用する必要があります。Chrome ChromeDriver downloads webpage のバージョン。たとえば、Chrome v61(ニーズに合う)の場合) ChromeDriver 2.34 。完了したら、ChromeDriverバイナリを「/ usr/bin/local」に配置します。
3。他の予防策を講じる
SeleniumのWebDriver自体を使用してUserAgentを変更することはできません。これは、ここで実際に実行しようとしているように聞こえます。
ただし、変更できないという意味ではありません。
PhantomJSを入力します。
チェックアウト この答え 。これを使用して、Seleniumを別のブラウザー、またはほとんど何でも変装できます。もちろん、ウェブサイトがあなたを理解することを決定した場合、Seleniumが残した手がかりはたくさんあります(完全な精度でクリックするなど)。