滑动验证码验证

selenium +chrome+ firefox + webdriver 遇到的坑

lunix中启动webdriver时报错一:

测试代码为:

  1. #!/usr/bin/python

  2.  

    # -*- coding: utf-8 -*-

  3.  

  4.  

  5.  

    from selenium import webdriver

  6.  

  7.  

    driver = webdriver.Firefox()

  8.  

    driver.get("https://www.baidu.com")

运行报错信息如下:

  1. Traceback (most recent call last):

  2.  

    File "maimai_web.py", line 14, in <module>

  3.  

    driver = webdriver.Firefox()

  4.  

    File "/usr/local/python3.6/lib/python3.6/site-packages/selenium/webdriver/firefox/webdriver.py", line 152, in __init__

  5.  

    keep_alive=True)

  6.  

    File "/usr/local/python3.6/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 98, in __init__

  7.  

    self.start_session(desired_capabilities, browser_profile)

  8.  

    File "/usr/local/python3.6/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 188, in start_session

  9.  

    response = self.execute(Command.NEW_SESSION, parameters)

  10.  

    File "/usr/local/python3.6/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 256, in execute

  11.  

    self.error_handler.check_response(response)

  12.  

    File "/usr/local/python3.6/lib/python3.6/site-packages/selenium/webdriver/remote/errorhandler.py", line 194, in check_response

  13.  

    raise exception_class(message, screen, stacktrace)

  14.  

    selenium.common.exceptions.WebDriverException: Message: Process unexpectedly closed with status 1

处理方法:

  1. #!/usr/bin/python

  2.  

    # -*- coding: utf-8 -*-

  3.  

  4.  

  5.  

    from pyvirtualdisplay import Display

  6.  

    from selenium import webdriver

  7.  

  8.  

  9.  

    display = Display(visible=0, size=(1920, 1080))

  10.  

    display.start()

  11.  

    driver = webdriver.Firefox()

  12.  

    driver.get("https://www.baidu.com")

结果:

运行ok,搞定!

坑二、webdriver实例化报错

采用多线程调用webdriver时候,偶尔会出现这样的错:selenium.common.exceptions.WebDriverException: Message: connection refused

  1. Exception in thread Thread-2:

  2.  

    Traceback (most recent call last):

  3.  

    File "/usr/local/python3.6/lib/python3.6/threading.py", line 916, in _bootstrap_inner

  4.  

    self.run()

  5.  

    File "/usr/local/python3.6/lib/python3.6/threading.py", line 864, in run

  6.  

    self._target(*self._args, **self._kwargs)

  7.  

    File "maimai_tran_account_driver.py", line 591, in debug

  8.  

    t = TrainAccount(count,lock)

  9.  

    File "maimai_tran_account_driver.py", line 32, in __init__

  10.  

    self.chrome = webdriver.Firefox()

  11.  

    File "/usr/local/python3.6/lib/python3.6/site-packages/selenium/webdriver/firefox/webdriver.py", line 152, in __init__

  12.  

    keep_alive=True)

  13.  

    File "/usr/local/python3.6/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 98, in __init__

  14.  

    self.start_session(desired_capabilities, browser_profile)

  15.  

    File "/usr/local/python3.6/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 188, in start_session

  16.  

    response = self.execute(Command.NEW_SESSION, parameters)

  17.  

    File "/usr/local/python3.6/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 256, in execute

  18.  

    self.error_handler.check_response(response)

  19.  

    File "/usr/local/python3.6/lib/python3.6/site-packages/selenium/webdriver/remote/errorhandler.py", line 194, in check_response

  20.  

    raise exception_class(message, screen, stacktrace)

  21.  

    selenium.common.exceptions.WebDriverException: Message: connection refused

查看geckodriver.log具体报错信息。

坑三、模拟器被反爬

原因是在webdriver发送请求的时候,会有webdriver的js判断,当检测到此字段时会被作为爬虫处理,应对策略如下。

工具:mitmproxy做代理,替换掉请求里面的webdriver为别的字段

部分代码如下:

  1. if "/_next/static/js/common_pdd" in flow.request.url:

  2.  

    flow.response.text = flow.response.text.replace("webdriver", "userAgent")

坑四、滑动验证码验证失败

同样的代码,chromedriver验证码通过,firefox滑动到正常位置报失败,最后发现原因是firefox在滑动模块的时候速度太慢被机器识别出来,解决方法,增大滑动的速度,附上滑动验证的部分代码,如下:

  1. def crack_geetest(self, max_retry=10):

  2.  

    driver = self.driver

  3.  

    l = self.logger

  4.  

    l.info("process handle geetest captcha...")

  5.  

  6.  

    def get_position():

  7.  

    """

  8.  

    获取验证码位置

  9.  

    :return: 验证码位置元组

  10.  

    """

  11.  

    img = driver.find_element_by_xpath(‘//div[@class="geetest_canvas_img geetest_absolute"]‘)

  12.  

    time.sleep(2)

  13.  

    location = img.location

  14.  

    size = img.size

  15.  

    top, bottom, left, right = location[‘y‘], location[‘y‘] + size[‘height‘], location[‘x‘], location[‘x‘] + \

  16.  

    size[‘width‘]

  17.  

    return (top, bottom, left, right)

  18.  

  19.  

    def get_geetest_image(name):

  20.  

    """

  21.  

    获取验证码图片

  22.  

    :return: 图片对象

  23.  

    """

  24.  

    full_img_path = ‘./zhilian_screenshot_{}.png‘.format(self.account[‘user_id‘])

  25.  

    driver.save_screenshot(filename=full_img_path)

  26.  

    image = Image.open(fp=full_img_path, mode=‘r‘)

  27.  

    top, bottom, left, right = get_position()

  28.  

    print(‘验证码位置:({},{},{},{})‘.format(left, top, right, bottom))

  29.  

    t = driver.execute_script(‘var q=document.documentElement.scrollTop; return q;‘)

  30.  

    print(‘验证码位置:({},{},{},{})‘.format(left, top - int(t), right, bottom - int(t)))

  31.  

    print(‘p--->>>‘, t)

  32.  

    captcha = image.crop((left, top - int(t), right, bottom - int(t)))

  33.  

    captcha_file_name = ‘./zhilian_captcha_{}_{}.png‘.format(self.account[‘user_id‘], name)

  34.  

    captcha.save(captcha_file_name)

  35.  

    return captcha, captcha_file_name

  36.  

  37.  

    def get_slider():

  38.  

    """

  39.  

    获取滑块

  40.  

    :return: 滑块对象

  41.  

    """

  42.  

    slider = driver.find_element_by_xpath(‘//div[@class="geetest_slider_button"]‘)

  43.  

    return slider

  44.  

  45.  

    def get_gap(captcha_file_name):

  46.  

    """

  47.  

    获取缺口偏移量

  48.  

    :param image1: 不带缺口图片

  49.  

    :param image2: 带缺口图片

  50.  

    :return:

  51.  

    """

  52.  

    res = self.dama2.decode_captcha(6137, captcha_file_name)

  53.  

    print(res)

  54.  

    # (‘b800b4f6-0d9a-40e2-a972-d87c91582b46‘, [(176, 101)])

  55.  

    return int(res[1][0][0])

  56.  

  57.  

    def calculate_tracks(distance):

  58.  

    def generate_rand(n, sum_v): # 随机生成n个总和为sum_v的list

  59.  

    Vector = [random.randint(1, 3) for _ in range(n)]

  60.  

    Vector = [int(i / sum(Vector) * sum_v) for i in Vector]

  61.  

    if sum(Vector) < sum_v:

  62.  

    res = sum_v - sum(Vector)

  63.  

    for i in range(res):

  64.  

    Vector[random.randint(0, n - 1)] += 1

  65.  

    return [0 - i for i in Vector]

  66.  

  67.  

    back_dis = random.randint(16, 26)

  68.  

    distance += back_dis # 先滑过一点,最后再反着滑动回来

  69.  

    v = 0

  70.  

    t = 0.2

  71.  

    forward_tracks = []

  72.  

  73.  

    current = 0

  74.  

    mid = distance * 3 / 5

  75.  

    while current < distance:

  76.  

    if current < mid:

  77.  

    a = 2

  78.  

    else:

  79.  

    a = -3

  80.  

  81.  

    s = v * t + 0.5 * a * (t ** 2)

  82.  

    v = v + a * t

  83.  

    current += s

  84.  

    forward_tracks.append(round(s))

  85.  

  86.  

    # 反着滑动到准确位置

  87.  

    back_tracks = generate_rand(15, back_dis) # 总共等于 back_dis

  88.  

    return {‘forward_tracks‘: forward_tracks, ‘back_tracks‘: back_tracks}

  89.  

  90.  

    def move_to_gap(slider, tracks):

  91.  

    """

  92.  

    拖动滑块到缺口处

  93.  

    :param slider: 滑块

  94.  

    :param track: 轨迹

  95.  

    :return:

  96.  

    """

  97.  

    ActionChains(driver).click_and_hold(slider).perform()

  98.  

  99.  

    # 往后移动

  100.  

    for i in tracks[‘forward_tracks‘]:

  101.  

    ActionChains(driver).move_by_offset(i, 0).perform()

  102.  

  103.  

    # 往回移动

  104.  

    time.sleep(0.5)

  105.  

    for i in tracks[‘back_tracks‘]:

  106.  

    ActionChains(driver).move_by_offset(i, 0).perform()

  107.  

  108.  

    # 小范围震荡一下

  109.  

    # time.sleep(0.3)

  110.  

    random_sc = random.randint(3, 8)

  111.  

    ActionChains(driver).move_by_offset(0-random_sc, 0).perform()

  112.  

    time.sleep(0.5)

  113.  

    ActionChains(driver).move_by_offset(random_sc, 0).perform()

  114.  

  115.  

    # 释放

  116.  

    time.sleep(0.5)

  117.  

    ActionChains(driver).release().perform()

  118.  

  119.  

    def crack(retry=0):

  120.  

    # 输入用户名密码

  121.  

    # 点击验证按钮

  122.  

    # 获取验证码图片

  123.  

    print(‘get_geetest_image‘)

  124.  

    captcha_obj, captcha_file_name = get_geetest_image(‘2‘)

  125.  

    gap = get_gap(captcha_file_name)

  126.  

    l.info(‘缺口位置:{}‘.format(gap))

  127.  

    print(‘缺口位置:{}‘.format(gap))

  128.  

    # 减去起始缺口位移

  129.  

    BORDER = 29

  130.  

    gap -= BORDER

  131.  

    # 获取移动轨迹

  132.  

    track = calculate_tracks(gap)

  133.  

    l.info(‘滑动轨迹:{}‘.format(track))

  134.  

    print(‘滑动轨迹:{}‘.format(track))

  135.  

    # # 拖动滑块

  136.  

    slider = get_slider()

  137.  

    move_to_gap(slider, track)

  138.  

    driver.save_screenshot(‘./zhilian_capresult_{}_{}.png‘.format(self.account[‘user_id‘], retry))

  139.  

    #

  140.  

    time.sleep(3)

  141.  

    # #

  142.  

    result = driver.find_element_by_xpath(‘//div[@class="geetest_result_title"]‘).get_attribute(‘textContent‘)

  143.  

    l.info(result)

  144.  

    print(result)

  145.  

    return result

  146.  

  147.  

    retry = 1

  148.  

    while True:

  149.  

    l.info(f‘{retry}/{max_retry} crack geetest.‘)

  150.  

    if retry == max_retry:

  151.  

    l.info("max retry reached, return False")

  152.  

    return False

  153.  

    success = crack(retry)

  154.  

    if ‘秒的速度超过‘ in success or ‘passport.lagou.com/login/login‘ not in driver.current_url:

  155.  

    l.info("crack succeeded!")

  156.  

    print("crack succeeded!")

  157.  

    return True

  158.  

    elif ‘拖动滑块将悬浮图像正确拼合‘ in success:

  159.  

    retry += 1

  160.  

    l.info("crack failed, retry:{}/{}".format(retry, max_retry))

  161.  

    driver.find_element_by_xpath(‘//a[@class="geetest_refresh_1"]‘).click()

  162.  

    time.sleep(5)

  163.  

    continue

  164.  

    else:

  165.  

    time.sleep(5)

  166.  

    retry += 1

  167.  

    l.info("crack failed, retry:{}/{}".format(retry, max_retry))

  168.  

    continue

来源:https://blog.csdn.net/wenq_yang/article/details/81258932

原文地址:https://www.cnblogs.com/alex-13/p/12019764.html

时间: 2024-10-09 03:32:58

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

淘宝滑动验证码研究

引言 悠闲的时候,总会去找些事做做.前些天在登录淘宝的时候,发现了滑动验证码,虽然已经不是什么新事物,但还是产生了很大的兴趣. 传统的字符输入验证码,变为了滑动验证码,这一看就是产品大师的手笔啊,不知道申请专利没有. 这种“情感化”的验证码设计,可破解度高不高呢?如果是可破解度高,那就真是验证码的一次革命变新了.还是让我先了解一下滑动验证码的资料吧! 没有Google就百度,搜一搜,让我很震惊,一般搜技术的东西,大多数来源于csdn,blogs.cn,更牛批一点的是来源于stackoverflo

滑动验证码

自己研究: jQuery拖拽滑动验证码插件 slideunlock.js 原理:(别人说) 响应时间,拖拽速度,时间,位置,轨迹,重试次数等.这些因素能够构成一个采样结果或者辨识特性. 只获取到滑动时间,滑动的长度. 效果: html页面 <link href="css/slide-unlock.css" rel="stylesheet"> <script type="text/javascript" src="js/

gsxt滑动验证码

最后,谈谈滑动验证码. 目前,工商网站已经全面改版,全部采用了滑动验证码,上面绝大多数思路都失效了.对于滑动验证码,网上能搜到的解决方案基本都是下载图片,还原图片,算出滑动距离,然后模拟js来进行拖动解决,我们来看下能否不模拟拖动来解决这个问题. 以云南工商网站为例,首先抓包看过程. 1. http://yn.gsxt.gov.cn/notice/pc-geetest/register?t=147991678609,response: 2. 下载验证码图片 3. http://yn.gsxt.g

破解极验滑动验证码

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

听说验证码战场硝烟弥漫,你看滑动验证码这名小将如何?

听说验证码战场硝烟弥漫上一期我们简单的介绍了图形验证码这名小将. 如今验证码的战场怪相横生.接下来,我们介绍一下滑动验证码吧! 它是怎么样的呢?像手机解锁一样?爆照!如下为网易云易盾的行为式验证码中的滑动验证码. 仔细看上面的提示,就能明白如何操作.(强迫症的人看见图就条件反射的想要去拖动它吧,哈哈哈)这样是不是很有趣呢?用户不用仔细辨认图形验证码上的符号,再手打输入答案.只需要用鼠标轻轻拖拽到相应位置就可以了.这样的方式化简用户的操作步骤,简单.快速,相比于图形验证码,大大的增加用户的体验感.

1 如何引用第三方滑动验证码

参考:极验科技:https://docs.geetest.com/install/deploy/server/python 1 安装requests pip install requests 2 拷贝你在网站上下载好的软件包下面的sdk下面的geetest文件到你的项目utils目录下面 3 拷贝代码到views.py from utils.geetest import GeetestLib # 导入滑动验证码的模块 #请在官网申请ID使用,示例ID不可使用 pc_geetest_id = "b

VUE中使用geetest滑动验证码

一,准备工作:服务端部署 下载文件gt.gs: https://github.com/GeeTeam/gt3-python-sdk 需要说明的是这里的gt.js文件,它用于加载对应的验证JS库. 1.引入初始化函数 main.js import '../static/global/gt.js' 2.调用初始化函数进行初始化 api.js // 滑动验证码api export const getGeetest = ()=> { return Axios.get('captcha_check/')

python爬虫21 | 对于b站这样的滑动验证码,不好意思,照样自动识别

今天 要来说说滑动验证码了 大家应该都很熟悉 点击滑块然后移动到图片缺口进行验证 现在越来越多的网站使用这样的验证方式 为的是增加验证码识别的难度 那么 对于这种验证码 应该怎么破呢 接下来就是 学习 python 的正确姿势 打开 b 站的登录页面 https://passport.bilibili.com/login 可以看到登录的时候需要进行滑块验证 按下 F12 进入 Network 看下我们将滑块移到缺口松开之后做了什么提交 可以看到是一个 GET 请求 但是 这请求链接也太特么长了吧

Django 项目试炼blog(10) --补充 滑动验证码

首先安装一个需要用到的模块 pip install social-auth-app-django 安装完后在终端输入pip list会看到 social-auth-app-django 3.1.0 social-auth-core 3.0.0 然后可以来我的github,下载关于滑动验证码的这个demo:https://github.com/Edward66/slide_auth_code 下载完后启动项目 python manage.py runserver 启动这个项目后,在主页就能看到示例