博客园滑块验证码破解

article/2025/5/3 3:59:27

极验最初的滑块验证码是两张图,首先出现的是原图,点一下出现凹槽,然后拖动滑块进去,注意拖拽速度就可以破解成功。

原理: 分别遍历扫描原图和有凹槽的图片像素,进行对比,像素不一致的位置就是凹槽,拖动滑块到凹槽就可以破解。
  1. 模拟点击验证按钮
  2. 识别滑块缺口位置
  3. 拖动滑块到缺口位置
    现在极验登录升级了验证码,首先出来的就是凹槽,这样无法获取原图,就没有办法进行对比。登录地址为:https://auth.geetest.com/login/
    在这里插入图片描述
    极验现在登录不仅有这种滑块,还有图案顺序验证的方式在这里插入图片描述
    我们简化看一个博客园的例子,它采用的也是极验的验证码,登录地址为:
    https://account.cnblogs.com/signin
    在这里插入图片描述
    第一个点在于获取原图,如果获取到原图,就可以用上面的原理进行解决。在element调试分析如图一:
    在这里插入图片描述
    示例图二
    在这里插入图片描述
    对应的执行如下代码:
browser.execute_script("var x=document.getElementsByClassName('geetest_canvas_fullbg geetest_fade geetest_absolute')[0];""x.style.display='block';""x.style.opacity=1;")

图一与图二如果直接进行像素扫描,会由于小滑块的干扰,无法找到缺口,这也是一个点。示例图三:
在这里插入图片描述
执行如下代码去掉小滑块:

browser.execute_script("document.getElementsByClassName('geetest_canvas_slice geetest_absolute')[0].remove();")

然后就可以用利用上面原理的常规方法来解决了。
需要注意的是,在使用selenium的方法解决验证码图片的时候,截取的是window图,不能直接获取到验证码图片,要进行处理,获取到尺寸从屏幕截图当中抠出验证码图片。
在这里插入图片描述
如下:

    def get_captcha_pic(name="captcha.png"):"""获取验证码图片:param name::return: captcha图片对象"""browser.save_screenshot(name)  # 截屏幕图im = Image.open(name)aa = (572, 193, 980, 452)  # 获取验证码图片在屏幕图当中的位置,测量不知道比例,可以再一边测好了,直接使用,否则返回的验证码图片不正确captcha = im.crop(aa)  # todo 识别的时候存在问题captcha.save(name)  # 保存验证码图片return captcha

在这里插入图片描述
在这里插入图片描述
两张图片进行对比扫描找缺口的时候,有一些小技巧,比如图三中的第一个箭头是阴影小滑块,要把干扰去掉

    def pixel_is_equal(image1, image2, x, y):"""判断两张图片的像素是否相等,不相等即为缺口位置:param image1::param image2::param x::param y::return:"""# 取两个图片的像素点pixel1 = image1.load()[x, y]pixel2 = image2.load()[x, y]threshold = 60  # 像素色差if abs(pixel1[0] - pixel2[0]) < threshold and abs(pixel1[1] - pixel2[1]) < threshold and abs(pixel1[2] - pixel2[2]) < threshold:return True  # 像素色差小于60,默认为没区别else:return False

过程中还有一些其它问题,可以留言讨论,完整代码如下:

# -*- coding: utf-8 -*-
import time
from PIL import Image
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ECclass BlogYuan(object):def __init__(self):self.browser = webdriver.Chrome()self.wait = WebDriverWait(self.browser, 20)def open(self):self.browser.get('https://account.cnblogs.com/signin')self.browser.implicitly_wait(3)input_username = self.browser.find_element_by_id('LoginName')input_username.send_keys('dawfawfaefag')input_password = self.browser.find_element_by_id('Password')input_password.send_keys('cawfafaf')submitBtn = self.browser.find_element_by_id('submitBtn')time.sleep(1)submitBtn.click()time.sleep(2)  # 等待验证码加载def get_captcha_pic(self, name="captcha.png"):"""获取验证码图片:param name::return: captcha图片对象"""self.browser.save_screenshot(name)  # 截屏幕图im = Image.open(name)aa = (572, 193, 980, 452)  # 获取验证码图片在屏幕图当中的位置,测量不知道比例,可以再一边测好了captcha = im.crop(aa)  # todo 识别的时候存在问题captcha.save(name)  # 保存验证码图片return captchadef get_slider(self):"""获取滑块:return:"""slide = self.wait.until(EC.element_to_be_clickable((By.CLASS_NAME, 'geetest_slider_button')))return slidedef pixel_is_equal(self, image1, image2, x, y):"""判断两张图片的像素是否相等,不相等即为缺口位置:param image1::param image2::param x::param y::return:"""# 取两个图片的像素点pixel1 = image1.load()[x, y]pixel2 = image2.load()[x, y]threshold = 60  # 像素色差if abs(pixel1[0] - pixel2[0]) < threshold and abs(pixel1[1] - pixel2[1]) < threshold and abs(pixel1[2] - pixel2[2]) < threshold:return True  # 像素色差小于60,默认为没区别else:return Falsedef get_gap(self, image1, image2):"""获取缺口位置:param image1:完整图片:param image2: 带缺口的图片:return:"""left = 60  # 设置一个起始量,因为验证码一般不可能在左边,加快识别速度for i in range(left, image1.size[0]):for j in range(image1.size[1]):if not self.pixel_is_equal(image1, image2, i, j):left = ireturn leftreturn leftdef slide_path(self, gap):"""滑动路径:param gap::return: 滑动路径"""# 移动轨迹track = []# 当前位移current = 0# 减速阈值mid = gap * 4 / 5# 计算间隔t = 0.2# 初速度v = 0while current < gap:if current < mid:# 加速度为正2a = 2else:# 加速度为负3a = -3# 初速度v0v0 = v# 当前速度v = v0 + atv = v0 + a * t# 移动距离x = v0t + 1/2 * a * t^2move = v0 * t + 1 / 2 * a * t * t# 当前位移current += move# 加入轨迹track.append(round(move))return trackdef move_to_gap(self, slider, track):"""拖动滑块到缺口处:param slider: 滑块:param track: 轨迹:return:"""ActionChains(self.browser).click_and_hold(slider).perform()for x in track:ActionChains(self.browser).move_by_offset(xoffset=x, yoffset=0).perform()time.sleep(0.5)ActionChains(self.browser).release().perform()def check_gap(self, gap):"""校准gap,可以自己调节,越精细,效果越好:param gap::return: gap"""aa = round(gap / 12.5)bb = {4: 38, 5: 41, 6: 42, 7: 43, 8: 46, 9: 52, 10: 54, 11: 59, 12: 62, 13: 65, 14: 68, 15: 71, 16: 74, 17: 79,18: 84, 19: 86, 20: 87, 21: 92, 22: 93, 23: 95, 24: 98, 25: 101}return gap - bb.get(int(aa))def run(self):self.open()#  移除滑块,否则滑块会对色差造成影响,无法获取gapself.browser.execute_script("document.getElementsByClassName('geetest_canvas_slice geetest_absolute')[0].remove();")image1 = self.get_captcha_pic("image1.png")  # 获取有缺口验证码图片,# 显示无缺口图片self.browser.execute_script("var x=document.getElementsByClassName('geetest_canvas_fullbg geetest_fade geetest_absolute')[0];""x.style.display='block';""x.style.opacity=1;")image2 = self.get_captcha_pic("image2.png")  # 获取无缺口验证码图片# 获取缺口的位置gap = self.get_gap(image1, image2)# 减去缺口位移gap -= 6# 获取滑动路径track = self.slide_path(self.check_gap(gap))# 拖动滑块slide = self.get_slider()self.move_to_gap(slide, track)time.sleep(1)self.browser.close()# 如果验证通过,执行,,,if __name__ == "__main__":gt = BlogYuan()gt.run()

http://chatgpt.dhexx.cn/article/HqGyiltl.shtml

相关文章

尚硅谷Vue2.0+Vue3.0全套教程视频笔记 + 代码 [P001-050]

视频链接&#xff1a;尚硅谷Vue2.0Vue3.0全套教程丨vuejs从入门到精通_哔哩哔哩_bilibili P1-50&#xff1a;当前页面。 P51-100&#xff1a;尚硅谷Vue2.0Vue3.0全套教程视频笔记 代码 [P051-100]_小白桶子的博客-CSDN博客 P101-135&#xff1a;尚硅谷Vue2.0Vue3.0全套教程视…

【Vue】Mock.js的使用教程,入门级(附代码和案例)

Mock.js的使用&#xff08;附代码和案例&#xff09; 1、什么是mockjs 生成随机数据&#xff0c;拦截Ajax请求 了解一项技术&#xff0c;官网当然要知道 Mock.js 官网 2、程序 前端&#xff1a;访问后端接口&#xff0c;展示数据后端&#xff1a;后端负责业务逻辑&#xff0c…

YDOOK:vue3.0: vue-cli4.5: 引入 Element PLUS 的正确方法 Vue-cli4.5 引入 element+ plus

YDOOK&#xff1a;vue3.0: vue-cli4.5: 引入 Element PLUS 的正确方法 Vue-cli4.5 引入 element plus 1. 官网的指导安装使用方式尚未更新&#xff0c;显示的是&#xff1a; 2. 如果使用的是 npm 安装, 输入的代码为&#xff1a; npm install element-plus --save大陆建议使用…

使用Xposed对软件进行破解

入门 去AS里面新建一个NoActivity项目&#xff0c;最好把minimum版本调小 <!-- 加载Xposed模块--><meta-dataandroid:name"xposedmodule"android:value"true" /> <!-- 模块描述--><meta-dataandroid:name"xpose…

破解root密码精简版

破解root密码精简版&#xff1a; 1、重启虚拟机 2、在linux16末尾加上 rd.break,ctrlx执行 3、mount -o remount,rw /sysroot 把根以读写的方式挂载 挂在系统的根sysroot 4、chroot /sysroot 5、passwd root 6、输入新密码&#xff1a; 7、确认密码 8、touch /.autorelabel 标…

【word论文排版教程4】样式的应用

【word论文排版教程4】样式的应用 在使用样式处选择相应样式&#xff0c;同样可以使用之前设置的快捷键 标题比较长&#xff0c;使用软回车进行换行

【word论文排版教程2】论文章节安排及分节

【word论文排版教程2】论文章节安排及分节 论文章节可分为如下8个章节&#xff1a; 封面 中文摘要 英文摘要 目录 正文 参考文献 附录 致谢 输入封面&#xff0c;添加分解符 添加分解符效果 同样方法为其它章节添加分解符。

【word论文排版教程1】页面设置

【word论文排版教程1】页面设置 页面设置要求如下&#xff1a; 页面格式&#xff1a;纸张A4&#xff0c;上2.6cm&#xff0c;下2.6cm&#xff0c;左2.5cm&#xff0c;右2cm&#xff0c;装订线位置左侧&#xff0c;装订线0cm&#xff0c;无文档网格 页面布局->页面设置

毕业必备!推荐收藏的学位论文排版教程(word完整版)

本文将介绍学位论文的页面布局&#xff0c;标题格式&#xff0c;文档生成列表&#xff0c;插入公式&#xff0c;页眉页脚&#xff0c;生成目录、表格和图片的交叉引用、插入参考文献、英语翻译校对等内容和技巧&#xff0c;学习内容偏多&#xff0c;同学们可以先收藏下来&#…

毕业论文word文档排版教程(动图的方式演示,针对wps)

很久之前写好的文章&#xff0c;不知不觉毕业了那么久了 目录 1 常用快捷键 2 显示全部格式标记 3 因有手动换行符无法实现首行缩进 4 利用表格制作矩阵 5 因有英文(代码)和中文而导致空隙过大 6 设置页码和目录 xx 参考文献自动编号并更新文章中的序号 xxx 页…

Latex基本使用:论文排版

文章目录 前言一、参考文献引用二、插入符号1.插入希腊字母2.插入符号 三、插入公式三、插入图片总结 前言 记录使用Latex排版论文的方法。 一、参考文献引用 引用参考文献使用的是bib文件&#xff0c;首先在tex文件所在目录下新建txt文件&#xff0c;修改后缀为bib。 在谷歌…

texlive2020 + vscode 论文排版教程

这是我准备公开的第二篇技术博客&#xff0c;之前也写过一些简单的&#xff08;拿不出手的&#xff09;博文&#xff0c;但一直没信心公开&#xff0c;不过最后觉得也没啥&#xff0c;大家可以交流嘛&#xff0c;万一你写的有错&#xff0c;有好心人看见了指出的话那也是极好的…

毕业论文排版教程(word)桂林电子科技大学

摘要&#xff1a;满心欢喜地给导数发去初稿&#xff0c;换来了一句“格式乱起八糟”&#xff0c;你是否还在为论文排版而苦不堪言&#xff0c;认真看完这份教程&#xff0c;让你轻松搞定毕业论文排版。 毕业论文排版教程&#xff08;word&#xff09;桂林电子科技大学 样式图片…

【word论文排版教程3】制作样式和列表

【word论文排版教程3】制作样式和列表 一级标题&#xff1a;黑体小二&#xff0c;居中&#xff0c;行距“固定值:20磅”&#xff0c;段前、段后均1行。 二级标题&#xff1a;黑体小三&#xff0c;无缩进&#xff0c;行距“固定值:20磅”&#xff0c;段前、段后均0.5行。 三级及…

Word论文排版教程

设置样式 要求&#xff1a; 以下以修改“大标题”为例&#xff0c;其他以此类推 1、大标题 再点击右下角的“段落” 2、标题4… 我们发现word默认只显示了三级标题的样式&#xff0c;如果我们还要更多的样式&#xff1a; &#xff08;选择“所有样式”即可&#xff09; …

论文排版教程

论文排版教程 Tips 一、 常用键 Delete 向后删除 CtrlEnter插入一个分页符 Alt 插入公式 二、 单位可以直接输入 三、定制功能区提升效率 论文正题 一、信息栏制作方法 二、目录制作方法 三、页眉页脚设置 插入分节符 分节符的作用&#xff1a;使得前后两部分在语义上…

Word排版小技巧 | 快速论文排版

文章目录 1.设置中英文字体不同2.设置文档样式3.设置页边距4.设置页眉/页脚/页码添加页眉和页码页眉下边有横线设置从某一页开始显示页码 5.设置自动保存时间&#xff0c;防止死机丢文件6.批量删除空格、空行7. 竖向删除内容8. 图片批量修改大小9. 图片批量居中10.一键拆分表格…

吐血推荐收藏的学位论文排版教程(完整版)

目录 01.保存的高级选项设置 02.纸张设置为A4纸大小 03.设置页边距和装订线距离 04.度量衡的设置 05.创建“论文正文”样式 06.修改论文正文样式 07.设置并修改标题样式 08.给中英文摘要、附录、等大标题套用样式 09.两个Word文档之间进行并排查看 12.一键生成多级列…

2019年下半年软件工程领域各大会议投稿时间(包含会议信息介绍及CCF推荐会议最新目录)

文章目录 前言1 CCF会议最新排名1.1 基本信息1.2 软件工程领域相关会议A类B类C类 2 下半年软工会议投稿时间&#xff08;A类会议&#xff09;2.1 PLDI2.2 POPL2.3 FSE/ESEC2.4 OOPSLA2.5 ASE2.6 ICSE2.7 ISSTA 3 下半年软工会议投稿时间&#xff08;B类会议&#xff09;3.1 ICS…

CCF推荐会议 | 人机交互:截稿日期纵览 (含CSCW, UbiComp, collaboratecom 等会议微信交流群)

以上为未来三个月已公布截稿日期的CCF推荐,人机交互领域会议,按照时间排序。 个别会议因为没有公布截稿信息而不在所列时间线内。 录取率信息为网络上可获得的最近年份数据,不一定是上一年的,文中尽量选择同时带有投稿量的数据年份供大家参考. Core Ranking会排除Not prima…