bezier-mouse-js
Version:
Lightweight library to generate human-like mouse movements with Bézier curves.
91 lines (89 loc) • 3.16 kB
JavaScript
// src/BezierMouse.ts
import { Bezier } from "bezier-js";
// src/utils.ts
var { floor, random } = Math;
function choice(items) {
return items[floor(random() * items.length)];
}
function randint(min, max) {
return floor(random() * (max - min + 1)) + min;
}
var utils = { choice, randint };
var utils_default = utils;
// src/BezierMouse.ts
var { abs, ceil } = Math;
var BezierMouse = class {
constructor(mouseSpeed = 100) {
this.nutJsModule = null;
this.mouseSpeed = mouseSpeed;
}
async getNutJs() {
if (!this.nutJsModule) {
try {
this.nutJsModule = await import("@nut-tree/nut-js");
this.nutJsModule.mouse.config.mouseSpeed = this.mouseSpeed;
} catch {
throw new Error(
"bezier-mouse-js: @nut-tree/nut-js is required for mouse control methods. Install it with: npm install @nut-tree/nut-js"
);
}
}
return this.nutJsModule;
}
async moveAndClick(initPos, finPos, clickType = "LEFT", opts = {}) {
const nut = await this.getNutJs();
await this.move(initPos, finPos, opts);
await nut.mouse.click(nut.Button[clickType]);
}
async moveAndDoubleClick(initPos, finPos, clickType = "LEFT", opts = {}) {
const nut = await this.getNutJs();
await this.move(initPos, finPos, opts);
await nut.mouse.doubleClick(nut.Button[clickType]);
}
async move(initPos, finPos, opts = {}) {
const nut = await this.getNutJs();
let finishPosition = finPos;
if (!opts.preciseClick) {
const deviation = 5;
const randDeviation = () => utils_default.randint(deviation / 2, deviation);
const region = new nut.Region(
finPos.x,
finPos.y,
randDeviation(),
randDeviation()
);
finishPosition = await nut.randomPointIn(region);
}
const path = this.bezierCurveTo(initPos, finishPosition, opts);
const nutPoints = path.map((p) => new nut.Point(p.x, p.y));
await nut.mouse.move(nutPoints);
}
bezierCurveTo(initPos, finPos, opts = {}) {
const curve = this.cubicBezierCurve(initPos, finPos, opts);
const LUT = curve.getLUT(opts.steps || 100);
return LUT.map((point) => ({ x: point.x, y: point.y }));
}
cubicBezierCurve(initPos, finPos, opts = {}) {
const cntlPt1 = this.getBezierControlPoint(initPos, finPos, opts);
const cntlPt2 = this.getBezierControlPoint(initPos, finPos, opts);
return new Bezier([initPos, cntlPt1, cntlPt2, finPos]);
}
getBezierControlPoint(initPos, finPos, opts = {}) {
const { deviation = 20, flip = false } = opts;
const deltaX = abs(ceil(finPos.x) - ceil(initPos.x));
const deltaY = abs(ceil(finPos.y) - ceil(initPos.y));
const randDeviation = () => utils_default.randint(deviation / 2, deviation);
const refPointX = flip ? initPos.x : finPos.x;
const refPointY = flip ? initPos.y : finPos.y;
return {
x: refPointX + utils_default.choice([-1, 1]) * deltaX * 0.01 * randDeviation(),
y: refPointY + utils_default.choice([-1, 1]) * deltaY * 0.01 * randDeviation()
};
}
};
export {
BezierMouse,
BezierMouse as default,
utils_default as utils
};
//# sourceMappingURL=index.js.map