python下的自瞄算法鼠標移動算法
前提背景:已經(jīng)計算出目的坐標,已有移動鼠標的函數(shù),那么如何模擬手動移動呢
(此處我的移動函數(shù)為dd_dll.DD_movR)
第一種bezier移動
特點:坐標是隨機的,移動軌跡往往不定,但是由于每次移動的到目的坐標移動的點數(shù)是固定的,這時候還是容易被判斷為機器,也可每次運行時添加步數(shù)為隨機數(shù)
參考python代碼:
def sleep_exact(seconds):
? ?start_time = time.perf_counter()
? ?while time.perf_counter() - start_time < seconds:
? ? ? ?pass
class Point:
? ?def __init__(self, x, y):
? ? ? ?self.x = x
? ? ? ?self.y = y
def combination(n, k):
? ?if k == 0 or k == n:
? ? ? ?return 1.0
? ?elif k == 1:
? ? ? ?return float(n)
? ?else:
? ? ? ?result = 1.0
? ? ? ?for i in range(1, k+1):
? ? ? ? ? ?result *= float(n - i + 1) / i
? ? ? ?return result
def bezier(pts, t):
? ?n = len(pts) - 1
? ?x = 0.0
? ?y = 0.0
? ?for i in range(n+1):
? ? ? ?b = combination(n, i) * pow(t, i) * pow(1.0 - t, n - i)
? ? ? ?x += b * pts[i].x
? ? ? ?y += b * pts[i].y
? ?return Point(int(x), int(y))
def beziermove(dx,dy):
? ?# 設置控制點,可以根據(jù)需要自行調(diào)整
? ?controlPoints = [
? ? ? ?Point(0, 0),
? ? ? ?Point(dx // 2, dy),
? ? ? ?Point(dx, dy // 2),
? ? ? ?Point(dx, dy)
? ?]
? ?# 計算移動軌跡
? ?numPoints = 50 ?# 移動軌跡上點的數(shù)量
? ?path = []
? ?for i in range(numPoints + 1):
? ? ? ?t = i / float(numPoints)
? ? ? ?p = bezier(controlPoints, t)
? ? ? ?path.append(p)
? ?# 執(zhí)行移動操作
? ?for i in range(1, len(path)):
? ? ? ?x = path[i].x - path[i - 1].x
? ? ? ?y = path[i].y - path[i - 1].y
? ? ? ?dd_dll.DD_movR(x, y)
? ? ? ?random_float = random.uniform(0.0015, 0.002)
? ? ? ?sleep_exact(random_float)
第二種bresenham算法
特點:每次移動的次數(shù)不一樣,具體視坐標而定,但移動軌跡是直線,容易被判斷機器
參考python代碼:
def bresenham(x1, y1):
? ?x0=0
? ?y0=0
? ?dx = abs(x1 - x0)
? ?dy = abs(y1 - y0)
? ?sx = 1 if x0 < x1 else -1
? ?sy = 1 if y0 < y1 else -1
? ?increment_x = sx
? ?increment_y = sy
? ?err = dx - dy
? ?while x0 != x1 or y0 != y1:
? ? ? ?dd_dll.DD_movR(increment_x, increment_y)? #鼠標移動
? ? ? ?random_float = random.uniform(0.0015, 0.002)
? ? ? ?sleep_exact(random_float) ?# 設置隨機0.0015-0.002 ? ? random_number = random.randint(start, end)
? ? ? ?e2 = 2 * err
? ? ? ?if e2 > -dy:
? ? ? ? ? ?err -= dy
? ? ? ? ? ?x0 += sx
? ? ? ? ? ?increment_x = sx
? ? ? ?else:
? ? ? ? ? ?increment_x = 0
? ? ? ?if e2 < dx:
? ? ? ? ? ?err += dx
? ? ? ? ? ?y0 += sy
? ? ? ? ? ?increment_y = sy
? ? ? ?else:
? ? ? ? ? ?increment_y = 0