🔧 Як працює Live-трекер — до кінця

Пояснення для Max · без агентів, без LLM · детермінований конвеєр на таймері
Головна думка: у цій системі немає жодного агента і жодного штучного інтелекту в роботі. Це 5 простих програм, з'єднаних у конвеєр, які запускає системний таймер раз на годину. «Розум» був витрачений один раз — коли реверсилась логіка конкурента й писався код. Далі рантайм «тупий»: виконує той самий рецепт щогодини, як верстат на заводі. Тому система коштує $0 у Claude-токенах і працює сама, без участі будь-якого AI.
[1 launchd]──смикає──▶[2 run_live_tracker.sh]──запускає по черзі──▶ │ ├─▶ [3 live_tracker.py] ◀── СЕРЦЕ. дістає дані 2 способами: │ ├── Meta Graph API (HTTP-запити) → spend / ROAS / конверсії / зміни │ └── Chrome + проксі (Playwright) → ходить по лендингах, бере ключі │ ↓ усе складає в campaigns.json (пам'ять) ├─▶ [4 build_live_dashboard.py] → малює index.html зі state-файлу └─▶ [5 wrangler] → заливає сторінку на Cloudflare → ти відкрив сайт

① launchd — системний будильник

1
Що це. launchd — вбудований у macOS планувальник (аналог cron). Він тримає список «завдань» і запускає їх за розкладом. Наше завдання описане у файлі-конфізі (.plist):
// ~/Library/LaunchAgents/com.iamaximus.sbc-live-tracker.plist
ProgramArguments: [ "/bin/zsh", ".../run_live_tracker.sh" ]
StartCalendarInterval: { Minute: 7 }   // щогодини о хвилині :07
StandardOutPath: ".../run_live_launchd.log"
Як працює. Кожну годину о HH:07 launchd сам запускає скрипт. Нічого не треба тримати відкритим — він живе у системі, переживає перезавантаження Mac, стартує завдання навіть якщо ноут щойно прокинувся. Це і є весь «тригер»: один рядок розкладу.
Перевірити живий він чи ні: launchctl list | grep sbc-live-tracker.

② run_live_tracker.sh — диригент

2
Що це. Маленький zsh-скрипт, який launchd запускає. Його єдина робота — виконати 3 кроки по черзі і записати лог. Він нічого не вирішує, просто диригує:
# 1. підтягнути токени з оточення (Cloudflare), виставити PATH
source ~/.zshenv

# 2. ЗІБРАТИ дані (Meta API + браузер)  →  оновлює campaigns.json
./venv/bin/python live_tracker.py 2026-06-23 1 120 20

# 3. НАМАЛЮВАТИ сторінку зі зібраного state
./venv/bin/python build_live_dashboard.py

# 4. ЗАЛИТИ сторінку на Cloudflare
npx wrangler pages deploy live --project-name=sbc-live-tracker
Навіщо окремий диригент. Щоб кожен крок був незалежним і його можна було запустити/полагодити окремо. Якщо впав деплой — збір даних уже відбувся й лежить у state-файлі; наступний запуск просто домалює й заллє.
Аргументи 2026-06-23 1 120 20 = старт-дата трекінгу · 1 = вмикати браузер-резолв · 120 = максимум нових кампаній за прогін · 20 = скільки лендингів обходити браузером за прогін.

③ live_tracker.py — збирач (серце системи)

Тут відбувається 90% роботи. Дістає дані двома різними способами

🅰️ Як ми беремо дані від Meta (HTTP-запити до Graph API)

Що таке Meta Graph API. Це офіційний «вхід» Facebook для програм. Ти надсилаєш звичайний веб-запит з токеном доступу — у відповідь приходить текст у форматі JSON (структуровані дані, не картинка). Жодного браузера: як відкрити сторінку, але замість дизайну — чисті цифри.
# спрощено, що реально шле колектор:
GET https://graph.facebook.com/v21.0/act_1489…/insights
    ?access_token=EAAB…(живий токен)
    &level=campaign
    &fields=campaign_id,spend,actions,action_values
    &time_range={since:2026-06-23, until:today}
Три «ендпоінти» (адреси), звідки беремо дані:
АдресаЩо віддає
/campaignsсписок кампаній + коли створені, бюджет, тип ставки → так знаходимо нові кампанії
/insightsspend, ROAS, конверсії, revenue по кожній кампанії
/activitiesжурнал дій — коли підняли/зрізали бюджет, поставили на паузу (з точним часом)
Важливі деталі, як саме тягнемо:
Що означає spend на сайті. Це сумарний spend з 23.06 (старту трекінгу) до зараз — тобто фактично за весь час життя кампанії, бо вони створені 23-го. Це НЕ «за останню годину» і не «за сьогодні». Тому в нових кампаній віком ~1.5 дня зі стартовим бюджетом $20–30 spend поки малий ($20–45) — їх ще не масштабували. Цифра реальна.

🅱️ Хто «ходить по сайтах» — браузер через проксі

Навіщо. Рекламне посилання часто заклоачене (.click/.xyz з макросами {{ad.id}}) — воно ховає справжній лендинг. Через API його не видно. Тому туди треба реально «сходити» браузером, як живий користувач.

Хто йде. Справжній Google Chrome (не емуляція), яким керує Python-бібліотека Playwright. Він прикидається американцем, що клікнув з реклами у Facebook:
US-IPчерез проксі — наче трафік зі США
Referer: facebook.comначе перейшов саме з Facebook
фейковий fbclidначе справжній рекламний клік
відбиток Chrome + вимк. автоматизаціющоб виглядати як жива людина
Саме це обманює cloaker — він бачить «реальний FB-трафік зі США» і віддає справжній лендинг замість пустишки. Chrome скролить, дочікується редіректу, зчитує фінальний URL + RSOC-ключі (платні пошукові ключі зі сторінки) — і закривається. Не висить 24/7, вантажиться ~15с на лендинг.

🗄️ campaigns.json — пам'ять (щоб не переробляти)

Усе зібране лягає в один файл-стан tracker/campaigns.json. Він живе між запусками. Завдяки йому ми не обробляємо одне й те саме двічі: кеш = економія API, трафіку й часу

④ build_live_dashboard.py — маляр

4
Що робить. Бере готовий campaigns.json і малює з нього одну статичну HTML-сторінку (index.html): KPI-бар, таблицю кампаній, розкривні деталі, журнал змін. Жодних запитів — просто «дані → дизайн». Сторінка статична (швидка, нічого не ламається), тому в неї вшито авто-перезавантаження кожні 15 хв, щоб ти бачив свіже без F5.

⑤ wrangler — кур'єр на Cloudflare

5
Що робить. wrangler — це CLI Cloudflare. Однією командою заливає готовий index.html на хостинг Cloudflare Pages → сторінка одразу доступна за адресою sbc-live-tracker.pages.dev. Безкоштовно, без сервера, відкривається будь-де.

🔄 Повний цикл за один прогін

  1. launchd о :07 будить скрипт.
  2. run_live_tracker.sh запускає збирач.
  3. live_tracker.py тягне цифри з Meta API + ганяє Chrome через проксі по лендингах → пише campaigns.json.
  4. build_live_dashboard.py малює index.html.
  5. wrangler кладе сторінку на Cloudflare.
  6. Ти відкрив sbc-live-tracker.pages.dev і бачиш свіже.
Через годину — те саме. Нічого не треба натискати.

💰 Скільки це коштує

РесурсСпоживанняКошт
Claude-токени0 — в рантаймі немає LLM$0
Meta API~1.5–2k запитів/добу (тротлінг, лише читання)$0
Mac CPU/RAM~5 хв CPU/год; 1 Chrome на ~15с/лендинг, закривається$0
Cloudflare Pages24 деплої/добу × ~150 КБ$0 (free)
US-проксітрафік на обхід лендингівєдиний платний ресурс
Search-Arbitrage · Live-трекер 0011 · ← повернутись на трекер
Дані: Meta Graph API (read-only) + браузер-резолв. Документ оновлюється вручну.