-
Notifications
You must be signed in to change notification settings - Fork 147
/
Copy pathCloudflareBypasser.py
96 lines (81 loc) · 3.35 KB
/
CloudflareBypasser.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
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.")