拖动式验证码

拖动式验证码

问题点:

1、无法直接通过发送url请求来实现鼠标拖动的动作;

2、实际的背景图片是乱的,并不是我们实际肉眼看到的图像!

3、“开创行为判别算法,利用数据挖掘和机器学习,提取超过200多个行为判别特征,建立坚若磐石的多维验证防御体系。”这是官网的描述,听上去就已经很高大上,查了些资料也都说拖动轨迹的识别是geetest的核心内容而无过多的表述,那么这也应该是主要的难点了

提供的是一种思路:

1、获取图片,调整拼接

2、计算图片缺口(这个实例的计算不太理想)

3、生成移动轨迹(模拟)

4、滑动

安装geetest实例

首先自己安装配置一份geetest的样例。虽然geetest官网上有样例,但有时候反应比较慢,而且后面研究拖动轨迹的时候还需要对样例做一定的改动。编程语言我使用的是python2.7,所以这里选择的也是python版本的。

安装git:

[[email protected] ~]# yum install git

在github中clone出最新Demo项目:

[[email protected] ~]# git clone https://github.com/GeeTeam/gt-python-sdk.git

安装GeetestSDK:

[[email protected] ~]# cd gt-python-sdk/
[[email protected] gt-python-sdk]# python setup.py install

安装Django,要注意的是最新的Django-1.10.1和当前的GeetestSDK是有兼容性问题的,要用Django-1.8.14:

[[email protected] ~]# wget --no-check-certificate  https://www.djangoproject.com/download/1.8.14/tarball/
[[email protected] ~]# tar zxvf Django-1.8.14.tar.gz
[[email protected] ~]# cd Django-1.8.14
[[email protected] Django-1.8.14]# python setup.py install

后面就可以直接运行了:

[[email protected] ~]# cd gt-python-sdk/demo/django_demo/
[[email protected] django_demo]# python manage.py runserver 0.0.0.0:8000

解析过程:

#!/usr/local/bin/python
# -*- coding: utf8 -*-

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.action_chains import ActionChains
import PIL.Image as image
# from PIL import Image
import time, re, cStringIO, urllib2, random

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:
            # 选择区域对象,给定四点坐标,确定图像
            im_list_upper.append(im.crop((abs(location[‘x‘]), 58, abs(location[‘x‘])+10, 166)))
        if location[‘y‘] == 0:
            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\(\"(.*)\"\); background-position: (.*)px (.*)px;",background_image.get_attribute(‘style‘))[0][1])
        location[‘y‘]=int(re.findall("background-image: url\(\"(.*)\"\); background-position: (.*)px (.*)px;",background_image.get_attribute(‘style‘))[0][2])
        imageurl = re.findall("background-image: url\(\"(.*)\"\); background-position: (.*)px (.*)px;",background_image.get_attribute(‘style‘))[0][0]

        location_list.append(location)

    imageurl = imageurl.replace("webp", "jpg")

    proxy_support = urllib2.ProxyHandler({"http": "172.17.18.80:8080"})
    opener = urllib2.build_opener(proxy_support)
    urllib2.install_opener(opener)
    jpgfile = cStringIO.StringIO(urllib2.urlopen(imageurl).read())

    # 重新合并图片
    image = get_merge_image(jpgfile, location_list)

    return image

def is_similar(image1, image2, x, y):
    ‘‘‘
    对比RGB值
    ‘‘‘
    pass

    pixel1=image1.getpixel((x, y))
    pixel2=image2.getpixel((x, y))

    for i in range(0,3):
        if abs(pixel1[i]-pixel2[i]) >= 50:
            return False

    return True

def get_diff_location(image1, image2):
    ‘‘‘
    计算缺口的位置
    ‘‘‘

    i = 0

    for i in range(0, 260):
        for j in range(0, 116):
            if is_similar(image1, image2, i, j) == False:
                return i

def get_track(length):
    ‘‘‘
    根据缺口的位置模拟x轴移动的轨迹
    ‘‘‘
    pass

    list=[]

    # 间隔通过随机范围函数来获得
    x = random.randint(1, 3)

    while length-x >= 5:
        list.append(x)

        length = length-x
        x = random.randint(1, 3)

    for i in xrange(length):
        list.append(1)

    return list

def main():

#     这里的文件路径是webdriver的文件路径
#     driver = webdriver.Chrome(executable_path=r"C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe")
    driver = webdriver.Firefox()

#     打开网页
    driver.get("http://127.0.0.1:5000/")

#     等待页面的上元素刷新出来
    WebDriverWait(driver, 30).until(lambda the_driver: the_driver.find_element_by_xpath("//div[@class=‘gt_slider_knob gt_show‘]").is_displayed())
    # WebDriverWait(driver, 30).until(lambda the_driver: the_driver.find_element_by_xpath("//div[@class=‘gt_cut_bg gt_show‘]").is_displayed())
    # WebDriverWait(driver, 30).until(lambda the_driver: the_driver.find_element_by_xpath("//div[@class=‘gt_cut_fullbg gt_show‘]").is_displayed())

#     下载图片
    image1=get_image(driver, "//div[@class=‘gt_cut_bg gt_show‘]/div")
    image2=get_image(driver, "//div[@class=‘gt_cut_fullbg gt_show‘]/div")
    image1.save("image1.jpg", "JPEG")
    image2.save("image2.jpg", "JPEG")

    # 计算缺口位置
    loc = get_diff_location(image1, image2)

    # 生成x的移动轨迹点
    track_list = get_track(loc)

    # 找到滑动的圆球
    element = driver.find_element_by_xpath("//div[@class=‘gt_slider_knob gt_show‘]")
    location = element.location
    # 获得滑动圆球的高度
    y = location[‘y‘]

    # 鼠标点击元素并按住不放
    print "第一步,点击元素"
    ActionChains(driver).click_and_hold(on_element=element).perform()
    time.sleep(0.15)

    print "第二步,拖动元素"
    print track_list
    track_string = ""
    for track in track_list:
        track_string = track_string + "{%d,%d}," % (track, y - 521)
        # xoffset=track+22:这里的移动位置的值是相对于滑动圆球左上角的相对值,而轨迹变量里的是圆球的中心点,所以要加上圆球长度的一半。
        # yoffset=y-521:这里也是一样的。不过要注意的是不同的浏览器渲染出来的结果是不一样的,要保证最终的计算后的值是22,也就是圆球高度的一半
        ActionChains(driver).move_to_element_with_offset(to_element=element, xoffset=track+22, yoffset=y-521).perform()
        # 间隔时间也通过随机函数来获得
        time.sleep(random.randint(10, 50)/100)
    print track_string
    # xoffset=21,本质就是向后退一格。这里退了5格是因为圆球的位置和滑动条的左边缘有5格的距离
    ActionChains(driver).move_to_element_with_offset(to_element=element, xoffset=21, yoffset=y-521).perform()
    time.sleep(0.1)
    ActionChains(driver).move_to_element_with_offset(to_element=element, xoffset=21, yoffset=y-521).perform()
    time.sleep(0.1)
    ActionChains(driver).move_to_element_with_offset(to_element=element, xoffset=21, yoffset=y-521).perform()
    time.sleep(0.1)
    ActionChains(driver).move_to_element_with_offset(to_element=element, xoffset=21, yoffset=y-521).perform()
    time.sleep(0.1)
    ActionChains(driver).move_to_element_with_offset(to_element=element, xoffset=21, yoffset=y-521).perform()

    time.sleep(2)
    print "第三步,释放鼠标"
    # 释放鼠标
    ActionChains(driver).release(on_element=element).perform()
    time.sleep(5)
    # 点击验证
    driver.find_element_by_xpath("//input[@id=‘embed-submit‘]").click()
    # ActionChains(driver).click(on_element=submit).perform()

    time.sleep(10)

    driver.quit()

if __name__ == ‘__main__‘:
    pass

    main()

参考:http://blog.csdn.net/paololiu/article/details/52514504

时间: 2024-10-02 22:31:08

拖动式验证码的相关文章

点击式验证码

看到网上的点击式验证码,觉得很方便. 环境 W8.1 VS2013 .NET4.5 WPF 验证码类 CreateValidateImg 主要包含生成验证图片的方法,和比较验证码的方法 /// <summary> /// 生成验证码图片 /// 随机的验证码包含0-9十个数字和A-Z 26个字母(ascii65-90) /// </summary> internal class CreateValidateImg { private static string codesource

网易易盾行为式验证码家族添新成员:图标点选验证码上线 尤适出海企业

近日,网易易盾行为式验证码家族迎来一位新的成员--图标点选验证码,在提供高安全性.国际化的同时,又更加通用化,适合出海企业和服务于低龄端的产品应用.左为文字点选式验证码,右为图标点选式验证码 在图标点选式验证码使用上,用户只要根据提示,按照顺序点击图中图标,即可完成验证.相较文字点选式验证码,它更加通用化,非中文用户也可以轻松识别完成验证. 图标点选式验证码开发原理与传统验证码不同,主要是通过收集用户的行为轨迹信息.设备信息等,作为人机判别依据. 不同于文字点选,由于图标元素周期性叠代更新,再加

Highcharts可拖动式图表

默认情况下,Highcharts依据给定的数据列生成图表. 浏览者是无法改动图表的. 假设浏览者须要手动调整数据节点.就须要借助第三方插件Draggable Points.使用该插件后,浏览者能够直接拖动图表中的数据节点位置,从而改动图表的值. 拖动前效果 拖动后效果 PS:该内容已经增加<网页图表Highcharts实践教程图表篇>v1.2.3中.

python selenium3 模拟点击+拖动+保存验证码 测试对象 58同城验证码

#!/usr/bin/python # -*- coding: UTF-8 -*- # @Time : 2019/12/5 17:30 # @Author : shenghao/[email protected] '''test with selenium's move''' from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.

python selenium4 模拟点击+拖动+保存验证码 测试对象+以验证码的返回ID保存命名 58同城验证码

#!/usr/bin/python # -*- coding: UTF-8 -*- # @Time : 2019/12/5 17:30 # @Author : shenghao/[email protected] '''test with selenium's move''' from builtins import print from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWa

拖动验证码插件

拖动验证码插件 效果图: 在验证前,提交弹出验证失败,验证后弹出验证成功. 文件结构: css: #drag{ position: relative; background-color: #e8e8e8; width: 300px; height: 34px; line-height: 34px; text-align: center; } #drag .handler{ position: absolute; top: 0px; left: 0px; width: 40px; height:

要想破解验证码,就要从他的根源开始了解!这才是验证码!

②GIF格式的随机数字或者字母图片,这可以说是静态图片的升级 ③随机数字+随机大写英文字母+随机干扰像素+随机位置BMP格式图片 ④广告验证码,输入广告中的高亮部分的内容即可 ⑤问题验证码,主要是以问答式的形式来进行填写 ⑥行为方式验证码,主要分为拖动式和点触式 拖动式 点触式 ⑦手机短信验证码,通过发送验证码到手机实现验证识别 ⑧手机语音验证码,点击"获取语音验证码",通过语音电话直接呼到用户手机 目前,不少网站采用验证码技术,主要是为了防止用户利用机器人自动注册.登录.灌水.刷票.

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

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

Question | 你所遇到的验证码问题可能都在这里了

"Question"为网易云易盾的问答栏目,将会解答和呈现安全领域大家常见的问题和困惑.如果你有什么疑惑,也欢迎通过邮件([email protected])提问. 关于验证码的使用,大家也许会遇到各类问题,这里以Q&A形式总结的一些常见问题,希望对各位读者有所帮助. Q1:验证码有什么作用? 验证码作为一种人机识别手段,其终极目的,就是区分正常人和机器的操作. 区分人机行为的作用不言而喻.互联行为的注册.登录.发帖.领优惠券.投票等等应用场景,都有被机器刷造成各类损失的风险,