python处理滑块验证的轨迹计算问题

简介: 在上一回中说了五行代码找图中滑块验证的缺口位置《python五行代码解决滑块验证的缺口距离识别,破解滑块验证》,本章讲轨迹相关的问题。滑块验证核心是后台验证轨迹参数,效验轨迹取点的分布,正常情况是如下图的离散分布如果横坐标x是时间、纵坐标y是位移,那么每个点的切线就是加速度,会发现这样的一个规律,加速度由小变大,再又大变小,这是最主要的特征之一。

在上一回中说了五行代码找图中滑块验证的缺口位置《python五行代码解决滑块验证的缺口距离识别,破解滑块验证》,本章讲轨迹相关的问题。


滑块验证核心是后台验证轨迹参数,效验轨迹取点的分布,正常情况是如下图的离散分布

2019-03-12-17_35_39.png

如果横坐标x是时间、纵坐标y是位移,那么每个点的切线就是加速度,会发现这样的一个规律,加速度由小变大,再又大变小,这是最主要的特征之一。

速度的变化率如下:

2019-03-12-17_35_39.png

对速度而言肯定是先加速在减速,但加速度不会是固定的,应该是变变加速和变变加速,不过目前实际应用中的情况来说,是以速度变化情况为主要判别依据,因为在以恒加减速度生成的轨迹应用中一样可以通过检测,就说明目前没有对是否恒定加速度来鉴别机器和人工。


知道上面的两点后我们就应该明白滑块验证的关键,并且可以预测它的下一步优化方式将是对加速度变化的验证,收集了两种轨迹生成方式:一种是以加减速为主的物理学生成方式,另一种是根据轨迹离散分布生成的数学生成。

def generate_tracks(S):
    """
    :param S: 缺口距离Px
    :return: 
    """

    S += 20
    v = 0
    t = 0.2
    forward_tracks = []
    current = 0
    mid = S * 3 / 5  # 减速阀值
    while current < S:
        if current < mid:
            a = 2  # 加速度为+2
        else:
            a = -3  # 加速度-3
        s = v * t + 0.5 * a * (t ** 2)
        v = v + a * t
        current += s
        forward_tracks.append(round(s))

    back_tracks = [-3-3-2-2-2-2-2-1-1-1]
    return {'forward_tracks': forward_tracks, 'back_tracks': back_tracks}


传入距离S,先加上20的距离然后在生成轨迹中再减去20,达到超过缺口在回滑的效果,以固定周期0.2秒来计算轨迹和速度。


def ease_out_quad(x):
    return 1 - (1 - x) * (1 - x)


def ease_out_quart(x):
    return 1 - pow(1 - x, 4)


def ease_out_expo(x):
    if x == 1:
        return 1
    else:
        return 1 - pow(2-10 * x)


def get_tracks(distance, seconds, ease_func):
    tracks = [0]
    offsets = [0]
    for t in np.arange(0.0, seconds, 0.1):
        ease = globals()[ease_func]
        offset = round(ease(t/seconds) * distance)
        tracks.append(offset - offsets[-1])
        offsets.append(offset)
    return offsets, tracks


这种方式是从时间出发,在假设匀速的情况下,把时间分割成一段一段的,每段都对应一个轨迹,那么这个轨迹先大后小如下:

[0, 0.0, 21.0, 16.0, 13.0, 10.0, 9.0, 6.0, 5.0, 4.0, 4.0, 2.0, 2.0, 2.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0,  0.0, 0.0, 0.0]


目前这两种轨迹都是可行的,能够通过腾讯的滑块验证。

相关文章
|
1月前
|
算法 索引 Python
使用Python实现PageRank计算
使用Python实现PageRank计算
|
1月前
|
存储 Python
python计算两个数的和
python计算两个数的和
|
1月前
|
网络协议 网络安全 数据库
python验证公网ip与内网ip
python验证公网ip与内网ip
25 0
|
1月前
|
Python
利用Python计算两点之间的距离
利用Python计算两点之间的距离
247 0
|
1月前
|
存储 自然语言处理 数据挖掘
Python:计算字符串中每个单词出现的次数
Python:计算字符串中每个单词出现的次数
|
5天前
|
Python Serverless API
Python风险价值计算投资组合VaR、期望损失ES
Python风险价值计算投资组合VaR、期望损失ES
23 0
Python风险价值计算投资组合VaR、期望损失ES
|
16天前
|
算法 Python
78: 计算生日是星期几(python)
78: 计算生日是星期几(python)
|
1月前
|
Python
Python函数之计算规则图形的面积
Python函数之计算规则图形的面积
15 0
|
1月前
|
Python
Python小技巧:计算素数个数
Python小技巧:计算素数个数
|
1月前
|
机器学习/深度学习 人工智能 BI
Python计算余弦相似度
Python计算余弦相似度