Всем привет! На связи Павел Стариков Fullstack-разработчик digital-агентства Webit. Представьте, вы потратили целый день на создание хороших фотографий для статьи на сайте. Выставили свет, поставили «на уши» множество людей, долго работали в «фотошопе». Фотографии получились отличные, вот только спустя год Яндекс внезапно присылает фильтр «малополезный контент», при этом другие статьи, которые своровали нашу картинку – на первых местах по SEO-высокочастотным запросам. Обидно, не правда ли?
Для предотвращения подобных ситуаций поисковые системы обращают внимания на текстовые мета-теги, которые можно записать в каждую фотографию. Основной формат изображений – JPEG имеет сразу несколько механизмов. Как Exif-данные, содержащие сведения об авторе, камере, дате изменения, так и менее известный стандарт IPTC, который хранит данные в двоичном формате.
В статье я расскажу:
про каждый формат, его особенности;
как прочитать и записать данные;
приведём примеры PHP-кода, который был неоднократно протестирован нами и с легкостью встраивается в любые популярные CMS, такие как Wordpress или Битрикс.
Exif-теги
Exif-теги (Сокращение от Exchangeable Image File Format) являются самыми известными «тегами» - текстовыми данными в файлах изображений. Обычно данные теги автоматически проставляются фотоаппаратом и содержат информацию о технических параметрах съёмки, таких как ISO, фокусное расстояние, модель камеры, иногда – GPS-данные места съёмки. По этим данным, кстати, правоохранительные органы периодически находят преступников.
Exif-данные фотографии можно посмотреть в Windows, нажав правой кнопкой на файл и щёлкнув на «Свойства»:
Также самая популярная программа для просмотра и редактирования Exif-данных: ExifTool.
Нас интересуют в контексте статьи теги Copyright, Description, Comment.
Для автоматического проставления Exif на сайтах с PHP потребуется:
Установить библиотеку PEL (PHP Exif Library) с помощью composer.
Пример PHP-кода, который проставляет нужные нам теги:
<?php
// Composer / PEL
require 'PEL/vendor/autoload.php';
use lsolesen\pel\Pel;
use lsolesen\pel\PelConvert;
use lsolesen\pel\PelDataWindow;
use lsolesen\pel\PelEntryAscii;
use lsolesen\pel\PelEntryUserComment;
use lsolesen\pel\PelExif;
use lsolesen\pel\PelIfd;
use lsolesen\pel\PelJpeg;
use lsolesen\pel\PelJpegComment;
use lsolesen\pel\PelTag;
use lsolesen\pel\PelTiff;
$image_path = '/var/www/html/sample.jpg';
webit_add_exif($image_path);
function webit_add_exif($original_image_url)
{
// Image URLs
$url_before = $original_image_url;
$url_after = $original_image_url;
// Comment
$comment = ucfirst($_SERVER['HTTP_HOST']);
// Exif
$data = new PelDataWindow(file_get_contents($url_before));
// Prepare image data
$jpeg = $file = new PelJpeg();
$jpeg->load($data);
// Create new EXIF-headers, overwriting any existing ones (when writing to disk)
$exif = new PelExif();
$jpeg->setExif($exif);
$tiff = new PelTiff();
$exif->setTiff($tiff);
// Create Ifd-data that will hold EXIF-tags
$ifd0 = new PelIfd(PelIfd::IFD0);
$tiff->setIfd($ifd0);
// Create EXIF-data for copyright
$make = new PelEntryAscii(PelTag::COPYRIGHT, $comment);
$ifd0->addEntry($make);
// Create EXIF-data for description
$make2 = new PelEntryAscii(PelTag::IMAGE_DESCRIPTION, $comment);
$ifd0->addEntry($make2);
// Create EXIF-data for comment
$exif_ifd = new PelIfd(PelIfd::EXIF);
$exif_ifd->addEntry(new PelEntryUserComment($comment));
$ifd0->addSubIfd($exif_ifd);
// Save to disk
$file->saveFile($url_after);
return true;
}
В этом и последующих примерах в качестве тега я использую название домена сайта, на котором запускается скрипт. В других случаях, например, если нужно прописать имя и фамилию фотографа, вы можете модифицировать скрипт, изменив значение переменной $comment:
$comment = 'Pavel Starikov';
В таком случае результат будет следующий:
IPTC-теги
Стандарт IPTC является менее известным, тем не менее все JPG-файлы имеют возможности записи IPTC-тегов и поисковые системы «просматривают» их, вычисляя авторство картинки.
Список IPTC-тегов описан на сайте: https://exiftool.org/TagNames/IPTC.html
Список большой и содержит самые разные данные, такие как «время выпуска», «версия программы» и еще пара сотен различных тегов. Нас интересует копирайт, а именно теги:
By-line – Указание автора
CopyrightNotice – Ссылка на лицензию
Source, Credit – Ссылка на ваш сайт
PHP-функция, проставляющая IPTC-теги, которой для обработки нужен только путь к картинке в файловой системе сайта (например /var/www/html/sample.jpg):
$image_path = '/var/www/html/sample.jpg';
webit_add_iptc($image_path);
// Main Function
function webit_add_iptc($image_path)
{
// Get Vars
$domain_full = $_SERVER['HTTP_HOST'];
$domain_left = explode('.', $domain_full)[0];
$tags = [
'80' => $domain_left, // By-line
'116' => 'Copyright ' . date('Y') . ', ' . $domain_full, // CopyrightNotice
'115' => $domain_full, // Source
'110' => $domain_full // Credit
];
// To Binary Code
$data = '';
foreach ($tags as $tag => $string) {
$data .= webit_add_iptc_tag(2, $tag, $string);
}
// Add IPTC to Image
$content = iptcembed($data, $image_path);
// Save Image
file_put_contents($image_path, $content);
}
// Sub Function
function webit_add_iptc_tag($rec, $data, $value)
{
$length = strlen($value);
$retval = chr(0x1C) . chr($rec) . chr($data);
if ($length < 0x8000) {
$retval .= chr($length >> 8) . chr($length & 0xFF);
} else {
$retval .= chr(0x80) .
chr(0x04) .
chr(($length >> 24) & 0xFF) .
chr(($length >> 16) & 0xFF) .
chr(($length >> 8) & 0xFF) .
chr($length & 0xFF);
}
return $retval . $value;
}
Проверку изображения и просмотр IPTC-тегов рекомендуем осуществлять на официальном сайте: https://getpmd.iptc.org/getiptcpmd.html
После запуска вышеуказанного скрипта проверяем фотографию с добавленными тегами и видим, что теги проставились:
Официальный сайт IPTC по неизвестный причинам не показывает тег CopyrightNotice, но он прописан, что подтверждают другие прочие программы и сайты, показывающие IPTC-данные. А значит поисковые системы данный тег прочитают.
Неуникальные фотографии
Абсолютное большинство копирайтеров пользуются гуглом, не утруждая себя созданием фотографий.
Согласно ст. 1300, 1301 ГК РФ (с изменениями от 29.06.2023) ответственность за нарушение исключительного права на произведение составляет от 10 тысяч до 5 миллионов рублей.
Чтобы обезопасить себя от штрафов при невозможности сделать уникальные фотографии рекомендуем пользоваться нейросетями (Midjourney, Playground) или пользоваться фотостоками, такими как FreePik, Pixabay, Pexels, Unsplash. Использовать Яндекс картинки и Google Images в текущих реалиях – плохой вариант.
Итоги
Поисковые системы обращают внимание на копирайты в мета-данных фотографий, отдавая приоритет указанному в мета-тегах сайту.
Используя вышеуказанный код, при наличии одной и той же картинки на разных сайтах – в глазах поисковых систем вы останетесь первоисточником.
Если у вас остались вопросы по теме статьи – вы можете задать их в комментариях. Рассказать о своём опыте в сфере защиты изображений от копирования вы также можете в находящемся ниже блоке.