python處理滑塊驗證的軌跡計算問題

在上一回中說了五行代碼找圖中滑塊驗證的缺口位置《python五行代碼解決滑塊驗證的缺口距離識別,破解滑塊驗證》,本章講軌跡相關的問題。

滑塊驗證核心是后臺驗證軌跡參數,效驗軌跡取點的分布,正常情況是如下圖的離散分布

image

如果橫坐標x是時間、縱坐標y是位移,那么每個點的切線就是加速度,會發現這樣的一個規律,加速度由小變大,再又大變小,這是最主要的特征之一。

速度的變化率如下:

image

對速度而言肯定是先加速在減速,但加速度不會是固定的,應該是變變加速和變變加速,不過目前實際應用中的情況來說,是以速度變化情況為主要判別依據,因為在以恒加減速度生成的軌跡應用中一樣可以通過檢測,就說明目前沒有對是否恒定加速度來鑒別機器和人工。

知道上面的兩點后我們就應該明白滑塊驗證的關鍵,并且可以預測它的下一步優化方式將是對加速度變化的驗證,收集了兩種軌跡生成方式:一種是以加減速為主的物理學生成方式,另一種是根據軌跡離散分布生成的數學生成。

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]

目前這兩種軌跡都是可行的,能夠通過騰訊的滑塊驗證。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容