滑块验证码

1. 滑块简介

注:重点是识别滑块缺口,测出需要拖动的距离

1.1 核心步骤

  1. 从服务器随机取一张图片,并对图片上的随机x,y坐标和宽高一块区域抠图;

  2. 根据步骤一的坐标和宽高,使用二维数组保存原图上抠图区域的像素点坐标;

  3. 根据步骤二的坐标点,对原图的抠图区域的颜色进行处理。

  4. 完成以上步骤之后得到两张图(扣下来的方块图,带有抠图区域阴影的原图),将这两张图和抠图区域的y坐标传到前台,前端在移动方块验证时,将移动后的x坐标传递到后台与原来的x坐标作比较,如果在阈值内则验证通过。

  5. 请求验证的步骤:前台向后台发起请求,后台随机一张图片做处理将处理完的两张图片的base64,抠图y坐标和token(token为后台缓存验证码的唯一token,可以用缓存和分布式缓存)返回给前台。

  6. 前台滑动图片将x坐标和token作为参数请求后台验证,服务器根据token取出x坐标与参数的x进行比较。

1.2 突破规则

这类验证码可以使用 selenium 操作浏览器拖拽滑块来进行破解,难点两个,一个如何确定拖拽到的位置,另一个是避开人机识别(反爬虫)。

首先我们先看看,确定滑块验证码需要拖拽的位移距离

有三种方式

  • 人工智能机器学习,确定滑块位置
  • 通过完整图片与缺失滑块的图片进行像素对比,确定滑块位置
  • 边缘检测算法,确定位置

各有优缺点。人工智能机器学习,确定滑块位置,需要进行训练比较麻烦,所以我们主要看后面两种。

对比完整图片与缺失滑块的图片

1.3 验证码图片处理

  • 站点:https://www.geetest.com/demo/

  • 使用浏览器技术提取滑块图片,进行处理

# 提取背景图
document.getElementsByClassName('geetest_canvas_bg geetest_absolute')[0].toDataURL('image/png')
document.getElementsByClassName('geetest_canvas_fullbg geetest_fade geetest_absolute')[0].toDataURL('image/png')# 保存图片
import base64,io
images = q_qt.split(',')[1]
images = base64.b64decode(images)
images = Image.open(io.BytesIO(images))
images.save('q_qg.png')

1.4 背景滑块识别

  • 这里使用开源的技术ddddocr进行滑块的识别
import ddddocr
def text_dis():slide = ddddocr.DdddOcr(det=False, ocr=False)with open('bg.png', 'rb') as f:target_bytes = f.read()with open('zg.png', 'rb') as f:background_bytes = f.read()res = slide.slide_comparison(target_bytes, background_bytes)print(res)

2 OPENCV处理滑块

opencv 是一个跨平台计算机视觉和机器学习软件库,支持Linux、windows操作系统。

​ 一般来说,图像是一个标准的矩形,有着宽度(width)和高度(height)。而矩阵有着行(row)和列(column),矩阵的操作在数学和计算机中的处理都很常见且成熟,于是很自然的就把图像作为一个矩阵,把对图像的操作转换成对矩阵的操作,实际上所有的图像处理工具都是这么做的

2.1 cv库讲解

2.1.1 环境安装

pip install opencv-python

运行时报错:AttributeError: partially initialized module 'cv2' has no attribute '_registerMatType' (most likely due to a circular import) 解决

原因:版本太高

解决办法:

1、首先卸载:

pip uninstall opencv-pythonpip uninstall opencv-contrib-python

2、只安装低版本的opencv-contrib-python

pip install opencv_python==3.4.10.37

使用whl包安装

链接:https://pan.baidu.com/s/1KZd6VX-YsQjwiPoIXF1G5g
提取码:jlh1

2.2 CV使用

2.2.1 读取图片
  • 防止闪退 这个函数是在一个给定的时间内(单位ms)等待用户按键触发;如果用户没有按下 键,则接续等待(循环)
def read_img():img = cv.imread('op_test.jpg')print(img.shape)cv.imshow('image',img)cv.waitKey()
2.2.2 读取灰度
def read_img1():img = cv.imread('op_test.jpg')# 图像灰度化image = cv.cvtColor(img, cv.COLOR_BGR2GRAY)print(image.shape)cv.imshow('gray', image)cv.waitKey()  # 防止闪退
2.2.3 摄像头操作
def read_video():cap = cv.VideoCapture(0)  # 如果有一个摄像头就用0,大于一个用1或者其他数字cap.set(3, 640)  # 设置长度,序号是3cap.set(4, 480)  # 设置宽度,序号是4cap.set(10, 200)  # 设置亮度,序号是10qwhile True:success, img = cap.read()if success:cv.imshow("Video", img)if cv.waitKey(1) & 0xFF == ord('q'):breakelse:cv.destroyAllWindows()break

2.3 使用cv处理滑块

地址:https://passport.jd.com/new/login.aspx

2.3.1 处理code
from io import BytesIO
import requests
import cv2
from PIL import Image
import numpy as npdef get_dis():# 京东的滑块res = requests.get('https://iv.jd.com/slide/g.html?appId=1604ebb2287&scene=login&product=click-bind-suspend&e=PHMXTEAUGERCMBUAY2PXCENHW4KCWFS7AGHE3JYXMA4XXOOS5Z27CTBDBGC7IDQSAPSN5MT7XMVC4R5SYEPW5TJYQI&lang=zh_CN')patch = res.json().get('patch')bg = res.json().get('bg')import base64bg1 = base64.b64decode(bg)patch1 = base64.b64decode(patch)open('jd-bg1.png','wb').write(bg1)# 读取二进制图片image = np.array(Image.open(BytesIO(bg1)))gap = np.array(Image.open(BytesIO(patch1)))# 转换颜色通道,这里为什么要BGR转为RGB,因为np.array转换pillow的图像的结果就是BGR格式的image1 = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)gap1 = cv2.cvtColor(gap, cv2.COLOR_BGR2RGB)# 转为灰度图image_gray = cv2.cvtColor(image1.copy(), cv2.COLOR_BGR2GRAY)gap_gray = cv2.cvtColor(gap1.copy(), cv2.COLOR_BGR2GRAY)# 模板匹配result = cv2.matchTemplate(image_gray, gap_gray, cv2.TM_CCOEFF_NORMED)min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)print(min_val, max_val, min_loc, max_loc)# 获取最大相关的x,yx, y = min_locprint(x, y)

3. 极验滑块实战

import base64
import time
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from urllib import request
import cv2,randomimport ddddocr
def text_dis(bg,fg):slide = ddddocr.DdddOcr(det=False, ocr=False)with open(bg, 'rb') as f:target_bytes = f.read()with open(fg, 'rb') as f:background_bytes = f.read()res = slide.slide_comparison(target_bytes, background_bytes)return res.get('target')[0]def get_slide():options = webdriver.ChromeOptions()# 对于老版本的浏览器不行options.add_argument('--disable-blink-features=AutomationControlled')driver = webdriver.Chrome(chrome_options=options)driver.maximize_window()driver.get('https://www.geetest.com/demo/slide-bind.html')# 输入框输入账号和密码driver.find_element(By.ID,'username').send_keys('13535353535')driver.find_element(By.ID,'password').send_keys('123123123')# driver.find_element(By.ID,'btn').click()time.sleep(2)driver.find_element(By.CSS_SELECTOR,'div.btn').click()time.sleep(2)img_src = driver.execute_script('return document.getElementsByClassName("geetest_canvas_bg geetest_absolute")[0].toDataURL("image/png");')im_base64 = img_src.split(',')[1]im_bytes = base64.b64decode(im_base64)with open('./bg.png', 'wb') as f:f.write(im_bytes)temp = driver.execute_script("return document.getElementsByClassName('geetest_canvas_fullbg geetest_fade geetest_absolute')[0].toDataURL('image/png');")temp_base64 = temp.split(',')[1]temp_bytes = base64.b64decode(temp_base64)with open('./temp.png', 'wb') as f:f.write(temp_bytes)distance = text_dis('bg.png', 'temp.png')# 拖动滑块slide = driver.find_element(By.CSS_SELECTOR, 'div.geetest_slider_button')action_chains = webdriver.ActionChains(driver)# 点击,准备拖拽action_chains.click_and_hold(slide)action_chains.pause(0.2)action_chains.move_by_offset(distance - 10, 0)action_chains.pause(0.8)action_chains.move_by_offset(10, 0)action_chains.pause(1.4)action_chains.move_by_offset(-10, 0)action_chains.release()action_chains.perform()time.sleep(20)get_slide()'''
2、鼠标操作
click --- 鼠标左键点击(可以指定或不指定元素对象)
click_and_hold --- 鼠标左键点击但不释放(可以指定或不指定元素对象)
release --- 释放鼠标点击动作(可以指定或不指定在目标元素对象上释放)
context_click --- 鼠标右键点击(可以指定或不指定元素对象)
double_click --- 鼠标左键双击(可以指定或不指定元素对象)
drag_and_drop --- 鼠标左键在两个元素之间拖拽
drag_and_drop_by_offset --- 鼠标左键拖拽元素到目标偏移位置
move_by_offset --- 鼠标移动指定偏移
move_to_element --- 鼠标移动到指定元素
move_to_element_with_offset --- 鼠标移动到指定元素的指定偏移位置1、行为控制
perform --- 执行所有准备好的Action
reset_actions --- 清空所有准备好的Action  #  该方法在 selenium 3.141.0版本不生效
pause --- 设置Action之间的动作时间间隔'''

爬虫技术-滑块验证码相关推荐

  1. java爬虫破解滑块验证码

    使用技术:java+Selenium 废话: 有爬虫,自然就有反爬虫,就像病毒和杀毒软件一样,有攻就有防,两者彼此推进发展.而目前最流行的反爬技术验证码,为了防止爬虫自动注册,批量生成垃圾账号,几乎所 ...

  2. python爬虫进阶-滑块验证码破解(bilibili)

    目标 如下图,利用selenium模拟拖动滑块完成验证 关键问题 我们知道selenium可以定位到用户名和密码,用send_keys可以实现输入账号密码.同样我们可以用selenium定位到滑块,用 ...

  3. APP爬虫过滑块验证码的一种思路, 从此不再依赖打码平台

    每一个想学习的念头,都有可能是未来的你在向自己求救. 最近在学习 APP 逆向的道路上遇到一个 APP,当请求接口频繁的时候,会触发风控提示需要滑动验证码.验证码类型/风格类似下图: 经过分析发现,当 ...

  4. 网络爬虫-tx滑块验证码

    仅供研究学习使用. 目标站点 --> 腾讯防水墙官网 首先打开Fiddler,刷新下页面完成一组操作,发现主要请求有这几个 去除加载的js与log上传,真正的一组操作有三个: 1是初始化验证码. ...

  5. 抖音web爬虫【滑块验证码解决方法】

    文章内容仅供参考学习,如有侵权请联系作者进行删除 实现过程: 1.通过node下载滑块的图片 2.通过python的cv2视觉识别图对图片进行定位位置 3.通过获取的位置再通过node的控制鼠标自动移 ...

  6. 反爬虫技术及解决方案

    不同类型的网站都有不一样的反爬虫机制,判断一个网站是否有反爬虫机制需要根据网站设计架构.数据传输方式和请求方式等各个方面评估.下面是常用的反爬虫机制. 用户请求的Headers. 用户操作网站行为. ...

  7. 网络爬虫-破解顶象滑块验证码

    仅供研究学习使用. 今天带来的是dx滑块验证码的逆向 目标站 --> 传送门 解决此类验证码 首先要解决滑动距离的判定 无论是使用selenium还是使用协议的方式来破解 都绕不开滑动距离的识别 ...

  8. 了解一下爬虫技术方方面面

        本文全面的介绍了爬虫的原理.技术现状.以及目前仍面临的问题.如果你没接触过爬虫,本文很适合你,如果你是一名资深的虫师,那么文末的彩蛋你可能感兴趣.     一.需求     万维网上有着无数的 ...

  9. Python Selenium破解滑块验证码最新版!

    通过率高达百分之95!真的强! 一.滑块验证码简述 有爬虫,自然就有反爬虫,就像病毒和杀毒软件一样,有攻就有防,两者彼此推进发展.而目前最流行的反爬技术验证码,为了防止爬虫自动注册,批量生成垃圾账号, ...

最新文章

  1. ps怎么对比原图快捷键_PS教程:P图前后,你还能认出这是同一个人吗?
  2. Nutanix公布财报数据 准备IPO前表现抢眼
  3. 如何计算代码的运行性能
  4. 杭电1466计算直线的交点数
  5. CSDN 创始人蒋涛:选择长沙作“大本营”,打造开发者中心城市
  6. mysql能管理多大的硬盘,Mysql----查看数据库,表占用磁盘大小
  7. fortran快速入门
  8. 手把手 网络爬虫:用爬虫爬取贝壳房租网西安的租房信息
  9. 邓亚萍加盟人民日报社 担任人民搜索一把手
  10. 手机淘宝客户端架构探索实践
  11. 状态模式——你若安好,便是晴天
  12. 十八层地狱详解(看看你会进几层)....
  13. 雇佣兵(程序设计与算法(一))
  14. 新任务管理系统YYSchedule-介绍-引擎执行机制及结果回收机制
  15. 你有“隐私泄露担忧”吗?适合普通用户的6个方法来了
  16. java中flist cannot_cannot
  17. offsetParent解释
  18. linux下查看gaussian结构,察看Gaussian全部IOp的方法
  19. 微信公众号开发 接口配置信息 配置失败
  20. JavaSE -IO流

热门文章

  1. 还在为PPT烦恼?有了这四大高质量的PPT模板网站,1秒做出精美PPT
  2. autoit学习笔记---“While…WEnd”循环
  3. 【设计模式--->创建型模式】叩心自问 :工厂设计模式(简单工厂设计模式,工厂方法模式,抽象工厂方法)
  4. Vegas 使用教程(六)修剪器
  5. 智能客服 | 浅谈人工智能聊天机器人ChatGPT
  6. OneThousand - 去中心化的抽奖
  7. 四通OKI5760SP针式打印机连续打印第一张正常,后面的对不上位置
  8. 爬虫系列1:Requests+Xpath 爬取豆瓣电影TOP
  9. 第八章【ADFS集成Exchang实现OWA\ECP单点登录SSO】配置Exchange OWA认证方式为ADFS***(本栏目重点)
  10. xycms后台拿shell