精华内容
下载资源
问答
  • 在我们登录账号中常常会遇到各种验证码,如图片验证码,拖动滑块验证.....滑块验证码只需要用户使用鼠标将滑块从某个位置拖动到另一个位置即可。程序通过记录用户拖动滑块的轨迹,这一串的轨迹数据采用模式识别的...

    在我们登录账号中常常会遇到各种验证码,如图片验证码,拖动滑块验证.....

    滑块验证码只需要用户使用鼠标将滑块从某个位置拖动到另一个位置即可。程序通过记录用户拖动滑块的轨迹,这一串的轨迹数据采用模式识别的手段就可以判断出这是否是真人在操作。

    滑块验证通常需要使滑块按照正常的加速度进行拖动,停靠在一个合适的位置,在使用selenium时通常需要设置一个合适的滑动加速度来使自己伪装的更像人类用户而不是计算机。

    from selenium.webdriver import ActionChains这个类基本能够满足我们所有对鼠标操作的需求。

    我们使用企查查这个网站来实践一下

    from selenium.webdriver import ActionChains

    from selenium import webdriver

    import time

    driver=webdriver.Chrome()

    driver.get("https://www.qichacha.com/user_login")

    time.sleep(1)

    首先需要选中滑块,才能进行下一步操作

    driver.find_element_by_xpath('//*[@id="normalLogin"]').click()

    time.sleep(1)

    huakuai=driver.find_element_by_xpath('//*[@id="nc_1_n1z"]')

    需要自己设置一个函数来生成一个轨迹来模拟人类用户行为

    def get_track(distance): # distance为传入的总距离

    # 移动轨迹

    track=[]

    # 当前位移

    current=0

    # 减速阈值

    mid=distance*4/5

    # 计算间隔

    t=0.2

    # 初速度

    v=1

    while current

    if current

    # 加速度为2

    a=4

    else:

    # 加速度为-2

    a=-3

    v0=v

    # 当前速度

    v=v0+a*t

    # 移动距离

    move=v0*t+1/2*a*t*t

    # 当前位移

    current+=move

    # 加入轨迹

    track.append(round(move))

    return track

    拖动滑块进行测试,由于测试没有输入账号密码...

    drag_and_drop(source, target)拖拽

    drag_and_drop_by_offset(source, xoffset, yoffset)将目标拖动到指定的位置

    def move_to_gap(slider,tracks): # slider是要移动的滑块,tracks是要传入的移动轨迹

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

    for x in tracks:

    ActionChains(driver).move_by_offset(xoffset=x,yoffset=0).perform()

    time.sleep(0.5)

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

    if __name__ == '__main__':

    move_to_gap(huakuai,get_track(340))

    后面是全部代码,由于没有缺口位置,不需要设置到合适停止到正确的位置

    from selenium.webdriver import ActionChains

    from selenium import webdriver

    import time

    driver=webdriver.Chrome()

    driver.get("https://www.qichacha.com/user_login")

    time.sleep(1)

    driver.find_element_by_xpath('//*[@id="normalLogin"]').click()

    time.sleep(1)

    huakuai=driver.find_element_by_xpath('//*[@id="nc_1_n1z"]')

    def get_track(distance): # distance为传入的总距离

    # 移动轨迹

    track=[]

    # 当前位移

    current=0

    # 减速阈值

    mid=distance*4/5

    # 计算间隔

    t=0.2

    # 初速度

    v=1

    while current

    if current

    # 加速度为2

    a=4

    else:

    # 加速度为-2

    a=-3

    v0=v

    # 当前速度

    v=v0+a*t

    # 移动距离

    move=v0*t+1/2*a*t*t

    # 当前位移

    current+=move

    # 加入轨迹

    track.append(round(move))

    return track

    def move_to_gap(slider,tracks): # slider是要移动的滑块,tracks是要传入的移动轨迹

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

    for x in tracks:

    ActionChains(driver).move_by_offset(xoffset=x,yoffset=0).perform()

    time.sleep(0.5)

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

    if __name__ == '__main__':

    move_to_gap(huakuai,get_track(340))

    展开全文
  • 前言在爬取数据中,不可避免的会遇到各种验证,上一篇文章说了二维码验证的办法示例本篇文章讲的是遇到滑块验证的解决方案,本例是在一个b2b的网站内遇到的滑块验证重点真实人的拖动操作,是y轴和x都有变化的。...

    前言

    在爬取数据中,不可避免的会遇到各种验证,上一篇文章说了二维码验证的办法

    示例

    本篇文章讲的是遇到滑块验证的解决方案,本例是在一个b2b的网站内遇到的滑块验证

    重点

    真实人的拖动操作,是y轴和x都有变化的。这是重中之重。

    思路

    保存完整图片和缺口图片

    找到缺口和图片的距离

    生成移动轨迹

    松开鼠标,确定移动结果

    保存(完整和缺口)图片的代码:

    def get_code_image(driver, fiel_name, ele_name='token-img', is_by_id=True):

    if is_by_id is True:

    code_element = driver.find_element_by_id(ele_name)

    else:

    code_element = driver.find_element_by_css_selector(ele_name)

    code_element.location_once_scrolled_into_view

    driver.save_screenshot(fiel_name)

    left = code_element.location_once_scrolled_into_view['x']

    top = code_element.location_once_scrolled_into_view['y']

    right = code_element.size['width'] + left

    height = code_element.size['height'] + top

    im = Image.open(fiel_name)

    img = im.crop((left, top, right, height)) # 截取指定元素图片保存

    save_res = img.save(fiel_name)

    return save_res

    处理缺口和完整图片需要设置页面元素的展示和隐藏不同页面操作不同,本例使用的是执行js控制页面元素。

    js_code = """

    var x = document.getElementsByClassName('gt_slice')[0].style.display="none";

    console.log(x)

    """

    # 执行js代码

    self.browser.execute_script(js_code)

    找缺口距离的代码

    def get_distance(cut_image, full_image):

    cut_image = Image.open(cut_image) # 缺口背景图

    full_image = Image.open(full_image) # 完整背景图

    threshold = 86 # 灰度值正好为86,86,86 这个是透明度的差值,边界值像素的RGB中的B值为准

    for i in range(55, cut_image.size[0]): # 75为滑块的截图最右边阴影到图片最左端的长度

    for j in range(0, cut_image.size[1]):

    pixel1 = cut_image.getpixel((i, j))

    pixel2 = full_image.getpixel((i, j))

    res_R = abs(pixel1[0] - pixel2[0]) # 计算RGB差

    res_G = abs(pixel1[1] - pixel2[1]) # 计算RGB差

    res_B = abs(pixel1[2] - pixel2[2]) # 计算RGB差

    if res_R > threshold and res_G > threshold and res_B > threshold:

    print(i-7)

    return i-7

    return 0

    根据距离计算出拖动的弧度

    def get_stacks(distance):

    distance+5

    '''

    拿到移动轨迹,模仿人的滑动行为,先匀加速后匀减速

    变速运动基本公式:

    ① v=v0+at 匀加速\减速运行

    ② s=v0t+½at² 位移

    ③ v²-v0²=2as

    '''

    # 初速度

    v0 = 0

    # 加减速度列表

    a_list = [50, 65, 80]

    # 时间

    t = 0.4

    # 初始位置

    s = 0

    # 向前滑动轨迹

    forward_stacks = []

    mid = distance * 3 / 5

    while s < distance:

    if s < mid:

    a = a_list[random.randint(0, 2)]

    else:

    a = -a_list[random.randint(0, 2)]

    v = v0

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

    # 每次拿到的位移

    stack = round(stack)

    if (s + stack) > distance:

    stack = distance - s + 5

    s += stack

    v0 = v + a * t

    forward_stacks.append(stack)

    back_stacks = [-5,]

    print(forward_stacks)

    return {'forward_stacks': forward_stacks, 'back_stacks': back_stacks}

    重点

    接下来是拖动要真实模拟人的操作,不可能y轴不变,这是重中之重。

    n= 0

    for forward_stack in forward_stacks:

    ActionChains(self.browser).move_by_offset(xoffset=forward_stack, yoffset=n).perform()

    n += 1 + random.randint(1, 2)

    time.sleep(0.5)

    for back_stack in back_stacks:

    ActionChains(self.browser).move_by_offset(xoffset=back_stack, yoffset=n).perform()

    time.sleep(0.01)

    time.sleep(0.5)

    n += 1 + random.randint(1, 2)

    yoffset=n

    这两行是重点,很多文章中没有介绍。

    原文链接:https://blog.csdn.net/Ben_zp/article/details/106995826

    展开全文
  • 我这边是前端提供了随机生成缺口的位置,只适合部分人先定位到需要移动的滑块位置,应为我这边随机生成的缺口位置是display:none无法获取元素所以要先修改成block才能读取这里有一个坑就是如果你直接移动该元素的话...

    我这边是前端提供了随机生成缺口的位置,只适合部分人

    先定位到需要移动的滑块位置,

    应为我这边随机生成的缺口位置是display:none无法获取元素所以要先修改成block才能读取

    这里有一个坑就是如果你直接移动该元素的话他无法读取到你移动的位置的,你要先点击该滑块触发后才能获取到你要移动的距离

    下面贴上代码:

    time.sleep(5)

    # 定位到滑块位置

    a = obtener_elemeentos("login", "滑块位置", 1)

    b = obtener_elemeentos("login", "滑块位置", 2)

    slider = login.browser.find_element(a,b)

    # 修改display为block

    js =obtener_elemeentos("login", "缺口js", 2)

    # 执行

    login.browser.execute_script(js)

    # 读取随即后生产的距离

    time.sleep(1)

    c=obtener_elemeentos("login", "缺口距离", 1)

    d = obtener_elemeentos("login", "缺口距离", 2)

    distance = login.browser.find_element(c,d).text

    print(distance)

    while isElementExist(a,b):

    time.sleep(2)

    distance = login.browser.find_element(c, d).text

    print(distance)

    # 按住鼠标不动

    login.Action.click_and_hold(slider).perform()

    # 拖动到坐标后然后松手

    login.Action.drag_and_drop_by_offset(slider, int(distance), 0).perform()

    本人是读取的是excel里面的参数,你们要把obtener_elemeentos这个函数改一下,写的比较菜欢迎大佬指点

    展开全文
  • # 我用的是这个代码,可是拖动了是拖动失败的 ``` Actions action = new Actions(driver); action.clickAndHold(button); shoe.sleep(2000); action.moveByOffset(250, 0).perform(); shoe.sleep...
  • java Selenium 滑块验证破解

    千次阅读 2019-11-20 15:35:05
    前两天发现个好玩的工具Selenium,可以模拟人进行游览器操作,赶紧趁热打铁玩个小demo,滑块验证现在使用普遍,就是为了验证是否是机器人,但是这个是可以破解的,且听我娓娓道来 思路 计算滑块距离 模拟人进行滑块...

    目标

    前两天发现个好玩的工具Selenium,可以模拟人进行游览器操作,赶紧趁热打铁玩个小demo,滑块验证现在使用普遍,就是为了验证是否是机器人,但是这个是可以破解的,且听我娓娓道来

    思路

    1. 计算滑块距离
    2. 模拟人进行滑块拖动

    解决

    前提

    Selenium 官网下载jar包,先搭建环境

    第一个问题我在另一篇博客已经详细描述
    现在是第二个问题如何拟人化的拖动滑块,滑的太快不行,太慢也不行,这里我提供别人用python的一种方案,可以用

    public static void move(WebDriver driver, WebElement element, Integer[] track) 
    throws InterruptedException {
            Actions actions = new Actions(driver);
            // 按下滑块
            new Actions(driver).clickAndHold(element).perform();
    
            for (int i : track) {
                actions.moveByOffset(i, 0).perform();
            }
            Thread.sleep(500);
            //释放
            actions.release(element).perform();
    
        }
    
    
    
    // 获取运动轨迹
    public static Integer[] getTrack(int distance){
            List<Integer> integers = new ArrayList<>();
    //        distance += 20;
            int current = 0;
            double mid = (distance * 3) / 4;
            double t = 0.2;
            double v = 0.0;
            double v0 = 0;
            double move = 0.0;
            while (current < distance){
                int a = 0;
                if (current < mid){
                    a = 2;
                }else {
                    a = -3;
                }
                v0 = v;
                v = v0 + a * t;
                move = v0 * t + (0.5) * a * t * t;
                current += move;
                integers.add((int) CommandUtil.round(move));
            }
    //        integers.addAll(Stream.of(-3, -3, -2, -2, -2, -2, -2, -1, -3, -4).collect(Collectors.toList()));
            return integers.toArray(new Integer[0]);
        }
        
    

    由于我们计算的距离不一定十分准确,我们可以重试

       // 单个验证 重试次数
       int retryCount = 0;
       int i = 0;
       WebElement tcaptchaButtonEle = null;
       while (true){
           // 3次 是滑块验证单个图验证次数最多出现3次,否则会换图的
           if (retryCount % 3 == 0){
               retryCount = 0;
          	   // 滑块按钮元素
               tcaptchaButtonEle = webDriver.findElementById("tcaptcha_drag_thumb");
               System.out.println(tcaptchaButtonEle.getAttribute("class"));
    
               // 滑块背景图
               WebElement slideBgEle = webDriver.findElementById("slideBg");
               String slideBgPicUrl = slideBgEle.getAttribute("src");
    
               // 滑块元素
               WebElement slideBlockEle = webDriver.findElementById("slideBlock");
               String slideBlockPicUrl = slideBlockEle.getAttribute("src");
               String style = slideBlockEle.getAttribute("style");
               String[] split = style.split(";");
               // html中滑块的宽度
               double htmlBlockWidth = 0.0;
               // html中滑块x坐标
               double marginLeft = 0.0;
    
               for (String s : split) {
                   if (s.contains("width")){
                       String px = s.replace("width: ", "").replace("px", "");
                       htmlBlockWidth = Double.parseDouble(px);
                   }else if (s.contains("left")){
                       String px = s.replace("left: ", "").replace("px", "");
                       marginLeft = Double.parseDouble(px);
                   }
               }
               System.out.println(htmlBlockWidth + "," + marginLeft);
               try {
    				// 计算移动距离(基于上篇博客的代码)
                   i = SlideUtils.calculateOffset(slideBgPicUrl, slideBlockPicUrl, htmlBlockWidth, marginLeft);
                   // 误差
                   i -= 20;
               } catch (Exception e) {
                   e.printStackTrace();
               }
           }else {
               // 没有换图,那就不需要重新下载,直接修改距离
               // 如果距离不对,减少挪动距离,这个参数视情况而定
               i -= 15;
           }
           Thread.sleep(1000);
    
           System.out.println("移动距离 ==> "+ i);
           Integer[] track = getTrack(i);
           System.out.println("移动轨迹 ==> " + JSON.toJSONString(track));
           move(webDriver, tcaptchaButtonEle, track);
    
           Thread.sleep(1000);
           WebElement guideText = null;
           try {
               // 验证是否成功,因为滑块的图片基本会有这个字提示
               // 拖动下方滑块完成拼图   去找这个字元素id
               // 如果没有的话会报异常的,那就是通过了
               guideText = webDriver.findElementById("guideText");
           } catch (Exception e) {
               System.out.println("验证通过");
               break;
           }
    
    //            Thread.sleep(3000);
    		
           System.out.println("验证失败等待进行下一次重试");
           retryCount++;
    
       }
       // 回到父级的页面
       webDriver.switchTo().parentFrame();
    
       buttons = webDriver.findElementsByTagName("button");
       for (WebElement button : buttons) {
           String span = button.findElement(By.tagName("span")).getText();
           // 点击登录
           if (span.equals("登录")){
               button.click();
               Thread.sleep(2000);
               break;
           }
       }
    

    总结

    好玩!!!

    展开全文
  • 写京东登录的自动化测试用例的时候...于是我们可以怎么使用selenium+python来完成模拟拖动→自动化验证呢? 一开始的想法是:计算空缺的位置出现规律,每次遇见的时候做判断,然后将空缺的位置提取出来,让拼图块...
  • 破解无缺口滑块验证码 在学习完selenium 简单操作之后,继续...破解这种无缺口滑块首先要找到滑块位置,根据selenium选择器去选择要拖动的Slider,选中之后查看要拖动的px,执行 dragAndDropBy方法即可。 (1)F...
  • 本文为大家分享了python2.7+selenium2实现淘宝滑块自动认证的具体代码,供大家参考,具体内容如下1.编译环境操作系统:win7;...恰巧自己也在学习selenium,就想试一试能不能实现自动拖动滑块。2.2...
  • 解决滑块验证问题(selenium, opencv)

    千次阅读 2019-01-16 09:24:42
    本文环境配置: 系统=&gt;windows10:64位 工具=&gt;PyCharm:2018.1.4 语言=&gt;...selenium ...本次主要是使用selenium模拟滑动验证 最终目标:实现自动点击滑块,并且拖动完成验...
  • 最近在写自动化测试,在网上搜了很多拖动,发现都是拖动完之后不触发拖动完成事件,下面的代码是针对上面的这种滑块解锁登录的。 //输入用户名 driver.findElement(By.name("username")).sendKeys(...
  • 笔者是一名初入Python爬虫的小白,通过书籍(静觅大神出的书籍)的方式学了下突破验证的方式实现模拟登录有此类型的应用的...3.模拟拖动滑块至缺口处,完成验证 引入相关的库 from selenium import webdriver; from s...
  • 实现原理:使用selenium模拟登录,获取验证码有缺口的验证图片及没有缺口的图片,然后比对俩个图片的每一个像素点,知道了滑块需要拖动多远的距离,使用行为链进行拖动。这样就实现了模拟登录bilibili咯。 from ...
  • 于是查找selenium拖动滑块的方法,但是发现运行后都是如下报错 一番百度后,确认这是网站的反爬机制造成了。 于是想办法破解反爬,终于是淘宝爬虫之自动登录 (此处要向原作者致敬)中找到了解决办法,即:修改...
  • Selenium实现元素的拖拽(java版)

    万次阅读 2016-05-12 09:22:52
    selenium实现页面元素拖动滑块验证
  • QQ邮箱登录很可能需要拖动滑块进行验证,这里当做练习selenium,实现模拟拖动滑块 import sys import time import cv2 import os import requests import random import numpy as np from PIL import Image as Im ...
  • 如下图,利用selenium模拟拖动滑块完成验证 关键问题 我们知道selenium可以定位到用户名和密码,用send_keys可以实现输入账号密码。同样我们可以用selenium定位到滑块,用click_and_hold方法可以实现拖动滑块。 ...
  • B站的滑动验证,其实是极验验证,这里,我使用Selenium来操纵谷歌浏览器,抓取并识别滑动验证码,实现自动登陆B站 这个过程主要分为以下几步: ·截取验证码原图 ·截取有缺口的验证码 ·分析缺口位置,计算需要...
  • 1、准备html文件首先我们需要准备一个鼠标滑动的html文件,用来演示鼠标滑动的效果,...拖动滑块验证<<2、使用selenium进行鼠标拖拽操作,具体代码如下:from selenium import webdriverimport unittestfrom ...
  • 摘要分析验证码素材图片混淆原理,并采用selenium模拟人拖动滑块过程,进而破解验证码。人工验证的过程 打开威锋网注册页面(https://passport.feng.com/?r=user/register) 移动鼠标至小滑块,一张完整的图片会出现...
  • selenium模拟登录12306

    2020-10-15 13:24:26
    利用selenium模拟登录12306,但是12306的登陆要想模拟还挺难的,需要先进行坐标识别,识别出来之后还要在进行滑块拖动验证识别,这里做一下记录. 这里的坐标识别是用的超级鹰,有时也会坐标识别出错,最后的一步...
  • selenium+opencv干掉滑动验证码

    千次阅读 2020-01-26 23:29:53
    文章目录 操作流程: 1、找到目标 2、下载验证码图片 3、识别图像戳口 3.1、读取本地图片并展示 3.2、图片灰度处理 3.3、去掉滑块黑色部分 ...4、拖动滑块 4.1、控制滑块滑动 4.2、验证是否滑动成功v 代码汇总:
  • python-selenium模拟登陆(滑动验证码) ...①在目标网站带有完整背景图时,可以获取完整背景图与带缺口的图片进行比较,获取缺口的位置,计算距离,拖动滑块移动至缺口即可; ②尝试先用cv2的边缘检测识别出
  • selenium+java破解极验滑动验证码 卧颜沉默关注 2017.08.15 20:07*字数 3085阅读 2548...分析验证码素材图片混淆原理,并采用selenium模拟人拖动滑块过程,进而破解验证码。 人工验证的过程 打开威锋网注...
  • Part2 滑块验证码识别及请求截获滑块验证码识别滑块偏移量滑块验证码的拖动selenium截获请求Token获取后续 滑块验证码识别 新版网站登录使用滑块验证码做登录认证。验证通过的首要条件为将滑块向右滑动到图片缺失口...
  • 拖动条刷新后,报错

    2021-01-02 17:41:46
    拖动滑块一直验证失败(拖动动作进行了),点击刷新滑块之后, selenium报错 either the element is no longer attached to the DOM, it is not in the current frame context, or the ...
  • 爬虫时遇到滑动验证,基本思路是通过selenium操作浏览器,将滑动验证的原始图片和缺口图片进行对比,找出缺口位置,然后在利用selenium模拟拖动滑块,达到验证的目的。下面就以猪八戒网为例,进行操作。 一、分析 ...
  • 爬虫时遇到滑动验证,基本思路是通过selenium操作浏览器,将滑动验证的原始图片和缺口图片进行对比,找出缺口位置,然后在利用selenium模拟拖动滑块,达到验证的目的。下面就以猪八戒网为例,进行操作。一、分析首先...
  • ①在目标网站带有完整背景图时,可以获取完整背景图与带缺口的图片进行比较,获取缺口的位置,计算距离,拖动滑块移动至缺口即可; ②尝试先用cv2的边缘检测识别出边界,然后进行模糊匹配,匹配出拼图在验证码图片的位

空空如也

空空如也

1 2 3
收藏数 60
精华内容 24
关键字:

selenium拖动滑块验证