- бот: @username / имя / tg:id; веб: аккаунт сессии или «аноним»
- новая колонка FILES.web_account (tg:/yandex:/vk:/email:) — пишется в
_finalize_submit из резолвнутого аккаунта, чтобы у залогиненных веб-юзеров
атрибуция работала для любого способа входа (раньше только Telegram)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Бэкенд: разбивка WEB_SOURCES по дням (out.daily[].sources + source_names).
Фронт: 4-й малый график в «Активность по дням» с легендой; цвета — из
валидированной палитры, закреплены за источником (Yandex/Google/Прямые/…).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Таблица WEB_PAYWALL_EVENTS: пишется при показе пейвола (_finalize_submit),
статус обновляется при оплате (_db_mark_payment_paid) и освобождении по
подписке (/api/held/release). Разовый бэкфилл текущих awaiting_payment (веб+бот).
Раздел в админке: дата, пользователь, файл, размер, стр., источник, статус.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Источник — WEB_ACCOUNTS (created_at, способ = префикс account_id) + обогащение
именем/почтой из последней сессии WEB_SESSIONS.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- футер сайта вёл на несуществующий @pdf2scan_bot (t.me не резолвил) → @pdf2scan_pybot
- клик по ссылке открывает приложение (tg://resolve) с откатом на веб t.me
- логин на /developers тоже открывает приложение (d.url = tg://), а не браузер
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Документы: сегменты сайт/бот позиционируются absolute от низа (bottom:0 и bottom:siPx),
стыкуются вплотную — flex-подход давал зазор из-за нерезолвимых высот
- Плитки метрик ~вдвое ниже (padding 9px, val 20px); убрана плитка «Среднее на страницу»
(среднее с/стр перенесено в подпись «Общее время обработки»)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Вложенные проценты во flex-стеке не резолвились → между синим (сайт) и фиолетовым
(бот) появлялся прозрачный зазор (белый фон карточки). Теперь высоты сегментов
считаются в пикселях от высоты графика (78px), сегменты стыкуются вплотную.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- RU title/description/keywords переписаны под реальные запросы («эффект сканирования»,
«как отсканированный», «добавить эффект скана», «без сканера», Word)
- FAQ (ru/en): server-rendered видимый блок (<!--SEO_FAQ-->, <details>) + FAQPage JSON-LD
в head — контент под запросы и заявка на rich snippet
- Оферта: ИП Букреев Александр Иванович (было Игоревич)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- daily: split файлов по источнику (files_site/files_bot по user_id==WEB_USER_ID)
- Секция «Активность по дням» — 3 малых кратных (визуально выровнены по дню):
заходы (синий), документы (стек: сайт #007AFF / бот #5856d6), страницы (аква #1baf7a);
разные шкалы у метрик, поэтому small multiples, не один график с двумя осями
- «Активные подписки» перенесены в самый низ страницы
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- _notify_user_payment: письмо-подтверждение после успешной оплаты (sub/file/api_pro/donate),
дедуп WEB_PAYMENTS.user_notified; фискальный чек по-прежнему шлёт ЮKassa
- _run_expiry_warnings_once (в цикле автопродления, раз в 6ч): за ≤3 дня до конца подписки
без автопродления — сообщение в Telegram (tg:*), иначе письмо на pm_email; один раз на
период (WEB_ACCOUNTS.warned_until); pm_email сохраняется при каждой оплате подписки
- Модалка входа по почте: подсказка «Письма нет? Проверьте папку Спам» (7 языков)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- WEB_FUNNEL: paywall_shown/pay_click (фронт, /api/track) + pay_success (серверно);
в админке раздел «Воронка пейвола» с конверсией шагов (30 дн / всего)
- Раздел «Ожидают оплаты» — придержанные файлы (awaiting_payment) как лиды
- /offer|/oferta: публичная оферта (подписка, автопродление, возвраты); ссылки в футере
(7 языков) и в пейволе («Оплачивая, вы принимаете условия…»)
- POST /api/alert (ALERT_TOKEN, антифлуд 60с) → Telegram владельцу; используется скриптом
лечения туннеля на vds178
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Маячок /api/hit шлёт {ref: document.referrer, url} → сервер определяет источник
- _source_from: приоритет utm_source, иначе домен referrer (Google/Yandex/Telegram/VK/…),
переходы внутри сайта и пустой referrer → «Прямые заходы»
- Таблица WEB_SOURCES(day,source,count); в админке раздел «Источники трафика» (источник/заходов/доля)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Статистика по дням (14 дн): заходы/уникальные + файлы/страницы/исходный+конечный размер
- Числа заходов подписаны над столбцами графика
- Карточка «Время обработки»: суммарное время (из elapsed_time) + среднее с/страницу
- Уведомление владельцу в Telegram при успешной оплате (_tg_send через api.telegram.org,
дедуп через WEB_PAYMENTS.notified, отправка в отдельном потоке)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Длинные имена с white-space:nowrap растягивали таблицу шире экрана и левые
колонки уезжали за край. Колонка «Файл» теперь max-width 300px + ellipsis,
полное имя — в title (подсказка) и в CSV-экспорте.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- /api/paywall/check: решение сервера до загрузки файла → пейволл показывается
сразу для больших файлов (не грузим тяжёлый файл впустую)
- Загрузка файла — только при клике оплатить (upload-on-pay)
- Пакетная обработка (2+ файла, папка, ZIP) — только по активной подписке
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- seo_about (7 языков): бесплатно до 50 МБ/100 стр, больше — 99₽/подписка
- Видимая строка у загрузки про бесплатный лимит и цены
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- _finalize_submit держит большой файл (awaiting_payment) без активной подписки;
account из cookie-сессии (Yandex/VK) или tg user_id
- Оплата purpose=file (снимает задание с холда) / sub (+30 дней, снимает холд)
- Фронт: карточка пейволла (99₽/подписка), обработка возврата, single+batch
- Старый auth-баннер больших файлов заменён пейволлом
- Включается флагом PAYWALL_ENABLED (в .env)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- /api/auth/vk/{start,callback}: PKCE (code_verifier в cookie), обмен на
id.vk.com/oauth2/auth + user_info, аккаунт vk:<id> + cookie-сессия
- Кнопка VK в меню входа, i18n
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- OAuth Yandex ID: /api/auth/yandex/{start,callback}, cookie-сессии, /api/me, logout
- Меню входа Telegram/Яндекс в шапке, определение сессии
- Бэкенд пейволла (WEB_ACCOUNTS/подписка, purpose file/sub) — под флагом
PAYWALL_ENABLED (по умолчанию 0: прежний порог авторизации, ничего не ломается)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Бэкенд: /api/pay/create, /api/yookassa/webhook (перепроверка через API),
/api/pay/status (активный фоллбэк без вебхука), таблица WEB_PAYMENTS,
колонка WEB_API_KEYS.paid_until, активация plan=business на 30 дней
- Сайт: оплата картой в блоке поддержки (сумма + email для чека 54-ФЗ)
- /developers: оплата тарифа Business, i18n оплаты (7 языков)
- Ключи только из env (YOOKASSA_SHOP_ID/SECRET)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>