Saya telah menguji Selenium dengan Chromedriver dan saya perhatikan bahwa beberapa halaman dapat mendeteksi bahwa Anda menggunakan Selenium meskipun tidak ada otomatisasi sama sekali. Bahkan ketika saya hanya menjelajah secara manual hanya menggunakan chrome melalui Selenium dan Xephyr saya sering mendapatkan halaman yang mengatakan bahwa aktivitas mencurigakan terdeteksi. Saya telah memeriksa agen pengguna saya, dan sidik jari browser saya, dan semuanya persis sama dengan browser chrome normal.
Ketika saya menjelajah ke situs-situs ini di chrome normal semuanya berfungsi dengan baik, tetapi saat saya menggunakan Selenium saya terdeteksi.
Secara teori chromedriver dan chrome seharusnya terlihat persis sama persis dengan server web mana pun, tetapi entah bagaimana mereka dapat mendeteksinya.
Jika Anda ingin beberapa kode uji coba ini:
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')
Jika Anda menelusuri sekitar stubhub, Anda akan diarahkan dan 'diblokir' dalam satu atau dua permintaan. Saya telah menyelidiki ini dan saya tidak tahu bagaimana mereka bisa tahu bahwa pengguna menggunakan Selenium.
Bagaimana mereka melakukannya?
Perbarui EDIT:
Saya menginstal plugin Selenium IDE di Firefox dan saya diblokir ketika saya pergi ke stubhub.com di browser firefox normal hanya dengan plugin tambahan.
EDIT:
Ketika saya menggunakan Fiddler untuk melihat permintaan HTTP dikirim bolak-balik, saya perhatikan bahwa permintaan 'browser palsu' sering memiliki 'tanpa cache' di header respons.
EDIT:
hasil seperti ini Apakah ada cara untuk mendeteksi bahwa saya berada di halaman Selenium Webdriver dari Javascript menyarankan bahwa seharusnya tidak ada cara untuk mendeteksi ketika Anda menggunakan webdriver. Tetapi bukti ini menunjukkan sebaliknya.
EDIT:
Situs mengunggah sidik jari ke server mereka, tetapi saya memeriksa dan sidik jari selenium identik dengan sidik jari saat menggunakan chrome.
EDIT:
Ini adalah salah satu muatan sidik jari yang mereka kirim ke server mereka
{"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"}}
Ini identik dalam selenium dan chrome
EDIT:
VPN berfungsi untuk sekali pakai tetapi terdeteksi setelah saya memuat halaman pertama. Jelas beberapa javascript sedang dijalankan untuk mendeteksi Selenium.
sumber
distill
teknologi deteksi bot dan memberikan konten menggunakanakamaitechnologies.com
CDN dari berbeda ips misalnya95.100.59.245
,104.70.243.66
,23.202.161.241
Jawaban:
Untuk Pengguna Mac
Mengganti
cdc_
variabel menggunakan Vim atau PerlAnda dapat menggunakan
vim
, atau seperti yang ditunjukkan @Vic Seedoubleyew dalam jawaban oleh @ Erti-Chris Eelmaaperl
,, untuk mengganticdc_
variabel dalamchromedriver
( Lihat pos oleh @ Erti-Chris Eelmaa untuk mempelajari lebih lanjut tentang variabel itu ). Menggunakanvim
atauperl
mencegah Anda dari harus mengkompilasi ulang kode sumber atau menggunakan hex-editor. Pastikan untuk membuat salinan aslichromedriver
sebelum mencoba mengeditnya. Juga, metode di bawah ini diujichromedriver version 2.41.578706
.Menggunakan Vim
Setelah menjalankan baris di atas, Anda mungkin akan melihat banyak omong kosong. Lakukan hal berikut:
cdc_
dengan mengetik/cdc_
dan menekanreturn
.a
.$cdc_lasutopfhvcZLmcfl
dan ganti apa yang telah dihapus dengan jumlah karakter yang sama. Jika tidak,chromedriver
akan gagal.esc
.:wq!
dan tekanreturn
.:q!
dan tekanreturn
.Pergi ke
chromedriver
klik yang diubah dan dobel di atasnya. Sebuahterminal
jendela seharusnya terbuka. Jika Anda tidak melihatkilled
di output, Anda berhasil mengubah driver.Menggunakan Perl
Baris di bawah ini diganti
cdc_
dengandog_
:Pastikan string pengganti memiliki jumlah karakter yang sama dengan string pencarian, jika tidak maka string
chromedriver
akan gagal.Penjelasan Perl
s///g
menunjukkan bahwa Anda ingin mencari string dan menggantinya secara global dengan string lain (menggantikan semua kemunculan).Begitu,
Cara memeriksa apakah penggantian Perl bekerja
Baris berikut akan mencetak setiap kemunculan string pencarian
cdc_
:perl -ne 'while(/cdc_/g){print "$&\n";}' /path/to/chromedriver
Jika ini tidak mengembalikan apa pun, maka
cdc_
telah diganti.Sebaliknya, Anda dapat menggunakan ini:
perl -ne 'while(/dog_/g){print "$&\n";}' /path/to/chromedriver
untuk melihat apakah string pengganti Anda
dog_
,, sekarang dalamchromedriver
biner. Jika ya, string pengganti akan dicetak ke konsol.Pergi ke
chromedriver
klik yang diubah dan dobel di atasnya. Sebuahterminal
jendela seharusnya terbuka. Jika Anda tidak melihatkilled
di output, Anda berhasil mengubah driver.Membungkus
Setelah mengubah
chromedriver
biner, pastikan bahwa namachromedriver
biner yang diubah adalahchromedriver
, dan biner asli dipindahkan dari lokasi aslinya atau diganti namanya.Pengalaman Saya Dengan Metode Ini
Saya sebelumnya terdeteksi di situs web ketika mencoba masuk, tetapi setelah mengganti
cdc_
dengan string berukuran sama, saya bisa masuk. Seperti yang dikatakan orang lain, jika Anda sudah terdeteksi, Anda mungkin diblokir untuk kebanyakan alasan lain bahkan setelah menggunakan metode ini. Jadi, Anda mungkin harus mencoba mengakses situs yang mendeteksi Anda menggunakan VPN, jaringan yang berbeda, atau apa pun yang Anda miliki.sumber
Pada dasarnya cara deteksi selenium bekerja, adalah bahwa mereka menguji variabel javascript yang telah ditentukan yang muncul saat dijalankan dengan selenium. Skrip deteksi bot biasanya terlihat apa pun yang mengandung kata "selenium" / "webdriver" di salah satu variabel (pada objek jendela), dan juga mendokumentasikan variabel yang disebut
$cdc_
dan$wdc_
. Tentu saja, semua ini tergantung pada browser yang Anda gunakan. Semua browser yang berbeda memperlihatkan hal yang berbeda.Bagi saya, saya menggunakan chrome, jadi, yang harus saya lakukan adalah memastikan bahwa
$cdc_
tidak ada lagi sebagai variabel dokumen, dan voila (unduh kode sumber chromedriver, modifikasi chromedriver dan kompilasi ulang$cdc_
dengan nama yang berbeda.)ini adalah fungsi yang saya modifikasi di chromedriver:
call_function.js:
(perhatikan komentar, semua yang saya lakukan saya beralih
$cdc_
kerandomblabla_
.Berikut adalah pseudo-code yang menunjukkan beberapa teknik yang mungkin digunakan jaringan bot:
menurut pengguna @szx, juga dimungkinkan untuk hanya membuka chromedriver.exe di hex editor, dan cukup melakukan penggantian secara manual, tanpa benar-benar melakukan kompilasi.
sumber
$cdc
denganxxxx
dichromedriver.exe
dalam hex editor dan berhasil! Saya juga memperhatikan bahwa jika Anda memaksimalkan jendela browser (daripada menggunakan ukuran yang telah ditentukan) itu terdeteksi lebih jarang.Seperti yang telah kita ketahui dalam pertanyaan dan jawaban yang diposting, ada layanan anti-pengikisan Web dan deteksi Bot yang disebut "Distil Networks" yang sedang dimainkan di sini. Dan, menurut wawancara CEO perusahaan :
Butuh waktu dan tantangan tambahan untuk memahami bagaimana tepatnya mereka mendeteksi Selenium, tetapi apa yang bisa kita katakan dengan pasti saat ini:
Memutuskan untuk mengirimnya sebagai jawaban, karena jelas:
Iya.
Juga, apa yang saya belum bereksperimen dengan selenium yang lebih tua dan versi browser yang lebih tua - secara teori, mungkin ada sesuatu yang diimplementasikan / ditambahkan ke selenium pada titik tertentu yang mengandalkan pendeteksi bot jaringan Distil Networks. Kemudian, jika ini masalahnya, kita mungkin mendeteksi (yeah, mari kita deteksi detektor) pada titik / versi perubahan mana yang dibuat, lihat changelog dan changeets dan, mungkin, ini bisa memberi kita informasi lebih lanjut tentang ke mana harus mencari dan apa yang mereka gunakan untuk mendeteksi browser yang didukung webdriver. Itu hanya teori yang perlu diuji.
sumber
Contoh bagaimana penerapannya di wellsfargo.com:
sumber
Mengacaukan hasil JavaScripts
Saya telah memeriksa kode sumber chromedriver. Itu menyuntikkan beberapa file javascript ke browser.
Setiap file javascript pada tautan ini disuntikkan ke halaman web: https://chromium.googlesource.com/chromium/src/+/master/chrome/test/chromedriver/js/
Jadi saya menggunakan teknik reverse dan mengaburkan file js dengan mengedit Hex. Sekarang saya yakin bahwa tidak ada lagi variabel javascript, nama fungsi dan string tetap yang digunakan untuk mengungkap aktivitas selenium. Namun masih beberapa situs dan reCaptcha mendeteksi selenium!
Mungkin mereka memeriksa modifikasi yang disebabkan oleh eksekusi js chromedriver :)
Edit 1:
Modifikasi parameter 'navigator' Chrome
Saya menemukan ada beberapa parameter dalam 'navigator' yang secara singkat mengungkap penggunaan chromedriver. Ini adalah parameternya:
Jadi yang saya butuhkan adalah ekstensi chrome untuk menjalankan javascript di halaman web. Saya membuat ekstensi dengan kode js yang disediakan dalam artikel dan menggunakan artikel lain untuk menambahkan ekstensi zip ke proyek saya. Saya telah berhasil mengubah nilai; Tapi tetap saja tidak ada yang berubah!
Saya tidak menemukan variabel lain seperti ini tetapi itu tidak berarti bahwa mereka tidak ada. Masih reCaptcha mendeteksi chromedriver, Jadi harus ada lebih banyak variabel untuk diubah. Langkah selanjutnya adalah melakukan reverse engineering pada layanan detektor yang tidak ingin saya lakukan.
Sekarang saya tidak yakin apakah perlu menghabiskan lebih banyak waktu untuk proses otomasi ini atau mencari metode alternatif!
sumber
Cobalah untuk menggunakan selenium dengan profil pengguna tertentu dari chrome, Dengan cara itu Anda dapat menggunakannya sebagai pengguna tertentu dan mendefinisikan hal yang Anda inginkan. Ketika melakukannya, ia akan berjalan sebagai pengguna 'nyata', lihat proses chrome dengan beberapa proses explorer dan Anda akan melihat perbedaannya dengan tag.
Sebagai contoh:
daftar tag chrome di sini
sumber
Diambil langsung dari Draft of WebDriver Editor W3C 2017 . Ini sangat menyiratkan bahwa setidaknya, iterasi driver selenium di masa depan akan dapat diidentifikasi untuk mencegah penyalahgunaan. Pada akhirnya, sulit untuk mengetahui tanpa kode sumber, apa yang sebenarnya menyebabkan driver chrome secara khusus dapat dideteksi.
sumber
Firefox dikatakan mengatur
window.navigator.webdriver === true
jika bekerja dengan driver web. Itu menurut salah satu spesifikasi yang lebih lama (misalnya: archive.org ) tetapi saya tidak dapat menemukannya di yang baru kecuali untuk beberapa kata yang sangat kabur dalam lampiran.Sebuah tes untuk itu adalah dalam kode selenium dalam file fingerprint_test.js di mana komentar di akhir mengatakan "Saat ini hanya diimplementasikan dalam firefox" tapi saya tidak dapat mengidentifikasi kode apa pun dalam arah itu dengan beberapa cara sederhana
grep
, juga di saat ini (41.0.2) Firefox release-tree atau di pohon Chromium.Saya juga menemukan komentar untuk komit yang lebih lama mengenai sidik jari pada driver firefox b82512999938 mulai Januari 2015 . Kode itu masih ada di Selenium GIT-master yang diunduh kemarin
javascript/firefox-driver/extension/content/server.js
dengan komentar yang menghubungkan ke lampiran kata yang sedikit berbeda dalam spesifikasi webdriver w3c saat ini.sumber
window.navigator.webdriver
tidak didefinisikan.window.navigator.webdriver == true
Selain jawaban yang bagus dari @ Erti-Chris Eelmaa - ada yang mengganggu
window.navigator.webdriver
dan hanya-baca. Acara jika Anda mengubah nilaifalse
itu masih akan adatrue
. Itulah sebabnya browser yang digerakkan oleh perangkat lunak otomatis masih dapat dideteksi. MDNVariabel dikelola oleh bendera
--enable-automation
di chrome. Chromedriver meluncurkan chrome dengan bendera itu dan chrome mengaturwindow.navigator.webdriver
untuktrue
. Anda dapat menemukannya di sini . Anda perlu menambahkan ke "mengecualikan switch" bendera. Misalnya (golang):sumber
Sepertinya mereka ada di balik firewall aplikasi web. Lihatlah modsecurity dan lihatlah bagaimana cara kerjanya. Pada kenyataannya, apa yang Anda tanyakan adalah bagaimana melakukan penghindaran deteksi bot. Bukan itu yang dimaksud dengan driver web selenium. Ini untuk menguji aplikasi web Anda agar tidak mengenai aplikasi web lainnya. Itu mungkin, tetapi pada dasarnya, Anda harus melihat apa yang WAF cari dalam aturan mereka dan secara khusus menghindarinya dengan selenium jika Anda bisa. Meski begitu, mungkin masih tidak berhasil karena Anda tidak tahu WAF apa yang mereka gunakan. Anda melakukan langkah pertama yang benar, yaitu memalsukan agen pengguna. Jika itu tidak berhasil, maka WAF sudah ada dan Anda mungkin perlu lebih rumit.
Sunting: Poin diambil dari jawaban lain. Pastikan agen pengguna Anda benar-benar disetel dengan benar terlebih dahulu. Mungkin itu menabrak server web lokal atau mengendus lalu lintas keluar.
sumber
Sekalipun Anda mengirim semua data yang benar (mis. Selenium tidak muncul sebagai ekstensi, Anda memiliki resolusi / bit-depth yang masuk akal, & c), ada sejumlah layanan dan alat yang profil pengunjung perilaku untuk menentukan apakah aktor adalah pengguna atau sistem otomatis.
Misalnya, mengunjungi situs kemudian langsung akan melakukan beberapa tindakan dengan menggerakkan mouse langsung ke tombol yang relevan, dalam waktu kurang dari satu detik, adalah sesuatu yang tidak akan dilakukan oleh pengguna.
Mungkin juga bermanfaat sebagai alat debugging untuk menggunakan situs seperti https://panopticlick.eff.org/ untuk memeriksa seberapa unik peramban Anda; itu juga akan membantu Anda memverifikasi apakah ada parameter spesifik yang menunjukkan Anda menjalankan di Selenium.
sumber
Deteksi bot yang saya lihat tampaknya lebih canggih atau setidaknya berbeda dari apa yang saya baca dalam jawaban di bawah ini.
EKSPERIMEN 1:
EKSPERIMEN 2:
Seperti sebelumnya, saya membuka browser dan halaman web dengan Selenium dari konsol Python.
Kali ini, alih-alih mengklik dengan mouse, saya menggunakan Selenium (di konsol Python) untuk mengklik elemen yang sama dengan offset acak.
Tautan tidak terbuka, tetapi saya dibawa ke halaman pendaftaran.
IMPLIKASI:
Tampaknya misterius, tetapi saya kira mereka hanya dapat menentukan apakah suatu tindakan berasal dari Selenium atau tidak, sementara mereka tidak peduli apakah browser itu sendiri dibuka melalui Selenium atau tidak. Atau dapatkah mereka menentukan apakah jendela memiliki fokus? Akan menarik untuk didengar jika ada yang memiliki wawasan.
sumber
Satu hal lagi yang saya temukan adalah beberapa situs web menggunakan platform yang memeriksa Agen Pengguna. Jika nilainya berisi: "HeadlessChrome", tingkah lakunya bisa aneh ketika menggunakan mode tanpa kepala.
Solusi untuk itu adalah mengganti nilai agen pengguna, misalnya di Jawa:
sumber
Beberapa situs mendeteksi ini:
sumber
Tulis halaman html dengan kode berikut. Anda akan melihat bahwa dalam selenium DOM menerapkan atribut webdriver di outerHTML
sumber
Saya telah menemukan mengubah variabel "kunci" javascript seperti ini:
berfungsi untuk beberapa situs web saat menggunakan Selenium Webdriver bersama dengan Google Chrome, karena banyak situs memeriksa variabel ini untuk menghindari pembatalan oleh Selenium.
sumber
Menurut saya cara paling sederhana untuk melakukannya dengan Selenium adalah dengan mencegat XHR yang mengirimkan kembali sidik jari peramban.
Tetapi karena ini adalah masalah Selenium saja, lebih baik hanya menggunakan sesuatu yang lain. Selenium seharusnya membuat hal-hal seperti ini lebih mudah, bukan cara yang lebih sulit.
sumber
Anda dapat mencoba menggunakan parameter "enable-automation"
Tetapi, saya ingin memperingatkan bahwa kemampuan ini telah diperbaiki di ChromeDriver 79.0.3945.16 . Jadi mungkin Anda harus menggunakan versi chrome yang lebih lama.
Selain itu, sebagai opsi lain, Anda dapat mencoba menggunakan InternetExplorerDriver alih-alih Chrome. Bagi saya, IE tidak memblokir sama sekali tanpa peretasan.
Dan untuk info lebih lanjut coba lihat di sini:
Selenium webdriver: Memodifikasi flag navigator.webdriver untuk mencegah deteksi selenium
Tidak dapat menyembunyikan infobar "Chrome sedang dikendalikan oleh perangkat lunak otomatis" di dalam Chrome v76
sumber