No description
- Python 98.4%
- Dockerfile 1.6%
| plugins | ||
| docker-compose.yml | ||
| Dockerfile | ||
| proxy.py | ||
| README.md | ||
| requirements.txt | ||
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
- Copiez
plugins/_template.py→plugins/monsite.py - Remplissez les sections
TODO - Ajoutez
MONSITE_LOGIN/MONSITE_PASSWORDdans.env - Ajoutez
monsiteàENABLED_PLUGINSdans.env 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 |