Ich habe Selenium mit Chromedriver getestet und festgestellt, dass einige Seiten erkennen können, dass Sie Selenium verwenden, obwohl es überhaupt keine Automatisierung gibt. Selbst wenn ich nur manuell mit Chrom über Selenium und Xephyr surfe, wird häufig eine Seite angezeigt, auf der verdächtige Aktivitäten festgestellt wurden. Ich habe meinen Benutzeragenten und meinen Browser-Fingerabdruck überprüft und sie sind alle genau identisch mit dem normalen Chrome-Browser.
Wenn ich in normalem Chrom zu diesen Websites navigiere, funktioniert alles einwandfrei, aber sobald ich Selenium verwende, werde ich erkannt.
Theoretisch sollten Chromedriver und Chrome für jeden Webserver buchstäblich genau gleich aussehen, aber irgendwie können sie es erkennen.
Wenn Sie einen Testcode wünschen, probieren Sie Folgendes aus:
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')
Wenn Sie sich in stubhub umsehen, werden Sie innerhalb von ein oder zwei Anfragen umgeleitet und "blockiert". Ich habe dies untersucht und kann nicht herausfinden, wie sie feststellen können, dass ein Benutzer Selen verwendet.
Wie machen Sie das?
UPDATE BEARBEITEN:
Ich habe das Selenium IDE-Plugin in Firefox installiert und wurde gesperrt, als ich im normalen Firefox-Browser mit nur dem zusätzlichen Plugin zu stubhub.com ging.
BEARBEITEN:
Wenn ich Fiddler verwende, um die hin und her gesendeten HTTP-Anforderungen anzuzeigen, ist mir aufgefallen, dass die Anforderungen der gefälschten Browser häufig den Antwort-Header "no-cache" enthalten.
BEARBEITEN:
Ergebnisse wie dieses Gibt es eine Möglichkeit zu erkennen, dass ich mich auf einer Selenium Webdriver-Seite von Javascript befinde? Es gibt keine Möglichkeit zu erkennen, wann Sie einen Webdriver verwenden. Aber diese Beweise deuten auf etwas anderes hin.
BEARBEITEN:
Die Site lädt einen Fingerabdruck auf ihre Server hoch, aber ich habe überprüft, ob der Fingerabdruck von Selen mit dem Fingerabdruck bei Verwendung von Chrom identisch ist.
BEARBEITEN:
Dies ist eine der Fingerabdruck-Nutzdaten, die sie an ihre Server senden
{"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"}}
Es ist identisch in Selen und in Chrom
BEARBEITEN:
VPNs funktionieren nur einmal, werden jedoch erkannt, nachdem ich die erste Seite geladen habe. Offensichtlich wird etwas Javascript ausgeführt, um Selen zu erkennen.
quelle
distill
Erkennungstechnologie bietet und liefert Inhalte mitakamaitechnologies.com
CDN von diffrent ips zB95.100.59.245
,104.70.243.66
,23.202.161.241
Antworten:
Für Mac-Benutzer
cdc_
Variable durch Vim oder Perl ersetzenSie können
vim
oder, wie @Vic Seedoubleyew in der Antwort von @ Erti-Chris Eelmaa ausgeführt hatperl
, diecdc_
Variable in ersetzenchromedriver
( siehe Beitrag von @ Erti-Chris Eelmaa, um mehr über diese Variable zu erfahren ). Verwendenvim
oderperl
verhindert, dass Sie den Quellcode neu kompilieren oder einen Hex-Editor verwenden müssen. Stellen Sie sicher, dass Sie eine Kopie des Originalschromedriver
erstellen, bevor Sie versuchen, es zu bearbeiten. Auch die folgenden Methoden wurden getestetchromedriver version 2.41.578706
.Verwenden von Vim
Nachdem Sie die obige Zeile durchlaufen haben, werden Sie wahrscheinlich einen Haufen Kauderwelsch sehen. Mach Folgendes:
cdc_
durch Tippen/cdc_
und Drückenreturn
.a
.$cdc_lasutopfhvcZLmcfl
und ersetzen Sie das Gelöschte durch eine gleiche Anzahl von Zeichen. Wenn Sie dies nicht tun,chromedriver
wird dies fehlschlagen.esc
.:wq!
und drücken Sie, um die Änderungen zu speichern und zu beendenreturn
.:q!
und drücken Siereturn
.Gehen Sie zu den geänderten
chromedriver
und doppelklicken Sie darauf. Einterminal
Fenster sollte sich öffnen. Wenn Siekilled
in der Ausgabe nichts sehen , haben Sie den Treiber erfolgreich geändert.Verwenden von Perl
Die folgende Zeile ersetzt
cdc_
durchdog_
:Stellen Sie sicher, dass die Ersatzzeichenfolge dieselbe Anzahl von Zeichen wie die Suchzeichenfolge enthält, da sonst die Zeichenfolge
chromedriver
fehlschlägt.Perl Erklärung
s///g
bedeutet, dass Sie nach einer Zeichenfolge suchen und diese global durch eine andere Zeichenfolge ersetzen möchten (ersetzt alle Vorkommen).Damit,
So überprüfen Sie, ob der Perl-Ersatz funktioniert hat
In der folgenden Zeile wird jedes Vorkommen der Suchzeichenfolge gedruckt
cdc_
:perl -ne 'while(/cdc_/g){print "$&\n";}' /path/to/chromedriver
Wenn dies nichts zurückgibt,
cdc_
wurde es ersetzt.Umgekehrt können Sie Folgendes verwenden:
perl -ne 'while(/dog_/g){print "$&\n";}' /path/to/chromedriver
um zu sehen, ob Ihre Ersatzzeichenfolge
dog_
jetzt in derchromedriver
Binärdatei ist. Wenn dies der Fall ist, wird die Ersatzzeichenfolge auf der Konsole gedruckt.Gehen Sie zu den geänderten
chromedriver
und doppelklicken Sie darauf. Einterminal
Fenster sollte sich öffnen. Wenn Siekilled
in der Ausgabe nichts sehen , haben Sie den Treiber erfolgreich geändert.Einpacken
Stellen Sie nach dem Ändern der
chromedriver
Binärdatei sicher, dass der Name der geändertenchromedriver
Binärdatei lautetchromedriver
und dass die ursprüngliche Binärdatei entweder von ihrem ursprünglichen Speicherort verschoben oder umbenannt wurde.Meine Erfahrung mit dieser Methode
Ich wurde zuvor auf einer Website erkannt, als ich versuchte
cdc_
, mich anzumelden, aber nachdem ich sie durch eine gleich große Zeichenfolge ersetzt hatte, konnte ich mich anmelden. Wie andere bereits gesagt haben, werden Sie möglicherweise für a blockiert, wenn Sie bereits erkannt wurden Eine Vielzahl anderer Gründe, auch nach Anwendung dieser Methode. Daher müssen Sie möglicherweise versuchen, über ein VPN, ein anderes Netzwerk oder was Sie haben, auf die Site zuzugreifen, auf der Sie erkannt wurden.quelle
Grundsätzlich funktioniert die Selenerkennung so, dass sie auf vordefinierte Javascript-Variablen testen, die beim Ausführen mit Selen auftreten. Die Bot-Erkennungsskripte sehen normalerweise alles aus, was das Wort "Selen" / "Webdriver" in einer der Variablen (auf dem Fensterobjekt) enthält, und dokumentieren auch Variablen mit dem Namen
$cdc_
und$wdc_
. All dies hängt natürlich davon ab, in welchem Browser Sie sich befinden. All die verschiedenen Browser zeigen verschiedene Dinge.Für mich habe ich Chrome verwendet. Alles, was ich tun musste, war sicherzustellen, dass
$cdc_
es nicht mehr als Dokumentvariable existiert, und voila (Chromedriver-Quellcode herunterladen, Chromedriver ändern und$cdc_
unter einem anderen Namen neu kompilieren .)Dies ist die Funktion, die ich in chromedriver geändert habe:
call_function.js:
(Beachten Sie den Kommentar, alles, was ich getan habe, an das ich mich gewandt
$cdc_
haberandomblabla_
.Hier ist ein Pseudocode, der einige der Techniken demonstriert, die Bot-Netzwerke verwenden könnten:
Laut Benutzer @szx ist es auch möglich, chromedriver.exe einfach im Hex-Editor zu öffnen und den Austausch einfach manuell durchzuführen, ohne tatsächlich zu kompilieren.
quelle
$cdc
mitxxxx
inchromedriver.exe
in einem Hex - Editor und es funktionierte! Ich habe auch festgestellt, dass das Browserfenster weniger häufig erkannt wird, wenn Sie es maximieren (anstatt eine vordefinierte Größe zu verwenden).Wie wir bereits in der Frage und den veröffentlichten Antworten herausgefunden haben, gibt es hier einen Anti-Web-Scraping- und einen Bot-Erkennungsdienst namens "Distil Networks" . Und laut dem Interview des CEO des Unternehmens :
Es wird einige Zeit und zusätzliche Herausforderungen erfordern, um zu verstehen, wie genau sie Selen nachweisen, aber was können wir im Moment mit Sicherheit sagen:
Beschlossen, es als Antwort zu posten, da klar:
Ja.
Ich habe auch nicht mit älteren Selen- und älteren Browserversionen experimentiert - theoretisch könnte an einem bestimmten Punkt, auf den sich der Bot-Detektor von Distil Networks derzeit stützt, etwas implementiert / zu Selen hinzugefügt werden. Wenn dies der Fall ist, können wir dann erkennen (ja, lassen Sie uns den Detektor erkennen), an welchem Punkt / in welcher Version eine relevante Änderung vorgenommen wurde, das Änderungsprotokoll und die Änderungssätze untersuchen und möglicherweise weitere Informationen darüber erhalten, wo wir suchen müssen und was verwenden sie, um einen Browser mit Webdriver zu erkennen? Es ist nur eine Theorie, die getestet werden muss.
quelle
Beispiel für die Implementierung auf wellsfargo.com:
quelle
Verschleiertes JavaScripts-Ergebnis
Ich habe den Chromedriver-Quellcode überprüft. Dadurch werden einige Javascript-Dateien in den Browser eingefügt.
Jede Javascript-Datei unter diesem Link wird auf die folgenden Webseiten eingefügt: https://chromium.googlesource.com/chromium/src/+/master/chrome/test/chromedriver/js/
Also habe ich Reverse Engineering verwendet und die js-Dateien durch Hex-Bearbeitung verschleiert . Jetzt war ich mir sicher, dass keine Javascript-Variablen, Funktionsnamen und festen Zeichenfolgen mehr verwendet wurden, um die Selenaktivität aufzudecken. Trotzdem erkennen einige Standorte und reCaptcha Selen!
Vielleicht überprüfen sie die Änderungen, die durch die Ausführung von chromedriver js verursacht werden :)
Bearbeiten 1:
Änderung der Chrome-Navigatorparameter
Ich habe festgestellt, dass es in 'navigator' einige Parameter gibt, die die Verwendung von chromedriver kurz aufdecken. Dies sind die Parameter:
Was ich also brauchte, war eine Chrome-Erweiterung, um Javascript auf den Webseiten auszuführen. Ich habe eine Erweiterung mit dem im Artikel angegebenen js-Code erstellt und einen anderen Artikel verwendet , um die komprimierte Erweiterung zu meinem Projekt hinzuzufügen. Ich habe die Werte erfolgreich geändert. Trotzdem hat sich nichts geändert!
Ich habe keine anderen Variablen wie diese gefunden, aber das bedeutet nicht, dass sie nicht existieren. Trotzdem erkennt reCaptcha den Chromedriver. Es sollten also mehr Variablen geändert werden. Der nächste Schritt sollte das Reverse Engineering der Detektordienste sein, die ich nicht machen möchte.
Jetzt bin ich mir nicht sicher, ob es sich lohnt, mehr Zeit für diesen Automatisierungsprozess aufzuwenden oder nach alternativen Methoden zu suchen!
quelle
Versuchen Sie, Selen mit einem bestimmten Benutzerprofil von Chrome zu verwenden. Auf diese Weise können Sie es als bestimmten Benutzer verwenden und alles definieren, was Sie möchten. Wenn dies als "echter" Benutzer ausgeführt wird, sehen Sie sich den Chrome-Prozess mit einem Prozess-Explorer an und Sie werden den Unterschied mit den Tags sehen.
Zum Beispiel:
Chrom-Tag-Liste hier
quelle
Entnommen direkt aus dem Entwurf des W3C-Editors von WebDriver 2017 . Dies impliziert stark, dass zumindest zukünftige Iterationen der Selentreiber identifizierbar sind, um Missbrauch zu verhindern. Letztendlich ist es ohne den Quellcode schwer zu sagen, was genau dazu führt, dass der Chrome-Treiber spezifisch erkennbar ist.
quelle
Firefox soll eingestellt werden,
window.navigator.webdriver === true
wenn mit einem Web-Treiber gearbeitet wird. Das entsprach einer der älteren Spezifikationen (z. B. archive.org ), aber ich konnte es in der neuen nicht finden, abgesehen von einigen sehr vagen Formulierungen in den Anhängen.Ein Test dafür befindet sich im Selen-Code in der Datei fingerprint_test.js, wo der Kommentar am Ende lautet "Derzeit nur in Firefox implementiert", aber ich konnte keinen Code in dieser Richtung mit etwas Einfachem identifizieren
grep
, auch nicht in der aktueller (41.0.2) Firefox Release-Baum noch im Chromium-Baum.Ich habe auch einen Kommentar für ein älteres Commit bezüglich Fingerabdruck im Firefox-Treiber b82512999938 vom Januar 2015 gefunden . Dieser Code befindet sich noch im Selenium GIT-Master, der gestern unter heruntergeladen wurde,
javascript/firefox-driver/extension/content/server.js
mit einem Kommentar, der auf den etwas anders formulierten Anhang in der aktuellen w3c-Webdriver-Spezifikation verweist.quelle
window.navigator.webdriver
ist nicht definiert.window.navigator.webdriver == true
Zusätzlich zu der großartigen Antwort von @ Erti-Chris Eelmaa - es ist ärgerlich
window.navigator.webdriver
und es ist schreibgeschützt. Ereignis, wenn Sie den Wert ändern, wirdfalse
es weiterhin habentrue
. Deshalb kann der von automatisierter Software gesteuerte Browser immer noch erkannt werden. MDNDie Variable wird vom Flag
--enable-automation
in Chrome verwaltet. Der Chromedriver startet Chrome mit dieser Flagge und Chrome setzt daswindow.navigator.webdriver
auftrue
. Sie finden es hier . Sie müssen das Flag hinzufügen, um "Schalter ausschließen". Zum Beispiel (Golang):quelle
Es hört sich so an, als stünden sie hinter einer Webanwendungs-Firewall. Schauen Sie sich modsecurity und owasp an, um zu sehen, wie diese funktionieren. In Wirklichkeit fragen Sie, wie Sie die Bot-Erkennung umgehen können. Dafür ist der Selenium-Webtreiber nicht gedacht. Es dient zum Testen Ihrer Webanwendung, ohne andere Webanwendungen zu treffen. Es ist möglich, aber im Grunde müsste man sich ansehen, wonach eine WAF in ihrem Regelsatz sucht, und es mit Selen vermeiden, wenn man kann. Selbst dann funktioniert es möglicherweise immer noch nicht, da Sie nicht wissen, welche WAF sie verwenden. Sie haben den richtigen ersten Schritt getan, nämlich den Benutzeragenten zu fälschen. Wenn das aber nicht funktioniert hat, ist ein WAF vorhanden und Sie müssen wahrscheinlich kniffliger werden.
Bearbeiten: Punkt aus anderer Antwort genommen. Stellen Sie sicher, dass Ihr Benutzeragent zuerst richtig eingestellt ist. Vielleicht hat es einen lokalen Webserver getroffen oder den Datenverkehr aufgespürt.
quelle
Selbst wenn Sie alle richtigen Daten senden (z. B. Selen wird nicht als Erweiterung angezeigt, Sie haben eine angemessene Auflösung / Bittiefe usw.), gibt es eine Reihe von Diensten und Tools, die das Besucherverhalten profilieren, um festzustellen, ob die Akteur ist ein Benutzer oder ein automatisiertes System.
Wenn Sie beispielsweise eine Site besuchen und dann sofort eine Aktion ausführen, indem Sie die Maus in weniger als einer Sekunde direkt auf die entsprechende Schaltfläche bewegen, würde dies kein Benutzer tatsächlich tun.
Es kann auch als Debugging-Tool nützlich sein, eine Website wie https://panopticlick.eff.org/ zu verwenden, um zu überprüfen, wie einzigartig Ihr Browser ist. Außerdem können Sie überprüfen, ob bestimmte Parameter vorhanden sind, die darauf hinweisen, dass Sie in Selenium ausgeführt werden.
quelle
Die Bot-Erkennung, die ich gesehen habe, scheint ausgefeilter oder zumindest anders zu sein als das, was ich in den Antworten unten gelesen habe.
Versuch 1:
Versuch 2:
Nach wie vor öffne ich einen Browser und die Webseite mit Selenium über eine Python-Konsole.
Dieses Mal verwende ich Selenium (in der Python-Konsole), anstatt mit der Maus zu klicken, um auf dasselbe Element mit einem zufälligen Versatz zu klicken.
Der Link wird nicht geöffnet, aber ich werde zu einer Anmeldeseite weitergeleitet.
AUSWIRKUNGEN:
Scheint mysteriös, aber ich denke, sie können nur feststellen, ob eine Aktion von Selen stammt oder nicht, während es ihnen egal ist, ob der Browser selbst über Selen geöffnet wurde oder nicht. Oder können sie feststellen, ob das Fenster scharfgestellt ist? Es wäre interessant zu hören, wenn jemand irgendwelche Einsichten hat.
quelle
Eine weitere Sache, die ich gefunden habe, ist, dass einige Websites eine Plattform verwenden, die den User Agent überprüft. Wenn der Wert Folgendes enthält: "HeadlessChrome", kann das Verhalten im Headless-Modus seltsam sein.
Die Problemumgehung besteht darin, den Benutzeragentenwert zu überschreiben, beispielsweise in Java:
quelle
Einige Websites erkennen dies:
quelle
Schreiben Sie eine HTML-Seite mit dem folgenden Code. Sie werden sehen, dass im DOM-Selen ein Webdriver-Attribut in der OuterHTML angewendet wird
quelle
Ich habe festgestellt, dass die Javascript-Variable "key" folgendermaßen geändert wird:
funktioniert für einige Websites, wenn Selenium Webdriver zusammen mit Google Chrome verwendet wird, da viele Websites nach dieser Variablen suchen, um zu vermeiden, dass sie von Selenium verschrottet werden.
quelle
Es scheint mir, dass der einfachste Weg, dies mit Selen zu tun, darin besteht, das XHR abzufangen, das den Fingerabdruck des Browsers zurücksendet.
Da es sich jedoch nur um ein Selen-Problem handelt, ist es besser, nur etwas anderes zu verwenden. Selen soll solche Dinge einfacher machen, nicht viel schwieriger.
quelle
Sie können versuchen, den Parameter "enable-automation" zu verwenden.
Ich möchte jedoch warnen, dass diese Funktion in ChromeDriver 79.0.3945.16 behoben wurde . Daher sollten Sie wahrscheinlich ältere Chromversionen verwenden.
Als weitere Option können Sie auch versuchen, InternetExplorerDriver anstelle von Chrome zu verwenden. Was mich betrifft, blockiert IE überhaupt nicht ohne Hacks.
Und für weitere Informationen versuchen Sie es hier:
Selenium-Webdriver: Ändern des navigator.webdriver-Flags, um die Selenerkennung zu verhindern
Die Infobar "Chrome wird von automatisierter Software gesteuert" in Chrome v76 kann nicht ausgeblendet werden
quelle