极验滑动验证码

import timefrom io import BytesIOfrom PIL import Imagefrom selenium import webdriverfrom selenium.webdriver import ActionChainsfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECEMAIL = ‘小白kill‘PASSWORD = ‘‘BORDER = 6class CrackGeetest():    def __init__(self):        self.url = ‘https://account.cnblogs.com/signin‘        options = webdriver.ChromeOptions()        options.add_experimental_option(‘excludeSwitches‘,                                        [‘enable-automation‘])        self.browser = webdriver.Chrome(options=options)        self.wait = WebDriverWait(self.browser, 20)        self.email = EMAIL        self.password = PASSWORD

    def open(self):        ‘‘‘        输入账号密码        :return: None        ‘‘‘        self.browser.get(self.url)        email = self.wait.until(EC.presence_of_element_located((By.ID,‘LoginName‘)))        email.clear()        password = self.wait.until(EC.presence_of_element_located((By.ID,‘Password‘)))        email.send_keys(self.email)        password.send_keys(self.password)

    def login(self):        """        登录        :return: None        """        submit = self.wait.until(EC.element_to_be_clickable((By.ID, ‘submitBtn‘)))        submit.click()        time.sleep(10)        print(‘登录成功‘)

    def get_position(self):        ‘‘‘        获取验证码位置        :return: 验证码位置元组        ‘‘‘        img = self.wait.until(EC.presence_of_element_located((By.CLASS_NAME,‘geetest_canvas_img‘)))        time.sleep(2)        location = img.location        size = img.size        print(size[‘height‘])        print(size[‘width‘])        top,bottom,left,right = location[‘y‘] ,location[‘y‘]+size[‘height‘],location[‘x‘],location[‘x‘]+size[‘width‘]        return (top,bottom,left,right)

    def get_geetest_image(self,name=‘captcha.png‘):        """        获取验证码图片        :return: 图片对象        """

        top, bottom, left, right = self.get_position()        print(‘验证码位置‘, top, bottom, left, right)        screenshot = self.get_screenshot()        captcha = screenshot.crop((left, top, right, bottom))        captcha.save(name)        return captcha

    def get_screenshot(self):        ‘‘‘        网页截图        :return:截图对象        ‘‘‘        name = int(time.time())        screenshot = self.browser.get_screenshot_as_png()        with open("screenshot" + str(name) + ".png", "wb")as f:            f.write(screenshot)        screenshot = Image.open(BytesIO(screenshot))

        return screenshot    def get_slider(self):        ‘‘‘        获取滑块        :return:滑块对象        ‘‘‘        slider = self.wait.until(EC.element_to_be_clickable((By.CLASS_NAME,‘geetest_slider_button‘)))        print(1)        return slider

    def 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.is_pixel_equal(image1, image2, i, j):                    left = i                    return left        return left

    def is_pixel_equal(self, image1, image2, x, y):        """        判断两个像素是否相同        :param image1: 图片1        :param image2: 图片2        :param x: 位置x        :param y: 位置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        else:            return False

    def get_track(self, distance):        """        根据偏移量获取移动轨迹        :param distance: 偏移量        :return: 移动轨迹        """        # 移动轨迹        track = []        # 当前位移        current = 0        # 减速阈值        mid = distance * 4 / 5        # 计算间隔        t = 0.2        # 初速度        v = 0

        while current < distance:            if current < mid:                # 加速度为正2                a = 2            else:                # 加速度为负3                a = -3            # 初速度v0            v0 = v            # 当前速度v = v0 + at            v = v0 + a * t            # 移动距离x = v0t + 1/2 * a * t^2            move = v0 * t + 1 / 2 * a * t * t            # 当前位移            current += move            # 加入轨迹            track.append(round(move))        print(current)        return track

    def 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 delete_style(self):        ‘‘‘        执行js脚本,获取无滑块图        :return:        ‘‘‘        js = ‘document.querySelectorAll("canvas")[2].style=""‘        self.browser.execute_script(js)    def crack(self):        # 输入用户名密码        self.open()        # 点击登录按钮        self.login()        #获取滑块对象        slider = self.get_slider()        # 获取带缺口的验证码图片        image2 = self.get_geetest_image(‘captcha2.png‘)

        # 获取验证码图片

        js = ‘document.querySelectorAll("canvas")[2].style=""‘        self.browser.execute_script(js)        image1 = self.get_geetest_image(‘captcha1.png‘)

        # 获取缺口位置        gap = self.get_gap(image1, image2)        print(‘缺口位置‘, gap)        # 减去缺口位移        gap -= BORDER        # 获取移动轨迹        track = self.get_track(gap)        print(‘滑动轨迹‘, track)        # 拖动滑块        self.move_to_gap(slider, track)

        success = self.wait.until(            EC.text_to_be_present_in_element((By.CLASS_NAME, ‘geetest_success_radar_tip_content‘), ‘验证成功‘))        print(success)

        # 失败后重试        if not success:            self.crack()        else:            self.login()if __name__ == ‘__main__‘:    crack = CrackGeetest()    crack.crack()

原文地址:https://www.cnblogs.com/kill-520/p/11638452.html

时间: 2024-10-07 11:31:28

极验滑动验证码的相关文章

selenium处理极验滑动验证码

要爬取一个网站遇到了极验的验证码,这周都在想着怎么破解这个,网上搜了好多知乎上看到有人问了这问题https://www.zhihu.com/question/28833985,我按照这思路去大概实现了一下. 1.使用htmlunit(这种方式我没成功,模拟鼠标拖拽后轨迹没生成,可以跳过) 我用的是java,我首先先想到了用直接用htmlunit,我做了点初始化 private void initWebClient() { if (webClient != null) { return; } we

破解极验滑动验证码

阅读目录 一 介绍 二 实现 三 说明 一 介绍 一些网站会在正常的账号密码认证之外加一些验证码,以此来明确地区分人/机行为,从一定程度上达到反爬的效果,对于简单的校验码Tesserocr就可以搞定,如下 但一些网站加入了滑动验证码,最典型的要属于极验滑动认证了,极验官网:http://www.geetest.com/,下图是极验的登录界面 现在极验验证码已经更新到了 3.0 版本,截至 2017 年 7 月全球已有十六万家企业正在使用极验,每天服务响应超过四亿次,广泛应用于直播视频.金融服务.

95行代码极验滑动验证码?是远远不够的!大牛石锤!

一直以来,极验坚持的理念是:醉心技术,以不变之变以应万变.通过不断地钻研技术,升级产品,每日迭代更新,全网联动联防.在攻防过程中,始终将对手甩在身后,我们团队始终坚守着,因为我们相信行动才是最好的回应. 所以,在我们看来,大家围绕着"行为验证"安全产品而展开的相关技术细节讨论,是对我们最大的推动,极验"行为验证"的成功离不开大家的建言献策. "行为验证"本质上是一个人工智能产品 人工智能决策演示效果 我们还会从多个维度对用户的交互行为进行采集,一

极验滑块坐标识别(一)

一:介绍 一些网站为了区分人机行为,在网站的一些操作上添加验证码机制,来实现反爬虫. 目前比较常见的验证码类型有: 1:传统式验证码 主要通过用户输入图片中的字母,数字,汉字等来验证. 特点:简单易操作,人机交互性较好,但安全系数比较低. 目前通过机器学习技术对传统验证码的识别率已经可以达到90%以上. 2:行为式验证码 行为式验证码是一种较为流行的验证码.从字面来理解,就是通过用户的操作行为来完成验证,而无需去读懂扭曲的图片文字.常见的有两种:拖动式与点触式. 特点:操作简单,体验好,但容易被

极验验证码的破解2-图片还原和滑块位置求解

上一章我们讨论了破解极验验证码的思路和步骤,这一章我将介绍如何还原两张背景图和求解滑块的目标位置. 一.图片还原 我们首先看看页面上给了我们什么参数: 这个是完整的背景图(fullbg)的页面元素,可以看到他们都是来自于同一张原图,只是截取的位置不同.上图红框就是该小图片在原图中的位置,每一张小图片都是10个像素宽,58个像素高,我们再来看看原图: 确实很乱,根本看不出什么东西.如果我们把这个原图下载下来,然后按照页面上的参数截取一个个10像素宽,58像素高的小图片拼接在一起便可以得到完整的背景

极验验证码破解之selenium

这一篇写完很久了,因为识别率一直很低,没办法拿出来见大家,所以一直隐藏着,今天终于可以拿出来见见阳光了. 哈喽,大家好,我是星星在线,我又来了,今天给大家带来的是极验验证码的selenium破解之法,是不是有点小激动呢,小伙伴们等不了了,让我们赶紧直入主题吧. 虎嗅网注册 这次我们是拿虎嗅开刀,注册账号的时候需要滑动图片到缺口位置,这种验证码我们现在也经常遇到,这个就不用详细介绍了吧 针对这种验证码我们首先确定了使用selenium模拟滑动破解方式,selenium鼠标移动点击拖动都比较简单,那

极验验证码的破解4-执行破解

经过以上的铺垫,我们就差最后一步了-破解!首选我们来分析一下要做的事情: 1.加载包含验证码的页面,当然是用我们前面讲的phantomaJS来加载啦,因为极验验证码是依赖于js渲染的,我们必须等页面完全渲染完成后再执行拖动 2.收集一些页面的参数发送到java后台服务计算滑块的目标位移并接受结果 3.通过js模拟鼠标事件来实现滑块的移动 4.输出验证结果 好,让我们一步步来讲解如果实现上面的目标. 我们首先新建一个js文件,就叫做geetest_refresh.js好了,我们首先写一些样板代码,

极验验证码 破解

本文主要提供目前极验的识别思路. 极验验证码主要分为4步. 1/ 还原验证图片.通过分析CSS,发现是固定位置,把一张图片分成若干份,按照指定顺序重新排列,所以难度不大. 2/ 还原好图片后,找出2张图片的差异,即bg(验证图)和fullbg(全图).这个难度也不大,按像素或者按块去扫描.设定一个阈值,当2个图片块或像素的差异值高于这个阈值的时候,就横向向右再扫描几个像素,例如10个,如果这10个像素里面有7个都高于这个像素.那个这个像素所在图片的X坐标,就是我们要的坐标点.根据这种方式,识别坐

极验验证码的破解-开篇

    近几年有个拖动解锁的验证码风头很盛,用过12306的人就知道,它有段时间用的就是这个拖动解锁的验证码,据说就是极验验证码,虽然现在12306的验证码变成了看图识画,安全性和趣味性大大提高,但是也还是被万能的大神破了.由此看来天下没有破不了的验证码,只要功夫深,防火墙也能磨成针.     好了,今天我们来探讨一下极验验证码的破解,这也是我最近一段时间的研究成果.首先声明一下:本博客所讨论的内容仅限于技术研究,请勿用于商业用途,否则后果自负.     我打算分成几个章节来讨论极验验证码所采用