Comment puis-je empêcher «Lire la suite: www.site.com» d'être injecté avec du code JavaScript non Tynt dans des actions de copier-coller?

30

Il existe de nombreux sites qui insèrent quelque chose comme "En savoir plus: www.site.com" dans votre presse-papiers lorsque vous copiez du texte dans votre navigateur. Je trouve cela abominable. Une recherche Google révèle certaines méthodes pour empêcher cela si le site Web utilise le service Tynt (en bloquant simplement le domaine Tynt), mais de nombreux sites Web utilisent du JavaScript maison.

Existe-t-il un moyen général de bloquer ce comportement en plus de simplement désactiver JavaScript? J'utilise Chrome mais je suis intéressé par toutes les solutions.

EDIT: Pour être clair, je veux pouvoir conserver le reste de la fonctionnalité JavaScript pour ces sites Web, car beaucoup se briseront sans elle.

EDIT # 2: Voici deux exemples de sites Web qui continuent de me harceler malgré mon utilisation d'un bloqueur Tynt: Marginal Revolution | The Fiscal Times

Voici deux questions StackOverflow et deux articles de blog qui expliquent comment implémenter manuellement cette pratique louche sans Tynt. Voici un article de blog décrivant à quel point cela s'avère difficile à bloquer de manière fiable. Voici la discussion la plus récente que j'ai pu trouver (mars 2013) qui propose des suggestions sur la façon de bloquer cela dans Chrome à l'aide d'AdBlock, mais cela n'a pas fonctionné pour moi.

Jess Riedel
la source

Réponses:

24

Le site qui ajoute le truc ennuyeux "En savoir plus" est ShareThis.

Pour éviter ce mauvais comportement, vous avez trois alternatives différentes:

Désactiver les événements du presse-papiers

Ces sites Web utilisent les API Clipboard , qui permettent aux développeurs Web d'intercepter les actions de copier / couper / coller et d'exécuter du code lorsqu'elles sont effectuées. C'est ainsi que ShareThis (et d'autres sites Web comme celui-ci) fonctionne. Il attend simplement l'événement de copie et juste avant que la copie effective soit effectuée, il ajoute une "couche" de texte supplémentaire qui contient le "- Voir ..." ennuyeux.

Maintenant, la question est: existe-t-il une sorte de méthode pour désactiver les événements du presse-papiers? Malheureusement, je n'ai pas pu trouver de méthode pour le faire dans Chrome / Chromium, mais dans Firefox, c'est possible de deux manières différentes.

  • Entrez about:configet recherchez dom.event.clipboardevents.enabled. Double-cliquez sur la clé (réglez-la sur false) et le tour est joué! Vous avez désactivé les événements du presse-papiers et personne ne touchera à nouveau votre presse-papiers.
  • Pour les anciennes versions de Firefox (vraiment, vraiment plus anciennes), il y a cette extension qui fait exactement la même chose que l' about:configoption.

La désactivation des événements du presse-papiers ne devrait pas nuire à l'expérience d'un site Web, car ils sont rarement utilisés et il n'y a pas vraiment de raison de les utiliser (à l'exception du spam).

Passons à la deuxième solution.

Bloquer ShareThis

Si vous n'avez pas besoin de ShareThis, vous pouvez simplement bloquer le w.sharethis.comdomaine. Le Javascript responsable du chargement de ShareThis (et de l'enregistrement ClipboardEvent) est chargé à partir de ce site Web.

Vous pouvez le bloquer de différentes manières, allant d'un simple filtre AdBlock à la modification de votre fichier d'hôtes (ce n'est pas couvert ni lié ici car je ne peux pas mettre plus de liens en raison de ma réputation).

Un exemple de faire cela via le hostsfichier:

127.0.0.1 w.sharethis.com

La troisième solution est la plus difficile et ne doit être utilisée qu'en dernier recours.

Désactiver la fonction de sélection sur les sites Web problématiques

Pour modifier le contenu copié dans le presse-papiers, ces sites Web utilisent l' SelectionAPI qui leur permet de modifier des sélections à la volée. Ainsi, une solution consiste à désactiver complètement tout type de Selection(côté code, évidemment. Vous pourrez toujours effectuer des sélections).

Cela peut être fait avec un simple script Tampermonkey / Greasemonkey. Je l'ai testé uniquement sur Firefox car je ne peux pas installer Chrome pour le moment. Je suis désolé pour ça.

Voici le code source:

// ==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);
})();

Pour que cela fonctionne, vous devez créer un nouveau script Greasemonkey / Tampermonkey et ajuster les @includedirectives. Vous pouvez mettre un site Web par ligne, et cela doit être fait comme @include http://bad.website.address/.

Je l'ai testé avec les sites Web que vous avez liés et cela fonctionne sans problème. Cependant, gardez à l'esprit que cela peut causer des problèmes car les Selections sont utilisés par des sites Web parfaitement légitimes (par exemple, les zones de texte StackExchange les utilisent pour insérer un symbole, lorsque vous cliquez sur le bouton, à la position de votre curseur), vous devez donc activer ce script utilisateur uniquement sur les sites Web problématiques.

(notez que vous devrez peut-être supprimer les lignes commençant par //si vous créez le script utilisateur à partir des menus Greasemonkey / Tampermonkey, ils l'ajouteront automatiquement)

L'explication du script utilisateur est assez simple. Tout d'abord, il définit une fonction nommée disableSelectionsqui remplace la fonction par défaut document.getSelectionet window.getSelectionfonctionne avec une fonction qui renvoie simplement un objet contenant { isCollapsed: true }. Pourquoi? Parce que ShareThis (j'ai vérifié leur code JS) appelle cette fonction et vérifie si la isCollapsedpropriété est définie sur true(si c'est le cas, elle arrête «l'empoisonnement du presse-papiers»). D'autres sites Web comme celui-ci n'effectueront peut-être pas cette vérification, mais ils se retrouveront simplement avec une erreur lorsqu'ils tenteront d'appeler une fonction légitime de l' Selectionobjet.

Ensuite, la fonction est injectée dans le corps / en-tête / document et elle sera automatiquement exécutée. Une question que vous pouvez vous poser est la suivante: si Javascript permet de remplacer (presque) toutes les fonctions, pourquoi n'avez-vous pas remplacé la addEventListenerfonction pour ne rien faire lorsque l'événement est copié / coupé / collé? La réponse est plutôt simple. Un script utilisateur est exécuté à un moment difficile à prévoir, cela signifie que le Javascript ShareThis peut être chargé avant le script utilisateur, et il ne fera rien. Au lieu de cela, en remplaçant simplement la window.getSelectionfonction, il n'y aura aucun problème puisque cette fonction n'est appelée que lorsqu'une copie est effectuée, et nous sommes sûrs à 100% que lorsque vous copiez un texte, le script utilisateur a déjà été chargé.

Conclusion

La solution la meilleure et la plus propre est évidemment la première, car elle désactive une API pratiquement inutile.

Le second est également valide, mais vous perdrez l'une des fonctionnalités de ShareThis.

Le troisième est le plus "hacky", mais en dernier recours, il pourrait fonctionner.

Robertof
la source
Merci beaucoup! C'est excellent. C'est dommage que cela soit si difficile et qu'il n'y ait pas de solution parfaite, mais votre réponse semble être la meilleure information actuellement disponible sur Internet. Très heureux de vous attribuer la prime.
Jess Riedel
Oui, j'ai fait pas mal de recherches car ce problème me touchait aussi. Merci pour la prime au passage - cela aidera mon expérience StackExchange "nouveau venu"!
Robertof
Re: le premier, cela bloque-t-il les sites où vous pouvez cliquer sur un bouton pour copier du texte? Par exemple, emojipedia.org/snowman . Empiriquement, dans Firefox, cela ne semble pas. Cool. Re: blocage de ShareThis, mon débogueur affiche maintenant le chargement des scripts à partir des sous-domaines "l.sharethis.com" et "ws.sharethis.com". Je pense donc que le seul remède complet est de bloquer le domaine ShareThis.com complet, ce qui ne devrait pas être une grande perte. Merci @Robertof!
Conrad Meyer
Attention: la désactivation des événements du presse-papiers peut entraîner un dysfonctionnement de certains sites. Par exemple, cela provoque le blocage de Discord lors du collage dans la recherche.
Nicholas
2

Ces actions odieuses peuvent être bloquées sur Chrome avec l'extension "Kill Evil":

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

(MODIFIER) Cette extension semble causer des problèmes étranges sur Facebook, assurez-vous de la mettre sur liste blanche.

mouette
la source
Excellent! J'ai trouvé trois extensions qui prétendent résoudre ce problème: 1. Tynt Blocker. 2. RightToCopy. 3. Tuez le mal (grâce à vous, mouette). Kill Evil est celui qui a travaillé pour corriger les manipulations du presse-papiers particulièrement méchantes sur phys.org,
Dave Burton
1
pas de soucis @DaveBurton - veuillez noter que cette extension fait que de nombreux sites se comportent plutôt étrangement, cependant, ne l'activez que lorsque vous en avez besoin.
mouette
2
Kill Evil prend en charge une liste d'exclusion ou «liste blanche», qui est une liste de sites pour lesquels vous ne voulez PAS que l'extension soit activée (c'est-à-dire une liste «permettre le mal»). Ce n'était pas ce que je voulais: je veux juste activer Kill Evil UNIQUEMENT sur un site particulier (phys.org). Donc, je me suis retrouvé avec cette expression régulière délicate "lookahead négatif", pour désactiver Kill Evil sauf pour ce seul site: ^ https?: \ / \ / (?! ([A-zA-Z0-9 \ - \.] * phys \ .org))
Dave Burton
J'adore un peu effronté de regex. Merci de l'avoir posté.
mouette
1

Bien qu'il s'agisse d'un addon Firefox, NoScript vous permet de bloquer JavaScript à partir de n'importe quel site Web en créant une liste non fiable.

non terroriste
la source
2
Merci pour la réponse, mais ce n'est pas ce dont j'ai besoin. (Je veux quelque chose qui ne casse pas JavaScript partout sur le site.) Je vais modifier la question pour être plus précis.
Jess Riedel
1

Si vous cherchez un moyen de modifier automatiquement le code HTML avant qu'il ne s'affiche, Greasemonkey est l'outil et vous devez créer un script utilisateur qui effectue la modification.

De l'article Guide du débutant pour les scripts Greasemonkey dans Google Chrome :

Chrome prend désormais en charge nativement les scripts utilisateur. Vous n'avez pas besoin d'installer une extension supplémentaire pour les utiliser; en fait, Chrome traite chaque script utilisateur comme un module complémentaire individuel afin que vous puissiez facilement les gérer et les supprimer.

Il existe de nombreuses informations sur Greasemonkey sur Internet, y compris de nombreux didacticiels. La plupart d'entre eux seraient pour Firefox, où Greasemonkey est originaire, mais ils s'appliquent également aujourd'hui à Chrome.

Comme le site responsable de la "Lire la suite" est sharethis.com. Si vous le bloquez, cela devrait cesser. Si vous avez une suite de sécurité installée, utilisez-la pour bloquer le site. Sinon, vous pouvez le bloquer à l'aide de votre fichier d'hôtes .

sharethis.comest le fournisseur qui fournit Tynt aux deux sites Web que vous m'avez fournis. Tynt semble être plutôt une technologie qu'un site Web, il peut donc bien sûr y avoir d'autres fournisseurs, mais il faut espérer qu'ils seraient plutôt rares.

harrymc
la source
OK merci. En principe, presque n'importe quoi sur un site Web peut être corrigé si l'on applique un script greasemonkey. (Au moins, je suppose que tout problème JavaScript peut être résolu par plus de JavaScript.) Pour accepter cette réponse pour la prime, j'aurais besoin de beaucoup plus d'informations sur la façon de l'implémenter.
Jess Riedel
Quel genre d'informations? On peut commencer par wikipedia qui donne les liens les plus importants dont le wiki et userscripts.org .
harrymc
Disons, une explication du fonctionnement des implémentations non-Tynt et que faire exactement à leur sujet? Jusqu'à présent, rien de ce que vous avez écrit n'est même spécifique à ce problème de copier-coller (plutôt que JavaScript en général).
Jess Riedel
Je n'ai jamais rencontré Tynt (pas étonnant depuis que j'utilise NoScript). Sur les deux exemples de sites Web de l'article auquel vous avez lié, l'un a disparu et l'autre n'utilise plus Tynt. Avez-vous un exemple?
harrymc
J'ai effectué une modification pour ajouter deux exemples de sites Web qui continuent d'avoir ce comportement même lorsque j'utilise une extension bloquant Tynt.
Jess Riedel
1

Sur Chromium, j'ai réussi avec l' extension Absolute Enable Right Click & Copy .

Après l'avoir installé, vous pouvez ajouter votre liste d'utilisateurs des sites où l'extension est activée dans les préférences. Ou, lorsque vous êtes sur une page particulière et que vous voyez qu'elle triche avec votre presse-papiers, vous pouvez activer cette extension à la volée via son bouton de barre d'outils (cela ajoute automatiquement le site à votre liste).

Ruslan
la source
0

Vous pouvez également utiliser l'extension "Copier en texte brut" pour Chrome. Vous avez alors une option supplémentaire dans le menu en plus de la copie normale. Il a l'avantage de fonctionner dans Chrome et de ne rien casser. https://chrome.google.com/webstore/detail/copy-as-plain-text-amazin/mkkcgjeddgdnikkeoinjgbocghokolck?utm_source=chrome-app-launcher-info-dialog

julien
la source
D'après le nom, vous pensez que cela interrompt la copie de texte formaté? C'est parfois utile pour certaines personnes.
Conrad Meyer