上selenium 比较好上手的一种验证码, cv2模板匹配方法找缺口图在背景图中的位置, 计算要移动的距离, 移动缺口图 ,要注意的是移动轨迹模拟人移动的加速和减速

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
import time
from image_match import distance
from image_match import get_tracks
from image_match import getSlideInstanceclass yiDundriver(object):def __init__(self, url, prt='', time2wait=10):ex_path = 'C:\Program Files\Google\Chrome\Application\chromedriver.exe'chrome_options = Options()# chrome_options.add_argument("--proxy-server=http://%s" % prt)chrome_options.add_argument('--disable-gpu') #谷歌文档提到需要加上这个属性来规避bugchrome_options.add_argument('disable-infobars')self.browser = webdriver.Chrome(executable_path= ex_path, chrome_options=chrome_options)self.browser.set_window_size(500,800)self.browser.implicitly_wait(10)self.browser.get(url)self.wait = WebDriverWait(self.browser, time2wait)def __clickVerifyBtn(self):verify_btn = self.wait.until(EC.element_to_be_clickable((By.ID, "btnCertificationpone")))verify_btn.click()def __slideVerifyCode(self):slider = self.wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'yidun_slider')))ActionChains(self.browser).click_and_hold(slider).perform()slider_loc_x = slider.location["x"]img = self.wait.until(EC.presence_of_element_located((By.CLASS_NAME, "yidun_bg-img")))icon = self.wait.until(EC.presence_of_element_located((By.CLASS_NAME, "yidun_jigsaw")))pic_width = img.size['width']icon_width = icon.size['width']img_tags = self.browser.find_elements_by_tag_name("img")img_url = img_tags[0].get_attribute("src")icon_url = img_tags[1].get_attribute("src")match_x = distance(img_url, icon_url, pic_width)if match_x == -1:raise Exception()slider_instance = getSlideInstance(pic_width, icon_width, match_x)tracks = get_tracks(slider_instance)for track in tracks:ActionChains(self.browser).move_by_offset(xoffset=track, yoffset=0).perform()else:ActionChains(self.browser).move_by_offset(xoffset=3, yoffset=0).perform()ActionChains(self.browser).move_by_offset(xoffset=-3, yoffset=0).perform()time.sleep(0.5)ActionChains(self.browser).release().perform()time.sleep(3)cur_loc_x = slider.location["x"]if cur_loc_x > slider_loc_x:print("success")return Trueelse:return Falsedef verifySlideCode(self,attempt_times=10):#尝试attempt_times次滑动验证,返回是否验证通过self.wait.until(EC.text_to_be_present_in_element((By.CLASS_NAME,"yidun_tips__text"), r"向右拖动滑块填充拼图"))for attempt in range(attempt_times):try:if self.__slideVerifyCode():return Trueexcept Exception as e:print(e)ActionChains(self.browser).release().perform()refresh = self.wait.until(EC.visibility_of_element_located((By.CLASS_NAME, "yidun_refresh")))refresh.click()time.sleep(0.6)return Falseif __name__ == '__main__':drv = yiDundriver('http://dun.163.com/trial/jigsaw-wap')drv.verifySlideCode()

image_match.py
import cv2
import numpy as np
import urllib.request as request
import timedef mathc_img(img_gray, template, value):#图标和原图的匹配位置,即为图标要移动的距离w, h = template.shape[::-1]res = cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED)threshold = valueloc = np.where(res >= threshold)result_size = len(loc[1])if result_size > 0:middle = round(result_size/2)'''#show match resultguess_points = zip(*loc[::-1])for pt in guess_points:cv2.rectangle(img_gray, pt, (pt[0] + w, pt[1] + h), (7, 249, 151), 1)cv2.imshow('Detected', img_gray)cv2.waitKey(0)cv2.destroyAllWindows()'''return loc[1][middle]else:return -1def cropHeight(icon):mid = round(icon.shape[1] / 2)c = icon[:, mid, 2]no0 = np.where(c != 0)first, last = no0[0][0], no0[0][-1]return first, lastdef loadImg(url):resp = request.urlopen(url)image = np.asarray(bytearray(resp.read()), dtype="uint8")image = cv2.imdecode(image, cv2.IMREAD_COLOR)return imagedef cropImage(img,top_y,bottom_y):img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)crop_img = img_gray[top_y:bottom_y,:]return crop_imgdef showImg(img,name):cv2.imshow(name, img)cv2.waitKey(0)cv2.destroyAllWindows()def distance(img_url,icon_url,display_width):value = 0.45img_rgb = loadImg(img_url)tmp_rgb = loadImg(icon_url)crop_height = cropHeight(tmp_rgb)pic = cropImage(img_rgb,*crop_height)icon = cropImage(tmp_rgb,*crop_height)src_width = img_rgb.shape[1]guess_px = mathc_img(pic, icon, value)if guess_px is not -1:return round(guess_px * display_width / src_width)else:return -1# copy demo
def get_tracks(distance):'''''拿到移动轨迹,模仿人的滑动行为,先匀加速后匀减速匀变速运动基本公式:①v=v0+at②s=v0t+½at²③v²-v0²=2as:param distance: 需要移动的距离:return: 存放每0.3秒移动的距离'''# 初速度v = 0# 单位时间为0.2s来统计轨迹,轨迹即0.2内的位移t = 0.3# 位移/轨迹列表,列表内的一个元素代表0.2s的位移tracks = []# 当前的位移current = 0# 到达mid值开始减速mid = distance * 4 / 5while current < distance:if current < mid:# 加速度越小,单位时间的位移越小,模拟的轨迹就越多越详细a = 2else:a = -3# 初速度v0 = v# 0.2秒时间内的位移s = v0 * t + 0.5 * a * (t ** 2)# 当前的位置current += s# 添加到轨迹列表
        tracks.append(round(s))# 速度已经达到v,该速度作为下次的初速度v = v0 + a * treturn tracksdef getSlideInstance(img_w,icon_w,match_x):#考虑到滑块和图标的速度不总是1:1,获取滑块实际滑动的距离slider_width = 40iconMslider = icon_w - slider_widthfirst_l = round(iconMslider / 2)mid_l = img_w - first_l#end_l = img_w - first_l - mid_l  #eliminate 1px errorif match_x <= first_l:return match_x * 2elif match_x <= first_l + mid_l:return match_x + first_lelse:return 2 * match_x - mid_l

 

转载于:https://www.cnblogs.com/6min/articles/10959351.html

python易盾滑动验证码相关推荐

  1. 【验证码识别】OpenCV挑战网易易盾滑动验证码

    使用java + selenium + OpenCV破解网易易盾滑动验证码 戳这里→康康你手机号在过多少网站注册过!!! 友情推荐:新一代安全短信 谷歌图形验证码在AI 面前已经形同虚设,所以谷歌宣布 ...

  2. 使用java + selenium + OpenCV破解网易易盾滑动验证码

    使用java + selenium + OpenCV破解网易易盾滑动验证码 网易易盾:dun.163.com * 验证码地址:https://dun.163.com/trial/jigsaw * 使用 ...

  3. 用Python爬虫破解滑动验证码

    我们可以借用opencv来解决这个问题,主要步骤: opencv 是什么? OpenCV(Open Source Computer Vision Library)是开放源代码计算机视觉库,主要算法涉及 ...

  4. 用Python写一个滑动验证码

    1.准备阶段 滑动验证码我们可以直接用GEETEST的滑动验证码. 打开网址:https://www.geetest.com/ ,找到技术文档中的行为验证,打开部署文档,点击Python,下载ZIP包 ...

  5. 模仿网易云盾滑动验证码生成--抠图,大图部分背景透明

    思路,1,首先选取部分要抠图的样式,以此为模板,随机选取x,y坐标点,从源图中根据模板图片抠出你想要的样式 效果如:抠出的图:背景图: 源码: package com.rbao.east.JFrame ...

  6. 网易易盾,js逆向:★★★★★

    前言 可以关注我哟,一起学习,主页有更多练习例子 如果哪个练习我没有写清楚,可以留言我会补充 如果有加密的网站可以留言发给我,一起学习共享学习路程 如侵权,联系我,删 此文仅用于学习参考,请勿于商用, ...

  7. 网易云易盾验证码海外版发布,支持12种主流语言

    随着市场逐渐成熟,人口红利逐渐消失,越来越多的中国互联网产品走向海外,据<中国移动互联网出海环境全揭秘报告>,2017年Q4中国互联网出海企业就达到720多家,出海应用2268个,2018 ...

  8. 利用深度学习识别滑动验证码缺口位置

    做爬虫的同学肯定或多或少会为验证码苦恼过,在最初的时候,大部分验证码都是图形验证码.但是前几年「极验」验证码横空出世,行为验证码变得越来越流行,其中之一的形式便是滑块验证码. 滑块验证码是怎样的呢?如 ...

  9. 网易易盾助力工信部装备工业发展中心 守卫网站安全第一道防线

    近日,网易易盾与工业和信息化部装备工业发展中心(以下将简称:工信部装备工业发展中心)达成合作.借助网易易盾行为式验证码,工信部装备工业发展中心能有效防止机器的暴力登录和破解的同时,又能给用户带来无感知 ...

最新文章

  1. 报名 | 搜狐×清华:第三届内容识别算法大赛,比武招新两不误!
  2. python是全栈_Python全栈之路-3-字符串
  3. Hadoop详解(十一):Yarn设计理念与基本架构
  4. Linux图片的灰度化,iOS图像灰度解决方案--架构设计
  5. RocketMQ消息支持的模式-OrderProducer(顺序)
  6. 单列集合List的实现类
  7. Java 随心笔记7
  8. resultset遍历取数据_数据放在哪?如何从数据库取数据?
  9. 利用信号量实现线程同步
  10. 如何备份服务器日志到其他服务器_sql2008自动备份到ftp服务器,sql2008自动备份到ftp服务器代码公布...
  11. C++ Memory_order的理解
  12. 三国杀全武将台词大全(标准+神话再临+一将成名12345+SP+国战+其他+皮肤,更新中)
  13. 机器学习实战(Machine Learning in Action)学习笔记————10.奇异值分解(SVD)原理、基于协同过滤的推荐引擎、数据降维...
  14. 圣安德鲁斯计算机科学排名,2020年圣安德鲁斯大学历史世界排名最好是第几位...
  15. 美国近年来推进“新基建”的布局及启示
  16. 游戏c#脚本语言,C#作为脚本语言执行解密
  17. 痛心,拼多多一程序员在家跳楼自杀!发生了什么?
  18. module 'gensim' has no attribute 'corpora'
  19. ai面谈技巧_AI时代的人际化技巧
  20. 安全测试面试流程有哪些?

热门文章

  1. 浏览器和服务器的区别
  2. Blizzard的MPQ文件格式搜索算法---来自Gameres bbs
  3. 如何从一根普通八芯网线如何分出电话线和网络线?
  4. python基金比较上机题_使用python筛选基金
  5. Raspberry - 解决中兴(ZTE)摄像头无法使用密码访问树莓派上的samba共享(NAS)
  6. [渝粤教育] 中央财经大学 审计学 参考 资料
  7. linux 播放.ev4播放器,ev4文件怎么播放
  8. 【热门收藏】iOS开发人员必看的精品资料(100个)
  9. 快递管理系统项目整理
  10. 修正 Newton 公式