Chrome MV3 · Firefox MV2 · Docker

Рейтинг, стоп-лист
и контроль цены

Расширение добавляет к каждому объявлению на avito.ru кнопки 👍 / 👎, скрытие и блокировку продавца ✕, а также кнопку «☆ Следить» с отдельным списком отслеживания и графиком динамики цены. Все сводные рейтинги, пользователи и архив цен закрыты в админ-панели управляющего.

Форма 01-Б · проверенные пакеты расширений (v1.3)manifest.json в корне архива · автопривязка к серверу
Chrome · Яндекс · Edge · Opera✓ Manifest V3 · v1.3.0

Пакет для Chromium-браузеров

manifest.json и все скрипты лежат строго в корне архива (без лишней вложенной папки). Адрес этого сервера уже прописан автоматически.

  1. 1. Скачайте архив avito-rating-chrome.zip кнопкой ниже и распакуйте его в отдельную папку (например, C:\avito-rating-chrome).
  2. 2. Вставьте в адресную строку браузера:
  3. 3. Включите переключатель «Режим разработчика» и нажмите «Загрузить распакованное расширение» → выберите распакованную папку, внутри которой лежит manifest.json (либо просто перетащите скачанный .zip мышкой прямо на страницу chrome://extensions).
Mozilla Firefox · LibreWolf✓ addons-linter: 0 ошибок

Пакет для Firefox (ZIP без распаковки + MV3/XPI)

Плоский архив с manifest.json на верхнем уровне, gecko.id и декларацией data_collection_permissions (требование Firefox 2026).

  1. 1. Скачайте avito-rating-firefox.zip — распаковывать архив не нужно.
  2. 2. Вставьте в адресную строку Firefox:
  3. 3. Нажмите «Загрузить временное дополнение…» и выберите скачанный файл avito-rating-firefox.zip (или если распаковали — выберите сам файл manifest.json внутри папки, а не общую папку с несколькими сборками).
Самодиагностика сборок расширений
Проверка архивов…
Закрытый контур · /admin

Сводная статистика, база пользователей и управление рейтингами скрыты от посторонних

Войти в кабинет может только управляющий. Внутри доступны: полный реестр объявлений и продавцов с установкой ручного рейтинга (0–100) и глобальной блокировкой, список всех клиентов расширения с подписями и блокировкой нарушителей, а также каталог цен и история их изменений.

Открыть админ-панель →Защита: HttpOnly HMAC-cookie
Форма 02 · интерактивный стенд расширенияголоса, кнопка «следить» и список отслеживания цен

Проверьте работу кнопок 👍 / 👎 / ✕ и «☆ Следить» прямо сейчас

Слева показана панель расширения с вкладкой «Список» (отслеживаемые объявления и мини-графики цены). Нажмите «☆ Следить» на любой карточке справа — объявление сразу появится в вашем списке отслеживания в PostgreSQL.

Загрузка стенда…
Форма 04 · техническая частьперехват ссылок, цен и управление

Как устроены перехват на avito.ru, история цены и админка

Расширение опирается на стабильные атрибуты data-marker. При каждом просмотре выдачи или карточки товара сервер сравнивает текущую цену с последней записью в price_history и сохраняет новую точку при любом изменении стоимости.

Два места для списка отслеживания в расширении: быстрый список прямо в плавающей панели поверх страницы avito.ru и отдельное окно по клику на иконку расширения в браузере (с кнопкой «Во вкладке ↗» и фильтром «Подешевели»).
  1. 01

    Перехват выдачи и цены

    Контент-скрипт разбирает карточки avito.ru по устойчивым атрибутам data-marker и извлекает числовую цену как из общей выдачи, так и со страницы товара.

    [data-marker="item"]                 // карточка объявления
    [data-marker="item-title"]           // ссылка и заголовок
    [data-marker="item-price"]           // цена в поиске
    [data-marker="item-view/item-price"] // цена на карточке товара
  2. 02

    Идентификация ссылки и продавца

    Идентификатор объявления — числовой суффикс slug'а. Продавец — хеш профиля /user/<hash>/profile или слаг витрины /brands/<slug>.

    /moskva/telefony/iphone_15_3813986265
    └─ listingId = 3813986265
    
    /user/a3f1c8e9…60718/profile
    └─ sellerId  = user:a3f1c8e9…60718
  3. 03

    Кнопка «Следить» и список отслеживания

    Рядом с 👍 / 👎 / ✕ расположена кнопка «☆ Следить». Она добавляет товар в отдельный список отслеживания расширения (popup + вкладка в плавающей панели) и строит график динамики цены.

    POST /api/v1/watch          { action: "watch", listingId, price }
    GET  /api/v1/watch          // список слежения клиента
    GET  /api/v1/price-history  // точки цены во времени
  4. 04

    Закрытая админка управляющего

    Общая сводка БД, база клиентов расширения, ручная корректировка рейтингов и полный архив цен закрыты паролем управляющего на маршруте /admin.

    POST /api/admin/login     // HttpOnly HMAC-сессия
    GET  /api/admin/overview  // статистика, цены, клиенты
    POST /api/admin/manage    // ручной рейтинг, блоки, цены
Форма 05 · развёртывание в Dockerсервер + база + админка

Запуск сервера хранения и расширения

  1. 1. Поднимите контейнер с PostgreSQL и сервером

    Задайте свой пароль управляющего в ADMIN_PASSWORD и запустите сборку.

    docker compose up -d --build
    # витрина: http://localhost:8080
    # админка: http://localhost:8080/admin
  2. 2. Установите плагин в Chrome или Firefox

    Скачайте готовый ZIP-архив ниже и загрузите распакованную папку в браузер.

    chrome://extensions -> Загрузить распакованное
    about:debugging     -> Загрузить временное дополнение
  3. 3. Отслеживайте цены и управляйте рейтингами

    Жмите «☆ Следить» на объявлениях avito.ru, проверяйте динамику в окне расширения, а сводку — в /admin.

    ADMIN_USER=admin
    ADMIN_PASSWORD=ваш-надёжный-пароль
docker-compose.ymlPostgreSQL 16 + Admin Auth
# ОДИН порт наружу: хост:8080 -> app:3000 -> db:5432 (внутренняя сеть)
services:
  app:
    build: .
    depends_on:
      db:
        condition: service_healthy
    environment:
      DATABASE_URL: postgresql://postgres:postgres@db:5432/avito_rating
      ADMIN_USER: ${ADMIN_USER:-admin}
      ADMIN_PASSWORD: ${ADMIN_PASSWORD:-admin1234}
      NODE_ENV: production
    ports:
      - "${APP_PORT:-8080}:3000"   # единственный опубликованный порт
    networks: [avito-net]

  db:
    image: postgres:16-alpine
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
      POSTGRES_DB: avito_rating
    volumes:
      - pgdata:/var/lib/postgresql/data
    expose: ["5432"]   # только внутри avito-net, наружу НЕ пробрасывается
    networks: [avito-net]

networks:
  avito-net:
    driver: bridge
Форма 06 · интерфейс обменаREST JSON
МетодПутьНазначение
GET/api/healthПроверка связи с PostgreSQL, отдаёт { ok: true }.
POST/api/v1/ratingsПакетная регистрация объявлений из выдачи, автофиксация цены в price_history и выдача рейтингов.
POST/api/v1/voteГолос +1 / −1 по объявлению или продавцу с проверкой блокировки клиента.
POST/api/v1/hideСкрыть объявление и/или заблокировать продавца (кнопка «✕»).
GET / POST/api/v1/watchСписок отслеживания клиента (кнопка «Следить») вместе с историей цен каждого товара.
GET/api/v1/price-historyПолный ряд наблюдений цены, минимум, максимум и разница по listingId.
POST/api/admin/manageЗакрытый API управляющего: ручной рейтинг, блокировка пользователей, запись цен.
GET/api/extension?target=…Сборка установочного архива расширения: chrome (MV3), firefox (MV2) или all.