selenium
打开浏览器通过
selenium
打开的浏览器是出于测试状态的,和正常的浏览器不太一样。
selenium
打开的浏览器哪怕人工手动拖动验证码也会被判断出来是机器操作并显示"出错了"。window.navigator.webdriver
是否为空,通过代码处理后可以绕过。正常打开window.navigator.webdriver
值:
> window.navigator.webdriver
undefined
使用selenium
打开window.navigator.webdriver
值:
> window.navigator.webdriver
true
绕过代码
# 通过浏览器的 devtool 将 .webdriver 属性改为"undefined"
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": """Object.defineProperty(navigator, 'webdriver', {get: () => undefined})""",
})
selenium
通过操作元素ActionChains
模拟鼠标滚动后,可以检测出来是机器操作并显示"出错了"。while True:
for i in range(1,10):
div = driver.find_element_by_id(("nc_%d_n1z"%i))
if div != None:
break
ActionChains(driver).click_and_hold(on_element=div).perform()
time.sleep(random.random()%0.1)
curroffset = random.randint(30,200)
ActionChains(driver).move_to_element_with_offset(to_element=div, xoffset=curroffset, yoffset=10).perform()
win32api
模拟鼠标拖动
def mouse_down(posX, posY):#鼠标按下不放,从一个坐标点直线拖动到另外一个坐标点
print("down = %d,%d"%(posX, posY))
ctypes.windll.user32.SetCursorPos(posX, posY)#鼠标按下的坐标点
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, posX, posY,posX, posY)
def mouse_move(posX, posY):#鼠标按下不放,从一个坐标点直线拖动到另外一个坐标点
print("move = %d,%d"%(posX, posY))
win32api.mouse_event(win32con.MOUSEEVENTF_ABSOLUTE + win32con.MOUSEEVENTF_MOVE, posX, posY,0,0)
ctypes.windll.user32.SetCursorPos(posX, posY)#鼠标停在最后弹起的坐标点
def mouse_up(posX, posY):#鼠标按下不放,从一个坐标点直线拖动到另外一个坐标点
print("up = %d,%d"%(posX, posY))
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, posX, posY,posX, posY)
ctypes.windll.user32.SetCursorPos(posX, posY)#鼠标停在最后弹起的坐标点
mouse_down(670,880-182)
mouse_up(670,880-182)
time.sleep(1)
mouse_down(670,880-182)
time.sleep(1)
for i in range(1,5):
time.sleep(1)
offsetX = random.randint(300,500)
mouse_move(670+offsetX,880-182)
mouse_up(670,880-182)