Compare gratuitement les prix de 35 marques d'eau minérale (bouteille et stika) chez Géant et Carrefour. Mis à jour chaque jour.
Translation pending
CommerceHTML · JavaScriptGitHub @Ah6259OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Comparateur des prix de l'eau minerale en Tunisie (Carrefour, Geant, Otrity) - stika et bouteille, mis a jour automatiquement chaque jour
Translation pending
Taken from the repository README
Loading the full README.
Read the full README ↗Site web (et base d'une future app) qui compare les prix des marques d'eau minérale vendues en Tunisie (bouteille et stika), relevés automatiquement chaque nuit par GitHub chez Carrefour (magasin par magasin) et Géant Drive, complétés par les prix signalés par les visiteurs. Le site est autonome : rien sur le PC, rien à la main. (Aziza retiré le 30/09/2026 ; Otrity et Monoprix retirés le 23/10/2026 : ils ne se lisaient pas depuis GitHub, voir « Mettre à jour les prix ».)
Site public : https://prix-eau.clicvia.com/
© 2026 — Tous droits réservés (voir LICENSE). Ce dépôt est public uniquement pour l'hébergement gratuit du site : aucune réutilisation du code ou des données sans autorisation écrite. Dépôt GitHub : https://github.com/Ah6259/prix-eaux-tunisie (Ancienne version privée Claude : https://claude.ai/artifact/N4YgHUrDQegTPn69Z77DCv)
05/10 : design pro, photo neutre, photos libres des marques sans magasin, sécurité (CSP, noai, anti-copie), site installable (manifeste + service worker), Votre avis, GoatCounter, aperçu WhatsApp léger. Détails : CLAUDE.md.
data/composition.js)marque/<slug>/), FAQ, SEO, PWAa-propos/, 25/10/2026, règle commune § 44) : fabriquée chaque nuit par
page_a_propos() de tools/build_guides.py, liée depuis l'accueil et tous les pieds de page ; à tenir à jour à chaque
modification visible (test FONCTIONS de tools/test_site.mjs)disabled du fieldset.order-fields et le bloc div.tampon dans index.html,
et remettre le texte de la barre panier dans app.jsdata/votes.js)Le site tourne seul sur les serveurs de GitHub, gratuitement, sans nom de domaine à
renouveler. Ce qui se passe en cas de problème (simulé par python tools/test_pannes.py,
16 scénarios) :
| Risque | Ce que fait le système tout seul | À faire par un humain |
|---|---|---|
| Un magasin change son site / tombe en panne | Garde ses derniers prix 7 jours au plus (mention « Prix Géant du … » dès 2 jours), puis les retire | Demander à Claude : « lis le README et répare la collecte des prix de » |
| Un site renvoie des prix absurdes (millimes, produits manquants, marques inconnues) | Détecté (« incohérent » / « suspect ») : traité comme une panne | Idem |
| Toutes les sources en panne | Bandeau ⚠️ « prix non mis à jour depuis le … » dès 3 jours ; plus aucun prix après 7 jours | Idem, ou chercher de nouvelles sources |
| Robots GitHub arrêtés | Le site compare la date des prix à la date du visiteur : ⚠️ affiché quand même. Un « battement de cœur » mensuel empêche GitHub de mettre les robots en pause (60 jours sans activité) | Onglet Actions du dépôt → réactiver les workflows |
| PC d'Ahmed éteint, volé ou en panne | Rien ne change : depuis le 23/10/2026 aucun prix ne dépend du PC | En cas de vol : changer le mot de passe GitHub et révoquer les sessions (github.com → Settings → Sessions / Applications), fermer les sessions Telegram et Google de l'appareil volé |
| Compte Google inactif (supprimé après 2 ans) | Les prix signalés ne sont plus lus ; les anciens disparaissent après 30 jours ; rien ne casse | Gestionnaire de compte inactif Google → personne de confiance |
| Compte Telegram inactif | Les alertes s'arrêtent si le canal perd son robot | Telegram → Confidentialité → « Supprimer mon compte si absent » : durée maximale ; ajouter un 2ᵉ administrateur |
| Telegram en panne | Prix publiés quand même ; annonce retentée au passage suivant, sans doublon | — |
| Un téléphone garde une vieille version du site | sw.js (service worker) est en réseau d'abord pour les pages et les prix : le cache ne sert que hors connexion | Changer CACHE_VERSION dans sw.js (vide le cache de tous les téléphones) |
Données privées : la liste des fournisseurs, livreurs et grossistes (et leurs robots) est dans un dépôt
GitHub privé séparé (dispatch-eau-prive), jamais dans ce dépôt public.
Successeur : ajouter une personne de confiance comme collaboratrice du dépôt GitHub (Settings → Collaborators), administratrice du canal Telegram et éditrice du Google Forms « Prix signalés ». Pour toute réparation, ouvrir une session Claude Code dans ce dossier et lui demander de lire ce README.
| Chemin | Rôle |
|---|---|
index.html | La page (structure et textes) — changer les ?v= de style.css / app.js à chaque modification (cache des téléphones) |
style.css | Tout le style (thème clair/sombre) |
app.js | Rendu, filtres, avertissement de fraîcheur, prix signalés, panier |
data/eaux.js / eaux.json | Prix (généré — ne pas éditer), avec statut_sources |
data/signalements*.js/json, data/votes.js | Prix signalés et votes (générés) ; signalements_manuels.json = ajouts à la main |
data/baisses.*, historique.*, composition.js | Baisses du jour, historique, composition |
tools/collect_prices.py | Collecte des prix (Carrefour, Géant) + garde-fous |
tools/price_drops.py | Baisses de prix → site + Telegram |
tools/signalements.py | Décision automatique sur les prix signalés → site + Telegram |
tools/test_pannes.py | Simulateur de pannes (23 scénarios) — à relancer après toute modification du robot |
tools/build_history.py, tools/build_pages.py | Historique, pages par marque, sitemap |
| Workflow | Quand | Rôle |
|---|---|---|
maj-prix.yml | chaque nuit ≈ 1h07 (Tunis) | collecte → baisses/Telegram → historique → pages → publication |
signalements.yml | toutes les 2 h, 8h05–22h05 | prix signalés → site + Telegram ; décompte des votes ; commit seulement si un signalement change (10/10/2026) |
battement-de-coeur.yml | le 1er du mois | empêche GitHub de mettre les robots en pause (60 j) |
instagram.yml | chaque lundi 9h05 | image « 5 stikas les moins chères » + texte → canal Telegram (pour Instagram) |
telegram-bienvenue.yml | à la main | message de présentation sur le canal |
tests.yml | à chaque envoi (push) | YAML des robots + test_site.mjs + test_sw.mjs + test_pannes.py + visiteur simulé (visiteur_simule.py : le site vu comme un visiteur sur téléphone) (e-mail de GitHub si échec) |
Automatique : le workflow GitHub Actions (.github/workflows/maj-prix.yml) tourne
chaque nuit vers 1h du matin (heure de Tunis) sur les serveurs GitHub — PC éteint ou pas —
et publie directement sur le site. Lancement immédiat :
gh workflow run maj-prix.yml -R Ah6259/prix-eaux-tunisie.
Manuel (copie locale uniquement) : double-clic sur tools/update_prix.bat, ou :
python tools/collect_prices.py
Notes :
prix-eau-monoprix/ et prix-eau-otrity/
disent « n'est plus suivi » (noindex, hors du plan du site). Aziza n'est plus suivi (30/09/2026) : barka.tn ne donne que les
prix de l'ancienne boutique en ligne d'Aziza, fermée (prix périmés, signalés par un client) ;
le site actuel d'Aziza ne publie que des catalogues promo et son API de prix est privée.
Jumia exige une vérification « humain » : on ne contourne pas (demander l'autorisation, ou prix signalés).MARQUES_EAU), packs/fardeaux écartés
(la stika est affichée comme 6 × la bouteille), prix hors 0,25–2,5 DT/L ou supérieurs
au double de l'offre la moins chère écartés.META en tête de
tools/collect_prices.py.geant_scrape.py est conservé pour référence mais n'est plus utilisé (barka_scrape.py et
build_data.py, qui lisaient encore Monoprix, supprimés le 23/10/2026 ; ils restent dans l'historique git).Site statique servi par GitHub Pages (branche main, racine) : chaque commit des robots
redéploie le site en ~1 minute. Le dépôt doit rester public (Pages gratuit).
Le dépôt Ah6259/prix-eau-tunisie n'est qu'une redirection vers ce site : à garder.
data/composition.js — bon pour le SEO.tools/price_drops.py, secret GitHub TELEGRAM_BOT_TOKEN). Plus tard : alerte email
par marque, recopie éventuelle sur une chaîne WhatsApp.tools/signalements.py toutes les 2 h de 8h à 22h (workflow signalements.yml) qui décide seul
(vraisemblance, écart aux prix connus, doublons = « confirmé ») → affiché 30 jours sur la
carte (hors calcul du moins cher) + annoncé sur le canal Telegram. Tout est automatique.
Plus tard (pas urgent, ~15 min avec Ahmed) : publication quasi immédiate (2-3 min) —
script Google Apps Script attaché au formulaire, déclencheur « à l'envoi », qui lance le
workflow signalements.yml via l'API GitHub (workflow_dispatch) avec une clé GitHub
limitée (fine-grained token, Actions : write sur ce seul dépôt) rangée dans le script.
Garder alors un passage de secours toutes les 2 h.Réutiliser toute la recette du site de l'eau (scrapers Carrefour/Géant/barka, page, filtres, MAJ de nuit, historique, alertes Telegram, SEO, GoatCounter) pour d'autres produits.
/safia/…) pour le référencement Googleassets/son.js ; carte isolée et menus des filtres au-dessus (règle commune § 28) ; tests ajoutés. Règles communes § 27 (recherche au son) et § 28 (cartes).tools/sources_a_explorer.md) ; la vérification du matin le contrôle.