UNPKG

bezier-mouse-js

Version:

Lightweight library to generate human-like mouse movements with Bézier curves.

91 lines (89 loc) 3.16 kB
// 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