// ==UserScript== // @namespace mercado-libre-plox // @name Mercado Libre Plox // @name:en Mercado Libre Plox // @description Oculta o marca productos Internacionales en Mercado Libre (Chile). // @description:en Hide or mark international products in Mercado Libre (Chile). // @version 0.0.1 // @author Alplox // @match *://*.mercadolibre.cl/* // @grant none // @icon https://www.mercadolibre.cl/favicon.ico // @license MIT // @downloadURL https://raw.githubusercontent.com/Alplox/Mercado-Libre-Plox/refs/heads/main/mercado-libre-plox.user.js // @updateURL https://raw.githubusercontent.com/Alplox/Mercado-Libre-Plox/refs/heads/main/mercado-libre-plox.meta.js // ==/UserScript== (function (d) { 'use strict'; // === Íconos SVG === const iconOcultos = ``; const iconGrisear = ` `; // === Funciones de utilidad === function whenReady(selector, cb, timeout = 10000) { const el = d.querySelector(selector); if (el) return cb(el); const obs = new MutationObserver((_, o) => { const found = d.querySelector(selector); if (found) { o.disconnect(); cb(found); } }); obs.observe(d.documentElement, { childList: true, subtree: true }); setTimeout(() => obs.disconnect(), timeout); } whenReady('section.ui-search-results', init); // === Función principal === function init() { let modoMarcado = localStorage.getItem('ml_modo_marcado') === 'true'; // === CSS === const style = d.createElement('style'); style.textContent = ` .plox-item-oculto { display:none !important; } #btnConfigPlox { position: fixed; bottom: 20px; right: 20px; z-index: 99999; padding: 10px 14px; background: #ffdb4d; border: 1px solid #aaa; border-radius: 8px; cursor: pointer; font-size: 14px; font-weight: 600; box-shadow: 0 3px 8px rgba(0,0,0,0.2); gap: 10px; display: flex; align-items: center; } #btnConfigPlox span { background:#000; color:#fff; padding:3px; border-radius:8px; font-size:12px; } .modo-actual-plox svg, .plox-btn svg, #btnConfigPlox svg { margin: -5px auto; } #btnConfigPlox svg path { fill:#fff; } #ploxConfigModal { position: fixed; top: 25%; left: 50%; transform: translateX(-50%); background: #fff; padding: 16px; border: 1px solid #bbb; border-radius: 10px; box-shadow: 0 6px 20px rgba(0,0,0,0.25); z-index: 100000; width: 320px; font-family: Arial, sans-serif; } #ploxConfigModal h3 { margin: 0 0 8px 0; text-align: center; font-size: 16px; } .modo-actual-plox { margin: 12px 0; font-size: 14px; text-align: center; display:flex; justify-content:center; align-items:center; gap:6px; background: #96d5ffff; padding: 6px; border-radius: 6px; } .plox-btn { display:block; width:100%; padding:8px; margin-top:8px; background:#ffdb4d; border:1px solid #888; border-radius:6px; cursor:pointer; text-align:center; } .plox-btn:hover { background:#ffe87d; } #modalOcultos { position: fixed; top: 8%; left: 50%; transform: translateX(-50%); width: 100%; max-height: 80%; overflow-y: auto; background: #fff; border: 1px solid #888; padding: 18px; z-index: 100000; box-shadow: 0 6px 30px rgba(0,0,0,0.3); border-radius: 10px; } .descripcion-plox { font-size: 13px; text-align: center; margin-bottom: 8px; background: #f0f0f0; padding: 6px; border-radius: 6px; } .ocultos-cerrar { float:right; cursor:pointer; font-size:16px; border:none; background:transparent; } .ocultos-lista { list-style:none; padding:0; margin:0; display:flex; flex-wrap:wrap; gap:14px; } .ocultos-item { width: 200px; border:1px solid #ddd; border-radius:6px; padding:10px; box-sizing:border-box; display:flex; flex-direction:column; align-items:center; text-align:center; background:#fafafa; } .ocultos-item img { width:100%; height:120px; object-fit:contain; margin-bottom:8px; } .ocultos-item a { font-weight:600; color:#0066c0; text-decoration:none; margin-bottom:6px; } .ocultos-motivo { font-size:12px; color:#444; margin-bottom:6px; } .ocultos-boton { padding:6px 8px; margin-top:6px; width:100%; cursor:pointer; border-radius:6px; border:1px solid #999; background:#fff; } /* --- Marcar visualmente --- */ .plox-item-marcado { background-color:#e0e0e0 !important; opacity:0.5 !important; transition: all 0.3s ease; position:relative; } .plox-item-etiqueta { position:absolute; top:4px; right:4px; background:#000; color:#fff; font-size:10px; padding:2px 5px; border-radius:4px; opacity:0.8; z-index:2; } .plox-item-restaurado { background:#ffeb3b !important; border:none !important; } `; d.head.appendChild(style); // === Helpers === function obtenerItem(el) { if (!el || !el.closest) return null; // 1. Caso típico: ítems normales de resultados let li = el.closest('li.ui-search-layout__item'); if (li) return li; // 2. Caso: filtro "Envío desde otro país" li = el.closest('li.ui-search-filter-highlighted-SHIPPING_ORIGIN_HIGHLIGHTED'); if (li) return li; // 3. Caso: anuncio inferior al final del listado let div = el.closest('#ui-search-bottom-ads__wrapper'); if (div) return div; return null; } function actualizarContador() { const btn = d.querySelector('#conteo-ocultados'); if (!btn) return; const conteo = d.querySelectorAll('[data-plox-marcado]').length; btn.textContent = conteo; } function aplicarEtiqueta(li) { if (!li.querySelector('.plox-item-etiqueta')) { const tag = d.createElement('div'); tag.className = 'plox-item-etiqueta'; tag.textContent = 'Marcado por Mercado Libre Plox'; li.appendChild(tag); } } function estaVisible(el) { return !!(el.offsetWidth || el.offsetHeight || el.getClientRects().length); } function limpiarEtiqueta(li) { li.querySelector('.plox-item-etiqueta')?.remove(); } function aplicarModoAElemento(li) { if (!li) return; if (modoMarcado) { li.setAttribute('data-plox-marcado', 'true'); li.classList.add('plox-item-marcado'); li.classList.remove('plox-item-oculto'); aplicarEtiqueta(li); } else { li.setAttribute('data-plox-marcado', 'false'); limpiarEtiqueta(li); li.classList.remove('plox-item-marcado'); li.classList.add('plox-item-oculto'); } actualizarContador(); } function escanear() { const selectores = [ 'span.poly-component__cbt', // Internacional 'a.poly-component__ads-promotions', // Promocionado 'span.poly-component__manufacturing-time', // Llega después 'a.poly-component__purchase-options', // Opciones de compra '.ui-search-bottom-ads__wrapper', // Anuncio inferior (Si tienes adblock, no lo verás. Pero está ahí) 'li.ui-search-filter-highlighted-SHIPPING_ORIGIN_HIGHLIGHTED' // Boton Filtro Envío desde otro país ]; selectores.forEach(selector => { d.querySelectorAll(selector).forEach(node => { const item = obtenerItem(node); /* console.log('ML Plox - Encontrado:', selector, item); */ if (!item) return; if (modoMarcado) { aplicarModoAElemento(item); } else { if (estaVisible(item)) { aplicarModoAElemento(item); } } }); }); } function actualizarTextoBoton() { const btn = d.querySelector('#btnConfigPlox'); if (!btn) return; const label = modoMarcado ? `Marcados ${iconGrisear}` : `Ocultos ${iconOcultos}`; btn.querySelector('span span:last-child').innerHTML = label; } function crearBotonConfig() { if (d.querySelector('#btnConfigPlox')) return; const btn = d.createElement('button'); btn.id = 'btnConfigPlox'; btn.innerHTML = `⚙️ Mercado Libre Plox 0Marcados`; btn.addEventListener('click', abrirConfig); d.body.appendChild(btn); actualizarTextoBoton(); } function abrirConfig() { if (d.querySelector('#ploxConfigModal')) return; const modal = d.createElement('div'); modal.id = 'ploxConfigModal'; const titulo = d.createElement('h3'); titulo.textContent = '⚙️ Configuración Mercado Libre Plox'; const descripcion = d.createElement('div'); descripcion.className = 'descripcion-plox'; descripcion.textContent = 'Oculta: Compras Internacionales, Promocionados, Etiquetados como "Llega después" u "Opciones de compra".'; const modoActual = d.createElement('div'); modoActual.className = 'modo-actual-plox'; modoActual.id = 'active-mode'; const modoTexto = d.createElement('strong'); modoTexto.innerHTML = modoMarcado ? `Marcar (grisear) ${iconGrisear}` : `Ocultar ${iconOcultos}`; modoActual.innerHTML = 'Modo actual: '; modoActual.appendChild(modoTexto); const botonToggle = d.createElement('button'); botonToggle.id = 'ploxToggle'; botonToggle.className = 'plox-btn'; botonToggle.innerHTML = `Cambiar a: ${modoMarcado ? `Ocultar ${iconOcultos}` : `Marcar (grisear) ${iconGrisear}`}`; botonToggle.addEventListener('click', () => { modoMarcado = !modoMarcado; localStorage.setItem('ml_modo_marcado', modoMarcado); actualizarTextoBoton(); modal.querySelector('#active-mode').innerHTML = `Modo actual: ${modoMarcado ? `Marcar (grisear) ${iconGrisear}` : `Ocultar ${iconOcultos}`}`; botonToggle.innerHTML = `Cambiar a: ${modoMarcado ? `Ocultar ${iconOcultos}` : `Marcar (grisear) ${iconGrisear}`}`; escanear(); }); // Botón de cerrar const botonCerrar = d.createElement('button'); botonCerrar.id = 'ploxCerrar'; botonCerrar.className = 'plox-btn'; botonCerrar.textContent = 'Cerrar'; botonCerrar.addEventListener('click', () => modal.remove()); // Añadir todo al modal modal.appendChild(titulo); modal.appendChild(descripcion); modal.appendChild(modoActual); modal.appendChild(botonToggle); modal.appendChild(botonCerrar); d.body.appendChild(modal); } // === Activación inicial === const observer = new MutationObserver(escanear); const containerPrincipal = d.querySelector('section.ui-search-results'); const containerExtra1 = d.querySelector('.ui-search-bottom-ads__wrapper')?.parentNode; const containerExtra2 = d.querySelector('li.ui-search-filter-highlighted-SHIPPING_ORIGIN_HIGHLIGHTED')?.parentNode; if (containerPrincipal) { observer.observe(containerPrincipal, { childList: true, subtree: true }); } if (containerExtra1) { observer.observe(containerExtra1, { childList: true, subtree: true }); } if (containerExtra2) { observer.observe(containerExtra2, { childList: true, subtree: true }); } escanear(); actualizarContador() crearBotonConfig(); } })(document);