Automate the actions on the page
สคริปต์นี้ไม่ควรถูกติดตั้งโดยตรง มันเป็นคลังสำหรับสคริปต์อื่น ๆ เพื่อบรรจุด้วยคำสั่งเมทา // @require https://update.greasyfork.org/scripts/458951/1142610/PageAutomator.js
// ==UserScript== // @name PageAutomator // @description Automate the actions on the page // @version 1.0.4 // @author aolko // @match * // @namespace https://greasyfork.org/ru/users/5008-aolko // @grant none // @require https://cdnjs.cloudflare.com/ajax/libs/mousetrap/1.6.5/mousetrap.min.js // ==/UserScript== function PageAutomator() { // Animate the cursor movement function animateCursor(x, y) { var startX = cursorX; var startY = cursorY; var distanceX = x - startX; var distanceY = y - startY; var startTime = null; function step(timeStamp) { if (!startTime) startTime = timeStamp; var progress = timeStamp - startTime; cursorX = startX + (distanceX * progress) / 200; cursorY = startY + (distanceY * progress) / 200; updateCursor(cursorX, cursorY); if (progress < 200) { requestAnimationFrame(step); } } requestAnimationFrame(step); } // Mouse events mouse: { this.hover = function (selector) { var element = document.querySelector(selector); element.dispatchEvent(new MouseEvent("mouseover")); return this; }; this.click = function (selector, button = "left") { var element = document.querySelector(selector); if (!element) { console.log("Error: element not found"); return this; } if (button === "left") { element.dispatchEvent(new MouseEvent("click")); } else if (button === "right") { element.dispatchEvent(new MouseEvent("contextmenu")); } return this; }; this.scroll = function (amount) { window.scrollBy(0, amount); return this; }; this.scrollTo = function (element) { element.scrollIntoView({ behavior: "smooth", block: "start", inline: "nearest", }); return this; }; this.hold = function (selector, button) { var element = document.querySelector(selector); if (button === "left") { element.dispatchEvent(new MouseEvent("mousedown")); } else if (button === "right") { element.dispatchEvent( new MouseEvent("mousedown", { button: 2, }) ); } return this; }; this.moveToPosition = function (x, y) { window.dispatchEvent( new MouseEvent("mousemove", { clientX: x, clientY: y, }) ); return this; }; this.moveToElement = function (selector) { var element = document.querySelector(selector); if(!element) { console.log("Error: element not found"); return this; } var rect = element.getBoundingClientRect(); var x = rect.left + window.pageXOffset + rect.width / 2; var y = rect.top + window.pageYOffset + rect.height / 2; window.dispatchEvent( new MouseEvent("mousemove", { clientX: x, clientY: y, }) ); return this; }; this.getPosition = function () { var position = { x: 0, y: 0, }; document.addEventListener("mousemove", function (event) { position.x = event.clientX; position.y = event.clientY; }); return position; return this; }; } // Keyboard events keyboard: { this.keyPress = function (key) { var event = new KeyboardEvent("keypress", { key: key, }); document.dispatchEvent(event); return this; }; this.keyUp = function (key) { var event = new KeyboardEvent("keyup", { key: key, }); document.dispatchEvent(event); return this; }; this.keyDown = function (key) { var event = new KeyboardEvent("keydown", { key: key, }); document.dispatchEvent(event); return this; }; this.holdKey = function (key, action) { var keys = { ctrl: 17, shift: 16, alt: 18, win: 91, }; var event = new KeyboardEvent("keydown", { keyCode: keys[key], which: keys[key], }); document.dispatchEvent(event); action(); var event = new KeyboardEvent("keyup", { keyCode: keys[key], which: keys[key], }); document.dispatchEvent(event); return this; }; this.holdKeySequence = function (sequence, action) { Mousetrap.bind( sequence, function () { action(); Mousetrap.unbind(sequence); }, "keydown" ); return this; }; this.setKeyState = function (key, state) { if (key === "numlock") { var event = new KeyboardEvent("keydown", { key: "NumLock", code: "NumLock", }); document.dispatchEvent(event); } else if (key === "scrolllock") { var event = new KeyboardEvent("keydown", { key: "ScrollLock", code: "ScrollLock", }); document.dispatchEvent(event); } else if (key === "capslock") { var event = new KeyboardEvent("keydown", { key: "CapsLock", code: "CapsLock", }); document.dispatchEvent(event); } return this; }; } input: { // Block input this.blockInput = function () { document.addEventListener("keydown", function (event) { event.preventDefault(); }); document.addEventListener("mousedown", function (event) { event.preventDefault(); }); return this; }; } timer: { // Timer events this.wait = function (ms) { var start = new Date().getTime(); var end = start; while (end < start + ms) { end = new Date().getTime(); } return this; }; this.waitForElement = function (selector) { var element = document.querySelector(selector); while (!element) { element = document.querySelector(selector); } return this; }; this.waitForMouse = function (cursor) { var currentCursor = document.body.style.cursor; while (currentCursor !== cursor) { currentCursor = document.body.style.cursor; } return this; }; } // Conditionals this.ifElement = function (selector, condition, value) { var element = document.querySelector(selector); if (condition === "contains") { if (element.innerHTML.includes(value)) { return true; } else { return false; } } else if (condition === "does not contain") { if (!element.innerHTML.includes(value)) { return true; } else { return false; } } else if (condition === "is") { if (element.innerHTML === value) { return true; } else { return false; } } else if (condition === "is not") { if (element.innerHTML !== value) { return true; } else { return false; } } return this; }; this.onElement = function(selector, callback) { var target = document.querySelector(selector); var observer = new MutationObserver(function(mutations) { callback.call(target); return this; }); observer.observe(target, {attributes: true, childList: true, characterData: true}); return this; }; this.hasText = function(target, text) { return target.textContent.trim().includes(text); }; this.hasElement = function(target, selector) { return target.querySelector(selector) !== null; }; dialogs: { // Dialogs/Message Boxes this.showNotification = function (title, text) { var notification = new Notification(title, { body: text, }); return this; }; this.showDialog = function (title, text) { var dialog = document.createElement("dialog"); var titleElement = document.createElement("strong"); titleElement.innerHTML = title; var textElement = document.createElement("p"); textElement.innerHTML = text; dialog.appendChild(titleElement); dialog.appendChild(textElement); document.body.appendChild(dialog); dialog.show(); return this; }; this.showCustomDialog = function (html) { var dialog = document.createElement("dialog"); dialog.innerHTML = html; document.body.appendChild(dialog); dialog.show(); return this; }; } clipboard: { // Clipboard this.getClipboardText = function () { return navigator.clipboard.readText().then((text) => { return text; }); return this; }; this.setClipboardText = function (text) { navigator.clipboard.writeText(text); return this; }; this.clearClipboard = function () { navigator.clipboard.writeText(""); return this; }; } router: { // function to handle different actions based on URL this.ifUrl = function(url, action) { if (url.startsWith("/") && window.location.pathname === url) { action(); }else if (url === '/' && window.location.pathname === '/') { action(); } else if (window.location.href === url) { action(); } }; // function to navigate to a specified URL this.navigate = function(url) { window.location.href = url; }; // function to expose current URL currentUrl: { this.get_domain = function get_domain() { return window.location.hostname; }; this.get_protocol =function get_protocol() { return window.location.protocol; }; this.get_page = function get_page() { return window.location.pathname; }; this.get_query = function get_query() { return window.location.search; }; } } }