Не редко клиенты обращаются с просьбой защитить их картинки и тексты от копирования. Болшинство из них видели такую “фишку”, что вообще не получается вызвать контекстное меню на странице сайта (где бы был пункт “Открыть изображение в новой вкладке” или “Копировать”) и не работают сочетания клавишь типа 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)); } }