Как создать собственное расширение для Google Chrome
Что такое расширение Google Chrome?

Современные браузеры, такие как Google Chrome, содержат множество встроенных функций. Расширения (extensions) позволяют добавлять новые возможности или изменять поведение браузера и сайтов. Расширение — это мини‑программа, написанная с использованием привычных веб‑технологий: HTML, CSS и JavaScript. В отличие от сайта, расширение может работать в фоновом режиме, подписываться на события в браузере и взаимодействовать со страницами, которые вы посещаете.
Короткое определение: расширение Chrome — это набор файлов и метаданных (манифеста), которые расширяют возможности браузера или сайтов.
Что мы создадим в этой статье?

Мы соберём простое расширение, которое открывает сайт MakeUseOf и выполняет случайный поиск по категориям сайта. Это компактный проект для обучения: вы пройдёте путь от структуры файлов до загрузки расширения в Chrome и тестирования его работы.
Чему вы научитесь:
- создавать расширение Chrome с нуля
- вставлять скрипт в веб‑страницу с помощью API расширений
- добавлять обработчики событий и симулировать клики
- генерировать случайные числа и работать с массивами
- отлаживать и загружать расширение в chrome://extensions
Структура файлов проекта

Для локальной разработки нам понадобится четыре файла в одной папке:
- index.html — интерфейс всплывающего окна (popup)
- style.css — стили для popup
- script.js — код, который отправляет команду на страницу
- manifest.json — метаданные и разрешения расширения
Файл manifest.json обязателен и должен называться именно так. Остальные файлы можно назвать по‑другому, но тогда нужно будет адаптировать ссылки в манифесте и HTML.
Шаг 1. Создание манифеста
Манифест сообщает Chrome, что делает расширение, какие у него версии и какие разрешения требуются. Для нашего простого примера манифест выглядит так:
{
"name": "MakeUseOf.com Automated Search",
"version": "1.0.0",
"description": "A search tool to find interesting articles",
"manifest_version": 3,
"author": "Samuel Garbett",
"permissions": ["storage", "declarativeContent", "activeTab", "scripting"],
"host_permissions": [""],
"action":{
"default_popup": "index.html",
"default_title": "MUO Auto Search"
}
}Примечание: в реальных расширениях host_permissions обычно содержит шаблоны URL (например, https://www.makeuseof.com/*), иначе код не сможет запускаться в целевых вкладках. В демонстрационном примере поле оставлено пустым, как в исходном материале, но ниже вы найдёте рекомендации по корректной настройке разрешений.
Шаг 2. HTML интерфейса и CSS
Ниже — минимальный popup с двумя кнопками: одна открывает сайт, другая запускает автоматизированный поиск.
index.html:
style.css:
html {
width: 400px;
}
body {
font-family: Helvetica, sans-serif;
}
h1 {
text-align: center;
}
#buttonOne {
border-radius: 0px;
width: 100%;
padding: 10px 0px;
}
#buttonTwo {
border-radius: 0px;
width: 100%;
padding: 10px 0px;
margin-top: 10px;
} Эти файлы просты и служат только интерфейсом для запуска скрипта. Вы можете улучшать стиль и разметку по желанию (иконки, локализация, тёмная тема и т. п.).
Шаг 3. JavaScript: как работает автоматический поиск
Основная логика находится в script.js. Она вставляет функцию на текущую страницу и выполняет последовательность действий: открыть поле поиска, вставить случайный термин и отправить форму.
script.js:
// This function inserts our autoSearch function into the page's code
function insertScript() {
// This selects the focused tab for the operation and passes the autoSearch function
chrome.tabs.query({active: true, currentWindow: true}, tabs => {
chrome.scripting.executeScript({target: {tabId: tabs[0].id}, function: autoSearch})
})
// This closes the extension pop-up to select the website search bar
window.close();
}
// This is an event listener that detects clicks on our "Start Random Search" button
document.getElementById('buttonTwo').addEventListener('click', insertScript)
// This function selects a random topic from an array and
function autoSearch() {
// This is an array to store our search terms
const searchTerms = ["PC and Mobile", "Lifestyle", "Hardware", "Windows", "Mac",
"Linux", "Android", "Apple", "Internet", "Security",
"Programming", "Entertainment", "Productivity", "Career", "Creative",
"Gaming", "Social Media", "Smart Home", "DIY", "Review"];
// This generates a random number between 0 and 19
let selectorNumber = Math.floor(Math.random() * 20);
// This uses the random number to select an entry from the array
let selection = searchTerms[selectorNumber];
// This simulates a click on the MUO website search icon
document.getElementById("js-search").click();
// This sets the MUO website search bar as a variable
var searchBar = document.getElementById("js-search-input");
// This inserts our random search term into the search bar
searchBar.value = searchBar.value + selection;
// This finishes the process by activating the website form
document.getElementById("searchform2").submit();
}Технические замечания по коду:
- chrome.scripting.executeScript — API manifest v3 для выполнения кода в контексте вкладки.
- Для доступа к элементам страницы используются идентификаторы (ID). Если структура сайта поменяется, ID могут перестать существовать — тогда поиск сломается.
- host_permissions и content scripts можно настроить так, чтобы скрипт запускался автоматически при загрузке страницы, без нажатия кнопок.
Шаг 4. Как загрузить расширение в Chrome

Откройте в Chrome адрес chrome://extensions. Включите Developer mode (режим разработчика) в правом верхнем углу.

Нажмите Load Unpacked и выберите папку с вашими файлами.

После загрузки нажмите на значок пазла и закрепите расширение для удобного доступа. Обратите внимание: данное расширение будет работать на сайте MakeUseOf только если элементы поиска имеют те же ID, что использованы в скрипте.
Когда это может не сработать
- Если сайт изменит идентификаторы элементов (ID), автоматический ввод и отправка формы не найдут нужные DOM‑элементы.
- Если host_permissions не настроены, chrome.scripting.executeScript не выполнит код в целевой вкладке.
- Если сайт использует динамическую загрузку или SPA (single page application), элементы могут появляться с задержкой — нужно ждать появления элемента перед кликом.
- Если у пользователя запрещён доступ к расширениям в корпоративной политике, расширение не загрузится.
Альтернативные подходы
- Userscripts (Tampermonkey/Greasemonkey): вставляют пользовательский код прямо в страницы без упаковки в расширение; проще для быстрых правок.
- Плагин для Firefox (WebExtensions): практически тот же API, но некоторые детали отличаются; можно портировать расширение.
- Background scripts и content scripts: вместо вставки функции через executeScript можно прописать content script в манифесте, который будет работать на соответствующих сайтах.
- Bookmarklet: короткий JavaScript в закладке, который запускает код на текущей странице; не требует установки расширения.
Рекомендации по безопасности и приватности
- Не запрашивайте лишних разрешений. Чем шире scope permissions, тем выше риск и подозрительность у пользователей.
- Для доступа только к makeuseof.com добавьте в host_permissions: “https://www.makeuseof.com/*”.
- Отключите сбор данных и не отправляйте пользовательские запросы на сторонние серверы без ясного уведомления.
- При использовании storage API сохраняйте только настройки, а не чувствительные данные.
Important: расширения могут запрашивать доступ к содержимому всех страниц. Пользователь должен понимать, зачем это нужно.
Чеклисты по ролям
Разработчик
- создать структуру файлов и валидный manifest.json
- протестировать локально через chrome://extensions
- настроить host_permissions и протестировать на целевом сайте
- добавить обработку ошибок и условия ожидания элементов
Ревьюер (код и безопасность)
- проверить минимальность разрешений
- проверить, не отправляются ли данные на внешние серверы
- убедиться, что нет eval() и опасных строковых вставок
Пользователь
- включить Developer mode
- загружать расширения только из доверенных источников
- проверять права доступа расширения в chrome://extensions
Критерии приёмки
- Расширение загружается в chrome://extensions без ошибок.
- Нажатие «Start Random Search» на вкладке MUO открывает поиск и показывает результаты соответствующего запроса.
- При отсутствии элементов на странице расширение корректно обрабатывает ошибку (например, выводит console.log или не падает).
- Расширение не запрашивает лишних разрешений.
Тесты и кейсы приёмки
- Позитивный кейс: установлен MUO, элементы с ID js-search и js-search-input присутствуют — поиск выполняется.
- Негативный кейс: элементы отсутствуют — скрипт не вызывает исключений, в консоли выводится понятное сообщение.
- Разрешения: host_permissions указаны только для https://www.makeuseof.com/* и расширение запускается.
- Совместимость: протестировать на актуальной версии Chrome и на одной предыдущей стабильной версии.
Отладка и откат (runbook)
Шаги при ошибках:
- Откройте chrome://extensions и включите режим разработчика.
- Проверьте консоль расширения (Inspect views) для popup и целевой вкладки.
- Вручную выполните document.getElementById(“js-search”) в консоли страницы — убедитесь, что элемент существует.
- Если ID изменился, обновите script.js или используйте querySelector с более стабильным селектором.
- Если необходимо откатить изменения — загрузите предыдущую версию папки или удалите расширение и загрузите старую копию.
Полезные сниппеты и шпаргалка
Минимальный manifest для popup (пример):
{
"manifest_version": 3,
"name": "Example",
"version": "0.1",
"action": {"default_popup": "index.html"},
"permissions": ["scripting", "activeTab"],
"host_permissions": ["https://www.makeuseof.com/*"]
}Ожидание появления элемента перед кликом (content script):
function waitFor(selector, timeout = 3000) {
return new Promise((resolve, reject) => {
const start = Date.now();
const iv = setInterval(() => {
const el = document.querySelector(selector);
if (el) { clearInterval(iv); resolve(el); }
if (Date.now() - start > timeout) { clearInterval(iv); reject(new Error('Timeout')); }
}, 100);
});
}
waitFor('#js-search').then(el => el.click()).catch(err => console.log(err));Совет: вместо document.getElementById используйте document.querySelector с более надёжными селекторами.
Модель мышления и лучшие практики
- Разделение контекста: интерфейс (popup) должен только инициировать действие; весь DOM‑манипулирующий код должен выполняться в контексте страницы (content script или executeScript).
- Минимализм разрешений: начинайте с минимального набора и добавляйте только те разрешения, которые действительно нужны.
- Идём от простого к сложному: сначала сделайте рабочий prototype в локальном режиме, затем рефакторьте и улучшайте стабильность.
Совместимость и миграция
- Manifest v3 обязателен для новых расширений в Chrome — учтите это при портировании старых манифестов v2.
- Для переноса на Firefox WebExtensions обычно достаточно поправить поля манифеста и проверить API, но нужно тестировать конкретные вызовы.
Локальные альтернативы и особенности для русскоязычных пользователей
- Если нужно искать по русскоязычным сайтам, проверьте кодировку и локализацию формы поиска сайта.
- В регионах с ограниченным доступом к Google сервисам учитывайте сетевые особенности и сертификаты.
Когда стоит выбрать другой путь
- Нужна сложная интеграция с сервером и сбор аналитики — лучше сделать отдельный сервис с OAuth и бэкендом.
- Если нет желания публиковать расширение в магазине и нужна простота — userscript или bookmarklet часто быстрее.
Заключение
Это руководство показало базовый процесс создания простого расширения Google Chrome: структура файлов, манифест, HTML/CSS интерфейс и скрипт, который запускает автоматический поиск на сайте MakeUseOf. После освоения базового примера вы можете развивать проект: добавлять настройки, локализацию, обработку ошибок, периодические задания и публичную публикацию в Chrome Web Store.
Ключевые вещи для дальнейшей работы: внимательно настраивайте host_permissions, минимизируйте запрашиваемые права и тестируйте расширение на целевых страницах.
Summary:
- Расширения дают гибкость и возможности для автоматизации браузера.
- Собранный пример демонстрирует, как вставлять код в страницу и управлять DOM.
- Следуйте рекомендациям по безопасности и тестированию перед публикацией.
Notes: помните, что расширение будет работать только на сайтах с ожидаемой структурой DOM. Если сайт изменится, потребуется обновить селекторы и, возможно, логику взаимодействия.