Skip to content

Latest commit

 

History

History
122 lines (92 loc) · 12.4 KB

File metadata and controls

122 lines (92 loc) · 12.4 KB

Контекст Message487

English | Русский

Обновлено 8 сентября 2026 года.

Подтверждено пользователем

  • Новое Android-приложение заменяет sms487 в отдельном репозитории.
  • ID пакета: life.andre.message487.
  • Основное позиционирование — интеграция с n8n; произвольный webhook также должен поддерживаться.
  • Оформление, стиль кода, политика конфиденциальности, документация и CI ориентируются на AndroidMegaProxy.

Исходная система

sms487 передаёт SMS и уведомления через Go API и SQS в отдельного Telegram-бота. Код бота не изучен. Миграция рабочей системы не выполнялась.

Первый этап реализации

По просьбе пользователя добавлены DevServer с Docker Compose и тестовыми workflow n8n, а также Android-клиент для проверки подключения. Клиент сохраняет адрес, отправляет искусственное событие, проверяет подтверждение с совпадающим event_id и показывает результат запроса. Есть альтернативный режим произвольного webhook с успехом по HTTP 2xx. Формат подтверждения является контрактом наших примеров, а не стандартным ответом любого workflow n8n.

Сборка и проверки выполняются через Fastlane, интерфейс — Kotlin/Compose с английскими и русскими ресурсами. Далее реализованы захват уведомлений/SMS, постоянная очередь и повторы. Авторизация webhook требует Bearer-токен, зашифрованный на устройстве. DevServer/README.md описывает запуск и ограничения локального стенда.

Риски старого клиента sms487

В предыдущем обсуждении и при чтении Android-кода выявлены риски: асинхронная отправка завершается за пределами жизненного цикла Worker, SMS receiver не использует goAsync(), между получением и сохранением есть окно потери события, стабильного идентификатора события нет. Успешный HTTP callback помечает пачку отправленной до проверки ответа. В журнал попадает начало содержимого сообщения. Эти выводы получены статически, без воспроизведения на устройстве.

Старый клиент добавляет /add-sms к адресу сервера и использует собственный формат пачек. Совместимость с этим протоколом не согласована как требование к новому приложению.

Захват и доставка

Реализованы NotificationListenerService с выбором пакетов и SMS_RECEIVED с RECEIVE_SMS и goAsync. Оба источника выключены по умолчанию. История SMS не читается. Дубли SMS и уведомлений подавляются по пакету приложения, точному исходному времени и тексту. Фильтр включён по умолчанию; его можно отключить на экране источников. Сводки групп, постоянные уведомления и собственные уведомления Message487 исключены.

Событие сохраняется в SQLite до отправки; тело запроса зашифровано AES-GCM с Android Keystore. WorkManager отправляет с повторами при временных ошибках; отдельная периодическая задача восстанавливает планирование сохранённых событий. event_id, содержимое, URL и режим подтверждения фиксируются при захвате. Смена подключения не перенаправляет очередь. Неверный ACK и постоянные HTTP-ошибки требуют ручного повтора. Неподтверждённые события не очищаются по возрасту; подтверждённое содержимое удаляется, остаётся ограниченная история метаданных. Журнал не показывает текст сообщения. Общая пауза останавливает захват и новые попытки отправки; выполняющийся запрос может завершиться. Данные исключены из резервного копирования и переноса устройства.

Ограничения: захват зависит от Android, процесс может завершиться до локального сохранения; WorkManager не гарантирует немедленную доставку. Системные ограничения на чувствительные уведомления не обходятся. Физическая очистка страниц SQLite не гарантируется. Хеши дедупликации сохраняются до очистки данных приложения независимо от удаления записей журнала. После обновления БД до версии 2 история начинается с новых событий. Это не заменяет серверную дедупликацию по event_id.

Направление продукта

Следующие пункты описывают направление; последняя успешная отправка на главном экране и просмотр содержимого журнала пока не реализованы.

  • Подключение к n8n с готовым примером workflow и тестовым событием. Альтернативная настройка — полный URL произвольного webhook. Общий транспорт отправляет JSON по HTTPS.
  • Выбор приложений и отдельное включение SMS; разрешения запрашиваются в контексте выбранного источника. Фильтрация выполняется на телефоне до сохранения и отправки.
  • Локальная очередь с сохранением до сетевого запроса, стабильным event_id при повторах и идентификатором установки вместо модели телефона.
  • Главный экран со статусом подключения, разрешений и очереди, общей паузой и последней успешной отправкой. Журнал со скрытым по умолчанию содержимым и ручным повтором.
  • Успех приёма webhook отделён от доставки в Telegram или другой конечный сервис. Очередь не удаляет неподтверждённые события молча по возрасту.
  • Секреты и содержимое сообщений не попадают в диагностику. Требования к шифрованию, резервному копированию и срокам хранения определяются до реализации хранения.

У n8n есть test и production URL; постоянная интеграция использует URL опубликованного workflow. Режим ответа Immediately подтверждает запуск workflow, а не завершение его действий. См. документацию Webhook.

Что предстоит решить

  1. Проверка энергосбережения, перезагрузки и ограничений разрешений на физических устройствах.
  2. Подтверждение приёма: после выполнения workflow либо после устойчивой записи в серверную очередь. Простой HTTP-успех не доказывает надёжное сохранение или конечную доставку.
  3. Новые методы авторизации webhook и развитие контракта. Текущий формат и поведение очереди описаны в README; лимиты неподтверждённой очереди требуют отдельного решения.
  4. Распространение приложения и необходимые проверки на устройстве. Минимальная версия первого каркаса задана в Gradle; её пригодность для будущего захвата событий ещё предстоит проверить.
  5. Нужна ли миграция текущего Telegram-сценария и остаётся ли SQS. n8n не требует автоматически отказываться от существующей очереди; PostgreSQL — один из обсуждавшихся вариантов замены.

Повторы после потери ответа могут создавать дубли. Дедупликация должна опираться на стабильный идентификатор события; гарантия exactly-once не согласована и не должна обещаться.

Ориентиры из AndroidMegaProxy

Просмотрен main на коммите c8190e97b705a2c4578d278c40a690e97c5d5f27.

  • Kotlin, Compose Material 3, системная светлая/тёмная тема, английские и русские ресурсы.
  • JDK 21, Gradle Kotlin DSL, Fastlane через Bundler как общий вход для сборки и проверок.
  • CI для PR и main: JVM-тесты, Android lint и сборка; без обязательного эмулятора на GitHub.
  • APK-артефакты PR без ключей релизной подписи; выпуск и подпись отдельно от PR CI.
  • Публичная политика конфиденциальности описывает фактическое поведение приложения.

VPN, Go/JNI, DNS-диагностика и детали публикации MegaProxy не являются требованиями Message487. Политику конфиденциальности нельзя копировать дословно: Message487 передаёт содержимое событий выбранному получателю, а n8n и последующие сервисы имеют собственные правила хранения.

Реализованы локальные логи с ротацией, диалог после креша и ручная отправка ZIP-отчёта; см. диагностику. Адрес: der-morgenstern@yandex.ru.

Наборы тестов и команды CI описаны в тестировании; Compose UI-тесты выполняются на Robolectric без эмулятора.

Подписанные APK используют параметры окружения, как в MegaProxy; см. релизы.