Files
analytics/app/main.py
T
2026-06-22 05:26:20 +02:00

140 lines
6.0 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""analytics - stateless API proxy for Google Analytics (GA4) and Sklik.
Runs behind the AppFactory Caddy reverse proxy at /apps/<app-id>. ROOT_PATH is
injected as an env var; FastAPI's ``root_path`` makes Swagger UI and the OpenAPI
``servers`` use the proxy prefix so "Try it out" hits /apps/<app-id>/... .
The service stores no secrets. Every credential is supplied per request in an
X- header and used only to talk to the upstream API (see AGENTS.md and
``app.credentials``).
"""
import os
from fastapi import FastAPI
from . import config
from .errors import register_exception_handlers
from .logging_config import get_logger
from .routers import ga_admin, ga_data, googleads, gsc, meta, sklik
logger = get_logger(__name__)
ROOT_PATH = os.getenv("ROOT_PATH", "")
DESCRIPTION = """
Stateless proxy exposing **Google Analytics 4**, **Google Search Console**,
**Google Ads** and **Sklik** (Seznam) APIs.
Veškeré přihlašovací údaje se posílají v každém requestu jako `X-` hlavičky
služba si nic neukládá. Vyplníte je v Swaggeru po kliknutí na **Try it out**.
| Služba | Hlavička | Povinné |
| --- | --- | --- |
| Google Analytics | `X-GA-Access-Token` **nebo** `X-GA-Credentials` | jedna z nich |
| Google Analytics | `X-GA-Quota-Project` | ne |
| Search Console | `X-GSC-Access-Token` **nebo** `X-GSC-Credentials` | jedna z nich |
| Search Console | `X-GSC-Quota-Project` | ne |
| Google Ads | `X-GAds-Developer-Token` | ano |
| Google Ads | `X-GAds-Access-Token` **nebo** `X-GAds-Credentials` | jedna z nich |
| Google Ads | `X-GAds-Login-Customer-Id`, `X-GAds-Quota-Project` | ne |
| Sklik | `X-Sklik-Token` | ano |
| Sklik | `X-Sklik-User-Id` | ne (jen pro agenturní/MCC přístup) |
Tři Google služby používají stejný princip přihlášení (Google OAuth) liší se
jen prefixem hlavičky a oprávněním (scope). **Jeden service account lze použít
pro všechny tři** (stačí mu udělit přístup v dané službě a povolit příslušné
API). U Google Ads navíc vždy potřebujete *developer token*.
> 💡 Hotový OAuth2 *access token* lze u všech tří Google služeb poslat dvěma
> způsoby: buď v původní hlavičce `X-…-Access-Token`, **nebo** ve standardní
> hlavičce `Authorization: Bearer <token>`. Obě cesty jsou rovnocenné; pokud
> pošlete obě, vyhrává `X-…-Access-Token`. Pořadí priority je
> `X-…-Access-Token` → `Authorization: Bearer` → `X-…-Credentials`.
---
## Kde vzít přihlašovací údaje
### 🔹 Společné pro všechny Google služby přístup přes service account
1. [Google Cloud Console](https://console.cloud.google.com/) → vytvořte nebo
vyberte projekt.
2. **APIs & Services → Library** → povolte API podle toho, co budete volat:
*Google Analytics Data API* + *Google Analytics Admin API*,
*Google Search Console API*, *Google Ads API*.
3. **IAM & Admin → Service Accounts → Create service account**.
4. U účtu **Keys → Add key → Create new key → JSON** stáhne se klíč.
5. Klíč zakódujte do **base64** a vložte do příslušné `*-Credentials` hlavičky:
- Windows PowerShell:
`[Convert]::ToBase64String([IO.File]::ReadAllBytes("klic.json"))`
- Linux/macOS: `base64 -w0 klic.json`
Service account (jeho `client_email` z JSON) pak musíte **přidat jako uživatele
v dané službě** viz níže. Místo service accountu lze vždy poslat i hotový
OAuth2 *access token* (např. z
[OAuth Playground](https://developers.google.com/oauthplayground/) se správným
scope); platí ~1 hodinu. Token pošlete buď v `*-Access-Token`, nebo ve
standardní hlavičce `Authorization: Bearer <token>`.
### 🔹 Google Analytics 4 (`X-GA-*`)
- **ID property** (`property_id` v URL): GA4 → **Administrace → Nastavení
property** → *ID property*, např. `123456789`.
- Přístup: service account `client_email` přidejte v **Administrace → Správa
přístupu k property** jako **Viewer**. Scope: `analytics.readonly`.
### 🔹 Google Search Console (`X-GSC-*`)
- **siteUrl**: adresa property, buď URL-prefix (`https://example.com/`) nebo
doménová property (`sc-domain:example.com`). Posílá se jako parametr `siteUrl`.
- Přístup: v [Search Console](https://search.google.com/search-console) →
**Nastavení → Uživatelé a oprávnění** přidejte `client_email` service accountu
(role *Full* nebo *Restricted*). Scope: `webmasters.readonly`.
### 🔹 Google Ads (`X-GAds-*`)
- **Developer token** (`X-GAds-Developer-Token`, povinný): v **Google Ads
manager (MCC) účtu → Tools → API Center**. Token musí mít schválený přístup.
- **customer_id** (v URL): 10místné číslo účtu (bez pomlček).
- **login-customer-id** (`X-GAds-Login-Customer-Id`, volitelné): ID manager
(MCC) účtu, přes který přistupujete k podřízenému účtu.
- Přístup: nejjednodušší je poslat hotový OAuth2 *access token* se scope
`https://www.googleapis.com/auth/adwords` v `X-GAds-Access-Token`.
Service account funguje jen s *domain-wide delegation*.
### 🔹 Sklik (`X-Sklik-Token`)
1. Přihlaste se na [sklik.cz](https://www.sklik.cz/).
2. Vpravo nahoře **své uživatelské jméno → Nastavení**.
3. Sekce **Přístup k API Drak** → **Zobrazit token**.
4. Token zkopírujte do hlavičky `X-Sklik-Token`.
> ⚠️ Každé vygenerování nového tokenu **zneplatní ten předchozí**. Token je
> vázaný na účet, pod kterým jste přihlášeni. Pro správu cizích účtů
> (agentura/MCC) vložte cílové `userId` do hlavičky `X-Sklik-User-Id`.
---
Podrobnosti k jednotlivým endpointům jsou v `documentation/` v repozitáři.
""".strip()
app = FastAPI(
title=config.APP_NAME,
version=config.APP_VERSION,
description=DESCRIPTION,
root_path=ROOT_PATH,
)
register_exception_handlers(app)
app.include_router(meta.router)
app.include_router(ga_data.router)
app.include_router(ga_admin.router)
app.include_router(gsc.router)
app.include_router(googleads.router)
app.include_router(sklik.router)
logger.info(
"analytics started (version=%s, root_path=%r)", config.APP_VERSION, ROOT_PATH
)