您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Simulate human typing in Google Docs and Slides with customizable settings such as typing speed, errors, and breaks.
当前为
// ==UserScript== // @name Human-Typer by Warrior // @description Simulate human typing in Google Docs and Slides with customizable settings such as typing speed, errors, and breaks. // @version 1.3 // @namespace http://yournamespace.com/human-typer // @match *://docs.google.com/document/* // @match *://docs.google.com/presentation/* // @include *://docs.google.com/document/* // @include *://docs.google.com/presentation/* // @license MIT // ==/UserScript== (function() { 'use strict'; // Function to create a button on the Google Docs/Slides toolbar function createButton() { const toolbar = document.querySelector('.docs-titlebar-right'); if (!toolbar) { return; } const button = document.createElement("button"); button.textContent = "Human-Typer"; button.style.marginLeft = "10px"; button.style.backgroundColor = "#000"; button.style.color = "#fff"; button.style.border = "none"; button.style.padding = "8px 12px"; button.style.borderRadius = "4px"; button.style.cursor = "pointer"; button.id = "human-typer-button"; // Add event listener to show UI overlay when button is clicked button.addEventListener("click", showUIOverlay); toolbar.appendChild(button); } // Function to create and display the UI overlay for user customization function showUIOverlay() { // Check if an overlay already exists; if so, remove it const existingOverlay = document.getElementById("human-typer-overlay"); if (existingOverlay) { document.body.removeChild(existingOverlay); return; } // Create an overlay div for user input and customization options const overlay = document.createElement("div"); overlay.id = "human-typer-overlay"; overlay.style.position = "fixed"; overlay.style.bottom = "10px"; overlay.style.right = "10px"; overlay.style.backgroundColor = "rgba(255, 255, 255, 0.9)"; overlay.style.padding = "20px"; overlay.style.border = "1px solid #ccc"; overlay.style.borderRadius = "8px"; overlay.style.boxShadow = "0px 2px 8px rgba(0, 0, 0, 0.1)"; overlay.style.zIndex = "10000"; // Create input field for text input const textInput = document.createElement("textarea"); textInput.rows = "4"; textInput.placeholder = "Enter text to type..."; textInput.style.width = "100%"; textInput.style.marginBottom = "10px"; textInput.style.padding = "8px"; textInput.style.border = "1px solid #ccc"; textInput.style.borderRadius = "4px"; // Create dropdown for typing speed selection const speedLabel = document.createElement("p"); speedLabel.textContent = "Typing Speed:"; const speedSelect = document.createElement("select"); speedSelect.options.add(new Option("Fast", "fast")); speedSelect.options.add(new Option("Medium", "medium")); speedSelect.options.add(new Option("Normal", "normal")); speedSelect.options.add(new Option("Slow", "slow")); speedSelect.style.marginBottom = "10px"; // Create input for number of typing errors const errorLabel = document.createElement("p"); errorLabel.textContent = "Number of Typing Errors:"; const errorInput = document.createElement("input"); errorInput.type = "number"; errorInput.min = "0"; errorInput.value = "0"; errorInput.style.width = "100%"; errorInput.style.marginBottom = "10px"; errorInput.style.padding = "8px"; errorInput.style.border = "1px solid #ccc"; errorInput.style.borderRadius = "4px"; // Create input for the number of breaks const breakLabel = document.createElement("p"); breakLabel.textContent = "Number of Breaks:"; const breakInput = document.createElement("input"); breakInput.type = "number"; breakInput.min = "0"; breakInput.value = "0"; breakInput.style.width = "100%"; breakInput.style.marginBottom = "10px"; breakInput.style.padding = "8px"; breakInput.style.border = "1px solid #ccc"; breakInput.style.borderRadius = "4px"; // Create input for the duration of each break in minutes const breakDurationLabel = document.createElement("p"); breakDurationLabel.textContent = "Duration of Each Break (minutes):"; const breakDurationInput = document.createElement("input"); breakDurationInput.type = "number"; breakDurationInput.min = "0"; breakDurationInput.value = "0"; breakDurationInput.style.width = "100%"; breakDurationInput.style.marginBottom = "10px"; breakDurationInput.style.padding = "8px"; breakDurationInput.style.border = "1px solid #ccc"; breakDurationInput.style.borderRadius = "4px"; // Create a button to start typing const startButton = document.createElement("button"); startButton.textContent = "Start Typing"; startButton.style.padding = "8px 16px"; startButton.style.backgroundColor = "#1a73e8"; startButton.style.color = "#fff"; startButton.style.border = "none"; startButton.style.borderRadius = "4px"; startButton.style.cursor = "pointer"; // Append elements to the overlay overlay.appendChild(textInput); overlay.appendChild(speedLabel); overlay.appendChild(speedSelect); overlay.appendChild(errorLabel); overlay.appendChild(errorInput); overlay.appendChild(breakLabel); overlay.appendChild(breakInput); overlay.appendChild(breakDurationLabel); overlay.appendChild(breakDurationInput); overlay.appendChild(startButton); // Append the overlay to the body document.body.appendChild(overlay); // Add an event listener to the start button startButton.addEventListener("click", () => { // Get user input values from the overlay const text = textInput.value.trim(); const speed = speedSelect.value; const numErrors = parseInt(errorInput.value); const numBreaks = parseInt(breakInput.value); const breakDuration = parseInt(breakDurationInput.value); // Remove the overlay from the page document.body.removeChild(overlay); // Call function to start typing with user-defined options startTyping(text, speed, numErrors, numBreaks, breakDuration); }); } // Function to simulate typing with errors and breaks function startTyping(text, speed, numErrors, numBreaks, breakDuration) { // Select the active element in the iframe to simulate typing const inputElement = document.querySelector(".docs-texteventtarget-iframe").contentDocument.activeElement; // Define speed settings based on user choice const speedSettings = { fast: { lowerBound: 50, upperBound: 150 }, medium: { lowerBound: 60, upperBound: 220 }, normal: { lowerBound: 70, upperBound: 200 }, slow: { lowerBound: 80, upperBound: 250 } }; // Get the lower and upper bounds for the chosen typing speed const lowerBound = speedSettings[speed].lowerBound; const upperBound = speedSettings[speed].upperBound; let currentErrorCount = 0; // Track current error count let currentBreakCount = 0; // Track current break count // Calculate interval for breaks based on the number of breaks let breakInterval = numBreaks > 0 ? Math.floor(text.length / numBreaks) : text.length; // Convert break duration from minutes to milliseconds let breakTime = breakDuration * 60 * 1000; // Function to type a character with optional errors and delay async function typeCharacter(character, delay) { return new Promise((resolve) => { if (currentErrorCount < numErrors && Math.random() < 0.05) { // Introduce a random typing error inputElement.value += character; inputElement.value = inputElement.value.slice(0, -2); currentErrorCount++; } else { inputElement.value += character; } setTimeout(resolve, delay); }); } // Function to type the text with the defined speed, errors, and breaks async function typeText(text) { for (let i = 0; i < text.length; i++) { // Generate a random delay based on the chosen speed const delay = Math.floor(Math.random() * (upperBound - lowerBound + 1)) + lowerBound; // Check if it's time to take a break if (currentBreakCount < numBreaks && i > 0 && i % breakInterval === 0) { // Take a break await new Promise((resolve) => setTimeout(resolve, breakTime)); currentBreakCount++; } // Type the current character with a delay await typeCharacter(text[i], delay); } } // Start typing the text typeText(text); } // Create the button on the toolbar createButton(); })();