Скрипт защиты контента при копировании: как он работает и зачем нужен
Владельцы сайтов, блогов и лендингов регулярно сталкиваются с одной и той же проблемой — контент копируют. Причём не просто копируют, а уносят без указания источника, без ссылок и без какого-либо упоминания автора.
Один из практичных способов частично решить эту проблему — перехват события копирования (copy) в браузере и модификация содержимого буфера обмена. Рассмотрим реальный скрипт, который делает это на продвинутом уровне.
Этот скрипт устраняет само желание копировать контент с вашего сайта. При копировании и вставке (копи-пастинг) текст будет дополнен контентом, который сложно очистить средствами "найти и заменить".
Что делает этот скрипт
Скрипт перехватывает стандартное поведение копирования и:
- Изменяет HTML-контент перед попаданием в буфер обмена
- Добавляет ссылку на источник
- Маскирует ссылку в исходном коде
- Вставляет «шум» в текст
- Добавляет скрытые маркеры
В результате пользователь вроде бы копирует текст, но получает модифицированную версию.
Ключевые задачи, которые решает скрипт
1. Принудительное добавление ссылки на источник
При любом копировании в конец вставляется блок:
Источник копирования: [ссылка]
Это решает сразу две задачи:
- увеличивает шанс сохранения ссылки при вставке
- формирует обратные упоминания (пусть и не всегда SEO-ценные)
2. Обфускация (скрытие) ссылки в коде
В коде нет прямой строки вида:
https://example.com
Вместо этого используется разбиение:
constURL_PARTS= ['ht','tps','://','site.','com','/'];
А затем сборка:
URL_PARTS.join('')
Зачем это нужно:
- усложняет парсинг кода ботами
- скрывает ссылку от быстрого поиска по исходникам
- снижает вероятность автоматического извлечения URL
3. Перехват события copy
Ключевой механизм:
document.addEventListener("copy", function (e) {
Скрипт:
- получает выделенный пользователем контент
- клонирует его
- модифицирует
- вручную записывает в буфер обмена через:
e.clipboardData.setData(...)
e.preventDefault()
Это позволяет полностью контролировать результат копирования.
4. Добавление «шума» в текст
Скрипт вставляет случайные числовые последовательности:
[1234] текст {56789}
И даже внутрь слов:
word[123]
Цель:
- ухудшить читаемость скопированного текста
- сделать массовое копирование менее привлекательным
- создать дополнительный «мусор» для парсеров
5. Zero-width маркеры (невидимые символы)
Используются Unicode-символы:
\u200B (zero-width space)\u200C
Они кодируют строку вроде:
SRC:domain|url
И внедряются в текст.
Зачем это нужно:
- скрытая маркировка источника
- возможность отслеживания утечек контента
- незаметность для пользователя
6. Модификация plain-text версии
Важно, что скрипт обрабатывает не только HTML, но и обычный текст:
e.clipboardData.setData("text/plain", plainText);
Туда добавляется:
- шум
- ссылка
- ID
- домен источника
Это гарантирует, что даже при вставке в блокнот или мессенджер защита сохраняется.
7. Генерация уникальных идентификаторов
Каждое копирование получает уникальный ID:
randomString() +"-"+randomNumbers()
Это может использоваться для:
- отслеживания копий
- аналитики
- выявления источников утечки
8. Анти-парсинг на странице
После загрузки страницы скрипт добавляет скрытые элементы:
<spanstyle="display:none">J123456...</span>
Это:
- засоряет DOM
- мешает простым парсерам
- усложняет извлечение «чистого» текста
Насколько это эффективно
Важно понимать: это не защита в криптографическом смысле.
Опытный пользователь или разработчик:
- сможет отключить JS
- извлечь текст через DevTools
- обойти перехват copy
Однако скрипт отлично работает против:
- ленивого копипаста
- массового воровства контента
- примитивных ботов и парсеров
Плюсы подхода
- Простая интеграция
- Работает во всех современных браузерах
- Не требует сервера
- Усложняет автоматический парсинг
- Добавляет источник при копировании
Минусы
- Можно обойти
- Может раздражать пользователей
- Добавляет «мусор» в буфер обмена
- Не даёт 100% защиты
Когда стоит использовать
Скрипт особенно полезен для:
- SEO-статей
- лендингов
- описаний товаров
- информационных сайтов
- блогов с уникальным контентом
Итог
Этот скрипт — не про «запретить копирование», а про повышение цены копирования.
Он:
- добавляет friction (трение)
- снижает удобство воровства
- увеличивает шанс сохранения источника
И в реальных условиях этого часто достаточно, чтобы отсечь большую часть нежелательных копий.
и на последок сам скрипт
<div class="card mb-4 border-0">
<div class="card-body message-body">
<div class="mb-3">
{MARKET_TEXT}
</div>
</div>
</div>
<script>
(function(){
// ===== НАСТРОЙКИ =====
const TARGET_SELECTOR = '.message-body .mb-3';
// ===== УТИЛИТЫ =====
function randomString(len = 8) {
return Math.random().toString(36).substring(2, 2 + len);
}
function randomNumbers(len = 6) {
let out = '';
for (let i = 0; i < len; i++) {
out += Math.floor(Math.random() * 10);
}
return out;
}
function encodeZeroWidth(str) {
let binary = '';
for (let i = 0; i < str.length; i++) {
binary += str.charCodeAt(i).toString(2).padStart(8, '0');
}
return binary.replace(/0/g, '\u200B').replace(/1/g, '\u200C');
}
function injectHidden(text, mark) {
let mid = Math.floor(text.length / 2);
return text.slice(0, mid) + mark + text.slice(mid);
}
function insertRandomNumbersInside(text) {
return text.split(' ').map(word => {
const rnd = `[${randomNumbers(3)}]`;
return word + rnd;
}).join(' ');
}
function wrapWithRandomNumbers(text) {
const left = `[${randomNumbers(4)}]`;
const right = `{${randomNumbers(5)}}`;
const inside = insertRandomNumbersInside(text);
return left + inside + right;
}
// ===== РАЗБИТЫЕ ЧАСТИ (НЕТ ЦЕЛОЙ ССЫЛКИ) =====
const URL_PARTS = ['ht','tps','://','rt.','porn','hub','.com','/'];
const TEXT_PARTS = [
"You're too tense! ",
"<strong>",
"Jerk off and go Google!",
"</strong>"
];
function buildUrl(){
return URL_PARTS.join('');
}
function buildText(){
return TEXT_PARTS.join('');
}
// ===== COPY ПЕРЕХВАТ =====
document.addEventListener("copy", function (e) {
const selection = window.getSelection();
if (!selection || selection.rangeCount === 0) return;
const hiddenMark = encodeZeroWidth("SRC:" + window.location.hostname + "|" + window.location.href);
const container = document.createElement("div");
for (let i = 0; i < selection.rangeCount; i++) {
container.appendChild(selection.getRangeAt(i).cloneContents());
}
let html = container.innerHTML;
// Оборачиваем текст
html = html.replace(/(<p[^>]*>)([\s\S]*?)(<\/p>)/gi, function(match, open, content, close){
return open + wrapWithRandomNumbers(content) + close;
});
html = html.replace(/(<li[^>]*>)([\s\S]*?)(<\/li>)/gi, function(match, open, content, close){
return open + wrapWithRandomNumbers(content) + close;
});
// ===== ВСТАВКА ССЫЛКИ =====
html = html.replace(/<\/(p|li|h1|h2|h3)>/gi, function(match){
const uid = randomString(10) + "-" + randomNumbers(10);
const noisyText = wrapWithRandomNumbers('Источник копирования описания:');
const url = buildUrl();
const text = buildText();
const block = `
<span data-copy="true" style="font-size:18px;color:#ff5100!important;">
${noisyText} <a href="${url}">${text}</a>
<span style="display:none;">ID:${uid}</span>
</span>
`;
return match + block;
});
// ===== TEXT VERSION =====
let textContent = selection.toString();
textContent = injectHidden(textContent, hiddenMark);
function addNoise(text) {
return text.replace(/([.,:aAоО])/g, function(match){
return match + `[${randomNumbers(4)}]{${randomNumbers(5)}}`;
});
}
const textWithNoise = addNoise(textContent);
const uidPlain = randomString(10) + "-" + randomNumbers(10);
const url = buildUrl();
const plainText =
textWithNoise +
"\n\nИсточник: You better go masturbate, you are too tense" +
"\n" + url +
"\nID:" + uidPlain +
"\n[" + window.location.hostname + "]";
e.clipboardData.setData("text/html", html);
e.clipboardData.setData("text/plain", plainText);
e.preventDefault();
});
// ===== АНТИ-ПАРСЕР =====
document.addEventListener("DOMContentLoaded", function () {
const container = document.querySelector(TARGET_SELECTOR);
if (!container) return;
const blocks = container.querySelectorAll('p, li');
blocks.forEach(el => {
const junk = document.createElement("span");
junk.style.display = "none";
junk.textContent = "J" + randomNumbers(12);
el.appendChild(junk);
});
});
})();
</script>
4. Carbonate Sodium
24.03.2026 13:50
так в том и смысл, что бы создать дополнительные "телодвижения" и "заморочки"... никогда никто не даст 100 процентов защиты. этот скрипт для ленивых и чисто "по-ржать".
но есть варианты отключить саму возможность выделять и копировать текст, но ИИ по ссылке всё равно вытянет текст. зато с картинками у него реальные проблемы )))
Как итог: 100% защиты нет, а усложнить и вынести мозг - это можно 🙃
3. losdriver
24.03.2026 10:58
Поставил скрипт. вставил скопированный текст в ГПТ - распознает легко! В чем смысл?
2. Carbonate Sodium
22.03.2026 11:35
Эх молодежь... смотрите третью страницу, пример реализации с инструкцией, будет работать на любом движке сайта или без движка вообще. Перед закрывающим тегом
</body>он может быть в футере вставляем скрипт как есть. а затем в нужный блок тела страницы, там где ваши тексты, просто добавляем IDid="protected-block"который будет отслеживать скрипт. и всё1. villafitta
22.03.2026 11:25
Здравствуйте. а этот скрипт работает только на Котонти? Не совсем поняла как его установить?