PageAutomator

Automate the actions on the page

Этот скрипт недоступен для установки пользователем. Он является библиотекой, которая подключается к другим скриптам мета-ключом // @require https://update.greasyfork.org/scripts/458951/1142610/PageAutomator.js

Чтобы установить этот скрипт, вы сначала должны установить расширение браузера, например Tampermonkey, Greasemonkey или Violentmonkey.

Чтобы установить этот скрипт, вы сначала должны установить расширение браузера, например Tampermonkey или Violentmonkey.

Чтобы установить этот скрипт, вы сначала должны установить расширение браузера, например Tampermonkey или Violentmonkey.

Чтобы установить этот скрипт, вы сначала должны установить расширение браузера, например Tampermonkey или Userscripts.

Чтобы установить этот скрипт, сначала вы должны установить расширение браузера, например Tampermonkey.

Чтобы установить этот скрипт, вы должны установить расширение — менеджер скриптов.

(у меня уже есть менеджер скриптов, дайте мне установить скрипт!)

Чтобы установить этот стиль, сначала вы должны установить расширение браузера, например Stylus.

Чтобы установить этот стиль, сначала вы должны установить расширение браузера, например Stylus.

Чтобы установить этот стиль, сначала вы должны установить расширение браузера, например Stylus.

Чтобы установить этот стиль, сначала вы должны установить расширение — менеджер стилей.

Чтобы установить этот стиль, сначала вы должны установить расширение — менеджер стилей.

Чтобы установить этот стиль, сначала вы должны установить расширение — менеджер стилей.

(у меня уже есть менеджер стилей, дайте мне установить скрипт!)

// ==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;
      };
    }
    }

}