Завязка истории о чеках

Недавно начал новый проект. Он называется Receipts. Дело вот как началось: однажды зашёл в магазину Взял хлеба. Очень хотелось чипсов. Долго выбирал, все какие-то... эх, куда делись мои Pringles? Взял запасной вариант, пошёл оплачивать, а приложить к терминалу скидочную карточку магазина забыл. Не знаю, почему забыл, видимо торопился. И вот без карты и мне распечатался бумажный чек покупки. Решил забрать его. Чек позже валялся у меня на рабочем столе, шуршал и мялся. И мне стало интересно, что это за QR код на нём.

Оказалось, что код содержит так называемые фискальные данные. А именно дату, сумму чека, а так же загадочный номер фискального носителя, номер фискального документа, фискальный признак и тип операции. Если вы расшифруете код с чека то получите примерно такой выход:

t=20260724T1942&s=334.98&fn=7384440800504330&i=65870&fp=106002757&n=1

Вы уже смекаете, в чём дело? Нет? Ах да... конечно, ваш мозг не варился последние три недели в этой каше... Дело вот в чём. Чек этот можно отсканировать в специальном приложении и получить по нему кучу данных. Общая сумма чека - это понятно. Но в ответе так же есть и список товаров, что вы покупали. Примерно вот такой:

{
  "items": [
    {
      "nds": 2,
      "sum": 8499,
      "name": "Батон НАРЕЗНОЙ  в/с нарез. 400г",
      "price": 8499,
      "quantity": 1.0,
      "paymentType": 4,
      "productType": 1,
      "isProductMarked": false,
      "itemsQuantityMeasure": 0
    },
    {
      "nds": 11,
      "sum": 24999,
      "name": "LAY'S Чипсы карт.вк.краба 225г",
      "price": 24999,
      "quantity": 1.0,
      "paymentType": 4,
      "productType": 1,
      "isProductMarked": false,
      "itemsQuantityMeasure": 0
    }
  ]
}

Но не одними товарами едины, помимо них в чек ещё попадают:

  • ИНН магазина
  • При наличии, физический адрес магазина
  • Имя оператора, что вас обслуживал
  • Проценты по НДС для каждого продукта и чека в целом
  • Данные Честного знака для каждого из товаров, если есть
  • Номер смены на этом аппарате
  • Номер чека в рамках этой смены
  • Оператор фискальных данных этой кассы

Товары в чеке весьма интересные. Когда я увидел уродливый JSON ответ от мобильного приложения сканера чеков (они вообще разные бывают, я использовал приложение "Проверка чеков" от ФНС), то придумал идею для нового проекта.

В общем, суть такая: собрать как можно больше чеков, провести их через API, собрать данных, а потом устроить аналитику. Собственно, заготовку для системы сбора я уже написал. Она использует отличную библиотеку, которая помогает в обход разных приложений и отправки бумажного письма в налогоую, сразу из API ФНС получать данные о чеке. Надо лишь предоставить эти 5 фискальных параметров с QR кода на вход. Моя система же работает как обёртка и коллекционирует в своей базе все ответы от API. Зачем мне оно надо? Я хочу просто узнать, что с этим можно вообще сделать. В идеале данных тут немало.

Вычленить можно (при большой базе) можно хотя бы вот что:

  • Список магазинов и их точки продажи
  • Список уникальных товаров среди магазинов
  • Список имён продавцов по каждому магазину, при наличии
  • Наиболее популярный товар среди магазинов
  • Динамику цен в рамках товара между магазинами или по времени
  • Средний чек покупателя по магазину или в целом
  • Наиболее популярный к покупке товар
  • Общую сумму всех чеков за период
  • Названия товаров и динамику цен

Как по мне, весьма неплохо. Плюс, если вы ведёте базу только для себя, то можно её хорошо так использовать для учёта личных расходов. Это, конечно, классно, вести статьи расходов и доходов, но вы представьте, как в теории может быть красива сводка, где вам за месяц пишется не просто "вы потратили более всего денег на еду", а называются ещё и конкретные товары, что дорого обошлись. Что-то в стиле "вы съели макарон в этом месяца на столько то денег". Да, знаю, пока мало кто может сделать такую систему рабочей, но готовить данные надо с осени.

Ах да, я вот ещё что обнаружил. Есть такой сайт, называется Мои чеки онлайн, на нём можно узнать все свои фискальные чеки за последние годы. И узнать сразу все чеки, что привязаны к вашей почте или телефону. Они, конечно, не экспортируются, но я сгенерировал небольшой скрипт, чтобы всё скачалось. Единственное что от вас требуется: зайти на страницу и потом в консоли исполнить этот скрипт:

my_receipts_online_dumper.js

Он скачает все QR коды как изображения. Да, только как QR, никаких готовых данных. Для их получения надо прогонять каждый QR через API от CRPT. CRPT - это приложение Честного знака, но его можно использовать не только для проверки маркировок на товарах, но и для получения всех данных о чеке. Если вы захотите попробовать вручную, то просто вставьте данные отсканированного чека вот в такого рода запрос:

QR="t=20260724T1942&s=334.98&fn=7384440800504330&i=65870&fp=106002757&n=1"

curl -s -X POST "https://mobile.api.crpt.ru/mobile/check" \
    -H "content-type: application/json" \
    -H "accept: application/json" \
    -H "user-agent: Platform: iOS 17.2; AppVersion: 4.47.0; AppVersionCode: 7630; Device: iPhone 14 Pro;" \
    -H "client: iOS 17.2; AppVersion: 4.47.0; Device: iPhone 14 Pro;" \
    -d "{\"code\": \"$QR\", \"codeType\": \"qr\"}"

Если хотите красивый вывод, добавьте в конец | jq - API возвращает JSON формат. Увы, QR код надо отдельно парсить, чтобы получить его значение. Это можно делать только скриптами, поэтому массовая обработка возможна только путём небольших раздумий и открытого терминала.

Собственно, примерно этим и занимается мой проект Receipts - сканирует чек, отправляет запрос в CRPT и перед выдачей результата, сохраняет добытый чек в свою локальную базу данных. Я пока не тороплюсь разбивать данные и проводить аналитики, потому что мне охота собрать как можно больше чеков для начала.

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

Но это я привычный: тот что лишь просит. А что я дам взамен за чеки? Пока что мне нечего предложить, но я собираюсь провести аналитику этих данных. Выставлять в открытый доступ сами данные я не буду, только результаты с них. Вероятно, на это уйдёт какое-то время. Впрочем, я планирую проект выложить в открытый доступ, так что если у вас будет желание самостоятельно изучить всё это дело или провести аналитику и учёт для себя: можете посетить GitHub этого проекта.


Да, я пробовал выложить этот проект на Tau, но вот проблема: запросы к API CRPT, с помощью которого мы добываем данные, работает только из русских IP. А мой Tau лежит в Нидерландах, поэтому для хостинга не подходит. Весьма печально. Я пытался настроить прокси, но успехом это дело не увенчалось.