Перейти к содержанию

Текучка Пузырика — Telegram бот

@puzyrikinboxbot — бот для захвата информации с телефона в wiki.

Стек

  • aiogram 3.x (Telegram Bot API)
  • Whisper base (локальная транскрибация, бесплатно)
  • Claude Opus 4 через OpenRouter (описание фото/скринов, извлечение расходов)
  • ChromaDB (paraphrase-multilingual-MiniLM-L12-v2) — индексация inbox
  • Google Calendar API
  • yaml, httpx, sentence-transformers

Основные функции

Захват (Capture)

  • Текст → inbox + авто-детект расходов (≤80 символов) и дат
  • Голосовые → Whisper → inbox + авто-детект дат
  • Фото → Opus описание → inbox + извлечение расходов из банковских пушей
  • Форварды → inbox с указанием источника
  • Документы → файл в inbox/files/
  • Видео/кружки → inbox (без транскрипции)

Защита от ложных расходов (фикс 16 апреля)

  1. Порог 80 символов — текст >80 символов = заметка, расход не детектится. "В посольстве сбор 75 евро, нужно собрать документы" → только inbox.
  2. FUTURE_MARKERS — regex фильтр: "потом", "надо будет", "будет стоить", "планирую", "собираюсь", "хочу купить", "думаю взять", "будем платить", "придётся" → не расход.
  3. Для фото — промпт Opus требует финансовый JSON только для чеков/пушей/квитанций. Информационные цены ("сбор 75 EUR на сайте посольства") — пока решается вечерним ревью.

Google Calendar

Авто-детект дат на русском → Google Calendar событие. Работает и в обычных сообщениях, и через /cal. Поддержка: дни недели, "завтра"/"послезавтра"/"сегодня", "16 апреля", DD.MM. Ремайндеры: за 1 час и за 24 часа.

Переключение таймзоны

/vakhta → Казахстан UTC+5, /riga → Латвия UTC+3. Влияет на: inbox дату, расходы, напоминание, детект дат. По умолчанию: UTC+3 (Рига).

Финансовый захват

Из фото (Opus Vision)

Скриншоты банковских пушей (Revolut, Kaspi, Swedbank) → JSON с amount/currency/group/subcategory/merchant. OpenRouter lock (asyncio.Lock) — при пачке фото запросы идут последовательно, не забивают API.

Из текста (regex)

"пиво 5 евро", "парковка 25000 тенге" — только для коротких сообщений (≤80 символов). Валюты: EUR, USD, KZT, лат→EUR. Автокатегоризация по 30+ ключевым словам.

Курс валют

"курс 515" → EUR/KZT сохранён. Используется в /expenses.

Хранение

  • finances/expenses.jsonl — расходы (JSON Lines)
  • finances/rates.jsonl — курсы валют
  • Поля расхода: amount, currency, group, subcategory, merchant, date, description, source, photo, saved_at

Категории расходов

  1. obyazalka_riga (1500 EUR): shkoly, tekuchka_detey, tekuchka_semya
  2. tekuchka (1400 EUR): itunes_podpiski, pivasik, produkty, bilety_samolyot, svyaz, kommunalka, transport, ipoteka_riga, sport_krasota, repetitory, detskiy_sport, drugoe
  3. ipoteki_arendy (1200 EUR): ipoteki, arenda_semya
  4. avtomobil: lizing, moyka, nalog, parkovka, remont, strahovka, toplivo, shtrafy, tehosmotr, zapchasti, tyuning
  5. puteshestviya: gostinitsy, sladosti, sotovaya_svyaz, transport, ekskursii, bilety, produkty, kafeshki, zapravka, drugoe
  6. finansy: oplata_uslug, komissiya_bankov, dolgi, tekushchie_kredity, kursovaya_raznitsa
  7. dom_kzt (KZT): dacha, mebel, sklad, remont, uborka, nalog_nedvizhimost, ohrana, pokupka_nedvizhimosti, raznaya_meloch, strahovka
  8. investitsii: investitsii, nakopleniya
  9. rabochie_poezdki (KZT): arenda_kvartiry, transport, zavtraki_obedy, parkovka, produkty, gostinitsy, raznaya_meloch, posidelki_s_kollegami
  10. obraz_zhizni: podarki, razvlecheniya, sladosti, kafeshki, dlya_sobaki, elektronika, kosmetika, igry, igrushki, knigi, apteki, odezhda, temu, vrachi, protein, drugoe
  11. ucheba: kursy, uchebniki, ekskursii
  12. dohod: zarplata, podarki, dohod_biznes, dividendy, protsenty, cashback, treyding, drugoe

Команды

  • /start, /help — приветствие
  • /status — количество записей за сегодня
  • /inbox — сегодняшний inbox (до 4000 символов)
  • /cal <текст> — создать событие в календаре
  • /expenses — последние 10 расходов с итогами EUR/KZT + курс
  • /vakhta — UTC+5 Казахстан
  • /riga — UTC+3 Латвия

Вечернее напоминание

21:00 по текущей таймзоне → "Не забудь разобрать в Cowork!"

ChromaDB

После каждой записи → background thread обновляет embeddings. Модель: paraphrase-multilingual-MiniLM-L12-v2, коллекция: wiki.

Отображение ответов

  • Текст ≤300 символов → целиком, >300 → обрезка до 120 + "..."
  • Фото описание ≤500 символов → целиком, >500 → 200 + "..."
  • Расход — тихо в конце ответа, если есть

Устойчивость

  • Photo graceful error — если Opus упал, фото всё равно сохраняется в inbox с пометкой ошибки
  • OpenRouter lock — пачка фото не забивает API
  • Unique filenamesfile_unique_id в имени, нет коллизий при одновременных фото

Кодовая база

~1060 строк, один файл bot.py на сервере. Локальные файлы в iCloud ОТСТАЮТ от серверной версии. Патчи (patch_wiki.py, patch_multi_expense.py) — возможно ещё не применены к текущей версии на сервере.

Деплой

Сервер: Hetzner CPX52 (46.62.238.135) Путь: /opt/tekuchka-bot/ Сервис: systemd tekuchka-bot Процесс: правка → scp на сервер → systemctl restart tekuchka-bot

Связанные

  • [[system/tekuchka_bot]] — workflow
  • [[finansy/budget_structure_2026]] — бюджет
  • [[finansy/expense_dashboard_plan]] — план дашборда