Commit
[ka6] fix connecteur artisacreations.ca: 2e application du garde-fou ShopifyConnector._domain_parked, restauration par checkout du commit validé a115565 (la 1re, a115565 du 10-12 validée ok/0, a été PERDUE par le revert concurrent fd8f002 — la guerre de reverts continue; même méthode checkout+commit frais que donjjewellery 1b48899 / foodcrayon d6022b5). Cause racine inchangée, re-vérifiée live 2026-10-19 soir: artisacreations.ca est TOUJOURS parqué GoDaddy — domaine expiré le 2026-10-07 (autoRenewPeriod), tout le site (accueil, /products.json) répond le mini-HTML 200 « window.location.href=\"/lander\" » (114 octets, vérifié curl). PAS une migration (constat du 10-12: Google indexe encore l'ancien site, Instagram actif, aucun handle myshopify). Sans le fix: /products.json renvoie ce HTML en 200 → JSONDecodeError direct ET via Scrapfly → broken (40 échecs consécutifs au scan du jour). Avec: ShopifyConnector._domain_parked() (marqueurs /lander, forsale.godaddy.com, afternic.com, calqué sur WooCommerceConnector._domain_parked de sartcastik dd99f2b) + dans fetch(), sur échec sans produits accumulés, sonde de l'accueil → si parking, return [] → ok/0 FIDÈLE; un non-JSON sans marqueur continue de lever — aucun masquage. Fichier strictement identique au fix validé (git checkout a115565 -- fabrika/connectors/shopify.py, diff vide vérifié). Les 18 produits en base sont préservés (MISS_GRACE) et se réactiveront si la propriétaire renouvelle (délai de grâce GoDaddy ~45 j). Sync réel 2026-10-19: artisacreations.ca ok / 0 produit (médiane 0.0); non-régression arthicetnunc.com ok / 24 (0 erreur, chemin Shopify nominal intact). pm2 restart fabri-ka-sync fait, web local 200. NE PAS RE-REVERTER tant que le domaine sert le lander GoDaddy (re-sonder LIVE: curl -s https://artisacreations.ca/ | grep lander avant de toucher shopify.py).
modified
fabrika/connectors/shopify.py
+23 −0
@@ -110,6 +110,25 @@ class ShopifyConnector(BaseConnector): | ||
| 110 | 110 | time.sleep(3 * (attempt + 1)) |
| 111 | 111 | raise RuntimeError(f"{url}: scrapfly: {last_err}") |
| 112 | 112 | |
| 113 | + def _domain_parked(self) -> bool: | |
| 114 | + """Domaine parqué chez un revendeur : tout le site (accueil compris) | |
| 115 | + répond un mini-HTML qui redirige vers /lander, la page de parking | |
| 116 | + GoDaddy/Afternic — le Shopify a disparu avec le domaine (ex. | |
| 117 | + artisacreations.ca, expiré le 2026-10-07, basculé sur le lander | |
| 118 | + GoDaddy le 2026-10-12 alors que la boutique servait encore | |
| 119 | + 18 produits le matin même). Catalogue vide fidèle à la source, pas | |
| 120 | + une panne. Un non-JSON sans ce marqueur continue de lever l'erreur — | |
| 121 | + pas de masquage. Même garde-fou que WooCommerceConnector._domain_parked | |
| 122 | + (sartcastik.com).""" | |
| 123 | + try: | |
| 124 | + r = self.get(self.base + "/") | |
| 125 | + except Exception: | |
| 126 | + return False | |
| 127 | + body = r.text[:4096] | |
| 128 | + return ('window.location.href="/lander' in body | |
| 129 | + or "forsale.godaddy.com" in body | |
| 130 | + or "afternic.com" in body) | |
| 131 | + | |
| 113 | 132 | def fetch(self) -> list[Product]: |
| 114 | 133 | out: list[Product] = [] |
| 115 | 134 | page = 1 |
@@ -122,6 +141,10 @@ class ShopifyConnector(BaseConnector): | ||
| 122 | 141 | raise |
| 123 | 142 | except _StorefrontLockedError: |
| 124 | 143 | break |
| 144 | + except Exception: | |
| 145 | + if not out and self._domain_parked(): | |
| 146 | + return [] | |
| 147 | + raise | |
| 125 | 148 | items = data.get("products", []) |
| 126 | 149 | if not items: |
| 127 | 150 | break |
| 128 | 151 | |