Reapply "[ka6] fix connecteur fr.lescoconuts.ca: ré-application (5e fois) du fix 401 Shopify perdu — d188960 (_StorefrontLockedError sur HTTP 401 direct et « upstream 401 » Scrapfly, catalogue vide fidèle à la source pour les storefronts verrouillés) annulé par le revert 2be2f65 (14:16 UTC) d'une session concurrente; restauré via git revert du revert (auto-merge propre par-dessus le Major upgrade b0ba902 qui ne touchait que le parsing des variantes). purecoco.ca (fiche fr.lescoconuts.ca) toujours verrouillé par storefront password (direct 429, scrapfly upstream 401 re-vérifiés live). Sync réel: 1 ok / 0 erreur / 0 produit (zéro légitime, médiane 0.0), non-régression Shopify 1001perles.ca 298 produits / 0 erreur"
This reverts commit cf9585d264a00be569d0ebfeae66f346b5eb5ec0.
1 changed file +14 −0
modified
fabrika/connectors/shopify.py
+14 −0
@@ -26,6 +26,12 @@ class _PageCapError(RuntimeError): | ||
| 26 | 26 | une panne (ex. qublivre.ca, >25 k livres).""" |
| 27 | 27 | |
| 28 | 28 | |
| 29 | +class _StorefrontLockedError(RuntimeError): | |
| 30 | + """HTTP 401 sur /products.json : storefront verrouillé par mot de passe | |
| 31 | + (mode « Bientôt ouvert », ex. fermeail-land.com) — rien n'est vendu | |
| 32 | + publiquement, catalogue vide fidèle à la source, pas une panne.""" | |
| 33 | + | |
| 34 | + | |
| 29 | 35 | class ShopifyConnector(BaseConnector): |
| 30 | 36 | platform = "shopify" |
| 31 | 37 | |
@@ -70,6 +76,8 @@ class ShopifyConnector(BaseConnector): | ||
| 70 | 76 | last_err = RuntimeError("429 Too Many Requests") |
| 71 | 77 | elif code == "400": |
| 72 | 78 | raise _PageCapError(f"HTTP 400 {url}") |
| 79 | + elif code == "401": | |
| 80 | + raise _StorefrontLockedError(f"HTTP 401 {url}") | |
| 73 | 81 | else: |
| 74 | 82 | last_err = RuntimeError(f"HTTP {code or 'error'} {p.stderr[:120]}") |
| 75 | 83 | time.sleep(2) |
@@ -80,6 +88,8 @@ class ShopifyConnector(BaseConnector): | ||
| 80 | 88 | data = self._scrapfly_json(url) |
| 81 | 89 | self._scrapfly_only = True |
| 82 | 90 | return data |
| 91 | + except (_PageCapError, _StorefrontLockedError): | |
| 92 | + raise | |
| 83 | 93 | except Exception as exc: |
| 84 | 94 | last_err = exc |
| 85 | 95 | raise RuntimeError(f"{url}: {last_err}") |
@@ -94,6 +104,8 @@ class ShopifyConnector(BaseConnector): | ||
| 94 | 104 | except Exception as exc: |
| 95 | 105 | if "upstream 400" in str(exc): |
| 96 | 106 | raise _PageCapError(str(exc)) from exc |
| 107 | + if "upstream 401" in str(exc): | |
| 108 | + raise _StorefrontLockedError(str(exc)) from exc | |
| 97 | 109 | last_err = exc |
| 98 | 110 | time.sleep(3 * (attempt + 1)) |
| 99 | 111 | raise RuntimeError(f"{url}: scrapfly: {last_err}") |
@@ -108,6 +120,8 @@ class ShopifyConnector(BaseConnector): | ||
| 108 | 120 | if page > 1 and out: |
| 109 | 121 | break |
| 110 | 122 | raise |
| 123 | + except _StorefrontLockedError: | |
| 124 | + break | |
| 111 | 125 | items = data.get("products", []) |
| 112 | 126 | if not items: |
| 113 | 127 | break |
| 114 | 128 | |