Back

Как создавать и запускать пользовательские скрипты в браузере

Как создавать и запускать пользовательские скрипты в браузере

Пользовательские скрипты и расширения браузера произвели революцию в том, как разработчики взаимодействуют с веб-сайтами. Независимо от того, автоматизируете ли вы повторяющиеся задачи, удаляете раздражающие элементы или добавляете недостающие функции, userscripts предлагают мощный способ модифицировать веб без ожидания, пока владельцы сайтов внесут изменения.

Ключевые выводы

  • Userscripts — это JavaScript-файлы, которые модифицируют веб-страницы через менеджеры расширений браузера
  • Tampermonkey и Violentmonkey — наиболее надёжные менеджеры пользовательских скриптов для всех браузеров
  • MutationObserver решает проблемы синхронизации при манипуляции динамически загружаемым контентом
  • Всегда тестируйте скрипты в консоли браузера перед развёртыванием их как userscripts

Понимание пользовательских скриптов браузера и менеджеров

Userscripts — это JavaScript-файлы, которые запускаются на определённых веб-страницах для изменения их поведения или внешнего вида. Думайте о них как о лёгких расширениях браузера, которые работают «на лету». Для запуска этих скриптов вам понадобится менеджер пользовательских скриптов — расширение браузера, которое управляет выполнением, хранением и разрешениями скриптов.

Выбор менеджера пользовательских скриптов

Tampermonkey доминирует с более чем 10 миллионами пользователей в Chrome, Firefox, Edge и Safari. Для сторонников открытого исходного кода Violentmonkey предлагает аналогичную функциональность с полной прозрачностью. Greasemonkey, оригинальный менеджер, отстал из-за изменений API, которые нарушили совместимость с большинством существующих скриптов.

Для браузеров на базе Chromium Tampermonkey работает наиболее надёжно. Пользователи Firefox часто предпочитают Violentmonkey за его меньший размер и ориентацию на приватность.

Написание вашего первого пользовательского скрипта

Каждый userscript начинается с блока метаданных, который сообщает менеджеру, когда и как запускать ваш код:

// ==UserScript==
// @name         My Custom Script
// @match        https://example.com/*
// @grant        none
// @version      1.0
// ==/UserScript==

(function() {
  'use strict';
  // Your code here
})();

Директива @match критически важна — она определяет, какие страницы запускают ваш скрипт. Используйте @include для простых шаблонов с подстановочными знаками, если вам нужно более широкое совпадение. Директива @grant контролирует доступ к API. Начните с none и добавляйте разрешения вроде GM_setValue или GM_xmlhttpRequest по мере необходимости.

Стратегии манипуляции DOM

Избегайте фреймворков — чистый JavaScript более надёжен и быстрее для пользовательских скриптов. Ключевая проблема — это синхронизация: ваш скрипт может запуститься до того, как появятся элементы, которые вы хотите модифицировать.

// Wait for specific element
const waitForElement = (selector) => {
  return new Promise(resolve => {
    if (document.querySelector(selector)) {
      return resolve(document.querySelector(selector));
    }
    
    const observer = new MutationObserver(() => {
      if (document.querySelector(selector)) {
        observer.disconnect();
        resolve(document.querySelector(selector));
      }
    });
    
    observer.observe(document.body, {
      childList: true,
      subtree: true
    });
  });
};

// Usage
waitForElement('.target-class').then(element => {
  element.style.display = 'none';
});

MutationObserver — ваш лучший друг для динамических сайтов. Он отслеживает изменения DOM и реагирует соответствующим образом, решая большинство проблем синхронизации, которые преследуют пользовательские скрипты браузера.

Тестирование перед развёртыванием

Всегда сначала создавайте прототип в консоли браузера. Откройте DevTools (F12), перейдите на целевой сайт и протестируйте ваши селекторы и логику напрямую:

// Test your selector
document.querySelectorAll('.ad-banner').forEach(el => el.remove());

// Verify element properties
console.log(document.querySelector('#main-content').innerHTML);

Как только всё заработает, оберните ваш код в шаблон userscript и протестируйте с простым console.log(), чтобы убедиться, что скрипт загружается. Этот двухэтапный подход выявляет большинство проблем до того, как они превратятся в кошмар отладки.

Распространённые ошибки и решения

Состояния гонки преследуют новичков. Элементы загружаются асинхронно, поэтому ваш скрипт может выполниться слишком рано. Используйте MutationObserver или событие DOMContentLoaded вместо произвольных таймаутов.

Ограничения кросс-доменных запросов ограничивают то, к чему могут получить доступ пользовательские скрипты. Разрешение @grant GM_xmlhttpRequest обходит CORS для API-вызовов, но используйте его экономно.

Производительность имеет значение. Неэффективные селекторы или чрезмерная манипуляция DOM могут замедлить страницы до черепашьей скорости. Группируйте обновления DOM, используйте специфичные селекторы вместо широких и отключайте наблюдатели, когда закончите.

Ограничения современных браузеров

Manifest V3 в браузерах на базе Chromium не убил пользовательские скрипты, но изменил ландшафт. Менеджеры userscripts адаптировались, используя другие API, сохраняя совместимость. Однако некоторые продвинутые функции, такие как синхронные XHR-запросы, исчезли навсегда.

Мобильные браузеры серьёзно ограничивают поддержку расширений. Только Firefox на Android и Kiwi Browser правильно поддерживают Tampermonkey. iOS остаётся закрытой экосистемой — ограниченная модель расширений Safari не поддерживает традиционные менеджеры пользовательских скриптов.

Заключение

Пользовательские скрипты браузера заполняют разрыв между тем, что предлагают веб-сайты, и тем, что нужно пользователям. Начните с простого — скройте раздражающий элемент или добавьте горячую клавишу. По мере освоения рабочего процесса переходите к более сложной автоматизации. Веб становится бесконечно более гибким, когда вы можете переписывать его по требованию.

Часто задаваемые вопросы

Нет, userscripts изолированы в конкретной вкладке и странице, на которой они запускаются. Они не могут напрямую получать доступ к данным из других вкладок или взаимодействовать с другими расширениями, если только вы не используете специфичные GM-функции с соответствующими разрешениями.

Большинство менеджеров userscripts блокируют выполнение на чувствительных доменах, таких как банковские сайты и внутренние страницы браузера, из соображений безопасности. Вы можете вручную переопределить это в настройках расширения, но это не рекомендуется по соображениям безопасности.

Публикуйте скрипты на платформах вроде Greasy Fork или OpenUserJS. Эти репозитории содержат тысячи скриптов сообщества. Пользователи могут установить их одним кликом, если у них установлен менеджер пользовательских скриптов.

Каждый скрипт добавляет накладные расходы, но хорошо написанные скрипты имеют минимальное влияние. Проблемы возникают, когда скрипты используют неэффективные селекторы или создают утечки памяти. Отслеживайте производительность через DevTools браузера, если страницы замедляются.

Understand every bug

Uncover frustrations, understand bugs and fix slowdowns like never before with OpenReplay — the open-source session replay tool for developers. Self-host it in minutes, and have complete control over your customer data. Check our GitHub repo and join the thousands of developers in our community.

OpenReplay