Écriture de sélection câblée (PUT cart) + auth par cookie storage_state
Découvert via attache CDP au vrai Chrome (contourne le blocage automation) :
- set_selection = PUT /gw/v1/carts/{week}, body {meals:[{index,quantity}], extras:[]}
sélection par index de course, params (customer/subscription/sku/cutoff) dérivés
dynamiquement de /subscriptions + /deliveries (aucun id en dur)
- Recipe.course_index conservé depuis le menu pour le mapping id->index
- get_editable_weeks via /deliveries (modèle Delivery: cutoff, status, editable)
- Token lu depuis le cookie apiV2Auth (storage_state) -> auth sans navigateur, headless OK
- hf_confirm_selection: garde-fou coco + dry_run; tool attach_capture.py ajouté
- Dry-run validé: requête identique à l'appel réel capturé
This commit is contained in:
16
server.py
16
server.py
@@ -44,11 +44,11 @@ def hf_login() -> dict:
|
||||
|
||||
@mcp.tool()
|
||||
def hf_list_weeks() -> list[dict]:
|
||||
"""Liste les semaines de l'abonnement encore modifiables (handle + date livraison)."""
|
||||
"""Liste les semaines de l'abonnement encore modifiables (handle + dates)."""
|
||||
with api.HelloFreshClient() as client:
|
||||
weeks = client.get_editable_weeks()
|
||||
return [{"week": w.id, "delivery_date": w.delivery_date, "editable": w.editable,
|
||||
"max_selectable": w.max_selectable} for w in weeks]
|
||||
return [{"week": d.week, "delivery_date": d.delivery_date, "cutoff_date": d.cutoff_date,
|
||||
"status": d.status, "editable": d.editable} for d in weeks]
|
||||
|
||||
|
||||
@mcp.tool()
|
||||
@@ -90,10 +90,11 @@ def hf_propose(week: str = "", count: int = 0) -> dict:
|
||||
|
||||
|
||||
@mcp.tool()
|
||||
def hf_confirm_selection(week: str, recipe_ids: list[str]) -> dict:
|
||||
def hf_confirm_selection(week: str, recipe_ids: list[str], dry_run: bool = False) -> dict:
|
||||
"""ÉCRIT la sélection de recettes dans la box de la semaine (après confirmation).
|
||||
|
||||
Garde-fou : refuse une recette contenant un ingrédient exclu.
|
||||
Garde-fou : refuse toute recette contenant un ingrédient exclu (coco !).
|
||||
`dry_run=True` : construit et renvoie la requête sans l'envoyer (vérification).
|
||||
"""
|
||||
with api.HelloFreshClient() as client:
|
||||
menu = client.get_menu(week)
|
||||
@@ -110,8 +111,9 @@ def hf_confirm_selection(week: str, recipe_ids: list[str]) -> dict:
|
||||
if unknown:
|
||||
return {"ok": False, "error": "Recette(s) inconnue(s) pour cette semaine.",
|
||||
"unknown_ids": unknown}
|
||||
result = client.set_selection(week, recipe_ids)
|
||||
return {"ok": True, "week": week, "selected": recipe_ids, "api_response": result}
|
||||
result = client.set_selection(week, recipe_ids, dry_run=dry_run)
|
||||
return {"ok": True, "week": week, "selected": recipe_ids, "dry_run": dry_run,
|
||||
"api_response": result}
|
||||
|
||||
|
||||
@mcp.tool()
|
||||
|
||||
Reference in New Issue
Block a user