Расширение для Chrome + локальный сервер печати, которые автоматически печатают номерки ячеек при размещении товаров в Ozon PVZ (Turbo-PVZ).
- 🎯 Автопечать при размещении — номерок печатается в двух сценариях: когда товар кладётся в ячейку (
Movement/put/v2) и когда товару присваивается полка (TransferByBarcodeArticle, например"Ozon Полка-88"→П88). - ⌨️ Ручная печать — ввести номер через всплывающее окно расширения.
- 📚 Серийная печать диапазонов — например
100-105, П15-П20(до 1000 ячеек за раз). - 🛑 Отмена с прогрессом — печать продолжается даже при закрытом popup, прогресс виден в реальном времени.
- ⚙️ Веб-настройки — выбор принтера, размер этикетки, DPI, размер шрифта через браузер.
- 🖥️ Иконка в трее — быстрый доступ к настройкам.
- 🧠 Устойчивость к перезапускам — если Chrome выгрузит service worker, печать продолжится с места остановки.
page-hook.js(работает в MAIN-мире страницы) перехватывает XHR-ответы Turbo-PVZ и извлекает номер ячейки или полки.content.js(изолированный мир) слушает сообщения отpage-hook.jsи передаёт их в service worker черезchrome.runtime.sendMessage.background.js(service worker) ставит номер в очередь и отправляетPOST /printна локальный сервер.- Сервер печати (Flask :3000 +
win32print) форматирует номер и отправляет его на термопринтер.
Цепочка: page-hook.js → content.js → background.js → сервер :3000 → принтер
Печать запускается в двух сценариях размещения:
/api2/address-storage/Movement/put/v2— товар кладётся в ячейку. Из ответа берётсяarticlePositions[0].address..../MicroFFTransferApi/TransferByBarcodeArticle— товару присваивается полка. Из ответа берётсяtransferSuccess.cellи преобразуется:"Ozon Полка-88"→П88.
В обоих случаях номер отправляется на печать. Подробности — в комментариях к исходникам.
- Скачайте
StickerPrint_Setup.exeсо страницы Releases - Запустите установщик (потребуются права администратора)
- После установки сервер запустится автоматически и будет стартовать при загрузке системы
- Установите расширение:
chrome://extensions/→ «Режим разработчика» → «Загрузить распакованное» → выберитеC:\StickerPrint\extension - Обновите каждую открытую вкладку Turbo-PVZ (F5 или Ctrl+R) — см. предупреждение ниже
- Настройте принтер — см. раздел «Настройка принтера» ниже
Python и Visual C++ устанавливать не нужно — всё уже внутри установщика.
После установки расширения обязательно обновите каждую открытую вкладку Turbo-PVZ (клавиша F5 или Ctrl+R).
❗ Без перезагрузки страницы перехват запросов не включится, и автопечать не будет работать.
- Windows 10/11 (сервер использует
win32print) - Python 3.9+
- Google Chrome (или Chromium-based браузер)
- Термопринтер с установленным драйвером (Xprinter, Zebra, Godex и т.п.)
# Перейти в папку сервера
cd server
# Установить зависимости
pip install -r requirements.txt
# Запустить сервер
python server.pyСервер запускается на значениях по умолчанию «из коробки». Файл config.json создаётся автоматически при первом сохранении настроек через веб-интерфейс — заранее готовить его не нужно.
После запуска:
- 🌐 Веб-настройки: http://localhost:3000/settings
- 🔍 Проверка сервера: http://localhost:3000/
- 🖥️ Иконка в системном трее
- Открой
chrome://extensions/ - Включи «Режим разработчика» (справа сверху)
- Нажми «Загрузить распакованное расширение»
- Выбери папку
extension/из этого репозитория (⚠️ именноextension/, а не корень проекта) - Готово! Иконка 🖨️ появится в панели браузера
- Обновите каждую открытую вкладку Turbo-PVZ (F5 или Ctrl+R)
После установки расширения обязательно обновите каждую открытую вкладку Turbo-PVZ (клавиша F5 или Ctrl+R).
❗ Без перезагрузки страницы перехват запросов не включится, и автопечать не будет работать.
Перед первым использованием обязательно настройте принтер — установщик не знает, какой принтер подключён к вашему компьютеру.
- Убедитесь, что драйвер принтера установлен в Windows (Панель управления → Устройства и принтеры)
- Откройте http://localhost:3000/settings
- В выпадающем списке «Принтер» выберите ваш принтер
- При необходимости укажите размер этикетки и DPI (обычно 203)
- Нажмите «Сохранить настройки»
Если в списке ничего не выбрано — сервер попробует использовать системный принтер по умолчанию.
💡 Настройки в драйвере Windows и в сервере печати не связаны. Сервер использует только значения из
config.json/ веб-интерфейса (ширина, высота, DPI, размер шрифта). Настройки драйвера (размер бумаги, ориентация, отступы) сервер игнорирует.Если что-то печатается не так — сначала проверьте настройки на странице http://localhost:3000/settings, а не в драйвере.
Просто работай в Turbo-PVZ как обычно. Номерок распечатается автоматически:
- когда товар кладётся в ячейку (
Movement/put/v2); - когда товару присваивается полка (
TransferByBarcodeArticle).
- Нажми иконку расширения 🖨️
- Введи номер:
105,П15,A1и т.д. - Нажми Enter или кнопку «Напечатать»
В поле ввода можно вводить диапазоны:
| Ввод | Что напечатается |
|---|---|
105 |
105 |
100-105 |
100, 101, 102, 103, 104, 105 |
П15-П20 |
П15, П16, П17, П18, П19, П20 |
А50-60 |
А50, А51, …, А60 |
П1-П3, А5, 200 |
П1, П2, П3, А5, 200 |
П008-П012 |
П008, П009, П010, П011, П012 (ведущие нули) |
Ограничение: до 1000 ячеек за один запуск.
Сервер работает на значениях по умолчанию «из коробки». Файл config.json создаётся автоматически при изменении настроек через веб-интерфейс. Вот что он хранит:
{
"label_width_mm": 30,
"label_height_mm": 20,
"dpi": 203,
"max_font_size": 100,
"min_font_size": 4,
"printer_name": ""
}| Параметр | Описание |
|---|---|
label_width_mm |
Ширина этикетки в мм |
label_height_mm |
Высота этикетки в мм |
dpi |
Разрешение принтера (203 — стандарт для термопринтеров) |
max_font_size |
Максимальный размер шрифта |
min_font_size |
Минимальный размер шрифта |
printer_name |
Имя принтера. Пустая строка (или принтер, которого нет в системе) = используется системный принтер по умолчанию |
Менять файл вручную не нужно — используй веб-интерфейс http://localhost:3000/settings.
| Попап расширения | Настройки сервера |
|---|---|
![]() |
![]() |
- Всё работает локально. Расширение обращается только к
127.0.0.1:3000. - Никакие данные не отправляются на сторонние серверы.
- Разрешения расширения:
storage(настройки),alarms(watchdog), доступ кturbo-pvz.ozon.ruи127.0.0.1:3000.
StickerPrint/
│
├── extension/ # 🧩 Chrome-расширение (Manifest V3)
│ ├── manifest.json # манифест: разрешения, точки входа, мир скриптов
│ ├── background.js # service worker: очередь печати, watchdog
│ ├── content.js # мост: слушает page-hook → шлёт в background
│ ├── page-hook.js # перехват XHR в MAIN-мире (put/v2, полка)
│ ├── popup.html # разметка попапа (UI расширения)
│ ├── popup.js # логика UI: парсинг диапазонов, прогресс
│ └── icon.png # иконка расширения (16/48/128)
│
├── server/ # 🖨️ Локальный сервер печати (Python)
│ ├── server.py # Flask :3000 + win32print + иконка в трее
│ ├── icon.ico # иконка сервера (вшита в .exe)
│ └── requirements.txt # зависимости Python (Flask, pywin32, pystray, Pillow)
│
├── docs/ # 🖼️ картинки для README
│ ├── popup.png # скриншот попапа расширения
│ └── settings.png # скриншот страницы /settings
│
├── .gitignore # что не коммитить (config.json, venv, __pycache__, dist)
├── README.md # этот файл — описание проекта
└── LICENSE # лицензия MIT
💡
config.jsonсоздаётся автоматически при изменении настроек и не хранится в репозитории (он в.gitignore).
Печать не работает / сервер offline
→ Убедись, что StickerPrintServer.exe запущен (иконка в трее), и в настройках выбран принтер.
После установки ничего не печатается → Скорее всего, не настроен принтер. Откройте http://localhost:3000/settings, выберите принтер из списка и нажмите «Сохранить настройки». Убедитесь, что драйвер принтера установлен в Windows.
Установил расширение, но автопечать не работает → Скорее всего, не обновлены открытые вкладки. Расширение внедряет скрипт в момент загрузки страницы, поэтому каждая вкладка Turbo-PVZ, открытая до установки, не перехватывает запросы. Нажмите F5 (или Ctrl+R) на каждой такой вкладке — после обновления автопечать заработает.
Печать идёт не по тому размеру / обрезается / съезжает → Проверьте настройки на http://localhost:3000/settings: ширина, высота, DPI. Сервер не использует настройки драйвера Windows — только свои. Если вы меняли размер в драйвере, это ни на что не влияет. И наоборот: настройки сервера не меняют драйвер.
Номерки печатаются дважды
→ Проверь lastPrintedCell в консоли service worker. Возможно, страница отправляет дублирующие запросы.
Расширение не устанавливается
→ Проверь, что выбираешь папку extension/, а в ней на верхнем уровне лежит manifest.json.
Принтер не виден в настройках → Принтер должен быть установлен в системе (Панель управления → Устройства → Принтеры). Если в настройках ничего не выбрано, сервер использует системный принтер по умолчанию.
Где взять config.json?
→ Не нужно нигде брать. Сервер работает на дефолтных значениях «из коробки», а config.json создастся сам, как только ты сохранишь настройки через http://localhost:3000/settings.
Где скачать установщик?
→ На странице Releases — файл StickerPrint_Setup.exe.
MIT — можно свободно использовать, форкать и модифицировать.
Проект создан для упрощения работы сотрудников ПВЗ Ozon. Не является официальным продуктом Ozon.

