---
name: chekpilot_overview
description: "ChekPilot — авто-кэшбэк за чеки РФ через официальный канал ФНС MCO + партнёры; план, recon API ФНС, статус"
metadata: 
  node_type: memory
  type: project
  originSessionId: 52dd8a41-3322-48b9-b45e-fa17afb81eb6
---

# ChekPilot — авто-кэшбэк за чеки РФ (планирование, 2026-05-31)

Личный проект пользователя: полностью автоматический кэшбэк за чеки **без риска бана**. Чеки приходят на email из магазинов.

**Ключевое открытие:** «full auto без бана» = **официальный канал ФНС**, не бот-имитатор сдачи. Ядро: ФНС «Мои чеки онлайн» (mco.nalog.ru) → привязать телефон+email → в разделе «Партнёры» авторизовать **Едадил/Qrooto/Кошелёк** → чеки авто-уходят партнёрам, кэшбэк начисляется сам, антифроду реагировать не на что (санкционировано ФНС). Один чек → всем партнёрам сразу.

**Роль софта (оптимизатор поверх):** MCO-reader (аналитика своих чеков), email-backstop (чеки вне MCO → регистрация в ФНС), советник «что купить», авто-вывод (Phase 3), TG-бот с детальным дайджестом «найдено N чеков на X ₽» + подтверждение перед отправкой. Сквозной анти-фрод: реестр чеков по **ФПД** + state machine + строгий дедуп (использованный чек не трогать повторно).

**Recon API ФНС (2026-05-31, оба живы):**
- Канал A читать свои чеки: `mco.nalog.ru/api`, эталон github jfk9w-go/lkdr-api (дек 2025). Auth: phone+SMS+капча 1 раз → refresh-token. `POST /v1/receipt` (список) + `POST /v1/receipt/fiscal_data` {key} (позиции).
- Канал B регистрация QR: `irkkt-mobile.nalog.ru:8888` (старый :9999 мёртв). Auth **без капчи** по ИНН+пароль ЛК ФЛ: `POST /v2/mobile/users/lkfl/auth`. Регистрация: `POST /v2/ticket` {qr}. ⚠️ irkkt↔mco синхронизация не гарантирована — проверить.
- Офферы скрейпить бесплатно НЕЛЬЗЯ (Едадил squark закрыт→404, веб за Yandex SmartCaptcha, Кошелёк B2B, Qrooto приватный). Советник → ретро-аналитика MCO + опц. Playwright+storage_state капча-gated.

**Решения юзера:** полу-авто ассистент + советник + авто-вывод; сервисы Едадил/Кошелёк/VK/Qrooto; интерфейс TG-бот; только бесплатные источники; секреты в **macOS Keychain**; хост **mac mini**; переиспользовать механизм капчи из zemlya-bot/[[cebersresearch_overview]] (Playwright storage_state).

**БЕЗОПАСНОСТЬ ЛК налога (D9, важно):** пароль ЛК налога В СИСТЕМУ НЕ ПОПАДАЕТ. Оба канала ФНС — телефон+SMS (капча 1 раз), храним только узкие refresh-токены (доступ только к чекам, не к декларациям/платежам). Least privilege на API, токены не логируются, Keychain+ACL, Госуслуги НЕ автоматизируем, kill-switch=смена пароля nalog.ru. lkfl-auth (ИНН+пароль) ОТВЕРГНУТ.

**Стек (по образцу [[gaechkin_planning]]):** aiogram 3.28 + pydantic-settings + SQLite(aiosqlite) + launchd `local.chekpilot` + TG_PROXY :2081 + [[omniroute_cloud_bus]] :20127. venv `~/.venvs/chekpilot`, проект `~/Разработки/ChekPilot`. zbar поставить (`brew install zbar`) для pyzbar.

**СТАТУС 2026-05-31 — Phase 1 идёт, оба источника РАБОТАЮТ вживую:**
- Проект `~/Разработки/ChekPilot` (локально на MacBook, py3.14 venv `~/.venvs/chekpilot`, Playwright 1.60). Деплой на mini позже.
- **Email-парсер** (`chekpilot/parser/`): Такском + 1-ОФД, позиции из тела письма, ключ дедупа ФН:ФД:ФПД. **40/40 чеков OK** (товары/развес/услуги). IMAP Яндекс в Keychain (`chekpilot.imap_password/imap_user`).
- **MCO-reader** (`chekpilot/mco/reader.py`) **РАБОТАЕТ**: `bootstrap_mco.py` (Playwright, постоянный профиль, токены из localStorage `refresh.token`/`auth.token`/`sourceDeviceId` → Keychain `chekpilot.mco_refresh_token`+`mco_device_info`), refresh `/v1/auth/token`, `Bearer auth.token`, `list_receipts` `/v1/receipt`, `fiscal_data` `/v1/receipt/fiscal_data`. Отдаёт структурные позиции, покрывает больше почты (OZON/Майрест). **MCO = основной источник, почта = backstop.**
- Партнёры подключены: Едадил + Т-Банк. Капча — 1 раз при bootstrap.
- **Реестр SQLite + ингест ГОТОВ** (`chekpilot/db.py`+`ingest.py`, WAL): ingest_mco инкрементально, `fuel_summary_db` мгновенно. Проверено: 100 чеков → топливо май 245.44 л/16342.66₽/8 заправок = ровно как live.
- **Топливная фича ГОТОВА** (`chekpilot/analytics/fuel.py`): `fuel_summary`/`fuel_summary_db` — литры+рубли за период, любые АЗС (детект по позиции), извлечение литров из названия (Сургутнефтегаз «x14.000»), дедуп дубль-чеков (ИНН+литры+сумма в 30 мин).
- **Интерфейс (D11): НЕ отдельный бот** — встроить в **cebers-pulse** (`/Users/cebers_mini/Services/cebers-pulse`, py3.12, launchd `com.cebers.cebers-pulse`, Keychain service `cebers-pulse`) подпакетом `src/cebers_pulse/chekpilot/` + reply-кнопка «💰 Мой кэшбэк» в модуле `advisor` → inline-подменю (⛽Топливо/Траты/Кэшбэк/Вычеты). Паттерны кнопок: `advisor/telegram/{menu,handlers}.py`.
- **Хранение (юзер): всё на mini, БД на внешнем диске `/Volumes/Ext/chekpilot/`** (940 ГБ free).
- **ДЕПЛОЙ ВЫПОЛНЕН (2026-05-31):** chekpilot на mini `~/Разработки/ChekPilot` + `pip install -e` в venv cebers-pulse. Интеграция `chekpilot/integrations/pulse.py` (build_cashback_router + CASHBACK_BUTTON_TEXT «💰 Мой кэшбэк» + inline-подменю ⛽Топливо). Правки cebers-pulse: `advisor/telegram/menu.py` (кнопка), `main.py` (include_router до advisor). БД на `/Volumes/Ext/chekpilot/chekpilot.db` — снапшот 200 чеков (март–май). Бот перезапущен, polling @CebersPuls_bot id=8667188274 чисто.
- ⚠️ **Латентный баг:** в venv cebers-pulse не было `aiohttp-socks` (TG_PROXY) — поставил; рекомендовать внести в pyproject cebers-pulse.
- Секреты Keychain mini писать с `-A` (launchd читает без GUI-запроса).
- **АВТО-ИНГЕСТ В ПРОДЕ (2026-05-31):** MCO-токен в Keychain mini (перенесён с MacBook файлами + `security add -A` в GUI-терминале AnyDesk — lkdr дал лимит на повторный вход, ssh login-keychain не пишет). launchd-таймер `com.cebers.chekpilot-ingest` (`scripts/run_ingest.py`, 1800с, RunAtLoad) — работает (`ingest OK +0 new total=200`), токен авто-ротируется, лог `~/Library/Logs/chekpilot-ingest.log`.
- **ГРАБЛЯ (важно):** launchd-агент с доступом к login-keychain поднимать `launchctl bootstrap gui/$(id -u)` ИЗ GUI-сессии (AnyDesk), НЕ по ssh — иначе виснет на Keychain (ssh-bootstrap завис 86с, GUI ок). Касается любых будущих агентов на mini, читающих Keychain.
- **Кнопка видна (reply-клава обновилась) — юзер подтвердил «заправки работают в боте».** inline-клаву `/start` трогать не понадобилось.
- **ВСЕ 4 РАЗДЕЛА В ПРОДЕ (2026-05-31 ч.2):** ⛽Топливо (live, подтверждён) + 🛍️Траты за месяц + 🧾Налоговые вычеты + 💸Кэшбэк. Новые модули: `analytics/categories.py` (regex продавец→категория), `analytics/spending.py` (`spending_summary_db` — сумма/категории/топ-продавцы, навигация ◀ месяц), `analytics/deductions.py` (`deductions_summary_db(year)` — детект 💊лекарства/🏥медуслуги/🎓обучение/🏋️спорт, ~13% возврат, лимит 150к, дисклеймеры). `integrations/pulse.py`: хендлеры `cashback:spend/ded/cb`, `_nav_kb(kind)`, `_fmt_spend/_fmt_deductions/_fmt_cashback`. **Решения D12** (Кэшбэк=инфо-панель, MCO не отдаёт рубли, `brand_id`≠кэшбэк), **D13** (категоризация regex, не LLM — 0 токенов/детерминированно).
- **Верификация на боевой БД (200 чеков):** Траты май 84 439.18₽/85 (Продукты 27218/Маркетплейсы 22922/Топливо 18850.7); апр 69 748.30₽/83; Вычеты-2026 аптека ЭРКАФАРМ 947₽→~123.11₽. Рендер HTML валиден (escaping `&quot;`). Бот рестартнут, polling чисто. **Все 200 чеков свои** (buyer=email 178+тел 22), фильтр покупателя не нужен. `brand_id`≠кэшбэк (бренд/программа магазина).
- ⚠️ **tg-web-e2e tap НЕ прогонял:** shared test-акк `8688355181` не в admin_ids (cashback super-admin only) → «Нет доступа». admin-user-ids в login-keychain по ssh не читается (exit 36). Живой тап 3 новых кнопок — за юзером 1005954706. Обвязка = топливная (live ОК).

**ТОЧНЫЕ ЦИФРЫ КЭШБЭКА — выбор источника + спайк эмулятора (2026-05-31 ч.3):**
- **Расширенный кэшбэк (D12 info-панель → реальные цифры):** юзер хочет точные суммы + автоматизацию (цикл: бот находит чеки → прогноз «получишь ~X₽» → одобрение → отправка → факт «вернулось X₽»). Email-канал отпал (письма Едадила — промо без сумм; MCO рубли не отдаёт — подтверждено повторно).
- **Разведка вариантов** (agent WebSearch): (A) **перехват пушей** Android 24/7 → ntfy/adb → бот: точно/авто/риск~0/без паролей/D9-safe/оба партнёра, нужен Android-девайс; (B) **реверс-API Т-Банка** `jfk9w-go/tbank-api` (поле `cashbackAmount`, копейки) — но **нужен пароль ЛК Т-Банка (нарушает D9)**, Selenium+SMS, ToS-риск, Go; (C) фиксация по факту вывода. Официальных персональных API нет (Т-Банк T-API только B2B; Invest=брокер). Реверса мобильного Едадила нет публично.
- **Решение юзера: вариант A (пуши) через Android-ЭМУЛЯТОР (без реального телефона), пока ТОЛЬКО Едадил.** Гранулярность: нужны и прогноз-до, и факт-после.
- **СПАЙК ЭМУЛЯТОРА (на MacBook cebers, НЕ на mini) — Едадил РАБОТАЕТ:** AVD `chekpilot` (android-35 google_apis arm64, pixel_6), запуск headless `emulator -avd chekpilot -no-window -no-audio -no-boot-anim -no-snapshot -gpu swiftshader_indirect -dns-server 8.8.8.8,1.1.1.1`. **DNS грабля:** AVD slirp на macOS НЕ подхватывает хостовый DNS → `net.dns1` пуст, «unknown host» → ОБЯЗАТЕЛЕН флаг `-dns-server 8.8.8.8,1.1.1.1` (IP-связность есть и без него). APK Едадила: apkcombo через Playwright (`/tmp/dl_edadeal*.py`, fallback `pg.request.get(href)` — анти-бот режет curl, но не Playwright), **нужен именно arm64-v8a** (versionCode 46803, 74.5МБ; 46801=armeabi-v7a→`NO_MATCHING_ABIS`, 46804=x86_64). Подпись легитимная `CN=Slava Ivanov, OU=Edadeal`. Логин Едадила = **Yandex ID** (юзер вошёл своим `…@yandex.ru` в окне эмулятора windowed-перезапуск). **Едадил НЕ детектит эмулятор** (анти-эмулятор не сработал), уведомления разрешены (пуши будут).
- **АРХИТЕКТУРА КЭШБЭКА (важно):** раздел кешбэка = **WebView мини-апп `@edadeal/cb`** (грузится с yandex.ru), навигация в `content-desc`: `section:"transactions"` (история начислений по чекам), `section:"search"` (офферы), `openBalanceBonus:"tBankForm"` (вывод через Т-Банк). **Данные тянутся JSON-API** → чистый способ извлечения = **mitmproxy перехват API** (структурно), НЕ скрейп (uiautomator WebView-текст НЕ отдаёт, только «yandex.ru/AD» — остаётся OCR скриншота, хрупко). Транзакции с суммами реальны: видел «Кешбэк начислен +9,29 ₽» / «Списание бонусов −9,29 ₽» (нетто 0₽ — начисление сгорело). Кошелёк: вкладки Баланс/Чеки/Заказы, «В кошельке 0₽», алмазы 500.
- **СЛЕДУЮЩИЙ РИСК (до сборки пайплайна):** HTTPS-MITM на targetSdk35 — WebView не доверяет user-CA по умолчанию → нужен **system-CA** (`emulator -writable-system` + remount) + возможен **cert-pinning** Яндекса. Это спайк №2 перед сборкой. План пайплайна: эмулятор(@edadeal/cb) → mitmproxy JSON → `chekpilot.db` (таблица `cashback_events`/`offers`) → кнопка 💸 Кэшбэк реальными цифрами + прогноз матчингом чек↔офферы. cebers-pulse не трогать пока юзер в спорте.
- **Артефакты спайка:** AVD `~/.android/avd/chekpilot.avd` (Едадил установлен+залогинен, userdata хранит сессию), APK `/tmp/ed_46803.apk` (arm64), скрипты загрузки `/tmp/dl_edadeal*.py`, лог эмулятора `/tmp/chekpilot_emu.log`. Т-Банк отложен (детектит эмулятор + нужен пароль).

**СПАЙК №2 — MITM JSON-API (2026-05-31 ч.3, ЗАВЕРШЁН): api.edadeal.ru ЗАPINNED.**
- mitmproxy 12.2.3 в venv chekpilot. CA-инжект на Android-15 (apex-conscrypt) сделан: `-writable-system` + `adb root` + tmpfs-overlay `/apex/com.android.conscrypt/cacerts` + **nsenter в namespace zygote/процесса** (у аппов отдельный mount-ns; глобальный mount не виден — лечится `nsenter -t <pid> -m -- mount+cp`). Хэш-имя cert: `openssl x509 -subject_hash_old` → `<hash>.0`. Прокси: `adb shell settings put global http_proxy 10.0.2.2:8080`.
- **Результат:** CA подхватился (сторонний `userx.pro/getConfigs` расшифровался 200), НО **`api.edadeal.ru` certificate-pinned** → приложение пишет «Нет интернета», TLS к своему API отвергает даже с доверенным системным CA. Чистый JSON-MITM Едадила невозможен без **frida-распиннинга** (доп. инструмент + анти-тампер риск Яндекса + хрупко на апдейтах). leonardo.edadeal.io / datasync.edadeal.ru тоже Едадила.
- **ВЫВОД ПО ИЗВЛЕЧЕНИЮ:** (1) **перехват уведомлений** (вариант A, исходный выбор юзера) — пиннингом НЕ затронут: `dumpsys notification --noredact` видит каналы Едадила (`edadeal_prod2` Общие, `edadeal_prod2_hot_deals`), читаем «+X₽ кешбэк начислен» в реалтайме; (2) **OCR скриншота** экрана Кошелёк (tesseract на mini есть) — баланс+история (uiautomator WebView-текст не отдаёт). MITM/frida — НЕ рекомендую.
- **ЧЕСТНЫЙ COST/BENEFIT (на решение юзеру):** полный эмулятор-пайплайн дорог/хрупок — 24/7 AVD на тесном 16GB mini (~2-4GB RAM), Yandex-сессия протухает (повторный логин), OCR/пуш-парс ломается на апдейтах Едадила, А кэшбэк мал/0 (твой +9.29₽ сгорел, кэшбэк только по акциям). Варианты глубины: A) пуш-капчур (реалтайм факт, пиннинг-иммунный, чистейший из эмулятор-путей); B) +OCR баланса/истории; C) frida full-JSON (тяжело/гамбл); D) оставить D12 инфо-панель (не строить эмулятор). Спросить юзера до сборки.
- **РЕШЕНИЕ D14 (юзер): вариант D — НЕ строить эмулятор-пайплайн.** Дорого/хрупко (AVD 24/7 на 16GB mini, протухающая Yandex-сессия, OCR/пуш-парс ломается на апдейтах) несоразмерно кэшбэку (0₽, +9,29₽ сгорело, только по акциям). Кнопка 💸 Кэшбэк = честная инфо-панель D12. **ПРИБРАНО:** AVD `chekpilot` удалён (Яндекс-сессия стёрта), mitmproxy остановлен, /tmp очищен от APK/скриптов/CA. **cebers-pulse за всю разведку НЕ трогался** (юзер параллельно в спорте — важно: при правках cebers-pulse делать pull/sync, не затирать спорт). Если вернёмся к точным цифрам — вариант A (пуш-капчур `dumpsys notification`, пиннинг-иммунный), frida/mitm не трогать. Реверс-API Т-Банка отвергнут (нужен пароль ЛК, D9).
- Правки cebers-pulse/chekpilot: Edit локально `~/Разработки/ChekPilot`→scp на mini `~/Разработки/ChekPilot` (editable-install подхватывает)→`launchctl kickstart -k gui/$(id -u)/com.cebers.cebers-pulse`. БД `/Volumes/Ext/chekpilot/chekpilot.db`. Профиль Playwright lkdr `~/.chekpilot/mco_profile` (MacBook).
- **Осталось:** (1) живой тап 3 кнопок юзером; (2) email-backstop + irkkt для чеков вне MCO; (3) внести aiohttp-socks в pyproject cebers-pulse (латентный баг).

**Прежний статус (выполнен): ЗАБЛОКИРОВАНО на prerequisites от юзера** — настройка MCO+партнёры (фундамент) + доступы (ИНН+пароль ЛК ФНС, телефон, IMAP app-password). Код не начат (ждём кредов чтобы строить и сразу верифицировать). План: `~/.claude/plans/enchanted-meandering-ritchie.md`. Obsidian: `Projects/ChekPilot` (5 файлов).
