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