:Chaojiying.py + DrissionPage 实现【知乎滑块验证码自动识别免登录】保姆级实战教程)
一、前言⚠️ 重要合规提醒本文代码仅用于个人学习、技术研究请勿用于批量恶意爬虫、违规刷量、破解登录等违法场景遵守网站 robots 协议与网络安全法规。本篇独立讲解滑块验证码专属方案上篇回顾1004 普通字符验证码古诗文网图片验证码本篇核心知乎极验滑块验证码突破实战本篇 3 个核心文件清单chaojiying.py通用超级鹰打码客户端tools.py滑块工具封装函数突破滑块验证码.py【本篇重点】 系列文章回顾第一篇超级鹰注册充值第二篇古诗文网字符验证码 1004 自动识别登录第三篇本篇超级鹰 9901 滑块缺口识别知乎极验滑块全自动突破登录 绝大多数网站现在使用滑块验证码单纯字符验证码越来越少本篇带你搞定极验类滑块实现全自动免人工拖动验证️ 环境依赖安装pipinstallrequests DrissionPage 项目完整目录结构project/├─ chaojiying.py# 通用超级鹰打码客户端复用├─ tools.py# 滑块工具封装可选自己拓展└─ 突破滑块验证码.py# 本篇核心完整主程序 超级鹰题型编码再次区分重点1004普通字母 / 数字图片验证码上篇9901滑块缺口坐标识别本篇核心滑块验证完整原理流程完整流程拆解1.初始化浏览器Mac 用户指定 Chrome 完整路径重点2.打开知乎首页进入登录界面填写账号密码并提交触发极验滑块3.获取带缺口的滑块背景图元素截图保存本地bj.png4.实例化超级鹰客户端二进制读取截图调用 9901 识别接口拿到缺口坐标5.根据页面缩放比例校正像素减去滑块本身宽度算出真实需要滑动距离6.使用 DrissionPage Actions 动作链模拟真人鼠标悬浮 → 按住 → 拖动 → 释放7.校验登录成功元素判断是否完成登录捕获异常做报错处理二、chaojiying.py#!/usr/bin/env python# coding:utf-8importrequestsfromhashlibimportmd5classChaojiying_Client(object):def__init__(self,username,password,soft_id):self.usernameusername passwordpassword.encode(utf8)self.passwordmd5(password).hexdigest()self.soft_idsoft_id self.base_params{user:self.username,pass2:self.password,softid:self.soft_id,}self.headers{Connection:Keep-Alive,User-Agent:Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0),}defPostPic(self,im,codetype,str_debug):params{codetype:codetype,str_debug:str_debug}params.update(self.base_params)files{userfile:(ccc.jpg,im)}rrequests.post(http://upload.chaojiying.net/Upload/Processing.php,dataparams,filesfiles,headersself.headers)returnr.json()defPostPic_base64(self,base64_str,codetype):params{codetype:codetype,file_base64:base64_str}params.update(self.base_params)rrequests.post(http://upload.chaojiying.net/Upload/Processing.php,dataparams,headersself.headers)returnr.json()defReportError(self,im_id):params{id:im_id,}params.update(self.base_params)rrequests.post(http://upload.chaojiying.net/Upload/ReportError.php,dataparams,headersself.headers)returnr.json()if__name____main__:chaojiyingChaojiying_Client(你的账号,你的密码,96001)imopen(../RandCode.png,rb).read()resultchaojiying.PostPic(im,1004)print(result[pic_str])三、tools.pyfromChaojiyingimportChaojiying_ClientfromDrissionPageimportChromiumPagefromDrissionPage.commonimportActionsdefdrag_verify(page):# # 1. 初始化浏览器并访问知乎# page ChromiumPage()# page.get(https://www.zhihu.com/)# page.wait(3) # 等待页面加载## # 2. 执行登录操作# page.ele(.SignFlow-tab).click() # 点击“密码登录”标签# page.ele(xpath://input[nameusername]).input(3920682002qq.com) # 输入手机号或邮箱# page.ele(xpath://input[namepassword]).input(Aa123456789) # 输入密码# page.ele(xpath://button[typesubmit]).click() # 点击登录按钮## # 3. 获取验证码背景图并保存(背景图上有缺口需要保存之后使用超级鹰的方法来识别缺口位置, 这样才能直到要将滑块滑到哪个位置)bg_imgpage.ele(.yidun_bg-img)# 定位背景图元素# 将背景图保存为本地文件, 并重新命名bg_img.save(namebg.png,renameFalse)# 4. 【计算拖动距离】找到要拖动的滑块将滑块移动到缺口位置# 4.1 找到要拖动的滑块sliderpage.ele(.yidun_jigsaw)# 4.2 使用超级鹰的方法,识别缺口在图片内的坐标# 换成自己的超级鹰账号和密码, 96001可不改chaojiyingChaojiying_Client(tiantian991,8nvz3u4t,96001)# 读取刚刚保存的背景图withopen(bg.png,rb)asf:# 使用超级鹰的chaojiying.PostPic方法识别滑块缺口位置# f.read()是在传入读取到的图片数据,9901是专门用来识别滑块图的模式# result中的pic_str就是缺口的位置resultchaojiying.PostPic(f.read(),9901)# print(result) {err_no: 0, err_str: OK, pic_id: 2330620092252970036, pic_str: 261,60, md5: b9af18240aaebce8981e0f8bd2b51506}# 解析识别结果获取缺口相对于保存的背景图的X坐标# 得到的result是个字典需要的数据在字典的pic_str中, result[pic_str]获取对应的值得到261,60# 261,60, 261是缺口在背景图中x轴的位置, .split(,)表示将261,60从,分割成两部分得到的结果是[261,60]# [0]就是取列表的第一个获取缺口的位置blank_xint(result[pic_str].split(,)[0])print(f识别缺口X坐标:{blank_x})# 滑动滑块函数【直接使用】# 【参数说明】# drag_ele要拖动的滑块位置# blank_distance缺口x坐标defdrag_slider(drag_ele,blank_distance):# offset_x 为微调值用于补偿识别误差# 三目运算符如果缺口的x小于150的话, 微调值为10否则微调值为8offset_x10ifblank_distance150else8axis_xblank_distance-offset_xprint(f计算得出的实际滑动距离:{axis_x})# 模拟鼠标拖动滑块完成验证page.wait(3)# 等待验证码加载完成acActions(page)drag_ele.hover()# 鼠标悬停在滑块上ac.hold(drag_ele)# 按下鼠标ac.move(axis_x,0)# 水平移动计算出的距离(只需要横向移动)ac.release(drag_ele)# 松开鼠标try:# 使用函数滑动滑块drag_slider(slider,blank_x)returnTrueexcept:returnFalse#只导入函数若只导入文件则不能运行if__name____main__:drag_verify()四、【突破滑块验证码.py】完整源码fromChaojiyingimportChaojiying_ClientfromDrissionPageimportChromiumPage,ChromiumOptions#网页自动化爬取------自动化库fromDrissionPage.commonimportActions coChromiumOptions()co.set_browser_path(/Applications/Google Chrome.app/Contents/MacOS/Google Chrome)co.auto_port(True)pageChromiumPage(co)#Mac版----创建浏览器【windows只需要pageChromiumPage()即可】page.get(http://www.zhihu.com)page.wait(5)page.ele(.SignFlow-tab).click()page.ele(xpath://input[nameusername]).input(你的账号)page.ele(xpath://input[namepassword]).input(你的密码)page.wait(2)page.ele(xpath://button[typesubmit]).click()page.wait(2)bj_imgpage.ele(.yidun_bgimg)bj_img.get_screenshot(bj.png)#bj_img.save(namebj_img.png,renameFalse) ,就是在保存图片截图名称永不改变之意huakuaipage.ele(.yidun_slider__icon)ChaojiyingChaojiying_Client(你的超级鹰账号,你的超级鹰密码,96001)#登录超级鹰withopen(bj.png,rb)asf:resultChaojiying.PostPic(f.read(),9901)# print(result[pic_str]) #247,74blank_xresult[pic_str].split(,)[0]print(blank_x)#滑动滑块函数会用就好#只需要传入对应的滑块和缺口的x坐标就可以直接使用我供的函数了# drag_ele要拖动的滑块位置#blank_distance缺口x坐标defdrag_slider(drag_ele,blank_distance,page):scale0.557slider_w41real_xint(blank_distance)*scale axis_xreal_x-slider_wprint(f识别坐标:{blank_x}缩放后:{real_x:.1f}滑动距离:{axis_x:.1f})acActions(page)drag_ele.hover()ac.hold(drag_ele)ac.move(axis_x,0)ac.release(drag_ele)try:drag_slider(huakuai,int(blank_x),page)#判断有没有登录成功page.ele(.Avatar AppHeader-profileAvatar css-d9tvwx,timeout3).click()except:print(出错了)五、逐行保姆级源码解析1. 模块导入fromChaojiyingimportChaojiying_ClientfromDrissionPageimportChromiumPage,ChromiumOptionsfromDrissionPage.commonimportActionsChaojiying_Client调用超级鹰 9901 识别缺口坐标ChromiumPage,ChromiumOptions浏览器自动化Mac 重点配置 Chrome 路径Actions模拟鼠标动作链按住、拖动、释放滑块防风控核心2. Mac 专属浏览器初始化【小白高频踩坑点】Mac 系统必须指定 Chrome 完整可执行路径否则启动浏览器报错coChromiumOptions()co.set_browser_path(/Applications/Google Chrome.app/Contents/MacOS/Google Chrome)co.auto_port(True)pageChromiumPage(co)Windows 简化写法替换上面代码pageChromiumPage()3. 访问知乎并进入登录表单page.get(http://www.zhihu.com)page.wait(5)page.ele(.SignFlow-tab).click()page.ele(xpath://input[nameusername]).input(你的账号)page.ele(xpath://input[namepassword]).input(你的密码)page.wait(2)page.ele(xpath://button[typesubmit]).click()page.wait(2)page.wait()强制等待等待页面 DOM 渲染完成防止元素找不到报错定位登录 tab、账号密码输入框填充信息提交触发极验滑块验证码4. 获取滑块缺口背景图 滑块元素bj_imgpage.ele(.yidun_bgimg)bj_img.get_screenshot(bj.png)huakuaipage.ele(.yidun_slider__icon)重点使用get_screenshot()对缺口背景元素截图只截取验证码区域减少干扰yidun_bgimg带缺口的背景图yidun_slider__icon需要拖动的滑块图标元素5. 调用超级鹰 9901 识别缺口坐标【核心】ChaojiyingChaojiying_Client(你的账号,你的密码’,96001)withopen(bj.png,rb)asf:resultChaojiying.PostPic(f.read(),9901)blank_xresult[pic_str].split(,)[0]print(blank_x)题型编码9901滑块缺口识别返回示例pic_str247,74逗号分隔前面为 X 横向坐标后面 Y 纵向坐标我们只需要横向 X 坐标用来计算滑动距离6. drag_slider 滑动函数【重中之重缩放校正】defdrag_slider(drag_ele,blank_distance,page):scale0.557slider_w41real_xint(blank_distance)*scale axis_xreal_x-slider_wprint(f识别坐标:{blank_x}缩放后:{real_x:.1f}滑动距离:{axis_x:.1f})acActions(page)drag_ele.hover()ac.hold(drag_ele)ac.move(axis_x,0)ac.release(drag_ele)scale 0.557页面缩放比例校正很多小白忽略这个拖动位置不准验证失败次数值是按照我的电脑的标准大家可以自行修正slider_w 41滑块本身宽度必须减去滑块宽度修正偏移动作链流程hover 悬浮 → hold 按住滑块 → move 平移 → release 释放模拟真人操作降低风控检测7. 异常捕获 登录成功校验try:drag_slider(huakuai,int(blank_x),page)#判断有没有登录成功page.ele(.Avatar AppHeader-profileAvatar css-d9tvwx,timeout3).click()except:print(出错了)try-except 捕获拖动、元素查找过程中的报错查找头像元素作为登录成功判定标识验证是否真正登录成功六、调试优化 踩坑大全CSDN 读者最喜欢章节###踩坑 1Mac 启动 Chromium 报错找不到浏览器❌ 现象初始化 ChromiumOptions 启动失败✅ 解决核对 Chrome 完整可执行路径Mac 必须配置set_browser_path踩坑 2识别坐标拿到了拖动完依旧验证失败❌ 现象坐标识别成功拖动完成但是校验不通过✅ 解决重点检查缩放比例 scale不同设备页面缩放不同调整 scale 值同时修正滑块宽度偏移踩坑 3截图空白超级鹰识别报错❌ 现象截图的时候验证码还没渲染完成✅ 解决增加page.wait()等待时间等滑块完整加载完成再截图踩坑 4网页改版class 选择器失效❌ 现象page.ele()获取元素返回空解决F12 重新检查页面更新最新 class如yidun_bgimg、yidun_slider__icon踩坑 5超级鹰题分不足接口返回报错❌ 现象调用 PostPic 返回 err_no 报错✅ 解决登录超级鹰后台充值题分查看剩余题分踩坑 6Windows 用户照搬 Mac 浏览器初始化代码❌ 现象Windows 写死 Chrome 路径浏览器启动异常✅ 解决Windows 直接简化pageChromiumPage()去掉 ChromiumOptions 配置踩坑 7动作链拖动太机械被风控拦截❌ 现象拖动完成但是被判定机器操作验证失败✅ 拓展优化增加随机微小偏移分段多次移动模拟真人抖动式拖动七、优化增强完整版代码增加重试、异常捕获、日志输出拓展版 给读者福利在原版基础上加上循环重试、完善异常捕获小白直接拿去增强稳定性fromChaojiyingimportChaojiying_ClientfromDrissionPageimportChromiumPage,ChromiumOptionsfromDrissionPage.commonimportActionsimporttimedefdrag_slider(drag_ele,blank_distance,page,scale0.557,slider_w41):real_xint(blank_distance)*scale axis_xreal_x-slider_wprint(f识别坐标:{blank_x}缩放后:{real_x:.1f}滑动距离:{axis_x:.1f})acActions(page)drag_ele.hover()ac.hold(drag_ele)ac.move(axis_x,0)ac.release(drag_ele)defzhihu_slider_login(max_retry3):coChromiumOptions()# Mac配置Windows注释掉这两行co.set_browser_path(/Applications/Google Chrome.app/Contents/MacOS/Google Chrome)co.auto_port(True)pageChromiumPage(co)try:page.get(http://www.zhihu.com)page.wait(5)page.ele(.SignFlow-tab).click()page.ele(xpath://input[nameusername]).input(你的账号)page.ele(xpath://input[namepassword]).input(你的密码)page.wait(2)page.ele(xpath://button[typesubmit]).click()page.wait(2)chaojiyingChaojiying_Client(你的超级鹰账号,你的超级鹰密码,96001)retry_cnt0whileretry_cntmax_retry:bj_imgpage.ele(.yidun_bgimg)bj_img.get_screenshot(bj.png)huakuaipage.ele(.yidun_slider__icon)withopen(bj.png,rb)asf:reschaojiying.PostPic(f.read(),9901)ifres[err_no]!0:print(f识别失败重试{retry_cnt1})retry_cnt1time.sleep(1)continueblank_xres[pic_str].split(,)[0]print(f识别缺口X坐标{blank_x})drag_slider(huakuai,int(blank_x),page)try:page.ele(.Avatar AppHeader-profileAvatar css-d9tvwx,timeout3)print(✅ 登录成功)breakexcept:print(f验证失败重试{retry_cnt1})retry_cnt1exceptExceptionase:print(f程序异常{e})finally:# page.quit() # 可选择关闭浏览器passif__name____main__:zhihu_slider_login()八、拓展思考1. 思考 1如何增加随机抖动偏移优化拖动轨迹进一步规避网站风控检测2. 思考 2多账号批量登录场景如何循环刷新验证码批量突破滑块3. 思考 3不同网站滑块缩放比例不一样能不能自动识别缩放比例不用手动填 scale4. 思考 4如果是多段式、旋转类验证码超级鹰对应的题型编码该如何选择九、 系列总结【系列完整收官】第一篇1004 字符验证码古诗文网第二篇9901 极验滑块验证码知乎两套方案覆盖市面上绝大多数登录验证码场景学会这两套绝大多数自动化登录验证码难题可以搞定欢迎评论区交流你遇到的各种奇葩验证码踩坑经历