Назад в архив
IV. Клиентские проекты и логистические платформыдополнительносоло

Asterisk Call Sampler → Telegram QA

Несмотря на название — это сэмплер записей звонков Asterisk для QA: он заходит по SSH на сервер PBX, читает CDR из MySQL (asteriskcdrdb), случайно выбирает 10–15 записей отвеченных звонков за последние N часов, скачивает их по SCP и постит аудио в Telegram с подписями (время, src→dst, длительность). Один файл на Bun/TS, без зависимостей.

Статус
прототип
Период
2026-04-18 → 2026-04-18
AI-сессий
Стек
Языки
TypeScript
Фреймворки · Инфра
Bun
§01

Обзор

  • Что это: небольшая ops-утилита для выборочного QA звонков колл-центра на Asterisk. Название tg_invoice_listener вводит в заблуждение (вероятно, наследие bun init или переименования) — по коду это «сэмплер записей звонков для QA → Telegram».
  • Тип / статус / роль: cli / ops-скрипт · prototype · solo (1 коммит от пользователя).
  • Период активности: 2026-04-18 (один день, 1 коммит).
§02

Стек

  • Bun + TypeScript, БЕЗ внешних зависимостей — только встроенные средства Bun: Bun.$ (shell), Bun.file, Bun.env, нативные fetch/FormData. Системный sshpass для SSH/SCP по паролю.
  • Источник данных: Asterisk CDR (asteriskcdrdb MySQL), файлы записей в /var/spool/asterisk/monitor/YYYY/MM/DD/.
  • Доставка: Telegram Bot API (sendAudio, multipart FormData).
  • Конфигурация через env (SSH host/user/password, TG token/chat, параметры окна выборки и сэмпла).
§03

Что реализовано

  • Один коммит (2026-04-18): полностью рабочий скрипт index.ts (176 строк).
  • Логика: fetchCandidates() (SQL по CDR: ANSWERED, billsec ≥ порога, запись присутствует, GROUP BY recordingfile, ORDER BY RAND() LIMIT), pickCount() (случайные 10–15), скачивание по SCP во временную папку, sendAudio() с форматированной подписью, очистка tmp в finally, exit code по результату.
§04

Технические челленджи

Подтверждено по index.ts:

  • Автоматизация SSH/SCP по паролю (sshpass -e + строгие опции -o: проверка host-key отключена, только парольная аутентификация, таймаут): доступ к удалённому PBX без ключей. → практичная ops-интеграция.
  • Случайная выборка для QA (ORDER BY RAND() + pickCount 10–15): репрезентативный сэмпл записей вместо всех подряд. → продуманный подход к QA.
  • Zero-dependency на встроенных средствах Bun (Bun.$, Bun.file, нативные fetch/FormData): без зависимостей node_modules, весь I/O через рантайм Bun. → современный, лёгкий стиль.
  • Аккуратная работа с ресурсами и ошибками: временная папка с PID+timestamp, гарантированная очистка в finally, try/catch на каждый файл, осмысленный exit code (fail, если ничего не отправлено). → надёжность для запусков по cron.
  • `requireEnv` с явной ошибкой при отсутствии переменной. → fail-fast конфигурация.
§05

AI-разработка

  • Найдено сессий: 0. В репозитории есть .claude/ (с гайдом по Bun в CLAUDE.md) и .cursor/ — AI-тулинг использовался, но транскриптов Claude Code нет.
  • Что делалось с AI: вероятно, сгенерировано/доработано в Cursor/Claude (CLAUDE.md — стандартный гайд по Bun).
  • Паттерны AI-воркфлоу: данных минимум.
§06

Достижения и метрики

  • Рабочая ops-утилита: Asterisk CDR → SCP → Telegram, ~176 строк, без зависимостей.
  • Настраиваемая выборка, безопасная очистка, готовность к cron.
§07

Контрибьюторы

git shortlog · все ветки

  1. Dave931
1 контрибьютор1 коммитов всего
Сейчас

Открыт к ролям Senior / Staff инженера и избранному фрилансу — продакшн-AI, платформы и full-stack разработка.

Связаться