-
-
[原创]【原创】Python 网易易盾滑块验证
-
发表于: 2022-5-11 02:21 5324
-
<table><tr><td bgcolor=orange>本文仅供学习交流使用,如侵立删!</td></tr></table>
记一次 网易易盾滑块验证分析并通过
操作环境
- win10 、 mac
- Python3.9
- selenium、PIL、numpy、scipy、matplotlib
分析
网易易盾滑块验证,就长下面这个样子
具体验证原理有兴趣的可自行查询官方文档:网易易盾开发文档
话不多少,借助之前写阿里云盾滑块和极验滑块的经验,直接上代码,详细可参考:[阿里云盾滑块验证]极验滑块验证(https://cenjy.blog.csdn.net/article/details/124357598)
解决方案
使用selenium请求url,并触发滑块验证
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | def open ( self ): # 初始化浏览器 wait = WebDriverWait( self .driver, 5 ) # 点击对应标签 self .driver.get(cfg.TEST_URL) button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, cfg.HD_SELECOTR))) button.click() self .tc_item = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, cfg.TC_SELECOTR))) self .tc_item.click() # 得到背景和滑块的item, 以及滑动按钮 time.sleep( 2 ) self .background_item = wait.until( EC.presence_of_element_located((By.CSS_SELECTOR, cfg.BG_SELECOTR)) ) self .slider_item = wait.until( EC.presence_of_element_located((By.CSS_SELECTOR, cfg.HK_SELECOTR)) ) self .slider_btn = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, cfg.HD_BTN))) self .offset = cfg.offset self .background_path = cfg.background_path self .slider_path = cfg.slider_path |
获取验证图片并计算滑块距离
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 52 | def get_images( self ): """ 获取验证码图片 :return: 图片的location信息 """ url = selenium_item.get_attribute( "src" ) if url is not None : response = requests.get(url) with open (path, "wb" ) as f: f.write(response.content) img = Image. open (path).resize(size) img.save(path) else : class_name = selenium_item.get_attribute( "class" ) js_cmd = ( 'return document.getElementsByClassName("%s")[0].toDataURL("image/png");' % class_name ) im_info = self .driver.execute_script(js_cmd) im_base64 = im_info.split( "," )[ 1 ] im_bytes = base64.b64decode(im_base64) with open (path, "wb" ) as f: f.write(im_bytes) img = Image. open (path).resize(size) img.save(path) def compute_gap( self , array): """ 计算缺口偏移 """ grad = np.array(array > 0 ) h, w = grad.shape # img_show(grad) rows_sum = np. sum (grad, axis = 1 ) cols_sum = np. sum (grad, axis = 0 ) left, top, bottom = 0 , 0 , h # get the top index p = np. max (rows_sum) * 0.5 for i in range (h): if rows_sum[i] > p: top = i break for i in range (h - 1 , - 1 , - 1 ): if rows_sum[i] > p: bottom = i break p = np. max (cols_sum) * 0.5 for i in range (w): if cols_sum[i] > p: left = i break return top, bottom + 1 , left |
生成滑动轨迹
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | def get_tracks(distance): v = random.randint( 0 , 2 ) t = 1 tracks = [] cur = 0 mid = distance * 0.8 while cur < distance: if cur < mid: a = random.randint( 2 , 4 ) else : a = - random.randint( 3 , 5 ) s = v * t + 0.5 * a * t * * 2 cur + = s v = v + a * t tracks.append( round (s)) tracks.append(distance - sum (tracks)) return tracks |
滑动模块
1 2 3 4 5 6 7 8 9 10 | def move_to_gap( self , track): """滑动滑块""" print ( '第一步,点击滑动按钮' ) slider = self .wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'geetest_slider_button' ))) ActionChains( self .driver).click_and_hold(slider).perform() time.sleep( 1 ) print ( '第二步,拖动元素' ) for track in track: ActionChains( self .driver).move_by_offset(xoffset = track, yoffset = 0 ).perform() # 鼠标移动到距离当前位置(x,y) time.sleep( 0.0001 ) |
效果
资源下载
https://download.csdn.net/download/qq_38154948/85343666
<table><tr><td bgcolor=orange>本文仅供学习交流使用,如侵立删!</td></tr></table>
赞赏
看原图
赞赏
雪币:
留言: