¿Cómo evito que "Leer más: www.site.com" sea inyectado con JavaScript que no sea Tynt en acciones de copiar y pegar?


30

Hay muchos sitios que insertan algo como "Leer más: www.site.com" en su portapapeles cuando copia texto en su navegador. Esto me parece abominable. Una búsqueda en Google revela algunos métodos para detener esto si el sitio web utiliza el servicio Tynt (simplemente bloqueando el dominio de Tynt), pero muchos sitios web utilizan JavaScript interno.

¿Hay alguna forma general de bloquear este comportamiento además de desactivar JavaScript? Uso Chrome pero estoy interesado en todas las soluciones.

EDITAR: Para ser claros, quiero poder mantener el resto de la funcionalidad de JavaScript para estos sitios web, ya que muchos se romperán sin ella.

EDITAR # 2: Aquí hay dos sitios web de ejemplo que continúan hostigándome a pesar de mi uso de un bloqueador de Tynt: Revolución marginal | Los tiempos fiscales

Aquí hay dos preguntas de StackOverflow y dos publicaciones de blog que explican formas de implementar esta práctica sombría manualmente sin Tynt. Aquí hay una publicación de blog que describe lo difícil que resulta bloquear de manera confiable. Aquí está la discusión más reciente que pude encontrar (marzo de 2013) que ofrece sugerencias sobre cómo bloquear esto en Chrome usando AdBlock, pero no funcionó para mí.

Respuestas:


24

El sitio que agrega las cosas molestas de "Leer más" es ShareThis.

Para evitar este mal comportamiento, tiene tres alternativas diferentes:

Deshabilitar los eventos del portapapeles

Estos sitios web utilizan las API del Portapapeles , que permiten a los desarrolladores web interceptar las acciones de copiar / cortar / pegar y ejecutar algún código cuando se realizan. Así es como funciona ShareThis (y otros sitios web como ese). Simplemente espera el evento de copia y justo antes de que se realice la copia efectiva, agrega una "capa" adicional de texto que contiene el molesto "- Ver ...".

Ahora la pregunta es: ¿hay algún tipo de método para deshabilitar los eventos del portapapeles? Desafortunadamente, no he podido encontrar un método para hacer esto en Chrome / Chromium, pero en Firefox es posible de dos maneras diferentes.

  • Entra about:configy busca dom.event.clipboardevents.enabled. Haga doble clic en la tecla (configúrela como false) y listo. Ha deshabilitado los eventos del portapapeles y nadie volverá a tocar su portapapeles.
  • Para versiones anteriores de Firefox (muy, muy antiguas), existe esta extensión que hace exactamente lo mismo que la about:configopción.

Deshabilitar los eventos del portapapeles no debería dañar la experiencia de ningún sitio web, ya que rara vez se usan y no hay realmente un propósito para usarlos (aparte del envío de correo no deseado).

Pasemos a la segunda solución.

Block ShareThis

Si no necesita ShareThis, simplemente puede bloquear el w.sharethis.comdominio. El Javascript responsable de cargar ShareThis (y registrar el ClipboardEvent) se carga desde ese sitio web.

Puede bloquearlo de diferentes maneras, desde un simple filtro AdBlock hasta editar su archivo de hosts (esto no está cubierto ni vinculado aquí ya que no puedo poner más enlaces debido a mi reputación).

Un ejemplo de hacerlo a través del hostsarchivo:

127.0.0.1 w.sharethis.com

La tercera solución es la más difícil y debe usarse solo como último recurso.

Deshabilite la función de selección en los sitios web problemáticos

Para editar el contenido que se copia en el portapapeles, estos sitios web utilizan la SelectionAPI que les permite editar selecciones sobre la marcha. Por lo tanto, una solución es deshabilitar por completo cualquier tipo de Selection(en el lado del código, obviamente. Aún podrá realizar selecciones).

Esto se puede hacer con un simple script Tampermonkey / Greasemonkey. Lo probé solo en Firefox ya que no puedo instalar Chrome en este momento. Lo siento por eso.

Este es el código fuente:

// ==UserScript==
// @name        Goodbye selections
// @namespace   tag: utils
// @include     $put_here_a_website_you'd_like_to_disable_selections$
// @include     $more_websites$
// @version     1
// @grant       none
// ==/UserScript==
(function() {
    var disableSelections = function() {
        document.getSelection = window.getSelection = function() {
            return { isCollapsed: true };
        };
    };
    var script = document.createElement ("script");
    script.appendChild (document.createTextNode ("(" + disableSelections + ")();"));
    (document.body || document.head || document.documentElement).appendChild (script);
})();

Para que esto funcione, debe crear una nueva secuencia de comandos Greasemonkey / Tampermonkey y ajustar las @includedirectivas. Puede poner un sitio web por línea, y debe hacerse como @include http://bad.website.address/.

Lo probé con los sitios web que ha vinculado y funciona sin problemas. Sin embargo, tenga en cuenta que esto puede causar problemas, ya que Selectionlos sitios web perfectamente legítimos usan s (por ejemplo, los cuadros de texto de StackExchange los usan para insertar un símbolo, cuando hace clic en el botón, en la posición de su cursor), por lo que debe habilitar ese script de usuario solo en sitios web problemáticos.

(tenga en cuenta que es posible que deba eliminar las líneas que comienzan con //si está creando el script de usuario de los menús Greasemonkey / Tampermonkey, lo agregarán automáticamente)

La explicación del script de usuario es bastante simple. Primero, define una función llamada disableSelectionsque reemplaza el valor predeterminado document.getSelectiony window.getSelectionfunciones con una que simplemente devuelve un objeto que contiene { isCollapsed: true }. ¿Por qué? Porque ShareThis (verifiqué su código JS) llama a esa función y comprueba si la isCollapsedpropiedad está configurada en true(si es así, detiene el "envenenamiento del portapapeles"). Otros sitios web como ese tal vez no realicen esa verificación, pero terminarán simplemente con un error cuando intenten llamar a una función legítima del Selectionobjeto.

Luego, la función se inyecta en el cuerpo / encabezado / documento y se ejecutará automáticamente. Una pregunta que puede hacer es: si Javascript permite anular (casi) todas las funciones, ¿por qué no anuló la addEventListenerfunción para simplemente no hacer nada cuando el evento es copiar / cortar / pegar? La respuesta es bastante simple. Un script de usuario se ejecuta en un momento no fácilmente predecible, esto significa que el Javascript de ShareThis se puede cargar antes que el script de usuario, y no hará nada. En cambio, simplemente anulando la window.getSelectionfunción no habrá ningún problema ya que esa función se llama solo cuando se realiza una copia, y estamos 100% seguros de que cuando copie un texto, el script de usuario ya se ha cargado.

Conclusión

La mejor y más limpia solución es obviamente la primera, ya que deshabilita una API prácticamente inútil.

El segundo también es válido, pero perderá cualquiera de las funciones de ShareThis.

El tercero es el más "hacky", pero como último recurso podría funcionar.


¡Muchas gracias! Esto es excelente. Es una pena que esto sea tan difícil y no tenga una solución perfecta, pero su respuesta parece ser la mejor información disponible actualmente en Internet. Muy contento de otorgarle la recompensa.
Jess Riedel

Sí, investigué bastante porque ese problema también me estaba afectando. Por cierto, gracias por la recompensa, ¡esto ayudará a mi experiencia StackExchange "recién llegada"!
Robertof

Re: el primero, ¿esto bloquea los sitios donde puede hacer clic en un botón para copiar texto? Por ejemplo, emojipedia.org/snowman . Empíricamente, en Firefox, no parece. Guay. Re: bloqueando ShareThis, mi depurador ahora muestra las secuencias de comandos que se cargan desde los subdominios "l.sharethis.com" y "ws.sharethis.com". Así que creo que la única cura completa es bloquear el dominio ShareThis.com completo, lo que no debería ser una gran pérdida. Gracias @Robertof!
Conrad Meyer

Precaución: deshabilitar los eventos del portapapeles puede provocar que algunos sitios funcionen mal. Por ejemplo, hace que Discord se bloquee al pegar en la búsqueda.
Nicholas

2

Estas acciones odiosas se pueden bloquear en Chrome con la extensión "Kill Evil":

https://chrome.google.com/webstore/detail/kill-evil/epieehnpcepgfiildhdklacomihpoldk

(EDITAR) Esta extensión parece causar problemas extraños en Facebook, asegúrese de incluirla en la lista blanca.


¡Excelente! He encontrado tres extensiones que pretenden resolver este problema: 1. Tynt Blocker. 2. RightToCopy. 3. Mata al mal (gracias a ti, gaviota). Kill Evil es el que trabajó para arreglar las manipulaciones del portapapeles especialmente desagradables en phys.org,
Dave Burton

1
no se preocupe @DaveBurton: tenga en cuenta que esta extensión hace que muchos sitios se comporten de manera bastante extraña, por lo que solo habilítelos cuando lo necesite.
gaviota

2
Kill Evil admite una lista de exclusión o "lista blanca", que es una lista de sitios para los que NO desea que se habilite la extensión (es decir, una lista de "permitir el mal"). Eso no era lo que quería: solo quiero habilitar Kill Evil SOLAMENTE en un sitio en particular (phys.org). Así que terminé con esta expresión regular de "búsqueda anticipada negativa", para deshabilitar Kill Evil, excepto para ese sitio: ^ https?: \ / \ / (?! ([A-zA-Z0-9 \ - \.] * phys \ .org))
Dave Burton el

Me encanta un poco descarado de expresiones regulares. Gracias por publicarlo.
gaviota

1

Aunque es un complemento de Firefox, NoScript le permite bloquear JavaScript de cualquier sitio web configurando una lista no confiable.


2
Gracias por la respuesta, pero esto no es lo que necesito. (Quiero algo que no rompa JavaScript en todas partes del sitio). Editaré la pregunta para que sea más específica.
Jess Riedel

1

Si está buscando una manera de modificar automáticamente el HTML antes de que se muestre, entonces Greasemonkey es la herramienta, y necesitaría crear un script de usuario que realice la modificación.

Del artículo Guía para principiantes para las secuencias de comandos de Greasemonkey en Google Chrome :

Chrome ahora admite de forma nativa los scripts de usuario. No tiene que instalar una extensión adicional para usarlos; de hecho, Chrome trata cada script de usuario como un complemento individual para que pueda administrarlos y eliminarlos fácilmente.

Hay mucha información sobre Greasemonkey en Internet, incluidos muchos tutoriales. La mayoría de ellos serían para Firefox, donde se originó Greasemonkey, pero también se aplican hoy a Chrome.

Como el sitio responsable de la "Leer más" es sharethis.com. Si lo bloquea, esto debería detenerse. Si tiene una suite de seguridad instalada, úsela para bloquear el sitio. De lo contrario, puede bloquearlo utilizando su archivo de hosts .

sharethis.comes el proveedor que suministra Tynt a los dos sitios web que me diste. Tynt parece ser más una tecnología que un sitio web, por lo que, por supuesto, puede haber otros proveedores de este tipo, pero hay que esperar que sean bastante raros.


Vale gracias. En principio, casi cualquier cosa en un sitio web se puede arreglar si se aplica un script greasemonkey. (Por lo menos, supongo que cualquier problema de JavaScript se puede solucionar con más JavaScript). Para aceptar esta respuesta para la recompensa, necesitaría mucha más información sobre cómo implementarla.
Jess Riedel

¿Qué tipo de información? Uno puede comenzar con wikipedia que ofrece los enlaces más importantes, incluidos el wiki y userscripts.org .
harrymc

Digamos, ¿una explicación de cómo funcionan las implementaciones que no son de Tynt y qué se haría exactamente al respecto? Hasta ahora, nada de lo que ha escrito es específico para este problema de copiar y pegar (en lugar de JavaScript en general).
Jess Riedel

Nunca he conocido a Tynt (no es de extrañar desde que uso NoScript). De los dos sitios web de ejemplo en el artículo al que se vinculó, uno ha desaparecido y el otro ya no usa Tynt. ¿Tienes un ejemplo?
harrymc

He realizado una edición para agregar dos sitios web de ejemplo que continúan teniendo este comportamiento incluso cuando uso una extensión de bloqueo de Tynt.
Jess Riedel

1

En Chromium tuve éxito con la extensión Absolute Enable Right Click & Copy .

Una vez instalado, puede agregar su lista de usuarios de sitios donde la extensión está habilitada en las preferencias. O, cuando se encuentra en una página en particular y ve que manipula su portapapeles, puede habilitar esta extensión sobre la marcha a través de su botón de barra de herramientas (esto agrega automáticamente el sitio a su lista).


0

Alternativamente, use la extensión "Copiar como texto sin formato" para Chrome. Luego tiene una opción adicional en el menú además de la copia normal. Tiene la ventaja de que funciona en Chrome y no rompe nada. https://chrome.google.com/webstore/detail/copy-as-plain-text-amazin/mkkcgjeddgdnikkeoinjgbocghokolck?utm_source=chrome-app-launcher-info-dialog


Por el nombre, ¿pensarías que se rompe al copiar texto formateado? Eso a veces es útil para algunas personas.
Conrad Meyer
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.