Браузерное расширение (Manifest V3) для Firefox и Chrome-based браузеров, которое автоматически заменяет цены на AV.by из белорусских рублей (BYN) в выбранную валюту: USD, EUR или RUB. Курсы берутся из публичного API Национального банка Республики Беларусь.
Основная функция расширения — менять отображаемые цены на страницах AV.by, чтобы пользователь сразу видел стоимость автомобиля в удобной валюте.
- Замена цен на AV.by из BYN в USD, EUR или RUB.
- Возврат к оригинальным ценам в BYN при выборе валюты
BYN. - Поддержка цен в списках объявлений, карточках автомобилей, похожих объявлениях, салонных блоках и текстах ежемесячного платежа.
- Сохранение выбранной валюты в локальном хранилище браузера.
- Popup с текущими курсами НБРБ и простым конвертером валют.
- Автоматическое обновление курсов каждые 4 часа.
- Работа с кэшированными курсами, если API временно недоступен.
- Обмен VIN-кодами - чтобы автоматически получать и делиться VIN на карточках авто с другими пользователями (по умолчанию выключена).
- Пользовательские курсы валют — возможность задать свой курс валют. Курс сохраняется локально и используется для замены цен на AV.by и в конвертере. Сбрасывается при обновлении курсов из НБРБ.
- Установите расширение в Firefox или Chrome-based браузер.
- Откройте popup расширения.
- В поле
Валюта на av.byвыберитеUSD,EUR,RUBилиBYN. - Откройте или обновите страницу на
https://av.by/. - Цены на странице будут заменены на выбранную валюту.
- В блоке
VINвключите обмен VIN-кодами, чтобы автоматически получать и делиться VIN на карточках авто (по умолчанию выключено).
Базовый манифест расширения: имя, версию, разрешения, popup, background script и content script для AV.by.
Для Firefox используется исходный manifest.json, а для Chrome build-скрипт генерирует совместимый манифест в build/chrome/manifest.json.
Важные разрешения:
storage— хранение курсов, ошибок обновления и выбранной валюты.alarms— периодическое обновление курсов.https://api.nbrb.by/*— загрузка курсов НБРБ.https://avby.currencies-bel.top— чтение/отправка VIN-данных через Cloudflare Worker.https://av.by/*,https://*.av.by/*— запуск content script на AV.by.
Фоновый модуль расширения.
Функции:
- Загружает курсы НБРБ.
- Проверяет, что в ответе есть USD, EUR и RUB.
- Сохраняет валидные курсы в
browser.storage.local. - Не перезаписывает последние валидные курсы при ошибке API.
- Обновляет курсы при установке, запуске браузера, по расписанию и по кнопке
Обновитьв popup. - Отвечает на сообщения popup:
getRatesиrefreshRates. - Проксирует сообщения content script для VIN:
getVinForPageиsubmitVinForPage.
Content script, который работает на страницах AV.by.
Функции:
- Читает выбранную валюту и сохраненные курсы из
browser.storage.local. - Находит элементы цен на странице AV.by.
- Сохраняет оригинальный BYN-текст, чтобы можно было точно вернуть исходное отображение.
- Конвертирует BYN в выбранную валюту.
- Заменяет цену на странице без добавления второго значения рядом.
- Обрабатывает динамически добавленные элементы через
MutationObserver. - Реагирует на изменение выбранной валюты без переустановки расширения.
- При включенной опции VIN делает запросы к Worker через background, подставляет VIN при безопасном совпадении префикса и отправляет уже раскрытый VIN для подтверждения.
Чистый модуль бизнес-логики без зависимостей от браузерных API.
Функции:
parseRates— извлекает USD, EUR и RUB из ответа API НБРБ.convert— переводит сумму из выбранной валюты в BYN.convertFromBYN— переводит сумму из BYN в выбранную валюту.parseBynPrice— извлекает числовую цену из текста AV.by.formatDisplayPrice— форматирует цену для отображения на странице.formatRateLabel,formatRate,formatDate,formatTime— форматирование курсов и дат для popup.
Интерфейс расширения.
Функции:
- Показывает текущие курсы USD, EUR и RUB к BYN.
- Показывает время последнего обновления.
- Позволяет вручную обновить курсы.
- Содержит простой конвертер валют в BYN.
- Позволяет выбрать валюту, в которую будут заменяться цены на AV.by.
Тесты на Vitest.
Покрывают:
- Парсинг ответа НБРБ.
- Конвертацию валют.
- Форматирование цен.
- Поведение content script на сохраненных HTML-примерах AV.by.
- Восстановление оригинальных BYN-цен.
Build-скрипт для Chrome-based браузеров.
Функции:
- Создает
build/chrome/. - Копирует файлы расширения для Chrome-пакета.
- Генерирует
build/chrome/manifest.jsonизmanifest.json(заменяет background наservice_worker, удаляетbrowser_specific_settings). - Добавляет в
build/chrome/README_CHROME_INSTALL.txtнапоминание, что в Chrome нужно выбирать именноbuild/chrome, а не корень репозитория.
В исходных entrypoint-файлах (background.js, content/avby.js, popup/popup.js) есть shim globalThis.browser ??= globalThis.chrome;, чтобы один код работал с Firefox browser.* и Chrome chrome.* API.
Расширение в Addons Mozilla.org
Расширение обращается к API НБРБ для получения курсов валют и к Cloudflare Worker для опциональной функции VIN (только если пользователь включил ее в popup).
Выбранная валюта и последние курсы хранятся локально в браузере через browser.storage.local.
Для VIN-функции в Worker передаются: pageId, URL карточки и полный VIN. Worker также считает подтверждения чтения/записи и использует только хэшированный идентификатор запроса (без сохранения сырого IP и User-Agent).
На AV.by просмотр VIN доступен только зарегистрированным пользователям и требует нажатия кнопки «Показать VIN», количество которых ограничено для бесплатных аккаунтов. Расширение позволяет пользователям делиться VIN-кодами через общую базу.
Как это работает:
- Сбор. Когда вы нажимаете «Показать VIN» на AV.by, расширение автоматически сохраняет его в общую базу по ID объявления.
- Получение. Когда вы открываете карточку авто, расширение проверяет базу. Если VIN уже есть — он отображается сразу, без траты вашего лимита.
- Подтверждение. Каждый просмотр и каждая отправка VIN считаются подтверждением. Чем больше подтверждений — тем достовернее VIN.
- Защита. Если кто-то попробует сохранить другой VIN для того же объявления — система откажет. VIN можно только подтверждать, но не заменять.
Безопасность: IP-адрес и User-Agent не хранятся в открытом виде. Для идентификации используется односторонний хэш SHA256(соль + IP + UA), восстановить исходные данные невозможно.
Подробное описание логики — в VIN-LOGIC.md.
В manifest.json задан стабильный ID:
"id": "av-by-currencies@redpandadev"ID можно менять до первого публичного релиза. После релиза его лучше не менять, потому что Firefox использует ID для идентичности расширения, обновлений и локальных данных.
Если расширение будет публиковаться в AMO как новое listed add-on, Firefox Add-ons может назначить ID автоматически. Для self-hosted, unlisted или стабильного локального тестирования фиксированный ID в манифесте полезен.