最近在研究滑塊驗證碼這一塊,自然也玩了一把京東,發現之前的軌跡方程並不可用,需要自己慢慢除錯,找到合適的引數。這種滑塊認證的成功率不可能是100%,所以要寫個迴圈,讓認證失敗的時候重新呼叫。
先看效果:
(1) 滑塊缺口距離識別
京東的驗證碼背景圖和模板圖大概各10張;缺口位置變化的
使用 cv2 庫,用模板匹配,就是用來在大圖中找小圖,也就是說在一副影象中尋找另外一張模板影象的位置
import cv2
img = cv2.imread(
'a1.png',0
)template = cv2.imread(
'a2.png',0
)h, w = template.shape[:2
]print
("h = "
,h )
print
("w = "
, w)
res = cv2.matchtemplate(img, template, cv2.tm_ccorr_normed)
min_val, max_val, min_loc, max_loc = cv2.minmaxloc(res)
print
("min_val = "
, min_val)
print
("max_val = "
, max_val)
print
("min_loc = "
, min_loc)
print
("max_loc = "
, max_loc)
left_top = min_loc # 左上角
right_bottom =
(left_top[0]
+ w, left_top[1]
+ h)
# 右下角
cv2.rectangle(img, left_top, right_bottom,
255,2)
# 畫出矩形位置
cv2. imwrite(
'aa1.png'
, img)
匹配結果:
識別率大概 80% 左右,但好在**簡單,只需4行可解決缺口位置識別;這裡是真實的缺口距離,放到網頁中要縮放 278/360
(2) 處理滑塊驗證的軌跡
這裡用簡單的方式處理滑塊的拖動速度,**量少;
示例:
import asyncio
import random
import cv2
from pyppeteer import launch
from urllib import request
# 滑塊的缺口距離識別
async
defget_distance()
: img = cv2.imread(
'image.png',0
) template = cv2.imread(
'template.png',0
) res = cv2.matchtemplate(img, template, cv2.tm_ccorr_normed)
value = cv2.minmaxloc(res)[2
][0]
distance = value *
278/
360return distance
async
defmain()
: browser =
await launch(
) page =
await browser.newpage(
)await page.setviewport(
)await page.goto(
'')await page.waitfor(
1000
)await page.click(
'div.login-tab-r'
)await page.waitfor(
1000
)# 模擬人工輸入使用者名稱、密碼
await page.
type
('#loginname'
,'[email protected]',)
await page.
type
('#nloginpwd'
,'1234567890',)
await page.waitfor(
2000
)await page.click(
'div.login-btn'
)await page.waitfor(
3000
)# 模擬人工拖動滑塊、失敗則重試
while
true:if
await page.j(
'#ttbar-login'):
print
('登入成功!'
)await page.waitfor(
6000
)break
else
: image_src =
await page.jeval(
'.jdjrv-bigimg >img'
,'el => el.src'
) request.urlretrieve(image_src,
'image.png'
) template_src =
await page.jeval(
'.jdjrv-smallimg >img'
,'el => el.src'
) request.urlretrieve(template_src,
'template.png'
)await page.waitfor(
3000
) el =
await page.j(
'div.jdjrv-slide-btn'
) box =
await el.boundingbox(
)await page.hover(
'div.jdjrv-slide-btn'
) distance =
await get_distance(
)await page.mouse.down(
)await page.mouse.move(box[
'x']
+ distance + random.uniform(30,
33), box[
'y'],)
await page.waitfor(random.randint(
300,
700)
)await page.mouse.move(box[
'x']
+ distance +
29, box[
'y'],)
await page.mouse.up(
)await page.waitfor(
3000
)asyncio.get_event_loop(
).run_until_complete(main(
))
vue滑塊驗證登入
滑塊樣式 請輸入手機號 el input el form item checkmove movebox movego div txt id txt 按住滑塊,拖動到最右邊 div move movebefore v move pull div v move 為自定義指令 div el form it...
京東模擬登入
京東表示很無奈,爬蟲都用它練手 登入時,瀏覽器傳送了乙個post請求,在請求頭上帶了基本引數,並不是所有引數在模擬時都需要,一般需要cookie,referer,和user agent 會話物件requests.session能夠跨請求地保持某些引數,比如cookies,即在同乙個session例項...
系統登入頁面拉動驗證滑塊進行驗證
有如下登入頁面 登入過程中輸入賬號密碼後 需要拉 中 滑塊 後 才可登入成功 如何使用webdriver 實現拉動滑塊的功能?如下 建立公共功能類並加入方法 public class actionutil public static void drag element webelement e,in...