No description
  • Python 98.4%
  • Dockerfile 1.6%
Find a file
2026-04-30 15:27:00 +02:00
plugins first commit 2026-04-30 15:27:00 +02:00
docker-compose.yml first commit 2026-04-30 15:27:00 +02:00
Dockerfile first commit 2026-04-30 15:27:00 +02:00
proxy.py first commit 2026-04-30 15:27:00 +02:00
README.md first commit 2026-04-30 15:27:00 +02:00
requirements.txt first commit 2026-04-30 15:27:00 +02:00

playwright-api-proxy

Proxy générique qui gère l'authentification de plusieurs sites via Playwright (reCAPTCHA, cookies, JWT…). Chaque site est un plugin indépendant dans plugins/.

Architecture

playwright-api-proxy/
├── proxy.py              ← moteur générique (ne pas toucher)
├── plugins/
│   ├── saur.py           ← plugin Saur
│   ├── ed.py             ← plugin EcoleDirecte
│   ├── _template.py      ← modèle pour un nouveau plugin
│   └── __init__.py
├── .env.example
├── Dockerfile
└── docker-compose.yml

Routing par préfixe :

http://localhost:8080/saur/...  →  https://apib2c.azure.saurclient.fr/...
http://localhost:8080/ed/...    →  https://api.ecoledirecte.com/...

Démarrage

cp .env.example .env
nano .env                     # renseignez vos identifiants
docker compose up -d
curl http://localhost:8080/_proxy/status

Endpoints internes

Endpoint Description
GET /_proxy/status État de tous les plugins
POST /_proxy/{prefix}/relogin Force un re-login pour un plugin

Ajouter un plugin

  1. Copiez plugins/_template.pyplugins/monsite.py
  2. Remplissez les sections TODO
  3. Ajoutez MONSITE_LOGIN / MONSITE_PASSWORD dans .env
  4. Ajoutez monsite à ENABLED_PLUGINS dans .env
  5. docker compose restart

Un plugin doit exposer exactement ces 4 fonctions + 2 constantes :

PREFIX   = "monsite"                  # str  — préfixe URL
BASE_URL = "https://api.monsite.com"  # str  — API cible
REFRESH  = 600                        # int  — secondes entre re-logins (optionnel)

async def do_login(page) -> dict: ...         # retourne le state d'auth
def inject_headers(headers, state) -> dict: ...
def is_managed_header(name) -> bool: ...
def is_expired(status_code, body) -> bool: ...

Variables d'environnement

Variable Défaut Description
ENABLED_PLUGINS (tous) Plugins à charger, séparés par virgule
SAUR_LOGIN Email Saur
SAUR_PASSWORD Mot de passe Saur
ED_LOGIN Identifiant EcoleDirecte
ED_PASSWORD Mot de passe EcoleDirecte