Автоматический ввод текста в CollabVM. Позволяет отправлять заранее заданный текст в виртуальную машину с настраиваемой задержкой между символами.
// ==UserScript==
// @name CollabVM Autotype
// @namespace https://github.com/yourname/collabvm-autotype
// @version 1.0.0
// @description Автоматический ввод текста в CollabVM. Позволяет отправлять заранее заданный текст в виртуальную машину с настраиваемой задержкой между символами.
// @author Ваше имя
// @match *://computernewb.com/collab-vm/*
// @match *://collabvm.*/*
// @grant none
// @license MIT
// ==/UserScript==
(function() {
'use strict';
// Настройки по умолчанию
let settings = {
defaultText: "Hello from Autotype!",
delayMs: 50, // задержка между символами в миллисекундах
hotkey: "Alt+T" // горячая клавиша для запуска
};
// Функция получения элемента ввода (поле для отправки команд в VM)
function getInputField() {
// Пробуем найти поле ввода на странице CollabVM (чаще всего textarea или input)
const possibleSelectors = [
'textarea.vm-input',
'input.vm-input',
'#chat-input',
'.chat-input',
'#vm-input',
'[contenteditable="true"]'
];
for (let selector of possibleSelectors) {
const field = document.querySelector(selector);
if (field) return field;
}
// Если не нашли, ищем любой textarea на странице
return document.querySelector('textarea');
}
// Функция отправки текста в VM через симуляцию клавиатурного ввода
async function typeTextWithDelay(text, delay) {
const inputField = getInputField();
if (!inputField) {
console.error('CollabVM Autotype: поле ввода не найдено');
alert('Не удалось найти поле ввода на странице CollabVM');
return;
}
// Фокус на поле ввода
inputField.focus();
// Очищаем поле (опционально)
// inputField.value = '';
// Вводим текст с задержкой
for (let i = 0; i < text.length; i++) {
const char = text[i];
// События для каждого символа
const keydownEvent = new KeyboardEvent('keydown', { key: char, bubbles: true });
const keypressEvent = new KeyboardEvent('keypress', { key: char, bubbles: true });
const inputEvent = new InputEvent('input', { bubbles: true, data: char });
inputField.dispatchEvent(keydownEvent);
inputField.dispatchEvent(keypressEvent);
// Обновляем значение поля
if (inputField.value !== undefined) {
const start = inputField.selectionStart || 0;
const end = inputField.selectionEnd || 0;
inputField.value = inputField.value.slice(0, start) + char + inputField.value.slice(end);
inputField.selectionStart = inputField.selectionEnd = start + 1;
} else if (inputField.innerText !== undefined) {
inputField.innerText += char;
}
inputField.dispatchEvent(inputEvent);
inputField.dispatchEvent(new Event('change', { bubbles: true }));
// Задержка между символами
await new Promise(resolve => setTimeout(resolve, delay));
}
// Симулируем нажатие Enter для отправки (если нужно)
const enterEvent = new KeyboardEvent('keydown', { key: 'Enter', bubbles: true, code: 'Enter' });
inputField.dispatchEvent(enterEvent);
}
// Создание панели управления
function createControlPanel() {
// Проверяем, существует ли уже панель
if (document.getElementById('cvm-autotype-panel')) return;
const panel = document.createElement('div');
panel.id = 'cvm-autotype-panel';
panel.style.cssText = `
position: fixed;
bottom: 10px;
right: 10px;
background: #2c3e50;
color: white;
padding: 12px;
border-radius: 8px;
z-index: 9999;
font-family: Arial, sans-serif;
font-size: 14px;
box-shadow: 0 2px 10px rgba(0,0,0,0.5);
width: 260px;
`;
panel.innerHTML = `
<div style="margin-bottom: 8px; font-weight: bold;">🤖 CollabVM Autotype</div>
<div style="margin-bottom: 6px;">
<label style="display: block; font-size: 12px;">Текст для ввода:</label>
<textarea id="cvm-autotype-text" style="width: 100%; padding: 4px; font-size: 12px; border-radius: 4px; border: none;" rows="3">${settings.defaultText}</textarea>
</div>
<div style="margin-bottom: 6px;">
<label style="display: block; font-size: 12px;">Задержка (мс):</label>
<input type="number" id="cvm-autotype-delay" value="${settings.delayMs}" style="width: 100%; padding: 4px; font-size: 12px; border-radius: 4px; border: none;" min="0" max="500">
</div>
<div style="display: flex; gap: 6px;">
<button id="cvm-autotype-start" style="flex: 1; padding: 6px; background: #27ae60; color: white; border: none; border-radius: 4px; cursor: pointer;">▶ Запустить</button>
<button id="cvm-autotype-stop" style="flex: 1; padding: 6px; background: #e74c3c; color: white; border: none; border-radius: 4px; cursor: pointer;">⏹ Остановить</button>
</div>
<div style="margin-top: 6px; font-size: 11px; color: #bdc3c7;">
Горячая клавиша: ${settings.hotkey}
</div>
`;
document.body.appendChild(panel);
let isTyping = false;
let currentTypingPromise = null;
// Кнопка запуска
document.getElementById('cvm-autotype-start').addEventListener('click', async () => {
if (isTyping) {
alert('Ввод уже выполняется, дождитесь окончания или нажмите "Остановить"');
return;
}
const text = document.getElementById('cvm-autotype-text').value;
const delay = parseInt(document.getElementById('cvm-autotype-delay').value, 10);
if (!text.trim()) {
alert('Введите текст для автоввода');
return;
}
isTyping = true;
try {
currentTypingPromise = typeTextWithDelay(text, delay);
await currentTypingPromise;
} catch (err) {
console.error(err);
} finally {
isTyping = false;
currentTypingPromise = null;
}
});
// Кнопка остановки
document.getElementById('cvm-autotype-stop').addEventListener('click', () => {
if (currentTypingPromise) {
// Прерываем ввод (несовершенно, но пользователь поймёт)
isTyping = false;
currentTypingPromise = null;
alert('Ввод остановлен');
} else {
alert('Нет активного ввода');
}
});
// Сохраняем настройки при изменении
const textarea = document.getElementById('cvm-autotype-text');
const delayInput = document.getElementById('cvm-autotype-delay');
textarea.addEventListener('change', () => {
settings.defaultText = textarea.value;
});
delayInput.addEventListener('change', () => {
settings.delayMs = parseInt(delayInput.value, 10);
});
}
// Горячие клавиши
function setupHotkey() {
document.addEventListener('keydown', (event) => {
// Проверка на Alt+T (или другую комбинацию)
if (event.altKey && event.code === 'KeyT') {
event.preventDefault();
const startBtn = document.getElementById('cvm-autotype-start');
if (startBtn) startBtn.click();
}
});
}
// Инициализация после загрузки страницы
function init() {
createControlPanel();
setupHotkey();
}
// Запускаем скрипт, когда DOM готов
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', init);
} else {
init();
}
})();