На вашем сайте много текстового материала, и его частенько растаскивают все, кому не лень? Есть немного необычный способ за это наказать, не скажем, что мы «за» такие методы, но нелишне будет о нем знать тем, кто работает с контент-менеджерами, не владеющими навыками html и css.?
Многие SEO-специалисты знакомы с общепринятыми методами защиты авторского права:
- добейся, чтобы твоя статья стала первоисточником (первая проиндексировалась поисковиками)
- прикупи несколько ссылок с анкорами из пассажей, взятых из твоего же текста
- напиши в Google по DMCA, в хостинг-компанию и т.д.,
- опубликуй знак © и распиши правила использования своего авторского контента
- много свободного времени – можешь отправить заказное письмо со своей статьей себе же, чтобы в случае чего потом доказать в суде, что ты был первым ?
История, которую хотим рассказать мы – куда более изощренная.
Предыстория. Занимаясь продвижением одного проекта, мы однажды заметили, что он сильно просел в Яндексе. Проседание было только по определенным группам запросов и буквально за один раз, при этом другие группы КС продолжали расти дальше, поэтому на инцидент не обратили особого внимания.
На представленном графике видно, как это падение позиций отразилось на общей посещаемости проекта. Google тоже отреагировал, но совсем немного, что можно было списать на колебания спроса.
Начали разбираться, «где порылась собака», и нашли на сайте много скрытых ссылок на ресурс конкурента. Сначала подумали, что нас взломали, но это оказалось не так.
Маленькая сноска: контентом на сайте занимались специалисты на стороне клиента. И делали они это так – техническую информацию и описание продукта брали с сайта конкурента, переписывали ее до 90-100% уникальности и размещали на своем проекте.
В итоге, мы выяснили, что когда менеджеры копировали информацию с сайта конкурента, в качестве «подарка» к заимствованному элементу они получали и невидимый блок ссылок (о чем они, естественно, не подозревали) такого типа:
Вы спросите, как могло получиться так, что при полностью переписанном тексте сохранились все ссылки? А мы ответим:
Для изменения материала, менеджеры на стороне клиента использовали редактор в WYSIWIG-режиме, при котором текст отображается в привычном для многих виде «как в Word-е», соответственно, html код со скрытыми ссылками копирайтер не видит и преспокойно оставляет такой материал, в результате чего, конкурент получил пару десятков бэклинков с нашего сайта.
Отрицательная карма для донора при публикации таких ссылок очевидна (и в основном влияет на выдачу Яндекса), а вот что получает от невидимых ссылок акцептор? Мы особо не поняли, так как подобные ссылки считываются поисковыми системами как спам, тем более, что в самом коде было много «спамных» css-конструкций: ссылка в 1 пиксель далеко за пределами экрана и т.д.
Если уж хочешь испортить жизнь конкурента, так хоть веди по этим ссылкам на какой-нибудь сомнительный «мужской» сайт, но нет, конкурент вел к себе же.
UPD: на момент публикации статьи конкурент убрал данный скрипт со своего сайта, невидимые ссылки уже не добавлялись, но добавлялось простое и понятное: «… подробнее читайте на нашем сайте…»
Мы разобрали скрипт на составляющие, может быть, кого-то он заинтересует, а кто-то поймет, для чего так заморачиваться и поделится с нами ?
Есть несколько форматов скрипта:
- ES6 модуль;
import EvilClipboard from './evil-clipboard.js';
new EvilClipboard({
signatureText: 'Больше информации на www.seolt.ru: ',
useHiddenLink: true
});
Подключение скрипта, если вы не используете модули внутри html страницы :
<script type="module">
import EvilClipboard from './evil-clipboard.js';
let a = new EvilClipboard({
signatureText: 'Больше информации на www.seolt.ru: ',
useHiddenLink: true
});
</script>
Не забудьте seolt.ru заменить на ваш собственный сайт. ✌️
2. Скрипт, подключаемый на html-странице.
class EvilClipboard {
#signatureText;
#useHiddenLink;
#selectedText;
#selectedStrongText;
constructor(options = {}) {
this.#signatureText = options.signatureText || 'Подробнее: ';
this.#useHiddenLink = options.useHiddenLink || false;
// Navigator clipboard api needs a secure context (https)
if(navigator.clipboard && window.isSecureContext) {
this.#setListener();
}
}
#setListener() {
document.addEventListener('copy', (e) => {
e.preventDefault();
this.#copyToClipboardHook();
});
}
#copyToClipboardHook() {
this.#selectedText = this.#getSelectionText();
if (this.#selectedText) {
const modifyClipboard = `
${this.#selectedText}
${this.#useHiddenLink ? this.#generateHiddenLink() : ''}
${this.#generateSignature()}
`;
this.#writeToClipboard(modifyClipboard);
}
}
#generateHiddenLink() {
const linkUrl = window.location;
const linkText = this.#selectedStrongText || document.getElementsByTagName("h1")[0].innerText || linkUrl;
const hiddenTemplate = `
<div style="overflow: hidden; width: 1px; height: 1px; position: absolute; top: -10000px; left: -10000px;">
<a href="${linkUrl}" title="${linkText}" rel="nofollow" target="_blank">${linkText}</a>
</div>
`;
return hiddenTemplate;
}
#generateSignature() {
const linkUrl = window.location;
const signatureTemplate = `
${this.#signatureText} <a href="${linkUrl}" title="${linkUrl}" rel="nofollow" target="_blank">${linkUrl}</a>
`;
return signatureTemplate;
}
#getSelectionText() {
let range;
if (document.selection && document.selection.createRange) {
range = document.selection.createRange();
return range.htmlText;
} else if (window.getSelection) {
const selection = window.getSelection();
if (selection.rangeCount > 0) {
range = selection.getRangeAt(0);
const clonedSelection = range.cloneContents();
this.#selectedStrongText = clonedSelection.querySelector('strong')?.innerText;
const div = document.createElement('div');
div.appendChild(clonedSelection);
return div.innerText;
} else {
return '';
}
} else {
return '';
}
};
#writeToClipboard(text) {
navigator.clipboard.write([new ClipboardItem({
'text/plain': new Blob([text], {type: 'text/plain'}),
'text/html': new Blob([text], {type: 'text/html'})
})]);
}
}
export default EvilClipboard;
Обсудить скрипт или задать вопросы можно в нашем Telegram канале.
Принцип работы:
- В выделенном и скопированном элементе ищется текст в теге <strong> – нашли? Значит именно он используется в качестве анкора скрытой ссылки.
- Если не нашли, значит используется значение тега <h1>.
- Если и его нет, то берется доменное имя (а-ля естественная ссылка).
- Скрытая ссылка генерируется с атрибутами rel=”nofollow” target=”_blank”. Атрибут href ведет на страницу, с которой был взят текст.
- Если в скопированном материале несколько слов в теге <strong>, то в качестве анкора будет первое слово.
И, все же, вопрос о том, зачем это все нужно, остается открытым.
Итог: если вы видите, что ваш проект просел или с трудом продвигается по каким-то запросам, нелишне будет проверить его на такие скрытые «подарки».
Leave feedback about this