在全国企业信用信息系统中搜索信息时,可以看到以下验证码:
破解思路:
1.从div中或取乱序的图片及坐标,乱序图片如下图:
2.根据获取到的乱序图片及坐标将图片拼完整,如下图:
,
3.计算两张图片的像素差,并计算缺口位置,如下图:
4.根据缺口位置模拟人的行为拖动滑块
具体代码如下:
def get_merge_image(filename,location_list): ''' 根据位置对图片进行合并还原 :filename:图片 :location_list:图片位置 ''' pass im = image.open(filename) new_im = image.new('RGB', (260,116)) im_list_upper=[] im_list_down=[] for location in location_list: if location['y']==-58: pass im_list_upper.append(im.crop((abs(location['x']),58,abs(location['x'])+10,166))) if location['y']==0: pass im_list_down.append(im.crop((abs(location['x']),0,abs(location['x'])+10,58))) new_im = image.new('RGB', (260,116)) x_offset = 0 for im in im_list_upper: new_im.paste(im, (x_offset,0)) x_offset += im.size[0] x_offset = 0 for im in im_list_down: new_im.paste(im, (x_offset,58)) x_offset += im.size[0] return new_im def get_image(driver,div): ''' 下载并还原图片 :driver:webdriver :div:图片的div ''' pass #找到图片所在的div background_images=driver.find_elements_by_xpath(div) location_list=[] imageurl='' for background_image in background_images: location={} #在html里面解析出小图片的url地址,还有长高的数值 location['x']=int(re.findall("background-image: url\((\S+)\); background-position: (.*)px (.*)px;",background_image.get_attribute('style'))[0][1]) location['y']=int(re.findall("background-image: url\((\S+)\); background-position: (.*)px (.*)px;",background_image.get_attribute('style'))[0][2]) imageurl=re.findall("background-image: url\((\S+)\); background-position: (.*)px (.*)px;",background_image.get_attribute('style'))[0][0] location_list.append(location) imageurl=imageurl.replace("webp","jpg") image_bytes = urllib.request.urlopen(imageurl).read() data_stream = BytesIO(image_bytes) jpgfile = Image.open(data_stream) jpgfile.save("%s.png" % 'rr') #重新合并图片 image=get_merge_image("rr.png",location_list ) return image # 计算缺口位置 def getlocation(image3): for i in range(5,260): for j in range(0,116): pixel1 = image3.getpixel((i, j)) if(pixel1[0]>100 or pixel1[1]>100): return i # 获取图片并计算缺口位置 def getImgAndLoc(driver): # 下载图片 image1 = get_image(driver, "//div[@class='gt_cut_bg gt_show']/div") image2 = get_image(driver, "//div[@class='gt_cut_fullbg gt_show']/div") image3 = ImageChops.difference(image1, image2) image1.save("%s.png" % '3') image2.save("%s.png" % '4') image3.save("%s.png" % '5') loc = getlocation(image3) print("缺口位置:", loc) return loc # 移动滑块 def mourse(driver,element,loc): action = ActionChains(driver) action.move_to_element(to_element=element).perform() action.click_and_hold(element).perform() # 鼠标左键按下不放 action.reset_actions() id = random.randint(0, 2) print('track==%d'%id) #将图片划分成几个区域,对不同区域使用不同的行为数据,进一步提高通过率 if loc <= 75: moveStep = gehostMouse.read_txt('./trackData/1_%d.txt' % id) elif loc > 75 and loc <= 100: moveStep = gehostMouse.read_txt('./trackData/2_%d.txt' % id) elif loc > 100 and loc <= 150: moveStep = gehostMouse.read_txt('./trackData/3_%d.txt' % id) elif loc > 150 and loc <= 200: moveStep = gehostMouse.read_txt('./trackData/4_%d.txt' % id) else: moveStep = gehostMouse.read_txt('./trackData/5_%d.txt' % id) countStep = 0 idx = 0 while countStep <= loc-5 and idx < len(moveStep): # print(moveStep[idx][0], moveStep[idx][1], moveStep[idx][2]) action.move_by_offset(moveStep[idx][0], moveStep[idx][1]).perform() # 移动一个位移 action.reset_actions() time.sleep(moveStep[idx][2]) # 等待停顿时间 countStep += moveStep[idx][0] idx += 1 # countStep-=moveStep[idx-1][0] print(countStep) subStep = loc-5-countStep print("subStep=",subStep) while subStep <0: rd=random.randint(-2,-1) action.move_by_offset(rd, 0).perform() action.reset_actions() subStep-=rd time.sleep(random.randint(5, 10) / 100) action.release().perform() # 鼠标左键松开 action.reset_actions()
说明:
1.滑块滑动距离=缺口位置-5 的原因是滑块的位置相对于缺口位置的计算距离来说,滑块初始位置离图片最左边大约距离5个像素距离。
2.验证码破解的难点是模拟人的行为数据,滑太快或太慢都不行,人的行为是一个慢-快-慢的过程,因此我通过获取自己滑动验证码的行为数据,生成了以下形式的几组数据:
第一列是x方向的偏移量,第二列是y方向的偏移量,第三列为耗时。可以使用GhostMouse获取鼠标行为数据。
GhostMouse获取鼠标偏移量数据代码如下:
import os # xyd_typical = (1,0,0.04) def read_rms(file_rms,file_txt): with open(file_rms) as fp: # os.path.sep LMouse_down = False for line in fp: if 'LMouse down' in line or (LMouse_down == True and 'Move' in line): if 'LMouse down' in line: LMouse_down = True xyd_records = [] x_last, y_last = 0, 0 # 保证第一个偏移量为实际开始位置 xy_pos = line.split('(')[1].split(')')[0].split(',') x_pos, y_pos = [int(i) for i in xy_pos] continue if LMouse_down == True and 'Delay' in line: x_delta, y_delta = x_pos - x_last, y_pos - y_last if x_delta == 0 and y_delta == 0 and len(xyd_records) != 0: # len 可能起点就是0,0 continue else: delay = float(line.split(' ')[1].split('}')[0]) xyd_records.append((x_delta, y_delta, delay)) x_last, y_last = x_pos, y_pos continue # {LMouse up (790,659)} if LMouse_down == True and 'LMouse up' in line: # x_init y_init x_change y_change # x y d 每一次偏移量 # x y d with open(file_txt, 'a') as fh_txt: # x_change = sum(x for x,y,d in xyd_records) x_init = xyd_records[0][0] y_init = xyd_records[0][1] x_change = sum(x for x, y, d in xyd_records[1:]) y_change = sum(y for x, y, d in xyd_records[1:]) fh_txt.write('{} {} {} {}\n'.format(x_init, y_init, x_change, y_change)) # 加os.linesep是'\r\n' for x, y, d in xyd_records[1:]: # 第一个记录为起始位置,value记录之后的每一次偏移 fh_txt.write('{} {} {}\n'.format(x, y, d)) LMouse_down = False xyd_records = [] def read_txt(file_txt): with open(file_txt, 'r') as fp: result = [] # (x_init, y_init, x_change, y_chang): [(x0,y0,d0), (x1,y1,d1)...] # i=0; for line in fp: line = line.strip().split() if len(line) == 3: x, y, d = line x, y, d = int(x), int(y), float(d) tp=(x,y,d) result.append(tp) return result def main(): # file_rms = os.path.join(os.path.abspath('.'), 'night.rms') file_txt = os.path.join(os.path.abspath('.'), 'mouse.txt') # read_rms(file_rms,file_txt) result = read_txt(file_txt) for k, v in result.items(): print(k,v) if __name__ == '__main__': pass main()
当然也可以通过request方式模拟请求破解验证码,但需要的参数需要通过其js文件才能搞明白,现在的js文件都加密了,目前能力解决不了。(可参考:http://www.jianshu.com/p/3726581d218a)
相关推荐
"HFSS软件包下的圆锥(圆形)喇叭天线模型制作与参数调整:自主创造,实验验证,全流程教程指导",HFSS圆锥(圆形)喇叭天线 天线模型,自己做的,附带结果,可改参数,HFSS软件包 (有教程,具体到每一步,可以自己做出来) ,HFSS; 圆锥(圆形)喇叭天线; 模型自制; 参数可改; HFSS软件包; 教程详尽。,HFSS圆锥喇叭天线模型:可自定义参数与结果
免费JAVA毕业设计 2024成品源码+论文+数据库+启动教程 启动教程:https://www.bilibili.com/video/BV1SzbFe7EGZ 项目讲解视频:https://www.bilibili.com/video/BV1Tb421n72S 二次开发教程:https://www.bilibili.com/video/BV18i421i7Dx
"基于S7-200 PLC与组态王技术构建的智能化新能源汽车电池检测系统上位机软件平台",基于S7-200plc与组态王组态的新能源汽车电池检测系统上位机 ,S7-200plc;组态王组态;新能源汽车电池检测系统;上位机,"基于PLC与组态王的汽车电池检测上位机系统"
免费JAVA毕业设计 2024成品源码+论文+数据库+启动教程 启动教程:https://www.bilibili.com/video/BV1SzbFe7EGZ 项目讲解视频:https://www.bilibili.com/video/BV1Tb421n72S 二次开发教程:https://www.bilibili.com/video/BV18i421i7Dx
nodejs010-nodejs-docs-0.10.5-8.el6.centos.alt.x86_64.rpm
免费JAVA毕业设计 2024成品源码+论文+录屏+启动教程 启动教程:https://www.bilibili.com/video/BV1SzbFe7EGZ 项目讲解视频:https://www.bilibili.com/video/BV1Tb421n72S 二次开发教程:https://www.bilibili.com/video/BV18i421i7Dx
“基于Cadence Orcad的全面元器件数据库管理系统——全配版与基础版对比分析”,搭建使用Cadence Orcad CIS元器件数据库(默认为Access数据库,如需MySQL数据库需提前沟通),含orcad符号库,Allegro PCB库 —————————————————— 该元器件数据库种类丰富,大分类就有28种(全配版,含有很多如海思,全志,瑞芯微,TI,Xilinx等主流复杂IC的库信息),20种(基础版)。 ———————————————————— 全配版包含1000多种元器件属性信息汇总,都是已验证使用过的,可直接用于自己的电路设计。 全配版还附有大部分与元器件PCB封装已匹配好的的3D模型。 强烈建议原理图库及封装库基于数据库的方式来管理,好处主要有以下几点: 1. 易于管理,可通过数据库文件批量添加、更改或删除器件参数; 2. 减少原理图库的种类, 同类器件只需要新建一次原理图库, 例如不同阻值、精度的电阻; 3. 器件具有唯一性, 每个器件的参数都是唯一的; 4. 方便使用, 如使用 Link Database Part 功能,可以快速完成器件批量替,
1、文件内容:ptlib-devel-2.10.10-6.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/ptlib-devel-2.10.10-6.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装
西门子S7-1200+5轴伺服驱动系统的走工艺对象技术解析——采用脉冲输出驱动方式的控制方法及在全博途V15.1程序中的应用研究。,S7-1200+5轴伺服 走工艺对象 脉冲输出驱动方式 适用于西门子s7-1200+第三方伺服驱动器 全套博途v15.1程序 ,S7-1200;5轴伺服;走工艺对象;脉冲输出驱动方式;第三方伺服驱动器;博途v15.1程序,西门子S7-1200 5轴伺服系统控制程序
免费JAVA毕业设计 2024成品源码+论文+数据库+启动教程 启动教程:https://www.bilibili.com/video/BV1SzbFe7EGZ 项目讲解视频:https://www.bilibili.com/video/BV1Tb421n72S 二次开发教程:https://www.bilibili.com/video/BV18i421i7Dx
《四层三列堆垛式立体库控制系统:带解释的梯形图接线原理图及IO分配与组态画面详解》,4x3堆垛式立体库4层3列四层三列书架式立体库控制系统 带解释的梯形图接线图原理图图纸,io分配,组态画面 ,立体库; 堆垛式; 控制系统; 梯形图; 接线图; 原理图; IO分配; 组态画面,"立体库控制系统原理图:四层三列堆垛式书架的IO分配与组态画面"
1、文件内容:pyOpenSSL-0.13.1-4.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/pyOpenSSL-0.13.1-4.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装
免费JAVA毕业设计 2024成品源码+论文+数据库+启动教程 启动教程:https://www.bilibili.com/video/BV1SzbFe7EGZ 项目讲解视频:https://www.bilibili.com/video/BV1Tb421n72S 二次开发教程:https://www.bilibili.com/video/BV18i421i7Dx
基于三菱PLC与MCGS技术的防盗门报警系统:梯形图接线图原理及IO分配、组态画面详解,基于三菱PLC和MCGS的防盗门报警器 带解释的梯形图接线图原理图图纸,io分配,组态画面 ,三菱PLC; MCGS; 防盗门报警器; 梯形图接线图; IO分配; 组态画面,基于三菱PLC与MCGS的报警器系统:梯形图接线与组态画面详解
"COMSOL金膜表面等离子共振(SPR)分析:不同入射角下的共振角度观察",comsol金膜表面等离子共振SPR,不同入射角查看共振角度 ,关键词:comsol金膜表面;等离子共振(SPR);不同入射角;共振角度;分离度;角度调节;材料表面光;生物传感;互动现象;实时分析,"COMSOL研究金膜表面等离子共振: 角度变化影响共振角度"
1. 机器学习与深度学习 机器学习是人工智能的核心领域,旨在通过数据训练模型,使计算机能够从经验中学习和改进。监督学习、无监督学习和强化学习是其主要分支,广泛应用于图像识别、语音处理和预测分析等场景。深度学习作为机器学习的重要子领域,通过神经网络模拟人脑的工作机制,尤其在图像分类、自然语言处理和自动驾驶等领域取得了突破性进展。深度学习模型如卷积神经网络(CNN)和循环神经网络(RNN)已成为许多AI应用的基础。 2. 自然语言处理与计算机视觉 自然语言处理(NLP)使计算机能够理解、生成和处理人类语言,关键技术包括机器翻译、语音识别、情感分析和问答系统。例如,智能助手(如Siri、Alexa)和聊天机器人(如ChatGPT)都依赖于NLP技术。计算机视觉则让计算机能够“看懂”图像和视频,广泛应用于人脸识别、自动驾驶、医疗影像分析等领域。目标检测、图像分割和视频分析等技术正在推动安防、零售和制造业的智能化转型。 3. 强化学习与AI伦理 强化学习通过试错和奖励机制,训练智能体在复杂环境中做出最优决策,广泛应用于游戏AI(如AlphaGo)、机器人控制和资源调度等领域。与此同时,随着AI技术的快速发展,AI伦理和社会影响也成为重要研究方向。如何确保AI的公平性、透明性和隐私保护,以及应对AI对就业和社会结构的潜在影响,已成为学术界和产业界共同关注的焦点。AI的可持续发展离不开技术与伦理的平衡。
不同放牧策略对草原土壤性质的影响研究——基于机器学习.pdf
本资源提供一种基于Proteus仿真的纯硬件NE555呼吸灯设计方案,结合NE555定时器、三极管(如2N2222或8050)、电阻、电容等元件,完整实现LED的呼吸灯效果。内容包括: Proteus仿真模型搭建:电路原理图设计、虚拟示波器波形分析; 硬件实现步骤:元件选型、焊接调试、实测波形对比; 参数调优方法:通过仿真快速调整RC参数控制呼吸频率与渐变平滑度。 目标: 掌握Proteus中NE555电路仿真技巧; 理解硬件电路与仿真模型的匹配性; 学习从虚拟仿真到实物落地的全流程设计; 培养故障排查与参数优化能力。 核心功能: 仿真验证:在Proteus中模拟NE555的PWM输出及LED亮度渐变效果; 硬件实现:通过三极管驱动电路将仿真结果转化为实物呼吸灯; 双向调试:支持仿真与硬件实测数据对比,快速定位设计问题。 关键模块: NE555无稳态多谐振荡器(控制占空比渐变); Proteus虚拟示波器(观测PWM波形变化); 三极管电流放大电路(驱动高亮度LED)。 设计亮点 虚实结合:通过Proteus仿真降低硬件试错成本,提升学习效率。
,全c源程序太阳能并网逆变器全C源程序单相3kw5kw,板图原理图清单,可以直接打板验证,超好的生产光伏逆变器的技术方案,量产方案
免费JAVA毕业设计 2024成品源码+论文+数据库+启动教程 启动教程:https://www.bilibili.com/video/BV1SzbFe7EGZ 项目讲解视频:https://www.bilibili.com/video/BV1Tb421n72S 二次开发教程:https://www.bilibili.com/video/BV18i421i7Dx