在上一回中說了五行代碼找圖中滑塊驗證的缺口位置《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]
目前這兩種軌跡都是可行的,能夠通過騰訊的滑塊驗證。