user11275363

user11275363

Пикабушник
Дата рождения: 4 марта
6195 рейтинг 57 подписчиков 0 подписок 3 поста 1 в горячем
0

7 513 коробов через API Честного Знака: четыре отказа, два валидатора и один вопрос «можно, а зачем?»

Серия «Честный Знак: лучше бы я не разбирался»

В прошлом посте серии я спрашивал, почему Честный Знак отдаёт коды маркировки в PDF, а не в CSV. Ответа не нашлось, зато нашлось 703 комментария, и заметная часть объясняла мне, что я дурак.

«Вообще-то есть API и он отдаёт нормальные коды, и там ещё много разных полезных методов. А PDF сделан как раз для тех у кого лапки» — 129 плюсов. «Работал с честным знаком, получали коды по API. Сказки какие-то» — 124. «Слово api вот что-нибудь говорит?»

Я тогда ответил в комментах: «ЧЗ Апи уже внедряю!!!». С трёх восклицательных знаков. Как дурак и есть.

Внедрил. 7 513 коробов. 98 документов. 2 623 313 строк с кодами внутри них. Больше 1,4 миллиона кодов маркировки — по официальному тарифу 60 копеек за код это больше 840 тысяч рублей, уже уплаченных и уже наклеенных на товар.

API есть. Больше они ни в чём правы не были.

Что такое агрегация, если вы нормальный человек

Есть штука товара, у неё свой квадратный код. Шесть штук лежат в блоке, у блока свой код. Двадцать пять блоков лежат в коробе, у короба свой. Матрёшка: 150 кодов в одном коробе плюс 26 на упаковки.

Честный Знак должен знать состав каждого уровня, и электронная матрёшка обязана совпадать с той, которую руками собрали на производстве. Собирают её люди, мне приходят их таблицы. Моя работа — понять, сходится ли бумага с реальностью. Код я писал с нейронкой и отправлял в живую государственную систему. Да, вот так.

Песочница была. Работать в ней — нет

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

Поэтому нормальный путь такой: берёшь тестовый контур, ломаешь там короб всеми способами, чинишь код и только потом идёшь в бой. Доступ у меня был. Повторить в нём нужные операции не получилось. Написал специалисту со стороны клиента: песочницы нет, предлагаю начать с неполной палеты, которую склад при ошибке может перебрать руками. Согласовали.

Сомнительно, но окэй. Первый в жизни новый тип операции я проверял в живой системе. Можете начинать писать комментарий, я подожду.

Документ приняли, а я об этом не знал

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

Честный Знак отвечает строкой. Просто идентификатор, текстом. Весь остальной обмен — JSON, а этот ответ приходит текстом. Моя программа его не понимает и честно пишет в журнал: unknown.

Можно было отдать этот идентификатор в JSON, как всё остальное?

7 513 коробов через API Честного Знака: четыре отказа, два валидатора и один вопрос «можно, а зачем?»

Источник: news.drom.ru, «Дневник Хача» / YouTube.com. Да, второй пост подряд с этой картинкой. Она подходит второй пост подряд.

Дальше два варианта, оба плохие. Документ мог не уйти — тогда надо отправлять. Мог уйти и уже создать блок — тогда второй раз нельзя, номер уже использован.

Кнопку не нажал. Пошёл искать документ в списке отправленных, ничего не меняя. Он там был. Принят, пять штук в блоке подтверждены. Программа с тех пор понимает и JSON, и обычный текст. Но правило появилось раньше кода: непонятный ответ — не жать второй раз, а идти читать, что случилось с первой попыткой.

Ошибка 29

Вторая попытка. Два уровня сразу: блоки и короб. Документ проходит мою локальную проверку по схеме, структура сходится, коды на месте. Отправляю.

PARSE_ERROR. Ошибка 29 — XML не соответствует схеме. Той самой, по которой файл только что прошёл у меня на компьютере.

Дело было в одном поле. Блоки внутри короба я передал как sscc, а валидатор Честного Знака ждал их как cis. Формально документ отклонён целиком. Изменений в системе нет, уже неплохо. Переделал сборку.

Ошибка 32

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

CHECKED_NOT_OK. Ошибка 32 — блок уже содержит перечисленные вложения.

Не приняла. И отклонила документ целиком: ни новый блок, ни короб не создались, половинчатой каши тоже. Хорошая новость про Честный Знак, полученная самым дорогим способом.

Матрёшка собралась

Четвёртая попытка. Новый блок собрал из шести штук. Старый передал только как содержимое короба, без его пяти. Оба блока положил в новый короб, одним документом.

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

Четыре документа на один короб. Зато появился рабочий шаблон. На следующий день по нему ушло 14 боевых документов на 921 короб, 23 025 блоков и 138 150 кодов.

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

Пятьсот шестьдесят коробов, из которых уехало сто двадцать семь

Следующий артикул: 542 файла, 560 коробов. Оба валидатора сошлись полностью — по всем коробам, блокам и кодам. Я получил 178 годных. У клиента по тем же коробам получилось 128.

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

Безопасное пересечение — 127 коробов. Остальные 382 в ошибки: 535 кодов нашлись сразу в двух блоках. Отправлял двумя документами, 74 короба и 53: в один документ Честный Знак берёт не больше 30 000 вхождений, а 74 короба дают 29 674.

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

Нет.

Два валидатора сказали «чисто»

Другая партия, 178 коробов. Оба валидатора сошлись. Схема сошлась. Живая система показала: коробов ещё нет, можно формировать.

Отправляю первый документ на 74 короба. CHECKED_NOT_OK, и сразу две ошибки. Ошибка 22: одного кода маркировки в системе просто нет. Ошибка 21: другой код уже привязан к блоку — не к тому, в который я его кладу, а к совершенно другому.

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

Стал проверять всё дерево, до последней штуки: десятки тысяч штучных кодов и тысячи кодов упаковок. Упаковки искал сразу во всех доступных товарных группах — иначе код оказывается «не найден» просто потому, что смотришь не туда. Три короба убрал в карантин целиком. Остальные 175 пересобрал, проверил до нижнего кода и отправил. Приняли всё.

Что осталось в итоге

7 513 коробов. 98 документов с положительным статусом. 2 623 313 строк с кодами внутри. Каждый документ отправлен ровно один раз. Непонятный ответ — не повторяю, а иду читать состояние. Проверки разошлись — короб в карантин, без обсуждения. И правило, за которое я заплатил двумя отказами: пока живая система не подтвердила каждого ребёнка и каждого родителя, документ никуда не едет.

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

На каком шаге вы бы меня остановили: до первого боевого документа, после ошибки 29 или только тогда, когда выяснилось, что проверять надо всю матрёшку до последнего штучного кода?

P.S. Тем, кто писал мне про API — вы были правы. Только там, где было «нужно штук 5 запросов осилить на Rest API», оказалось четыре отказа, два валидатора и 2,6 миллиона строк. Пять запросов я осилил за вечер. Дальше начиналось всё остальное.

Показать полностью 1
5995

150 000 этикеток с кодами маркировки за 12 минут - как рвется жопка, а не кошелек!!!1

Серия «Честный Знак: лучше бы я не разбирался»

Пишет мне клиентка: «Нужно сгенерировать 150 тысяч этикеток с DataMatrix кодами Честного Знака. За один раз. Сможете?»

Конечно смогу. Когда я не мог-то. Мне предлагают заработать, а я что — откажусь?

Я делаю сервис для генерации этикеток. Штрихкоды Wildberries, коды маркировки Честного Знака, и самое вкусное — объединение того и другого на одной наклейке 58 на 40 миллиметров. Обычный заказ — двести-пятьсот штук. Ну тысяча иногда. А тут сто пятьдесят тысяч - можно сказать ОПТОМ . Я такие цифры только в калькуляторе видел.

Сказал «да». А дальше начался цирк.

PDF на 600 мегабайт, серьёзно?

Знаете, что бесит в маркировке больше всего?

Честный Знак выдаёт коды в PDF. Не в CSV. Не в Excel. В PDF. Каждый код — отдельная страница. Сто пятьдесят тысяч кодов — сто пятьдесят тысяч страниц. Шестьсот с лишним мегабайт.

Почему нельзя отдать просто текстовый файл со списком кодов? Никто не знает. Наверное, кто-то в 2019 году решил, что так будет «безопаснее», и с тех пор все страдают.

Источник: <!--noindex--><a href="https://pikabu.ru/story/150_000_yetiketok_s_kodami_markirovki_za_12_minut__kak_rvetsya_zhopka_a_ne_koshelek_13817409?u=http%3A%2F%2Fnews.drom.ru&t=news.drom.ru&h=a049ee7c6f44b51ef04534916a8dae4ac97c2394" title="http://news.drom.ru" target="_blank" rel="nofollow noopener">news.drom.ru</a><!--/noindex-->, «Дневник Хача» / <!--noindex--><a href="https://pikabu.ru/story/150_000_yetiketok_s_kodami_markirovki_za_12_minut__kak_rvetsya_zhopka_a_ne_koshelek_13817409?u=http%3A%2F%2FYouTube.com&t=YouTube.com&h=368a7b01eacdbf0e5b44f1804a2b675f69d9a938" title="http://YouTube.com" target="_blank" rel="nofollow noopener">YouTube.com</a><!--/noindex-->

Источник: news.drom.ru, «Дневник Хача» / YouTube.com

Я написал свой декодер, который вытаскивает коды обратно из этих PDF-ок. По сути, я раскодирую то, что система закодировала без причины. Абсурд? Абсурд. Но если бы ЧЗ выдавал коды нормально — половины моего сервиса не существовало бы. Так что спасибо, Честный Знак, за бизнес-модель.

Ладно, загружаю этот PDF-монстр на сервер. Ответ: 413 — слишком большой файл. Мой сервер настроен на 50 мегабайт. Для обычных заказов хватает за глаза. Для этого — нет.

Поднял лимит. Загрузка прошла. Сервер начал обработку и… тишина. Две минуты — таймаут. Соединение оборвалось. Ну да, 120 секунд на ответ, а тут работы на полчаса минимум.

Три часа ночи, или наверное утра, отдельный сервер, один я

Стало понятно: на основном сервере это не сделать. Он заточен под другое — много мелких быстрых запросов. А тут один запрос размером с небольшую базу данных.

Арендовал отдельную машину. Восемь ядер, шестнадцать гигов оперативки. Развернул копию системы с поднятыми лимитами — загрузка до гигабайта, таймауты до часа. Основной сервер работает как обычно, пользователи ничего не замечают.

И тут прилетело. Оба сервера слушали одну и ту же очередь задач. Я отправляю тестовый запрос на новый сервер — а задачу подхватывает старый. Он, понятное дело, файл не находит (файл-то на другой машине лежит) и падает. Я сижу, смотрю в логи и не понимаю, почему новый сервер простаивает, а старый в ошибках.

Разобрался. Развёл очереди. Каждый сервер слушает свою. Казалось бы, очевидная вещь — но когда ты один и делаешь это в три часа ночи, очевидные вещи имеют свойство становиться неочевидными.

42 минуты. Нет, это слишком

Первый тестовый прогон — 42 минуты на 150 тысяч этикеток. Декодирование шло последовательно, страница за страницей. Восемьдесят штук в секунду. Звучит быстро, но умножьте на сто пятьдесят тысяч.

Для разового заказа — ну ладно, потерпит. Но мне стало обидно. Восемь ядер простаивают, а я гоняю всё в один поток как дурак.

Сел переписывать. Поменял декодер, разогнал до двухсот с лишним страниц в секунду. Распараллелил — разбил PDF на восемь кусков по числу ядер. Каждое ядро жуёт свой кусок, потом склеиваю результат.

Двенадцать минут. От загрузки до готового файла — двенадцать минут. Гигабайтный PDF на выходе открывается и печатается. Я реально сидел и смотрел на это с чувством, которое, наверное, испытывают люди, когда их ребёнок первый раз встаёт на ноги. Ну, примерно.

«Всё готово, присылайте файлы»

Написал клиентке. Сервер поднят, тесты прошли, сто пятьдесят тысяч за двенадцать минут — присылайте реальные файлы, запускаем.

Тишина.

День тишины. Ладно, человек занят. Второй день. Аренда сервера тикает. На третий написал ещё: нужно ещё или нет?

«Нет, у нас отменилось.»

Всё. Четыре слова. Без объяснений. Без «спасибо, что подготовились». (Хотя они откуда могли знать мою бессонную ночь)

Без «может, в следующем месяце». Просто — отменилось.

Как говорится " Ваши ожидания - ваши проблемы"

Потом сказали: босс заказал маркировку в Китае. На фабрике. То есть вся эта история с «срочно нужно 150 тысяч» — оказалась просто одним из вариантов, который рассматривали параллельно. И выбрали не меня.

Свернул сервер. Отключил аренду. Пошёл делать чай с пустырником, ну сами понимаете мне 34 уже.

Про конкурентов и про «а зачем ты вообще это делаешь»

Знаете, что самое смешное? На рынке есть ребята, которые берут по 30 копеек за этикетку. Тридцать копеек! У меня — четырнадцать. Я дешевле в два раза. И при этом у них пять тысяч клиентов, а у меня… ну, сильно меньше...

ну как так сильно получается, как количество салютов в городе в глубинке.

Потому что они раньше начали. Потому что у них маркетинг. Потому что вес домена. Потому что люди привыкли и им лень переходить, даже если дешевле и быстрее. Классика.

А ещё на рынке есть сервисы, где ты загружаешь коды и получаешь результат через полчаса. У меня — через минуту. Но людям не с чем сравнить, они думают, что полчаса — это нормально.

Я не жалуюсь. Ладно, жалуюсь. Но продолжаю делать.

Потому что я знаю, какие боли есть у людей, которые маркируют товары. Я изучил этот рынок вдоль и поперёк. Коды только в PDF — решил. Объединение штрихкода WB и кода ЧЗ на одной наклейке — вместо того, чтобы клеить две — решил. Свой шаблон этикетки, куда штампуются коды — решил. Скорость обработки, от которой у конкурентов бы челюсть отвисла — тоже.

И вот сидишь такой, всё решил, всё работает, быстрее и дешевле всех — а клиент уходит маркировать в Китай.

Зачем я это пишу

Не для рекламы. Хотя, конечно, если вы маркируете товары для Wildberries — ну, вы поняли, гуглите KleyKod.

Я пишу, потому что накипело. Делаешь продукт один. Сам пишешь код, сам делашь СЕО, сам поднимаешь серверы, сам оптимизируешь, сам общаешься с клиентами. Приходит запрос на 150 тысяч — не спишь ночь, поднимаешь инфраструктуру, ускоряешь в три с половиной раза. А потом четыре слова: «у нас отменилось».

И ты не можешь даже нормально расстроиться, потому что через час пишет следующий клиент с вопросом «а у вас штрихкод для Вайлдберриз можно сделать?» — и ты отвечаешь «конечно, сейчас покажу». Потому что а что ещё делать.

В маркировке вообще так: сегодня горит, завтра не надо. Поставщик договорился иначе, склад передумал, логистика поменялась, босс решил делать в Китае. Ты готовишься к марафону, а тебе говорят «забег отменили, но спасибо что размялся».

Но знаете что?

Когда придёт следующий заказ на 150 тысяч — а он придёт, потому что маркировка с марта 2026-го стала обязательной почти для всех категорий товаров — я подниму сервер за час, а не за ночь. И сделаю за 12 минут, а не за 42. Потому что уже проходил.

А жопка? Жопка не порвалась. Жопка закалилась.

Показать полностью 1
32

Сделал расширение, которое убирает водяной знак Gemini при скачивании. Бесплатно

Кто генерит картинки в Google Gemini — знает боль. Скачиваешь файл, а там полупрозрачный водяной знак Nano Banana в углу. Каждый раз.

Можно руками вырезать в фотошопе. На одну картинку — минуты две.

Сделал расширение, которое убирает водяной знак Gemini при скачивании. Бесплатно

На десять — двадцать минут жизни в минус. Можно загрузить в онлайн-ремувер, но тогда твои картинки уедут на чей-то сервер.

Я программист, мне было лень. Поэтому написал Chrome-расширение Banana Clean. Работает так: нажимаешь «скачать» в Gemini — файл прилетает уже чистый. Всё.

Без кликов, без загрузок куда-то, без регистрации.

Как это устроено: расширение перехватывает скачивание и чистит водяной знак через Canvas API прямо в браузере. Картинка никуда не уходит — всё локально.

Что умеет:

— Автоматически убирает водяной знак при скачивании

— Сохраняет в PNG, WebP или JPEG — на выбор

— Переименовывает файлы в читаемые имена (а не «image (47).png»)

— Работает на gemini.google.com и aistudio.google.com

Сделал расширение, которое убирает водяной знак Gemini при скачивании. Бесплатно

Для русских пользователей — полностью бесплатно, без ограничений. Просто поставил и забыл.

За 20 дней набралось 857 установок, рейтинг 4.6 в Chrome Web Store. Не реклама — я правда один это делаю, без команды и бюджета.

Ссылка на расширение: ЗДЕСЯ

Сайт: ТУТА

Если пользуетесь Gemini для генерации — попробуйте, мне будет приятно. И если не сложно — оставьте отзыв в магазине, это реально помогает подняться в поиске среди конкурентов.

Готов ответить на вопросы в комментах.

Сделал расширение, которое убирает водяной знак Gemini при скачивании. Бесплатно
Показать полностью 3
Отличная работа, все прочитано!

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества

Недвижимость и ремонт

Теги

Популярные авторы

Сообщества