Обращаюсь к фрилансерам из категории вебпрограммисты, прошу назвать цену/сроки по предложенному здесь заданию, и затем выбранный кандидат приступит к выполнению. Оплата - через сейф.
Постановка задачи
Сделать копировщик лендингов, то есть простейшую версию программы типа HTTrack Website Copier, Offline Explorer или подобной - только на PHP и только заточенную под копирование единственной страницы сайта.
Дадим этому скрипту рабочее название copier.php.
Крайне важно, чтобы получившийся скрипт был способен наиболее полно копировать указанную страницу сайта с учётом всех современных тегов, с помощью которых может происходить подключение стилей, яваскриптов, медиафайлов к вёрстке страницы.
То есть исполнитель должен, во-первых, знать нюансы риппинга страниц и, во-вторых, додумать парсинг новых тегов, которые по незнанию составителя техзадания могли оказаться не перечисленными во втором пункте ТЗ ниже.
Что будет на входе
Скрипт принимает всего 2 входных параметра:
- url - абсолютный адрес копируемой страницы сайта
-
format - как форматировать HTML и CSS, имеет такие значения:
- asis - оставить как есть
- tab - табуляция
- 2s - 2 пробела
- 4s - 4 пробела
К скрипту прикреплено несколько технических папок. Предполагается что менеджер, обслуживающий позже скрипт, разместит в этих папках некие демонстрационные медиафайлы, которые во время работы скрипта заменят собой оригинальные медиа (вдруг там видео на 1Gb? вдруг медиа сейчас недоступно? - тогда демо заглушку подставим). Вот список папок:
-
demo
- audio
- images
- js
- video
Папки images и js пока пустые, их резервируем на будущее.
Что будет на выходе
После успешной отработки скрипта на выходе должна получиться вот такая структура папок скопированной страницы. Каждая папка опциональная, то есть будет присутствовать на выходе только в том случае, если в ней оказался хотя бы один файл:
-
copy
-
audio
- originals
- css
- fonts
- html
-
images
- originals
- js
-
video
- originals
-
audio
Важно помнить, что при каждом старте скрипта нужно стереть папку copy и создать её структуру заново.
Алгоритм работы
На мой взгляд, работа скрипта после старта, то есть непосредственно копирование страницы должно происходить следующим образом. Этот алгоритм и надо реализовать:
- 1. Создать пустые массивы css, img, js, fonts, audio, video. Они нужны для того, чтобы на шаге 2 собрать все URL-ы подключаемых медифайлов по типам, а на шаге 3 - ещё дособрать некоторые URL-ы прописанные в стилях, прежде чем начать скачивать медиафайлы на шагах 3-8.
Не забудьте, что в стилях возможно подключение изображений, шрифтов, курсоров, а также импорт других стилей с помощью инструкции @import url(...).
- 2. Извлечь исходную страницу
- Получить HTML-код страницы из указанного входного параметра url.
- Отформатировать согласно указанному входному параметру format.
- Распарсить теги
<link rel="stylesheet" href="..." *>- Заменить атрибут ... локальной ссылкой.
- Извлечённую ссылку добавить в массив css.
- Распарсить теги
<link rel="*icon*" href="..." *>
<link rel="apple-touch-icon" href="..." *>
<img src="..." *>
<svg src="..." *> - возможные атрибуты платформ: src, href, hc-svg-href, xlink:href
<image src="..." *>
<picture *>* <source srcset="..." *> *</picture>- Заменить атрибут ... локальной ссылкой.
- Извлечённую ссылку добавить в массив img.
- Распарсить теги
<script src="..." *>- Заменить атрибут ... локальной ссылкой.
- Извлечённую ссылку добавить в массив js.
- Распарсить теги
<audio src="..." *>
<audio *>* <source src="..." *> *</audio>- Заменить атрибут ... локальной ссылкой.
- Извлечённую ссылку добавить в массив audio.
- Распарсить теги
<video src="..." *>
<video *>* <source src="..." *> *</video>- Заменить атрибут ... локальной ссылкой.
- Извлечённую ссылку добавить в массив video.
- Распарсить теговые атрибуты style
- Найти все url(...).
- Заменить ... локальной ссылкой.
- Извлечённую ссылку добавить в соответствующий массив.
- Сохранить HTML в папку copy/html.
- 3. Извлечь исходные CSS
- Получить каждый файл согласно массиву css.
- Отформатировать согласно указанному входному параметру format.
- Распарсить свойства стилей
- Найти все url(...).
- Заменить ... локальной ссылкой.
- Извлечённую ссылку добавить в соответствующий массив.
- Сохранить файл локально в папку copy/css.
- 4. Извлечь исходные IMG
- Получить каждый файл согласно массиву img.
- Сохранить оригинал локально в папку copy/images/originals.
- Заменить изображение на заставку placeholder WWW x HHH.
- Сохранить файл локально в папку copy/images.
- 5. Извлечь исходные JS
- Получить каждый файл согласно массиву js.
- Сохранить файл локально в папку copy/js.
- 6. Извлечь исходные FONTS
- Получить каждый файл согласно массиву fonts.
- Сохранить файл локально в папку copy/fonts.
- 7. Извлечь исходные AUDIO
- Получить каждый файл согласно массиву audio.
- Сохранить оригинал локально в папку copy/audio/originals.
- Заменить звук на случайную запись из папки demo/audio.
- Сохранить файл локально в папку copy/audio.
- 8. Извлечь исходные VIDEO
- Получить каждый файл согласно массиву video.
- Сохранить оригинал локально в папку copy/video/originals.
- Заменить видео на случайную запись из папки demo/video.
- Сохранить файл локально в папку copy/video.
Обратите внимание на пункт 4 - как происходит скачивание и сохранение изображений, а также на пункты 7 и 8.