Como impedir que o “Leia mais: www.site.com” seja injetado com JavaScript não-Tynt em ações de copiar e colar?

30

Existem muitos sites que inserem algo como "Leia mais: www.site.com" na área de transferência quando você copia texto no navegador. Eu acho isso abominável. Uma pesquisa no google revela alguns métodos para impedir isso, se o site estiver usando o serviço Tynt (apenas bloqueando o domínio Tynt), mas muitos sites usam JavaScript doméstico.

Existe uma maneira geral de bloquear esse comportamento, além de desativar o JavaScript? Eu uso o Chrome, mas estou interessado em todas as soluções.

EDIT: Para ficar claro, desejo manter o restante da funcionalidade JavaScript desses sites, pois muitos deles ficarão sem ela.

EDIÇÃO 2: Aqui estão dois exemplos de sites que continuam a me incomodar, apesar do uso de um bloqueador de Tynt: Marginal Revolution | The Fiscal Times

Aqui estão duas perguntas sobre o StackOverflow e duas postagens no blog que explicam maneiras de implementar essa prática obscura manualmente sem o Tynt. Aqui está um post do blog descrevendo o quão difícil isso pode ser o bloqueio confiável. Aqui está a discussão mais recente que pude encontrar (março de 2013), que oferece sugestões sobre como bloquear isso no Chrome usando o AdBlock, mas não funcionou para mim.

Jess Riedel
fonte

Respostas:

24

O site que adiciona as coisas irritantes "Leia mais" é o ShareThis.

Para evitar esse mau comportamento, você tem três alternativas diferentes:

Desativar os eventos da área de transferência

Esses sites estão usando as APIs da área de transferência , que permitem aos desenvolvedores da Web interceptar as ações de copiar / recortar / colar e executar algum código quando são executadas. É assim que o ShareThis (e outros sites como esse) funciona. Ele simplesmente aguarda o evento de cópia e, imediatamente antes da cópia efetiva, ele adiciona uma "camada" adicional de texto que contém o irritante "- Veja ...".

Agora, a pergunta é: existe algum tipo de método para desativar os eventos da área de transferência? Infelizmente, não consegui encontrar um método para fazer isso no Chrome / Chromium, mas no Firefox é possível de duas maneiras diferentes.

  • Entre about:confige procure dom.event.clipboardevents.enabled. Clique duas vezes na chave (defina-a false) e pronto! Você desativou os eventos da área de transferência e ninguém tocará na sua área de transferência novamente.
  • Para versões mais antigas do Firefox (muito, muito mais antigas), existe esta extensão que faz exatamente a mesma coisa da about:configopção.

Desativar eventos da área de transferência não deve prejudicar a experiência de qualquer site, uma vez que raramente são usados ​​e não existe realmente um objetivo para usá-los (exceto spam).

Vamos para a segunda solução.

Bloquear ShareThis

Se você não precisa do ShareThis, pode simplesmente bloquear o w.sharethis.comdomínio. O Javascript responsável por carregar o ShareThis (e registrar o ClipboardEvent) é carregado nesse site.

Você pode bloqueá-lo de diferentes maneiras, desde um simples filtro do AdBlock até a edição do arquivo hosts (isso não é coberto nem vinculado aqui, pois não posso colocar mais links devido à minha reputação).

Um exemplo de fazer isso através do hostsarquivo:

127.0.0.1 w.sharethis.com

A terceira solução é a mais difícil e deve ser usada apenas como último recurso.

Desativar o recurso de seleção nos sites problemáticos

Para editar o conteúdo que é copiado para a área de transferência, esses sites usam a SelectionAPI, que permite editar as seleções rapidamente. Portanto, uma solução é desativar completamente qualquer tipo de Selection(no lado do código, obviamente. Você ainda poderá executar seleções).

Isso pode ser feito com um script simples Tampermonkey / Greasemonkey. Testei-o apenas no Firefox, pois não consigo instalar o Chrome no momento. Eu sinto por isso.

Este é o código fonte:

// ==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 deixar isso funcionar, você deve criar um novo script Greasemonkey / Tampermonkey e ajustar as @includediretivas. Você pode colocar um site por linha, e isso deve ser feito como @include http://bad.website.address/.

Eu testei com os dois sites que você vinculou e funciona sem problemas. No entanto, lembre-se de que isso pode causar problemas, já que Selections são usados ​​por sites perfeitamente legítimos (por exemplo, as caixas de texto StackExchange as utilizam para inserir um símbolo, quando você clica no botão, na posição do cursor), portanto, habilite que userscript apenas em sites problemáticos.

(observe que pode ser necessário remover as linhas iniciadas com, //se você estiver criando o script do usuário nos menus Greasemonkey / Tampermonkey, eles o adicionarão automaticamente)

A explicação do script do usuário é bem simples. Primeiro, define uma função nomeada disableSelectionsque substitui o padrão document.getSelectione window.getSelectionfunciona por uma que simplesmente retorna um objeto que contém { isCollapsed: true }. Por quê? Como o ShareThis (verifiquei o código JS) chama essa função e verifica se a isCollapsedpropriedade está definida como true(se estiver, interrompe o "envenenamento da área de transferência"). Outros sites como esse talvez não realizem essa verificação, mas eles acabam simplesmente com um erro quando tentam chamar uma função legítima do Selectionobjeto.

Em seguida, a função é injetada no corpo / cabeçalho / documento e será executada automaticamente. Uma pergunta que você pode fazer é: se o Javascript permite substituir (quase) todas as funções, por que você não substituiu a addEventListenerfunção para simplesmente não fazer nada quando o evento é copiar / recortar / colar? A resposta é muito simples. Um script de usuário é executado em um horário não facilmente previsível, isso significa que o Javascript ShareThis pode ser carregado antes do script de usuário e não fará nada. Em vez disso, substituindo apenas a window.getSelectionfunção, não haverá nenhum problema, pois essa função é chamada apenas quando uma cópia é executada e temos 100% de certeza de que, quando você copia um texto, o script do usuário já foi carregado.

Conclusão

A melhor e mais limpa solução é obviamente a primeira, pois desativa uma API praticamente inútil.

O segundo também é válido, mas você perderá qualquer funcionalidade do ShareThis.

O terceiro é o mais "hacky", mas como último recurso, ele pode funcionar.

Robertof
fonte
Muito obrigado! Isto e excelente. É uma pena que isso seja tão difícil e não tenha uma solução perfeita, mas sua resposta parece ser a melhor informação atualmente disponível na Internet. Muito prazer em conceder-lhe a recompensa.
Jess Riedel
Sim, eu pesquisei bastante desde que esse problema também estava me afetando. A propósito, obrigado pela recompensa - isso ajudará minha experiência StackExchange "iniciante"!
Robertof
Re: o primeiro, isso bloqueia sites onde você pode clicar em um botão para copiar algum texto? Por exemplo, emojipedia.org/snowman . Empiricamente, no Firefox, não parece. Legal. Re: bloqueando ShareThis, meu depurador agora está mostrando os scripts de carregamento dos subdomínios "l.sharethis.com" e "ws.sharethis.com". Então, acho que a única cura completa é bloquear todo o domínio ShareThis.com, o que não deve causar grandes perdas. Obrigado @Robertof!
Conrad Meyer
Cuidado: desativar eventos da área de transferência pode causar o mau funcionamento de alguns sites. Por exemplo, faz com que o Discord falhe ao colar na pesquisa.
Nicholas
2

Essas ações odiosas podem ser bloqueadas no Chrome com a extensão "Kill Evil":

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

(EDITAR) Esta extensão parece causar problemas estranhos no facebook, certifique-se de incluí-la na lista de permissões.

gaivota
fonte
Excelente! Eu encontrei três extensões que pretendem resolver esse problema: 1. Tynt Blocker. 2. RightToCopy. 3. Mate o mal (graças a você, gaivota). Mate Mal é o que trabalhou para corrigir as manipulações da área de transferência especialmente desagradáveis no phys.org,
Dave Burton
1
não se preocupe @DaveBurton - observe que essa extensão faz com que muitos sites se comportem de maneira estranha, portanto, habilite-a somente quando necessário.
gaivota
2
O Kill Evil suporta uma lista de exclusão ou "lista branca", que é uma lista de sites para os quais você NÃO deseja que a extensão seja ativada (por exemplo, uma lista "permitir mal"). Não era isso que eu queria: eu só queria ativar o Kill Evil SOMENTE em um site específico (phys.org). Então, acabei com essa expressão regular complicada de "lookahead negativo", para desativar o Kill Evil, exceto naquele site: ^ https?: \ / \ / (?! ([A-zA-Z0-9 \ - \.] * phys \ .org))
Dave Burton
Amor um pouco atrevido de regex. Obrigado por publicá-lo.
gaivota
1

Embora seja um complemento do Firefox, o NoScript permite bloquear o JavaScript de qualquer site, configurando uma lista não confiável.

não terrorista
fonte
2
Obrigado pela resposta, mas não é disso que eu preciso. (Quero algo que não quebre o JavaScript em qualquer lugar do site.) Editarei a pergunta para ser mais específica.
Jess Riedel
1

Se você estiver procurando uma maneira de modificar automaticamente o HTML antes que ele seja exibido, o Greasemonkey é a ferramenta e você precisará criar um script de usuário que faça a modificação.

No artigo Guia do iniciante para scripts Greasemonkey no Google Chrome :

O Chrome agora suporta nativamente scripts de usuário. Você não precisa instalar uma extensão extra para usá-los; de fato, o Chrome trata cada script do usuário como um complemento individual, para que você possa gerenciar e removê-los facilmente.

Há muitas informações sobre o Greasemonkey na Internet, incluindo muitos tutoriais. A maioria seria para o Firefox, onde o Greasemonkey se originou, mas eles também se aplicam hoje ao Chrome.

Como o site responsável pelo "Leia mais" é sharethis.com. Se você bloqueá-lo, isso deve parar. Se você possui um conjunto de segurança instalado, use-o para bloquear o site. Caso contrário, você pode bloqueá-lo usando o arquivo hosts .

sharethis.comé o provedor que fornece o Tynt aos dois sites que você me deu. Tynt parece ser mais uma tecnologia do que um site, então é claro que pode haver outros provedores desse tipo, mas é preciso esperar que eles sejam bastante raros.

harrymc
fonte
OK obrigado. Em princípio, praticamente qualquer coisa em um site pode ser corrigida se alguém aplicar um script greasemonkey. (No mínimo, presumo que qualquer problema de JavaScript possa ser corrigido por mais JavaScript.) Para aceitar esta resposta para a recompensa, preciso de muito mais informações sobre como implementá-la.
precisa saber é o seguinte
Que tipo de informação? Pode-se começar com a wikipedia, que fornece os links mais importantes, incluindo o wiki e userscripts.org .
harrymc
Digamos, uma explicação de como as implementações não-Tynt funcionam e o que exatamente seria feito sobre elas? Até agora, nada do que você escreveu é específico para esse problema de copiar e colar (em vez do JavaScript em geral).
Jess Riedel
Eu nunca conheci Tynt (não é de admirar desde que eu uso o NoScript). Dos dois sites de exemplo no artigo ao qual você vinculou, um desapareceu e o outro não usa mais o Tynt. Você tem um exemplo?
harrymc
Fiz uma edição para adicionar dois sites de exemplo que continuam tendo esse comportamento, mesmo quando eu uso uma extensão de bloqueio de Tynt.
Jess Riedel
1

No Chromium, obtive sucesso com a extensão Absolute Enable Right Click & Copy .

Após a instalação, você pode adicionar uma lista de usuários de sites nos quais a extensão está ativada nas preferências. Ou, quando você está em uma página específica e vê que ela mexe com a área de transferência, você pode ativar essa extensão rapidamente, usando o botão da barra de ferramentas (isso adiciona automaticamente o site à sua lista).

Ruslan
fonte
0

Como alternativa, use a extensão "Copiar como texto sem formatação" no Chrome. Você tem uma opção adicional no menu, além da cópia normal. Ele tem a vantagem de funcionar no Chrome e não quebra nada. https://chrome.google.com/webstore/detail/copy-as-plain-text-amazin/mkkcgjeddgdnikkeoinjgbocghokolck?utm_source=chrome-app-launcher-info-dialog

Julian
fonte
Pelo nome, você acha que ele quebra a cópia de texto formatado? Às vezes, isso é útil para algumas pessoas.
Conrad Meyer