Bookmarklet · Safari, Chrome, Firefox

Tout refuser

Deux favoris à glisser dans la barre de votre navigateur. Vous cliquez dessus quand vous en avez besoin, rien ne tourne en arrière-plan.

↑ glissez-les vers votre barre de favoris (⇧⌘B pour l'afficher)

Ce que fait chaque bouton

🍪 Tout refuser
Répond « non » à la fenêtre de cookies affichée sur la page. Si cette fenêtre ne propose aucun refus — seulement accepter ou s'abonner — il ne clique rien, vous le signale, et ouvre la vue de lecture.
📖 Mode lecture
Réaffiche le texte de la page sur fond clair ou sombre, sans les habillages. À la demande, sur n'importe quelle page. Échap pour revenir.

Ce qu'il ne fait pas

Le glisser-déposer ne marche pas ? Copier le code

Créez un favori, puis collez le code dans son champ « adresse ». Safari : clic droit sur un favori → Modifier l'adresse. Chrome : clic droit sur la barre → Ajouter une page.

🍪 Tout refuser

📖 Mode lecture

Voir le code source complet
(function () {
  var FORCE = /*FORCE*/false;
  var hits = [], blocked = 0;

  function txt(el) { try { return (el.innerText || el.textContent || '').replace(/\s+/g, ' ').trim(); } catch (e) { return ''; } }
  function vis(el) { try { return el.getClientRects().length > 0; } catch (e) { return false; } }

  function toast(msg, ok) {
    try {
      var d = document.createElement('div');
      d.textContent = msg;
      d.style.cssText = 'position:fixed !important;z-index:2147483647 !important;left:50% !important;bottom:22px !important;' +
        'top:auto !important;right:auto !important;transform:translateX(-50%) !important;' +
        'background:' + (ok ? '#14603a' : '#8A2B18') + ' !important;color:#fff !important;padding:11px 17px !important;' +
        'border-radius:9px !important;font:600 13px/1.45 -apple-system,BlinkMacSystemFont,sans-serif !important;' +
        'max-width:82vw !important;text-align:center !important;letter-spacing:normal !important;text-transform:none !important;' +
        'box-shadow:0 6px 22px rgba(0,0,0,.35) !important;pointer-events:none !important;opacity:1 !important;visibility:visible !important';
      document.body.appendChild(d);
      setTimeout(function () { d.parentNode && d.parentNode.removeChild(d); }, 5200);
    } catch (e) {}
  }

  /* ===================== MODE LECTURE ===================== */

  var KILL = /(^|[\s_-])(pub|pubs|ads?|advert|banner|sponsor|share|social|newsletter|related|recommend|comment|nav|menu|footer|header|breadcrumb|tags?|cookie|consent|paywall|subscribe|abonn|promo|widget|outbrain|taboola|toolbar|sidebar|caption)/i;
  var KEEP = /(article|content|contenu|body|story|post|entry|texte|chapo|main)/i;

  function pickContainer() {
    var ps = document.querySelectorAll('p'), nodes = [], sc = [];
    for (var i = 0; i < ps.length; i++) {
      var p = ps[i], t = txt(p);
      if (t.length < 45 || !vis(p)) continue;
      var par = p.parentElement;
      for (var d = 0; d < 3 && par && par.tagName !== 'BODY'; d++) {
        var idx = nodes.indexOf(par);
        if (idx < 0) { nodes.push(par); sc.push(0); idx = nodes.length - 1; }
        sc[idx] += t.length / (d + 1);
        par = par.parentElement;
      }
    }
    var best = null, bs = 0;
    for (var k = 0; k < nodes.length; k++) {
      var n = nodes[k], s = sc[k];
      var cls = ((typeof n.className === 'string' ? n.className : '') + ' ' + (n.id || ''));
      if (KILL.test(cls)) s *= 0.2;
      if (KEEP.test(cls)) s *= 1.6;
      if (n.tagName === 'ARTICLE') s *= 1.8;
      var links = n.querySelectorAll('a'), lt = 0;
      for (var q = 0; q < links.length; q++) lt += txt(links[q]).length;
      var tt = txt(n).length || 1;
      if (lt / tt > 0.4) s *= 0.25;
      if (s > bs) { bs = s; best = n; }
    }
    return bs > 700 ? best : null;
  }

  function meta(sel, attr) {
    var e = document.querySelector(sel);
    return e ? (attr ? e.getAttribute(attr) : txt(e)) : '';
  }

  function cssRules() {
    return [
      '.root{position:absolute;inset:0;overflow-y:auto;overscroll-behavior:contain;background:#FCFBF7;color:#1B1D18;font:400 19px/1.72 Charter,Georgia,"Times New Roman",serif;-webkit-font-smoothing:antialiased}',
      '@media (prefers-color-scheme:dark){.root{background:#12140F;color:#E6E9DE}}',
      '.w{max-width:40em;margin:0 auto;padding:26px 24px 140px}',
      '.bar{position:sticky;top:0;display:flex;gap:8px;align-items:center;justify-content:flex-end;padding:12px 0 18px;background:inherit}',
      '.bar button{font:600 13px/1 -apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;padding:8px 13px;border-radius:7px;border:1px solid rgba(127,127,127,.4);background:transparent;color:inherit;cursor:pointer}',
      '.bar button:hover{background:rgba(127,127,127,.16)}',
      '.bar button:focus-visible{outline:2px solid currentColor;outline-offset:2px}',
      'h1{font-size:1.85em;line-height:1.15;margin:.2em 0 .35em;font-weight:600;letter-spacing:-.01em}',
      '.meta{font:500 12.5px/1.5 -apple-system,BlinkMacSystemFont,sans-serif;letter-spacing:.06em;text-transform:uppercase;opacity:.55;margin:0 0 2.2em}',
      '.art p{margin:0 0 1.1em}',
      '.art h2,.art h3,.art h4{font-size:1.18em;line-height:1.3;margin:1.9em 0 .5em;font-weight:600}',
      '.art img{max-width:100%;height:auto;display:block;margin:1.6em auto;border-radius:6px}',
      '.art blockquote{margin:1.5em 0;padding-left:1.1em;border-left:3px solid rgba(127,127,127,.45);font-style:italic}',
      '.art a{color:inherit;text-underline-offset:3px}',
      '.art ul,.art ol{margin:0 0 1.1em;padding-left:1.4em}',
      '.art li{margin:0 0 .45em}',
      '.art figure{margin:1.6em 0}',
      '.art table,.art pre{max-width:100%;overflow-x:auto;display:block}',
      '.art *::first-letter{font-size:inherit;float:none;line-height:inherit;font-style:inherit;font-weight:inherit;color:inherit;margin:0;padding:0}',
      '.art *::before,.art *::after{content:none}'
    ];
  }

  var ASIDE = /^(à lire aussi|a lire aussi|lire aussi|à lire également|voir aussi|sur le même sujet|à voir également|en savoir plus|partager|nos articles)/i;

  function reader() {
    if (document.getElementById('__lect')) return true;
    var src = pickContainer();
    if (!src) return false;

    var box = src.cloneNode(true);
    var junk = box.querySelectorAll('script,style,noscript,iframe,form,button,input,select,textarea,svg,video,audio,aside,nav,footer,object,embed,link,h1,[role="dialog"],[aria-hidden="true"]');
    for (var i = junk.length - 1; i >= 0; i--) { try { junk[i].parentNode.removeChild(junk[i]); } catch (e) {} }

    var all = box.querySelectorAll('*');
    for (var j = all.length - 1; j >= 0; j--) {
      var e = all[j];
      var cls = ((typeof e.className === 'string' ? e.className : '') + ' ' + (e.id || ''));
      if (e.tagName !== 'P' && e.tagName !== 'IMG' && KILL.test(cls)) { try { e.parentNode.removeChild(e); } catch (x) {} continue; }
      var own = (e.textContent || '').replace(/\s+/g, ' ').trim();
      if (own.length < 400 && ASIDE.test(own)) { try { e.parentNode.removeChild(e); } catch (x) {} continue; }
      if (e.tagName === 'IMG') {
        var u = e.getAttribute('data-src') || e.getAttribute('data-lazy-src') || e.getAttribute('data-original') || e.getAttribute('src') || '';
        if (!u || /^data:image\/(gif|svg)/.test(u) || (e.naturalWidth && e.naturalWidth < 140)) { try { e.parentNode.removeChild(e); } catch (x) {} continue; }
        e.setAttribute('src', u);
        e.removeAttribute('srcset'); e.removeAttribute('loading'); e.removeAttribute('sizes');
      }
      e.removeAttribute('style'); e.removeAttribute('class'); e.removeAttribute('id'); e.removeAttribute('onclick');
    }

    var title = meta('meta[property="og:title"]', 'content') || meta('h1') || document.title || '';
    var author = meta('meta[name="author"]', 'content') || meta('[rel="author"]') || '';
    var date = meta('meta[property="article:published_time"]', 'content') || '';
    if (date) { try { date = new Date(date).toLocaleDateString('fr-FR', { day: 'numeric', month: 'long', year: 'numeric' }); } catch (e) { date = ''; } }

    var host = document.createElement('div');
    host.id = '__lect';
    host.style.cssText = 'position:fixed !important;left:0 !important;top:0 !important;right:0 !important;bottom:0 !important;' +
      'width:auto !important;height:auto !important;z-index:2147483647 !important;display:block !important;' +
      'margin:0 !important;padding:0 !important;border:0 !important;filter:none !important;transform:none !important;' +
      'opacity:1 !important;visibility:visible !important;clip-path:none !important';

    var sr = null;
    try { sr = host.attachShadow({ mode: 'open' }); } catch (e) {}
    var mount = sr || host;
    var root = document.createElement('div'); root.className = 'root';
    var w = document.createElement('div'); w.className = 'w';
    var bar = document.createElement('div'); bar.className = 'bar';

    function mk(t, fn) { var b = document.createElement('button'); b.type = 'button'; b.textContent = t; b.addEventListener('click', fn); bar.appendChild(b); }
    var size = 19;
    function setSize(v) { size = Math.max(14, Math.min(30, v)); root.style.fontSize = size + 'px'; }
    mk('A\u2212', function () { setSize(size - 1); });
    mk('A+', function () { setSize(size + 1); });
    mk('Quitter le mode lecture', close);

    var h = document.createElement('h1'); h.textContent = title;
    var m = document.createElement('p'); m.className = 'meta';
    m.textContent = [location.hostname.replace(/^www\./, ''), author, date].filter(Boolean).join(' \u00b7 ');
    var art = document.createElement('div'); art.className = 'art'; art.appendChild(box);

    w.appendChild(bar); w.appendChild(h); w.appendChild(m); w.appendChild(art);
    root.appendChild(w); mount.appendChild(root);
    document.body.appendChild(host);

    try {
      var st = document.createElement('style');
      mount.appendChild(st);
      if (!st.sheet) { mount.removeChild(st); document.head.appendChild(st); }
      var rules = cssRules();
      for (var c1 = 0; c1 < rules.length; c1++) {
        var rule = sr ? rules[c1] : rules[c1].replace(/(^|,|\{)\s*(\.root|\.w|\.bar|h1|\.meta|\.art)/g, '$1 #__lect $2');
        try { st.sheet.insertRule(rule, st.sheet.cssRules.length); } catch (x) {}
      }
    } catch (e) {}

    var prev = document.documentElement.style.overflow;
    document.documentElement.style.overflow = 'hidden';
    function close() {
      document.documentElement.style.overflow = prev;
      document.removeEventListener('keydown', esc, true);
      try { host.parentNode.removeChild(host); } catch (e) {}
    }
    function esc(ev) { if (ev.key === 'Escape') { ev.stopPropagation(); close(); } }
    document.addEventListener('keydown', esc, true);
    return true;
  }

  if (FORCE) {
    if (!reader()) toast("Pas assez de texte d'article identifiable sur cette page.", false);
    return;
  }

  /* ============ DÉTECTION DU MUR « ACCEPTER OU PAYER » ============ */

  var PAY = /(s['’ ]?abonn|abonnement|abonnez|sans publicit|sans pub\b|souscri|subscri|\d+[.,]\d{2}\s*(€|eur)|(€|eur)\s?\d|\d+\s?€|par mois|\/\s?mois|per month|offre premium|version payante)/i;
  var CONSENT = /(cookie|consent|traceur|donn[ée]es personnelles|nos partenaires|publicit[ée]s? (personnalis|cibl)|vie priv[ée]e|privacy|rgpd|gdpr)/i;

  function wallText() {
    var out = '', all = document.body.querySelectorAll('*'), n = Math.min(all.length, 6000);
    for (var i = 0; i < n; i++) {
      var el = all[i], st;
      try { st = getComputedStyle(el); } catch (e) { continue; }
      var modal = (el.getAttribute && (el.getAttribute('aria-modal') === 'true' || el.getAttribute('role') === 'dialog'));
      if (!modal && st.position !== 'fixed' && st.position !== 'sticky') continue;
      if (!vis(el)) continue;
      var t = txt(el);
      if (t.length < 60 || t.length > 6000) continue;
      out += ' ' + t;
      if (out.length > 24000) break;
    }
    return out;
  }

  var wt = wallText();
  if (CONSENT.test(wt) && PAY.test(wt)) {
    var ok = reader();
    toast(ok
      ? '⚠︎ Mur « accepter la pub ou payer ». Rien n\'a été cliqué — mode lecture activé.'
      : '⚠︎ Mur « accepter la pub ou payer ». Rien n\'a été cliqué, et l\'article n\'est pas dans la page.', false);
    return;
  }

  /* ===================== REFUS DES COOKIES ===================== */

  var apis = [
    ['Didomi',        function () { Didomi.setUserDisagreeToAll(); }],
    ['OneTrust',      function () { OneTrust.RejectAll(); }],
    ['Cookiebot',     function () { Cookiebot.decline(); }],
    ['Usercentrics',  function () { UC_UI.denyAllConsents(); }],
    ['Osano',         function () { Osano.cm.denyAll(); }],
    ['Complianz',     function () { cmplz_deny_all(); }],
    ['tarteaucitron', function () { tarteaucitron.userInterface.respondAll(false); }],
    ['Klaro',         function () { var m = klaro.getManager(); m.declineAll(); m.saveAndApplyConsents(); }],
    ['Axeptio',       function () { window._axcb.push(function (s) { s.setAllVendorsStatus(false); }); }],
    ['CookieYes',     function () { document.querySelector('.cky-btn-reject').click(); }],
    ['Quantcast',     function () { document.querySelector('.qc-cmp2-summary-buttons button:last-child').click(); }]
  ];
  for (var a = 0; a < apis.length; a++) { try { apis[a][1](); hits.push(apis[a][0]); } catch (e) {} }

  var WL = /(sans\s+accepter|without\s+accepting|ohne\s+akzeptieren|sin\s+aceptar)/i;
  var NO = /(tout\s+accepter|j.?accepte|accepter|accept|agree|allow|autoriser|abonn|subscribe|connect|log\s?in|sign\s?in|param[eé]tr|personnalis|configur|settings|manage|g[eé]rer|choix|options|customize|einstellungen|zustimmen|akzeptieren|en\s+savoir|learn\s+more|politique|policy|privacy|confidentialit)/i;
  var YES = /(tout\s+refuser|refuser\s+tout|refuser|je\s+refuse|non\s+merci|uniquement.{0,20}(essentiel|n[eé]cessaire)|(essentiel|n[eé]cessaire)s?\s+(uniquement|seulement)|reject\s*all|reject|decline|deny|disagree|do\s+not\s+(accept|consent|sell|share)|only\s+(necessary|essential|required)|(necessary|essential)\s+only|alle\s+ablehnen|ablehnen|nur\s+notwendige|rechazar|rifiuta|weigeren|afwijzen|odrzu)/i;

  function collect(root, out, depth) {
    if (depth > 10) return;
    var list;
    try { list = root.querySelectorAll('*'); } catch (e) { return; }
    for (var j = 0; j < list.length; j++) {
      var el = list[j], t = el.tagName, c = el.getAttribute && el.getAttribute('class');
      if (t === 'BUTTON' || t === 'A' || t === 'INPUT' ||
          (el.getAttribute && el.getAttribute('role') === 'button') ||
          (typeof c === 'string' && /btn|button/i.test(c))) out.push(el);
      if (el.shadowRoot) collect(el.shadowRoot, out, depth + 1);
    }
  }

  var seen = [];
  function sweep(doc) {
    var cands = [], best = null, bestScore = 0;
    try { collect(doc, cands, 0); } catch (e) { return null; }
    for (var k = 0; k < cands.length; k++) {
      var el = cands[k];
      if (seen.indexOf(el) > -1) continue;
      var t = '';
      try { t = (el.innerText || el.textContent || el.value || (el.getAttribute && el.getAttribute('aria-label')) || '').replace(/\s+/g, ' ').trim(); } catch (e) { continue; }
      if (!t || t.length > 60) continue;
      if (!vis(el)) continue;
      var s = 0;
      if (WL.test(t)) s = 100;
      else if (NO.test(t)) continue;
      else if (YES.test(t)) s = 60;
      else continue;
      s -= t.length * 0.3;
      if (el.tagName === 'BUTTON') s += 5;
      if (s > bestScore) { bestScore = s; best = el; }
    }
    if (best) { seen.push(best); try { best.click(); return best; } catch (e) {} }
    return null;
  }

  function allDocs() {
    var docs = [document], f = document.querySelectorAll('iframe,frame');
    for (var n = 0; n < f.length; n++) {
      try { var d = f[n].contentDocument; if (d && d.body) docs.push(d); else blocked++; } catch (e) { blocked++; }
    }
    return docs;
  }

  function pass() {
    var docs = allDocs(), found = null;
    for (var p = 0; p < docs.length; p++) { var r = sweep(docs[p]); if (r && !found) found = r; }
    return found;
  }

  function label(el) { return '"' + (el.innerText || el.value || '').replace(/\s+/g, ' ').trim().slice(0, 28) + '"'; }
  var r0 = pass();
  if (r0) hits.push(label(r0));
  var c = 0;
  var timer = setInterval(function () {
    var r = pass();
    if (r) hits.push(label(r));
    if (++c < 3) return;
    clearInterval(timer);
    if (hits.length) toast('Cookies refusés : ' + hits.join(' + '), true);
    else if (blocked) toast("Bandeau dans une iframe d'un autre domaine : un bookmarklet ne peut pas y entrer.", false);
    else toast('Aucun bouton de refus trouvé sur cette page.', false);
  }, 550);
})();