Не редко клиенты обращаются с просьбой защитить их картинки и тексты от копирования. Болшинство из них видели такую “фишку”, что вообще не получается вызвать контекстное меню на странице сайта (где бы был пункт “Открыть изображение в новой вкладке” или “Копировать”) и не работают сочетания клавишь типа Ctrl+C или Ctrl+insert. И вот эту “фишку” они и просят на сайте им сделать. Так вот, статья не о том, как сделать эту глупость. Ведь такая “защита” мешает только обычным пользователям. Те, кто хочет именно скопировать в корыстных целях, как правило знает как такую “защиту” обходить. Ведь все, что загружается в браузер пользователя, априори уже на стороне его компьютера, а значит доступно для копироваться. А еще, так как большинство таких хаков основывается на работе javascript, то для отключения этой “защиты” просто достаточно отключить в браузере сам javascript. Не работает javascript — не работает и “защита”.
Но вот сегодня мне попался особенный подопечный… Кличент решил переехать с конструктора сайта на MODX Revolution (заказал перенос) и вот встала задача перенести на новый сайт весь контент, включая картинки. Так как на сайте 200 документов, конечно же это все имело смысл автоматизировать (написать парсер). Но вот что интересно: на сайте картинки прописаны вот таким образом:
<img src="data:image/gif," alt="..." class="loading copy-protect" data-index="0" data-id="3900401" data-base-path="http_host/path/images/" data-file-name="images_file_name.jpg" data-version="" data-width="500" data-height="698" />
То есть итоговая картинка генерируется javascript-ом. И это типа призвано защитить сайт от копирования изображений…
Что тут можно сказать? Ну, от копирования это никак не спасает (и ниже я свой код приведу для примера). А вот если javascript-код будет битый, или у клиента отключен, то конкретно на этом сайте картинки в принципе не выводятся :) И вот тут не понятно, стоит ли игра свечь? Ведь подобные ошибки могут серьезно понизить конверсию сайта. Я бы вот не стал такого делать.
А вот для примера код. Задача: получить карту сайта документа, пробежаться по всем страницам, найти картинки, сформировать итоговый УРЛ картинок, скачать их на сайт и набить все это галереями имеющимся документам (они были похожим образом скопированы не за долго до этого).
ini_set('max_execution_time', 0);
ignore_user_abort(true);
$str = file_get_contents('http://host.name/sitemap.xml');
$xml = simplexml_load_string($str);
foreach($xml->url as $u){
$url = (string)$u->loc;
if(!preg_match('/http:\/\/host.name\/(shop\/.+)/', $url, $match)){
continue;
}
// Получаем документ
if(!$doc = $modx->getObject('modResource', [
'uri' => $match[1],
])){
continue;
}
// Если уже галерея имеется, тоже пропускаем
if($doc->getTVValue(12)){
continue;
}
// Получаем контент документа
if(!$content = file_get_contents($url)){
continue;
}
// Пытаемся найти картинки
if(!preg_match_all('/<div class="product-image-cell"><a .*?><img [^>]*class="[^"]* copy-protect"[^>]*data-base-path="(.*?)"data-file-name="(.*?)"/', $content, $match)){
continue;
}
$migx = array();
$img_path = MODX_ASSETS_PATH . "images/";
$doc_path = "original/{$doc->id}/";
foreach($match[0] as $i => $el){
$file_name = $match[2][$i];
$img_url = $match[1][$i] . '3-' . $file_name;
if(@$img_code = file_get_contents($img_url)){
// Проверяем наличие категории
$abs_path = "{$img_path}{$doc_path}";
if(!file_exists($abs_path) AND !mkdir($abs_path)){
continue;
}
$img_file_name = "{$doc_path}{$file_name}";
if(file_put_contents("{$img_path}{$img_file_name}", $img_code)){
$migx[] = array(
"MIGX_id" => count($migx) + 1,
"image" => $img_file_name,
"title" =>"",
"description" =>"",
);
}
}
}
if($migx){
$doc->setTVValue(12, json_encode($migx));
}
}