cloudflare turnstile
无头模式以spartanhost为例。
核心代码如下:
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
|
from DrissionPage import Chromium, ChromiumOptions
# 设置浏览器选项
co = ChromiumOptions()
windows_user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.6723.91 Safari/537.36"
co.set_user_agent(user_agent=windows_user_agent)
co.headless(True)
co.incognito() # 启用隐身模式
co.set_local_port(9911) # 设置本地端口,供调试使用
browser = Chromium(co)
browser.set.auto_handle_alert() # 自动处理警告框
# 标签页操作
tab = browser.latest_tab # 获取最新的标签页
tab.get("https://billing.spartanhost.net/login", timeout=15)
# 过 Cloudflare 验证
# 如果页面中有 Cloudflare-turnstile 验证提示元素,进行处理
if tab.ele('x://div[@class="cf-turnstile"]/div', timeout=15):
# 查找并操作 iframe 中的复选框
iframe = tab.ele('x://div[@class="cf-turnstile"]/div').sr('x://iframe') # 获取 iframe 元素
body = iframe.ele('x://body') # 获取 iframe 内部的 body 元素
# 在 body 元素内查找并点击复选框
checkbox = body.sr('x://input[@type="checkbox"]')
if checkbox:
checkbox.click()
print("已点击 Cloudflare 验证框")
tab.wait(3) # 等待页面加载
cf_response = tab.ele('x://div[@class="cf-turnstile"]/div/input')
print(cf_response.value)
else:
print("没有找到 Cloudflare 验证元素")
|
cloudflare 5s盾
5s盾:
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
|
from DrissionPage import Chromium, ChromiumOptions
# 设置浏览器选项
co = ChromiumOptions()
windows_user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.6723.91 Safari/537.36"
co.set_user_agent(user_agent=windows_user_agent)
co.headless(True)
co.incognito() # 启用隐身模式
co.set_local_port(9922) # 设置本地端口,供调试使用
browser = Chromium(co)
browser.set.auto_handle_alert() # 自动处理警告框
max_retries = 5
retries = 0
# 标签页操作
tab = browser.latest_tab # 获取最新的标签页
tab.get("https://www.dmit.io/cloudflare", timeout=15)
page_source = tab.html # 获取页面HTML源码
# print(page_source)
# 过 Cloudflare 验证
# 如果页面中有 Cloudflare-turnstile 验证提示元素,进行处理
print(tab.title)
if 'just a moment' in tab.title or '请稍候' in tab.title:
while retries < max_retries:
try:
if tab.ele('x://div[@id="rvwE0"]', timeout=15):
# 查找并操作 iframe 中的复选框
iframe = tab.ele('x://div[@id="rvwE0"]/div/div').sr('x://iframe', timeout=15) # 获取 iframe 元素
if iframe:
# 尝试获取 body 元素和复选框元素
body = iframe.ele('x://body', timeout=15)
if body:
checkbox = body.sr('x://input[@type="checkbox"]', timeout=15)
if checkbox:
print("复选框可点击")
checkbox.click()
print("已点击 Cloudflare 验证框")
break # 成功点击后跳出循环
else:
print("iframe 内部的 body 元素未找到")
break # 如果 body 元素没有找到,则跳出循环
except Exception as e:
# 捕获所有异常并打印异常信息
print(f"发生异常: {e}")
retries += 1 # 增加重试次数
tab.wait(1) # 等待 1 秒后继续尝试
tab.wait(3) # 等待页面加载
if 'just a moment' not in tab.title or '请稍候' not in tab.title:
print(tab.title)
print("5s盾点击成功")
|
使用DrissionPage.关键还是在于找元素,不同网页的turnstile一般只需要调整利用xpath找到第一个iframe属性就可以了。
iframe = tab.ele('x://div[@class="cf-turnstile"]/div').sr('x://iframe', timeout=15)
利用xpath找到iframe
5s盾似乎基本都是一样的样式。
iframe = tab.ele('x://div[@id="rvwE0"]/div/div').sr('x://iframe', timeout=15)
利用xpath找到iframe