g1879 / DrissionPage

Python based web automation tool. Powerful and elegant.
https://DrissionPage.cn/
BSD 3-Clause "New" or "Revised" License
8.1k stars 769 forks source link

drissionPage 破解 cf 的思路讨论,可以实现根据坐标进行模拟点击吗? #297

Open lexburner opened 3 months ago

lexburner commented 3 months ago

在破解 cloudflare 时,感觉可以大致定位到验证码框所在的位置,然后模拟点击 verify by human 即可,如果可以通过坐标直接点击,可以充当 cloudflare 升级过程中的 workaround 方案,现在 cloudflare 一层 shadowroot 套一层 iframe,然后 iframe 里面又套了一层 document,防不胜防啊,如果有其他解决方案,也欢迎讨论

lexburner commented 3 months ago

image 层级结构如上,验证码所在地址:https://core.particle.network/cloudflare.html?language=en&theme=light&_=0.1.1&siteKey=0x4AAAAAAAaHm6FnzyhhmePw

有什么思路吗,不知道怎么选择这个 iframe 里面的 document

lexburner commented 3 months ago

一个取巧的方案是直接 .cf-turnstile-wrapper.click()

Deaseyy commented 3 months ago

一个取巧的方案是直接 .cf-turnstile-wrapper.click()

box = page.ele('.cf-turnstile-wrapper').shadow_root.ele('tag:iframe').ele('tag:body').shadow_root.ele('.cb-i')

box.click()

page.actions.move_to(box).click() 现在点击都会失败,也许加了其他鼠标轨迹检测,有什么好的办法吗

lexburner commented 3 months ago

一个取巧的方案是直接 .cf-turnstile-wrapper.click()

box = page.ele('.cf-turnstile-wrapper').shadow_root.ele('tag:iframe').ele('tag:body').shadow_root.ele('.cb-i') #box.click() page.actions.move_to(box).click() 现在点击都会失败,也许加了其他鼠标轨迹检测,有什么好的办法吗

参考这个 https://github.com/g1879/DrissionPage/issues/295

rdcyuxi commented 3 months ago

用drissionpage可以直接绕开cf的人机检测啊

HuidongTian commented 3 months ago

Not works for "Chatgpt.com"

Tspm1eca commented 3 months ago

現在只能用pyauto等等...從外部用鼠標點擊。

animesh86868 commented 3 months ago

現在只能用pyauto等等...從外部用鼠標點擊。

How to use pyauto to achieve this , I have done till these steps but after that no idea, can you guide me? wrapper = first_iframe.ele(".cf-turnstile-wrapper") print(1) shadow_root = wrapper.shadow_root print("shadow_root",shadow_root) niframe = shadow_root.ele("tag=iframe", timeout=15)

print(niframe.html)

sleep(8) verify_element = niframe.ele("Verify you are human", timeout=25) print(verify_element)

iBugCode commented 2 months ago

使用 pyautogui + pyvirtualdisplay 来虚拟可以做到, 项目已经稳定跑了很久 wrapper = page.ele(".main-content") spacer = wrapper.ele(".spacer") div1 = spacer.ele("tag:div") div2 = div1.ele("tag:div")

iframe = div2.shadow_root.ele("tag:iframe", timeout=15)
page.wait(2)
iframeRoot = iframe("tag:body").shadow_root
cbLb = iframeRoot.ele(".cb-lb", timeout=10)

# 获取位置
pos = cbLb.ele("tag:input", timeout=10).rect.screen_click_point

page.wait(2)

# 移动鼠标
pyautogui.moveTo( pos[0],  pos[1] + 61, duration=0.5 )
# 点击右键
pyautogui.click()
cuncun-edg commented 1 week ago

使用 pyautogui + pyvirtualdisplay 来虚拟可以做到, 项目已经稳定跑了很久 wrapper = page.ele(".main-content") spacer = wrapper.ele(".spacer") div1 = spacer.ele("tag:div") div2 = div1.ele("tag:div")

iframe = div2.shadow_root.ele("tag:iframe", timeout=15)
page.wait(2)
iframeRoot = iframe("tag:body").shadow_root
cbLb = iframeRoot.ele(".cb-lb", timeout=10)

# 获取位置
pos = cbLb.ele("tag:input", timeout=10).rect.screen_click_point

page.wait(2)

# 移动鼠标
pyautogui.moveTo( pos[0],  pos[1] + 61, duration=0.5 )
# 点击右键
pyautogui.click()

请问下有完整代码吗?我想在无界面的服务器上运行