initial commit
This commit is contained in:
1 parent
eeab594b68
commit
e1ed811084
57 files changed
+18704
No files matched your search
@@ -0,0 +1,96 @@
|
||||
import time
|
||||
from DrissionPage import ChromiumPage
|
||||
|
||||
class CloudflareBypasser:
|
||||
def __init__(self, driver: ChromiumPage, max_retries=-1, log=True):
|
||||
self.driver = driver
|
||||
self.max_retries = max_retries
|
||||
self.log = log
|
||||
|
||||
def search_recursively_shadow_root_with_iframe(self,ele):
|
||||
if ele.shadow_root:
|
||||
if ele.shadow_root.child().tag == "iframe":
|
||||
return ele.shadow_root.child()
|
||||
else:
|
||||
for child in ele.children():
|
||||
result = self.search_recursively_shadow_root_with_iframe(child)
|
||||
if result:
|
||||
return result
|
||||
return None
|
||||
|
||||
def search_recursively_shadow_root_with_cf_input(self,ele):
|
||||
if ele.shadow_root:
|
||||
if ele.shadow_root.ele("tag:input"):
|
||||
return ele.shadow_root.ele("tag:input")
|
||||
else:
|
||||
for child in ele.children():
|
||||
result = self.search_recursively_shadow_root_with_cf_input(child)
|
||||
if result:
|
||||
return result
|
||||
return None
|
||||
|
||||
def locate_cf_button(self):
|
||||
button = None
|
||||
eles = self.driver.eles("tag:input")
|
||||
for ele in eles:
|
||||
if "name" in ele.attrs.keys() and "type" in ele.attrs.keys():
|
||||
if "turnstile" in ele.attrs["name"] and ele.attrs["type"] == "hidden":
|
||||
button = ele.parent().shadow_root.child()("tag:body").shadow_root("tag:input")
|
||||
break
|
||||
|
||||
if button:
|
||||
return button
|
||||
else:
|
||||
# If the button is not found, search it recursively
|
||||
self.log_message("Basic search failed. Searching for button recursively.")
|
||||
ele = self.driver.ele("tag:body")
|
||||
iframe = self.search_recursively_shadow_root_with_iframe(ele)
|
||||
if iframe:
|
||||
button = self.search_recursively_shadow_root_with_cf_input(iframe("tag:body"))
|
||||
else:
|
||||
self.log_message("Iframe not found. Button search failed.")
|
||||
return button
|
||||
|
||||
def log_message(self, message):
|
||||
if self.log:
|
||||
print(message)
|
||||
|
||||
def click_verification_button(self):
|
||||
try:
|
||||
button = self.locate_cf_button()
|
||||
if button:
|
||||
self.log_message("Verification button found. Attempting to click.")
|
||||
button.click()
|
||||
else:
|
||||
self.log_message("Verification button not found.")
|
||||
|
||||
except Exception as e:
|
||||
self.log_message(f"Error clicking verification button: {e}")
|
||||
|
||||
def is_bypassed(self):
|
||||
try:
|
||||
title = self.driver.title.lower()
|
||||
return "just a moment" not in title
|
||||
except Exception as e:
|
||||
self.log_message(f"Error checking page title: {e}")
|
||||
return False
|
||||
|
||||
def bypass(self):
|
||||
|
||||
try_count = 0
|
||||
|
||||
while not self.is_bypassed():
|
||||
if 0 < self.max_retries + 1 <= try_count:
|
||||
self.log_message("Exceeded maximum retries. Bypass failed.")
|
||||
break
|
||||
|
||||
self.log_message(f"Attempt {try_count + 1}: Verification page detected. Trying to bypass...")
|
||||
self.click_verification_button()
|
||||
|
||||
try_count += 1
|
||||
time.sleep(2)
|
||||
|
||||
if self.is_bypassed():
|
||||
self.log_message("Bypass successful.")
|
||||
else:
|
||||
self.log_message("Bypass failed.")
|
||||
Reference in new issue
Block a user