100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > 【.05】腾讯防水墙滑动验证码破解 python + selenium + OpenCV

【.05】腾讯防水墙滑动验证码破解 python + selenium + OpenCV

时间:2020-04-25 16:32:36

相关推荐

【.05】腾讯防水墙滑动验证码破解 python + selenium + OpenCV

captcha_qq

腾讯防水墙滑动验证码破解

* 使用OpenCV库* 成功率大概90%左右:在实际应用中,登录后可判断当前页面是否有登录成功才会出现的信息:比如用户名等。循环* 验证码地址:https://open./online.html* 破解 腾讯滑动验证码* 腾讯防水墙* python + seleniuum + cv2

结果展示

这里有一点很有意思

如果滑动过快或者滑动的又精确又快的话,有时会解锁不成功,所以这里使用了 模拟人滑动的方法:加速度,多滑,划回来等 各种操作,各位也可以多试试。

def get_track(distance):"""模拟轨迹 假装是人在操作:param distance::return:"""# 初速度v = 0# 单位时间为0.2s来统计轨迹,轨迹即0.2内的位移t = 0.2# 位移/轨迹列表,列表内的一个元素代表0.2s的位移tracks = []# 当前的位移current = 0# 到达mid值开始减速mid = distance * 7 / 8distance += 10 # 先滑过一点,最后再反着滑动回来# a = random.randint(1,3)while current < distance:if current < mid:# 加速度越小,单位时间的位移越小,模拟的轨迹就越多越详细a = random.randint(2, 4) # 加速运动else:a = -random.randint(3, 5) # 减速运动# 初速度v0 = v# 0.2秒时间内的位移s = v0 * t + 0.5 * a * (t ** 2)# 当前的位置current += s# 添加到轨迹列表tracks.append(round(s))# 速度已经达到v,该速度作为下次的初速度v = v0 + a * t# 反着滑动到大概准确位置for i in range(4):tracks.append(-random.randint(2, 3))for i in range(4):tracks.append(-random.randint(1, 3))return tracks

代码在这里

star 一下项目地址 /ybsdegit/captcha_qq入口代码地址 /ybsdegit/captcha_qq/blob/master/captcha_qq.py

这里是代码

#!/usr/bin/env python# encoding: utf-8# -*- coding: utf-8 -*-# @contact: ybsdeyx@# @software: PyCharm# @time: /4/25 16:39# @author: Paulson●Wier# @file: captcha_qq.py# @desc:import numpy as npimport randomimport requestsfrom selenium.webdriver import ActionChainsimport timefrom selenium import webdriverfrom PIL import Imageimport osfrom selenium.webdriver.support.ui import WebDriverWaitimport cv2class Login(object):"""腾讯防水墙滑动验证码破解使用OpenCV库成功率大概90%左右:在实际应用中,登录后可判断当前页面是否有登录成功才会出现的信息:比如用户名等。循环https://open./online.html破解 腾讯滑动验证码腾讯防水墙python + seleniuum + cv2"""def __init__(self):# 如果是实际应用中,可在此处账号和密码self.url = "https://open./online.html"self.driver = webdriver.Chrome()@staticmethoddef show(name):cv2.imshow('Show', name)cv2.waitKey(0)cv2.destroyAllWindows()@staticmethoddef webdriverwait_send_keys(dri, element, value):"""显示等待输入:param dri: driver:param element::param value::return:"""WebDriverWait(dri, 10, 5).until(lambda dr: element).send_keys(value)@staticmethoddef webdriverwait_click(dri, element):"""显示等待 click:param dri: driver:param element::return:"""WebDriverWait(dri, 10, 5).until(lambda dr: element).click()@staticmethoddef get_postion(chunk, canves):"""判断缺口位置:param chunk: 缺口图片是原图:param canves::return: 位置 x, y"""otemp = chunkoblk = canvestarget = cv2.imread(otemp, 0)template = cv2.imread(oblk, 0)# w, h = target.shape[::-1]temp = 'temp.jpg'targ = 'targ.jpg'cv2.imwrite(temp, template)cv2.imwrite(targ, target)target = cv2.imread(targ)target = cv2.cvtColor(target, cv2.COLOR_BGR2GRAY)target = abs(255 - target)cv2.imwrite(targ, target)target = cv2.imread(targ)template = cv2.imread(temp)result = cv2.matchTemplate(target, template, cv2.TM_CCOEFF_NORMED)x, y = np.unravel_index(result.argmax(), result.shape)return x, y# # 展示圈出来的区域# cv2.rectangle(template, (y, x), (y + w, x + h), (7, 249, 151), 2)# cv2.imwrite("yuantu.jpg", template)# show(template)@staticmethoddef get_track(distance):"""模拟轨迹 假装是人在操作:param distance::return:"""# 初速度v = 0# 单位时间为0.2s来统计轨迹,轨迹即0.2内的位移t = 0.2# 位移/轨迹列表,列表内的一个元素代表0.2s的位移tracks = []# 当前的位移current = 0# 到达mid值开始减速mid = distance * 7 / 8distance += 10 # 先滑过一点,最后再反着滑动回来# a = random.randint(1,3)while current < distance:if current < mid:# 加速度越小,单位时间的位移越小,模拟的轨迹就越多越详细a = random.randint(2, 4) # 加速运动else:a = -random.randint(3, 5) # 减速运动# 初速度v0 = v# 0.2秒时间内的位移s = v0 * t + 0.5 * a * (t ** 2)# 当前的位置current += s# 添加到轨迹列表tracks.append(round(s))# 速度已经达到v,该速度作为下次的初速度v = v0 + a * t# 反着滑动到大概准确位置for i in range(4):tracks.append(-random.randint(2, 3))for i in range(4):tracks.append(-random.randint(1, 3))return tracks@staticmethoddef urllib_download(imgurl, imgsavepath):"""下载图片:param imgurl: 图片url:param imgsavepath: 存放地址:return:"""from urllib.request import urlretrieveurlretrieve(imgurl, imgsavepath)def after_quit(self):"""关闭浏览器:return:"""self.driver.quit()def login_main(self):# ssl._create_default_https_context = ssl._create_unverified_contextdriver = self.driverdriver.maximize_window()driver.get(self.url)click_keyi_username = driver.find_element_by_xpath("//div[@class='wp-onb-tit']/a[text()='可疑用户']")self.webdriverwait_click(driver, click_keyi_username)login_button = driver.find_element_by_id('code')self.webdriverwait_click(driver, login_button)time.sleep(1)driver.switch_to.frame(driver.find_element_by_id('tcaptcha_iframe')) # switch 到 滑块frametime.sleep(0.5)bk_block = driver.find_element_by_xpath('//img[@id="slideBg"]') # 大图web_image_width = bk_block.sizeweb_image_width = web_image_width['width']bk_block_x = bk_block.location['x']slide_block = driver.find_element_by_xpath('//img[@id="slideBlock"]') # 小滑块slide_block_x = slide_block.location['x']bk_block = driver.find_element_by_xpath('//img[@id="slideBg"]').get_attribute('src') # 大图 urlslide_block = driver.find_element_by_xpath('//img[@id="slideBlock"]').get_attribute('src') # 小滑块 图片urlslid_ing = driver.find_element_by_xpath('//div[@id="tcaptcha_drag_thumb"]') # 滑块os.makedirs('./image/', exist_ok=True)self.urllib_download(bk_block, './image/bkBlock.png')self.urllib_download(slide_block, './image/slideBlock.png')time.sleep(0.5)img_bkblock = Image.open('./image/bkBlock.png')real_width = img_bkblock.size[0]width_scale = float(real_width) / float(web_image_width)position = self.get_postion('./image/bkBlock.png', './image/slideBlock.png')real_position = position[1] / width_scalereal_position = real_position - (slide_block_x - bk_block_x)track_list = self.get_track(real_position + 4)ActionChains(driver).click_and_hold(on_element=slid_ing).perform() # 点击鼠标左键,按住不放time.sleep(0.2)# print('第二步,拖动元素')for track in track_list:ActionChains(driver).move_by_offset(xoffset=track, yoffset=0).perform() # 鼠标移动到距离当前位置(x,y)time.sleep(0.002)# ActionChains(driver).move_by_offset(xoffset=-random.randint(0, 1), yoffset=0).perform() # 微调,根据实际情况微调time.sleep(1)# print('第三步,释放鼠标')ActionChains(driver).release(on_element=slid_ing).perform()time.sleep(1)print('登录成功')self.after_quit()if __name__ == '__main__':phone = "****"login = Login()login.login_main()

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。