Как работает автозапись трат по пушам и СМС

Как работает автозапись трат по пушам и СМС

Служба автозаписи трат в приложении "Считаю" (Tally) позволяет полностью автоматизировать учет ваших финансов. Как только вам приходит PUSH-уведомление от банка или СМС-сообщение о покупке, приложение перехватывает его в фоновом режиме, а наш искусственный интеллект мгновенно распознает сумму, валюту, категорию расходов, бренд (магазин) и автоматически добавляет транзакцию в вашу ленту.

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

Настройка автозаписи

На экране "Настройки" -> "Автозапись трат" находятся три переключателя. Они спроектированы по принципу наращивания стабильности работы в фоне: каждый последующий уровень делает фоновую работу приложения все более независимой от ограничений операционной системы Android.

Для работы автозаписи требуется выдать приложению доступ к уведомлениям. Это активирует системную службу Android ("NotificationListenerService"). Без этого разрешения операционная система Android из соображений безопасности не позволит ни одному приложению читать содержимое шторки уведомлений.

Чтобы Android не усыплял приложение при длительном простое, необходимо исключить его из списков энергосбережения системы (Doze Mode). Это гарантирует, что служба прослушивания пушей продолжит реагировать на приходящие сообщения, даже если вы не открывали приложение несколько дней.

Для максимальной надежности запускается постоянный фоновый процесс ("Foreground Service"), который висит в оперативной памяти и имеет приоритет наравне с навигатором или музыкальным плеером. Android обязывает показывать уведомление для таких служб (плашка "Считаю ваши траты"). Однако вы можете скрыть это уведомление в системных настройках Android для категории "Автозапись трат" ("bank_push_channel"), сохранив все преимущества 100% стабильности фонового процесса.

Чтение СМС и импорт истории

Иногда банковские пуши не приходят, например, при плохом интернет-соединении, или банк присылает обычные СМС. В "Считаю" встроена поддержка чтения входящих СМС и импорта их истории.

Для этого в манифесте приложения запрашиваются разрешения "RECEIVE_SMS" и "READ_SMS". Как только на телефон приходит СМС об операции, система запускает "SmsReceiver" (наследник класса "BroadcastReceiver"). Он перехватывает событие "SMS_RECEIVED_ACTION", собирает тело многосегментного сообщения и передает его через нативный мост во Flutter по каналу "EventChannel".

Если вы только установили приложение или хотите перенести старые траты, вы можете использовать импорт истории СМС за последние 30 дней. При нажатии кнопки импорта Flutter вызывает нативный метод "importSmsHistory" через "MethodChannel". Приложение обращается к контент-провайдеру Android по адресу "content://sms/inbox", считывает сообщения от банков и отправляет их на сервер для распознавания.

Различия версий для магазинов

В зависимости от того, откуда вы установили приложение, доступность функций различается. Мы используем три сборки (Gradle flavors):

  1. Версия с сайта (direct): Содержит встроенное автообновление ("REQUEST_INSTALL_PACKAGES") и полный доступ к чтению и импорту СМС.
  2. Версия для RuStore (rustore): RuStore обновляет приложение сам, поэтому автообновление отключено, но доступ к СМС полностью сохранен.
  3. Версия для Google Play (store): Google Play запрещает приложениям запрашивать СМС-разрешения без статуса дефолтного СМС-клиента. Поэтому в версии для Google Play чтение и импорт СМС полностью вырезаны на уровне манифеста и кода, чтобы избежать блокировки приложения в магазине.

Как ИИ понимает текст сообщений

Для мамы это выглядит как чудо: умный робот-секретарь читает сообщение, сразу понимает, сколько вы потратили, в каком магазине были, и сам раскладывает покупку по нужным полкам. Он легко разбирается в сокращениях вроде "POS" или "AC No", понимает разные валюты в отпуске (например, дирхамы AED или лари GEL) и сам переводит их в рубли.

Для гиков под капотом работает целая инфраструктура на FastAPI бэкенде:

  1. Локальная фильтрация: Чтобы экономить заряд батареи и сетевой трафик, приложение на телефоне сначала проверяет отправителя по белому списку (например, "tbank", "sber") и структуре текста. Реклама и одноразовые пароли (OTP) отбрасываются сразу.
  2. ИИ-парсер: Очищенный текст отправляется на бэкенд, где большая языковая модель (LLM) извлекает структурированные данные: сумму ("amount"), валюту ("currency"), бренд ("brand") и дату ("timestamp").
  3. Валютный конвертер ("Currency Service"): Если транзакция совершена в иностранной валюте, бэкенд обращается к сервису курсов валют (с fallback на keyless API "open.er-api.com" при редких валютах вроде BDT) и конвертирует сумму в базовую валюту пользователя. Данные кэшируются в Redis.
  4. Дедупликация: Чтобы избежать дублирования трат (например, если пришел и пуш от банка, и СМС), алгоритм сверяет хэш отправителя, сумму, точное время операции и хвост номера счета или карты. Если совпадение найдено, повторная транзакция игнорируется.

Безопасность и конфиденциальность

Безопасность ваших данных строится по принципу "Zero Trust" (нулевого доверия):
- Нет доступа к счетам: Приложение не знает ваших паролей, не подключается к счетам напрямую и работает только с текстом приходящих уведомлений.
- Локальная обработка: Личные переписки из Telegram или СМС от друзей отсекаются прямо на устройстве и не передаются в сеть.
- Шифрование: Все авторизационные ключи и токены на устройстве зашифрованы с использованием системного хранилища ключей Android (KeyStore).

Часто задаваемые вопросы

В: Будет ли работать автозапись, если временно пропал интернет?
О: Да. Служба перехватит пуш или СМС, сохранит его в локальную базу данных на телефоне, а при восстановлении связи отправит на сервер для распознавания.

В: Что делать, если ИИ ошибся с категорией?
О: Откройте транзакцию в ленте и измените категорию вручную. ИИ запомнит ваш выбор и в следующий раз распределит аналогичную трату верно.

Попробуйте «Считаю»

Начните вести учёт расходов с помощью ИИ уже сегодня