一、破解极验验证码思路

现在极验验证码广泛应用于直播视频、金融服务、电子商务、游戏娱乐、政府企业等各大类型网站
对于这类验证,如果我们直接模拟表单请求,繁琐的认证参数与认证流程会让你蛋碎一地,我们可以用selenium驱动浏览器来解决这个问题,大致分为以下几个步骤:
1、输入用户名,密码
2、点击按钮验证,弹出没有缺口的图
3、获得没有缺口的图片
4、点击滑动按钮,弹出有缺口的图
5、获得有缺口的图片
6、对比两张图片,找出缺口,即滑动的位移
7、按照人的行为行为习惯,把总位移切成一段段小的位移
8、按照位移移动
9、完成登录

二、代码模块

这里以某小说平台为例,自动登录获取cookies
代码如下:

import time
import re
import random
import requests
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from urllib.request import urlretrieve
from PIL import Image
from selenium.webdriver.common.action_chains import ActionChains
import pymysql
import json
import time
from selenium import webdriver
import win32api
import win32con
import win32clipboard
from ctypes import *class yuewen():def __init__(self):"""初始化属性,传入url地址,驱动路径,浏览器窗口最大化,伪造ua"""self.url = 'https://open.yuewen.com/'chrome_options = Options()chrome_options.add_argument("--no-sandbox")# chrome_options.add_argument('--disable-dev-shm-usage')# chrome_options.add_argument('--disable-gpu')# chrome_options.add_argument('--headless')self.driver = webdriver.Chrome(options=chrome_options)self.driver.maximize_window()#self.headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'}def input_username_password(self, account, password):self.driver.get(self.url)#请求地址time.sleep(1)self.driver.find_element_by_class_name('op-button-sign').click()#找到class为op-button-sign的元素点击time.sleep(1)windll.user32.SetCursorPos(740,260)win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)# self.driver.find_element_by_id('opUserName').send_keys(account)#找到id为accountInput的输入框输入内容# time.sleep(0.5)# self.driver.find_element_by_id('opUserPwd').send_keys(password)#找到id为passwordInput的输入框输入内容# time.sleep(0.5)self.driver.find_element_by_class_name('el-input__inner').send_keys(account)self.driver.find_element_by_name('password').send_keys(password)time.sleep(3)self.driver.find_element_by_class_name('loginin').click()  # 找到class为op-button-sign的元素点击# windll.user32.SetCursorPos(620, 620)# win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)# win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)time.sleep(3)#self.driver.find_element_by_class_name('el-button el-button--default loginin').click()#找到id为login-btn的元素点击def get_img(self):"""获取验证码阴影图和原图:return:"""self.driver.switch_to.frame('tcaptcha_iframe')time.sleep(3)# 获取有阴影的图片src = self.driver.find_element_by_id('slideBg').get_attribute('src')#分析图片地址,发现原图地址可以通过阴影图地址改动获取src_bg = re.sub('img_index=1', 'img_index=0', src)urlretrieve(src, 'img1.png')urlretrieve(src_bg, 'img2.png')captcha1 = Image.open('img1.png')captcha2 = Image.open('img2.png')return captcha1, captcha2def resize_img(self, img):"""下载的图片把网页中的图片进行了放大,所以将图片还原成原尺寸:param img: 图片:return: 返回还原后的图片"""a = 2.428  # 通过本地图片与原网页图片的比较,计算出的缩放比例(x, y) = img.sizex_resize = int(x // a)y_resize = int(y // a)img = img.resize((x_resize, y_resize), Image.ANTIALIAS)return imgdef is_pixel_equal(self, img1, img2, x, y):"""比较两张图片同一点上的像数值,差距大于设置标准返回False:param img1: 阴影图:param img2: 原图:param x: 横坐标:param y: 纵坐标:return: 是否相等"""pixel1, pixel2 = img1.load()[x, y], img2.load()[x, y]sub_index = 100if abs(pixel1[0] - pixel2[0]) < sub_index and abs(pixel1[1] - pixel2[1]) < sub_index and abs(pixel1[2] - pixel2[2]) < sub_index:return Trueelse:return Falsedef get_gap_offset(self, img1, img2):'''获取缺口的偏移量'''offset = Nonedistance = 70for i in range(distance, img1.size[0]):for j in range(img1.size[1]):# 两张图片对比,(i,j)像素点的RGB差距,过大则该x为偏移值if not self.is_pixel_equal(img1, img2, i, j):offset = ireturn offsetprint(offset)return offsetdef get_track(self, offset):'''计算滑块的移动轨迹'''offset -= -8  # 滑块并不是从0开始移动,有一个初始值a = offset / 4track = [a, a, a, a]print(track)return trackdef shake_mouse(self):"""模拟人手释放鼠标抖动:return: None"""ActionChains(self.driver).move_by_offset(xoffset=-2, yoffset=0).perform()ActionChains(self.driver).move_by_offset(xoffset=2, yoffset=0).perform()def operate_slider(self, track):"""拖动滑块:param track: 运动轨迹:return:"""#  定位到拖动按钮slider_bt = self.driver.find_element_by_xpath('//div[@class="tc-drag-thumb"]')# 点击拖动按钮不放ActionChains(self.driver).click_and_hold(slider_bt).perform()# 按正向轨迹移动for i in track:ActionChains(self.driver).move_by_offset(xoffset=i, yoffset=0).perform()time.sleep(random.random() / 100)  # 每移动一次随机停顿0-1/100秒之间骗过了极验,通过率很高time.sleep(random.random())# 按逆向轨迹移动back_tracks = [-1, -0.5, -1]for i in back_tracks:time.sleep(random.random() / 100)ActionChains(self.driver).move_by_offset(xoffset=i, yoffset=0).perform()# 模拟人手抖动self.shake_mouse()time.sleep(random.random())# 松开滑块按钮ActionChains(self.driver).release().perform()def login(self, account, password):'''实现主要的登陆逻辑'''self.input_username_password(account, password)time.sleep(5)#获取cookiea, b = self.get_img()a = self.resize_img(a)b = self.resize_img(b)distance = self.get_gap_offset(a, b)track = self.get_track(distance)login = self.operate_slider(track)time.sleep(4)# 获取cookiecookie = self.driver.get_cookies()cookie_str = {}# 组装cookie字符串for item_cookie in cookie:cookie_str[item_cookie["name"]] =  item_cookie["value"]return cookie_str
if __name__ == '__main__':qq = yuewen()account = '56318****@qq.com'password = '********'cookies = qq.login(account, password)

三、结果验证

如下面动态图:

补充说明

从下图可以看出电脑鼠标一直处于左上方的状态,验证码的滑动都是依照代码来拖动的

python--破解滑动验证码相关推荐

  1. Python破解滑动验证码(极验/无背景图)

    在使用Python突破人机验证时,验证码乃第一大关卡.本文针对破解滑动验证码展开分析.对于能够直接获取滑块小图与背景图的滑动验证码,通过使用cv2模块的matchTemplate函数,可以准确地计算出 ...

  2. 破解滑动验证码,成功率在百分之九十九

    破解滑动验证码 使用python破解滑动验证码后获取cookie, 用于爬取数据,这里是获取到cookie存到redis,不费话了,上代码 import re import redis from se ...

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

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

  4. 如何破解滑动验证码?

    本文通过自动化查询域名或公司的备案信息,来演示其中图片滑动验证码的破解方式,以此来思考验证码的安全性问题,思考如何设计出安全性更高的验证码. 注意:破解验证码进行网络内容抓取可能是一种违规行为,可以以 ...

  5. Python破解滑块验证码算法,完美避开人机识别

    | 完美是不可能的,加个震惊!Python破解BiliBili滑块验证码,完美避开人机识别,可以有 准备工作 B站登录页 https://passport.bilibili.com/login pyt ...

  6. 使用Selenium破解滑动验证码的原理及解决思路

    介绍 现在出现了一种通过用户鼠标移动滑块来填补有缺口图片的验证码,我们叫做滑动验证码. 它的原理很简单,首先生成一张图片,然后随机挖去一块,在页面展示被挖去部分的图片,再通过js获取用户滑动距离,以及 ...

  7. python处理滑块验证码_使用python实现滑动验证码

    首先安装一个需要用到的模块 pip install social-auth-app-django 安装完后在终端输入pip list会看到 social-auth-app-django 3.1.0so ...

  8. selenium爬虫|破解滑动验证码以极验为例

    爬虫访问一些网站遇到滑动验证码解决方案 这里是用selenium做模拟,如果是requests可以封装这个登录方法来获取登录后的cookies也是可以用的. 1 思路 先讲思路,分析流程 我们输入账号 ...

  9. python实现滑动验证码_使用python实现滑动验证码

    首先安装一个需要用到的模块 pip install social-auth-app-django 安装完后在终端输入pip list会看到 social-auth-app-django 3.1.0 s ...

  10. python爬虫滑动验证码_python爬虫21 | 对于b站这样的滑动验证码,不好意思,照样自动识别...

    今天 要来说说滑动验证码了 大家应该都很熟悉 点击滑块然后移动到图片缺口进行验证 现在越来越多的网站使用这样的验证方式 为的是增加验证码识别的难度 那么 对于这种验证码 应该怎么破呢 接下来就是 打开 ...

最新文章

  1. 在Uubuntu 14.04 64bit上搭建NumPy函数库环境
  2. Rocksdb 写流程,读流程,WAL文件,MANIFEST文件,ColumnFamily,Memtable,SST文件原理详解
  3. 终于!北京无人车,今起也能免费坐
  4. OpenCV2:图像滤波基础
  5. python中ndarray和matrix
  6. REST设计模式简介
  7. 科学家利用计算机模型,科学家尝试利用计算机模拟整个宇宙的演化
  8. 云效发布策略指南|滚动、分批、灰度怎么选?
  9. Django Web在Apache上的部署
  10. 手动实现apply、call、bind
  11. 动态规划——打家劫舍||(Leetcode 213)
  12. 【Spark大数据处理】动手写WordCount
  13. 背景建模之codebook算法
  14. k近邻法 kd树 平衡kd树
  15. 【ESP32之旅】ESP32C3 Arduino库使用方法
  16. Ubuntu 18.04 安装后的美化与软件安装
  17. 5M1E分析法—质量管理纵向无死角
  18. 线性代数:第五章 相似矩阵及二次型(2)二次型及其标准型 配平方法 合同变换法 正定二次型
  19. Excel VBA 代替Sumproduct实现多条件求和
  20. C语言_钩子函数(回调函数)

热门文章

  1. 模糊理论相关学习(2)——模糊神经网络
  2. VB.NET中LISTVIEW控件点击列首排序问题
  3. 一件衣服95元,如果消费满300元,可以打八五折。输入购买衣服数,输出需要支付的金额。
  4. tensorflow环境安装(及tensorflow虚拟环境中配置jupyter)
  5. iOS网络NSURLSession使用详解
  6. 【无标题】No qualifying bean of type ‘javax.sql.DataSource‘ available: expected at least 1
  7. synopsys工具介绍
  8. 一念起,万水千山;一念灭,沧海桑田。
  9. 辐射强度、辐亮度、辐照度——一文搞定
  10. 移动SEO之页面优化