Маніменеджмент для гіка: звідки брати дані?

Якщо ви всерйоз вирішили зайнятися рахуванням особистих фінансів, то однією з перших труднощів для вас, ймовірно, буде збір даних. У коментарях до попередньої статті, де я невдало намагався обґрунтувати саму необхідність маніменеджмента, відзначилися люди з високим рівнем самодисципліни, для яких це питання — не питання. Вони дисципліновано день за днем записують свої витрати на мобільний телефон протягом багатьох років. Особисто я за себе можу сказати, що мені ніколи це не вдавалося, і якщо бути чесним із самим собою, ймовірно, ніколи не почне вдаватися в майбутньому. Тому, цей шлях не для мене. Але я знайшов рішення!

На моє щастя, мій телефон і так реєструє всі мої витрати без моєї участі. На кожну операцію по моїй карті мені прилітає SMS-повідомлення від банку, в якому є більша частина необхідної інформації:

  • Сума платежу
  • Код терміналу продавця
  • Час здійснення платежу
  • Залишок на балансі
  • Ідентифікатор карти списання

Таким чином, для отримання первинних даних для аналізу нам потрібно вивантажити SMS повідомлення. Я двк і тому у мене рутованний телефон на Android. У моєму випадку це завдання тривіальне:

$ adb shell "su -c 'cp /data/data/com.android.providers.telephony/databases/mmssms.db /mnt/sdcard'"
$ adb pull /mnt/sdcard/mmssms.db > /dev/null
$ adb shell "rm /mnt/sdcard/mmssms.db"

 

(adb [android debug bridge] програма, що входить в пакет Android SDK. Є реалізації як під Windows так і під Linux/Mac. Для доступу до бази даних mmssms.db потрібні привілеї root. Якщо хто-небудь знає, як отримати файл без root, напишіть, будь ласка в коментарях)

В результаті роботи скрипта ми маємо звичайну базу даних SQLite3. Працювати з нею можна за допомогою пакета sqlite, реалізації якого так само є в Linux, Windows і Mac. У цій базі нас цікавить таблиця SMS, що містить колонки address і body.

Читайте також  У цій мережі Wi-Fi застосовується застарілий стандарт безпеки в Windows 10 — чому і що робити
$ sqlite3 mmssms.db 
SQLite version 3.22.0 2018-01-22 18:45:57
Enter ".help for usage hints.
sqlite> PRAGMA table_info(sms);
0|_id|INTEGER|0||1
1|thread_id|INTEGER|0||0
2|address|TEXT|0||0
3|m_size|INTEGER|0||0
4|person|INTEGER|0||0
5|date|INTEGER|0||0
6|date_sent|INTEGER|0|0|0
7|protocol|INTEGER|0||0
8|read|INTEGER|0|0|0
9|status|INTEGER|0|-1|0
10|type|INTEGER|0||0
11|reply_path_present|INTEGER|0||0
12|subject|TEXT|0||0
13|body|TEXT|0||0
14|service_center|TEXT|0||0
15|locked|INTEGER|0|0|0
16|sim_id|INTEGER|0|-1|0
17|error_code|INTEGER|0|0|0
18|seen|INTEGER|0|0|0
19|ipmsg_id|INTEGER|0|0|0

За допомогою звичайного sql-запиту ми можемо вибрати SMS-повідомлення надіслані Ощадбанком:

 $ echo "select trim(body, '0A') from sms where address = '900' order by date asc" | sqlite3 mmssms.db

Тут 900 — це номер з якого Ощадбанк розсилає повідомлення. Функція trim прибирає перенесення каретки в кінці повідомлення, який навіщось ставлять деякі банки. Ось приклад виводу:

VISA2222 01.01.18 08:43 купівля 1245р GAZPROMNEFT Баланс: 1985.29 р
VISA2222 01.01.18 12:05 купівля 176.50 р YARCHE Баланс: 1808.79 р
VISA2222 01.01.18 12:16 покупка 504р FRUKTY Баланс: 1304.79 р
VISA2222 01.01.18 15:09 купівля 441р KFC Баланс: 863.79 р
ECMC1111 01.01.18 17:52 купівля 15.09 EUR HOSTING COMPANY Баланс: 66679.05 р
ECMC1111 02.01.18 19:41 купівля 104р MCDONALDS Баланс: 66583.47 р
ECMC1111 03.01.18 08:49 купівля 205.10 р MARIYA-RA Баланс: 66378.37 р
ECMC1111 03.01.18 09:16 покупка 810р FIT SERVICE Баланс: 65568.37 р
VISA2222 03.01.18 09:17 купівля 220р EKSKLYUZIV Баланс: 643.79 р
ECMC1111 03.01.18 09:18 купівля 4200р FIT SERVICE Баланс: 61368.37 р

Я і дружина користуємося різними картами. За ідентифікатором карти можна диференціювати платника. За кодом терміналу можна з’ясувати, на що саме були витрачені гроші і витрачену суму. В принципі, цього цілком достатньо для того, щоб отримати якусь статистичну картину.

Обробка даних

Починаючи з цієї точки, далі кожен може піти своїм шляхом. Хтось може написати скрипт на Python для парсингу і аналізу. Хтось може за допомогою AWK перегнати дані в CSV і аналізувати в Excel. Я для аналізу використовую ledger cli.

Степан Лютий

Обожнюю технології в сучасному світі. Хоча частенько і замислююся над тим, як далеко вони нас заведуть. Не те, щоб я прям і знаюся на ядрах, пікселях, коллайдерах і інших парсеках. Просто приходжу в захват від того, що може в творчому пориві вигадати людський розум.

You may also like...

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *