SPB Git

spb/fabri-ka

Public

Agrégateur de produits québécois — www.fabri-ka.com

[ka6] fix connecteur artisacreations.ca: garde-fou _domain_parked dans le connecteur Shopify (domaine expiré, parking GoDaddy). Cause racine vérifiée live le 2026-10-12: artisacreations.ca a expiré le 2026-10-07 (WHOIS statut autoRenewPeriod — renouvellement impayé, délai de grâce) et a basculé entre 03h et 09h (heure de Mtl) le 2026-10-12 sur le lander de parking GoDaddy (NS ns61/ns62.domaincontrol.com, mini-HTML « window.location.href=\"/lander\" » sur tous les chemins, lander avec marqueur ap:"parking") — la boutique Shopify servait encore 18 produits (= médiane) le matin même à 02h59. /products.json renvoie donc ce mini-HTML en 200 → JSONDecodeError en direct ET via Scrapfly (« scrapfly: Expecting value: line 1 column 1 ») → 4 échecs consécutifs, broken. Pas une migration: Google indexe encore l'ancien site, Instagram du marchand actif, aucun nouveau domaine ni handle myshopify trouvé (botikiperle/artisacreations/artisa-creations/art-isa-creations .myshopify.com → tous 404). Fix minimal calqué sur le garde-fou validé WooCommerceConnector._domain_parked (sartcastik.com, dd99f2b): ShopifyConnector._domain_parked() (mêmes marqueurs /lander, forsale.godaddy.com, afternic.com) + dans fetch(), sur échec de page sans produits accumulés, sonde de l'accueil → si parking, retour [] → ok/0 FIDÈLE (le domaine ne vend plus rien), les 18 produits en base sont préservés et se réactiveront au retour du domaine. Un non-JSON sans marqueur parking continue de lever l'erreur — aucun masquage. Sync réel 2026-10-12: artisacreations.ca ok / 0 produit; non-régression arthicetnunc.com ok / 24 produits (chemin Shopify nominal intact). pm2 restart fabri-ka-sync fait, web local 200. Si la propriétaire renouvelle le domaine (probable: délai de grâce GoDaddy ~45 j), le connecteur reprendra tout seul; ne pas toucher la fiche.

Simon-Pierre Boucher committed (Oct 13, 2026) parent 7e4493f Browse files

1 changed file +23 −0

Unified Split
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
Menu

Theme