一.項(xiàng)目背景
滑塊驗(yàn)證碼,即用戶使用鼠標(biāo)將滑塊從某個(gè)位置拖動(dòng)到另一個(gè)位置,服務(wù)器通過用戶拖動(dòng)滑塊的軌跡來判斷當(dāng)前用戶是否為人類,本文主要介紹如何利用Selenium框架模擬滑塊移動(dòng)。
上篇Selenium模擬滑塊拖動(dòng)我們介紹了模擬豆瓣滑塊登錄,但是尚未成功,主要原因是豆瓣會(huì)檢測Chromium層指紋,需要抹除該指紋才能登錄成功,這塊相關(guān)知識(shí)點(diǎn)我們就不分享了。本篇在之前基礎(chǔ)上改進(jìn),增加了輪廓檢測部分,適用性更廣。
二.實(shí)現(xiàn)過程
1.構(gòu)建加速度函數(shù)
#獲取距離值
def get_tracks(distance):
'''
模擬人的滑動(dòng)行為,先勻加速后勻減速
勻變速基本公式
v=v0+at
s=vot+1/2at2
'''
#初速度
v=0
#設(shè)置時(shí)間
t=0.3
#存儲(chǔ)每段距離值
tracks=[]
#當(dāng)前距離
current=0
#中間位置為4/5距離處
mid=distance*4/5
while current
2.構(gòu)建位置檢測函數(shù)
#獲取圖片位置
def get_pos(img):
#高斯濾波
blurred=cv.GaussianBlur(img,(5,5),0)
#邊緣檢測
canny=cv.Canny(blurred,200,400)
#提取邊界的拓?fù)湫蛄? contours,hierarchy=cv.findContours(canny,cv.RETR_EXTERNAL,cv.CHAIN_APPROX_SIMPLE)
#遍歷點(diǎn)集
for i,contour in enumerate(contours):
m=cv.moments(contour)
if m['m00']==0:
cx=cy=0
else:
cx,cy=m['m10']/m['m00'],m['m01']/m['m00']
if 6000(contour)<8000>
3.模擬滑塊移動(dòng)
from selenium import webdriver
from selenium.webdriver import ActionChains
import time
from selenium.webdriver.chrome import options
import requests
import cv2 as cv
#初始化選項(xiàng)
opt=options.Options()
#設(shè)置user-agent
ua='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36'
#添加user-agent
opt.add_argument(f"user-agent={ua}")
#去掉提示:Chrome正收到自動(dòng)測試軟件的控制
opt.add_argument('--disable-infobars')
#關(guān)閉開發(fā)者模式
opt.add_experimental_option("useAutomationExtension", False)
#以鍵值對的形式加入參數(shù)
opt.add_experimental_option("excludeSwitches", ['enable-automation'])
#禁用啟用Blink運(yùn)行時(shí)的功能
opt.add_argument('--disable-blink-features=AutomationControlled')
#獲取滑塊
element=browser.find_element_by_xpath('//*[@id="tcaptcha_drag_thumb"]')
#在滑塊上暫停
ActionChains(browser).click_and_hold(on_element=element).perform()
#拖動(dòng)滑塊180像素
ActionChains(browser).move_to_element_with_offset(to_element=element,xoffset=distance[0]/2-25,yoffset=0).perform()
#拖動(dòng)剩余像素
tracks=get_tracks(25)
#遍歷梅一段距離
for track in tracks:
#滑塊移動(dòng)響應(yīng)距離
ActionChains(browser).move_by_offset(xoffset=track,yoffset=0).perform()
#休息1s中
time.sleep(1)
#釋放滑塊
ActionChains(browser).release().perform()
-
服務(wù)器
+關(guān)注
關(guān)注
12文章
8704瀏覽量
84580 -
框架
+關(guān)注
關(guān)注
0文章
396瀏覽量
17272 -
軌跡
+關(guān)注
關(guān)注
0文章
46瀏覽量
9252
發(fā)布評論請先 登錄
相關(guān)推薦
評論