Учимся писать шаблоны на GET. Объединение картинок в PDF. Пошагово для новичков.

Hannes

Client
Регистрация
03.02.2016
Сообщения
522
Благодарностей
263
Баллы
63
Привет. Этот гайд рассчитан для новичков, которые только знакомятся с возможностями ZennoPoster. Мы научимся:
  1. Снифать трафик сайта
  2. Парсить на GET запросах
  3. Распаковывать архивы
  4. БОНУС. Делать автоматическую конвертацию SVG в PDF-файл

История начинается 1 сентября в 2 часа ночи. Пишет тетя, которая работает преподавателем в университете.



Итак, вводные такие:
Сайт: urait.ru
Задача: скачать документ, который недоступен для загрузки

Нам потребуется:
Firefox - ссылка
ZennoPoster - подойдет даже Demo версия

Устанавливаем, если не стоит, и начинаем. В конце будет видео, если какой-то момент будет вам непонятен - посмотрите его, возможно, там найдёте ответ.

Первым делом заходим на urait.ru через Firefox. Регистрируем бесплатную учетную запись. На сайте есть большая библиотека. Сайт позволяет только просматривать документы, без загрузки. Часть материалов доступна бесплатно, а часть по подписке. В учебных целях мы будем работать с бесплатными материалами, чтобы не покупать подписку.

Я выбрал для примера “Дедуктивную и индуктивную логику”


Нажимаем “Изучить”. Листаем страницы и видим, что они подгружаются.


Пробуем выделить текст - не получается. Тут либо защита, либо это картинка.

Нажимаем правой кнопкой мыши на страницу книги и видим “Открыть изображение в новой вкладке”. Нажимаем.


Открылась страница книги (документа). Стало понятно, что нужно сделать: загрузить все картинки, а потом объединить их в один файл.
Руками скачивать каждую страницу долго и муторно. Использование программы автоматизации ZennoPoster позволит сделать это быстро и просто.

Смотрим на url адрес открытой страницы документа (картинки) в браузере:


Видим, что адрес типа blob:null
blob:null указывает на временный объект Blob, который был создан в браузере, но не был загружен из какого-либо url адреса. Этот объект существует только в памяти и не привязан к реальному ресурсу в сети.
Нужно искать другой способ скачать. Открываем монитор трафика в Firefox (ПКМ - Исследовать - Сеть) и смотрим, как подгружаются новые страницы.

Если вы никогда не пользовались снифферами / мониторами трафика, то посмотрите два этих видео: первое, второе.


Видим подгрузку страниц документа. Это GET запрос, имеющий структуру:


https://urait.ru/viewer/page/0D0C56B4-F0CA-42AA-9588-CA85FB74A961/11
https://urait.ru/viewer/page/ уникальный ID для документа (учебника) / номер страницы

Получается, чтобы скачать все страницы учебника, нам нужно знать уникальный ID документа и количество страниц. Возникает логичный вопрос: “Как получить ID учебника?”. Первым делом поищем это значение в коде страницы. Копируем уникальный ID и нажимаем в Firefox “ПКМ - Исходный код страницы”. Вставляем в поиск (ctrl+f) значение ID и ищем.


Находим несколько мест, где встречается этот ID. Чтобы не делать так с каждым новым документом (учебником) руками, мы научим ZennoPoster делать это за нас. Оставляем вкладку с кодом открытой. Она понадобится нам позже.

Теперь нужно научится получать сведения о количестве страниц в документе. Давайте снова внимательно посмотрим запросы в мониторе трафика. Находим вот такой интересный:


Посмотрим поближе:


Мы видим название документа, описание, количество страниц (page_count: 287) и остальную информацию. Это то, что там и нужно! Теперь мы можем перейти к автоматизации.

Переходим к написанию шаблона. Запускаем ZennoPoster. Подойдёт даже бесплатная Demo версия.

Сразу создадим нужные переменные:
UraitRU_Link - ссылка на документ (как в браузере)
UraitRU_ID - уникальный ID для документа (учебника)


Теперь создадим удобные Входные настройки для проекта. В будущем в них мы будем указывать ссылки на документы, который хотим скачать.
Нажимаем Входные настройки в меню действий:


Настройки появляются снизу:


Нажимаем на них и указываем имя поля “Ссылка”, тип “Text”, а в “Сохранить в переменную” выбираем созданную ранее переменную UraitRU_Link.


В “Значение по умолчанию” указываем ссылку на выбранный документ для скачивания.


При использовании шаблона в дальнейшем это будет выглядеть вот так (нажмите на лупу справа чтобы посмотреть):


Нажимаем “ОК” и окно закроется.
Заполнив Входные настройки, нажимаем на крестик (выход). Всё сохранится автоматически. Видим пустую рабочую область:


Теперь создаем первое действие в шаблоне (нажимаем на GET-запрос).


Сначала нам нужно получить код страницы документа, чтобы из него извлечь уникальный ID книги. Напомню, что ID нужен нам для загрузки всех страниц.


Вкладки “Дополнительно” и “Прокси” оставляем без изменений. Внизу в графе “Положить в переменную” пишем GET_UraitRU_Link. Так мы создадим новую переменную.
Выполняем действие (выделяем GET-запрос и нажимаем Далее). В переменной GET_UraitRU_Link появится HTML код страницы.


Теперь нам нужно вынуть из HTML кода, который мы получили, уникальный ID. Вспоминаем про отложенную вкладку в Firefox, где мы искали ID в коде. Ещё раз указываю скрин вкладки которая нам нужна.


Нам потребуется создать регулярное выражение (гайд по regex) для поиска нужного значения в коде.

Вставляем:
1. “<form action="/professor/task/create/” в “Перед искомым текстом всегда есть”
2. кавычку “ в “Это идёт после искомого текста” (справа).
Нажимаем на “Тест” и, если всё было сделано правильно, мы получим нужный нам ID (на скриншоте он уже есть, в правой нижней углу - 0D0C56B4-F0CA-42AA-9588-CA85FB74A961).

Сохраняем текст регулярного выражения (?<=<form\ action="/professor/task/create/)[\w\W]*?(?=") , оно понадобится нам дальше. Само окно закрывать не надо, просто вернитесь назад в зону написания проекта ZennoPoster.


Теперь автоматизируем получение ID из HTML кода. Добавляем действие “Данные - Обработка текста”. Выбираем действие “Regex”.


В поле сверху вставляем нашу переменную с кодом GET_UraitRU_Link, а в Regex ниже наше регулярное выражение (которое сохранили до этого).


Теперь выполняем оба действия.


ID мы получили. Теперь нужно собрать информацию о книге. Вспоминаем о том запросе в мониторе трафика Firefox, где была информация о документе (название, описание, количество страниц). Теперь у нас есть уникальный ID и мы можем получить значение и оттуда.


Нам нужно создать такой же GET запрос. Обратите внимание на структуру URL:
0D0C56B4-F0CA-42AA-9588-CA85FB74A961/10
Вместо 0D0C56B4-F0CA-42AA-9588-CA85FB74A961 нам нужно вставить нашу переменную с ID документа.

Создаём третье действие, снова GET.


В Referer вставим ссылку на наш документ. Создаем новую переменную GET_UraitRU_DocInfo. Выполняем действие.


Сайт отдал данные в JSON (тут подробнее что это https://zennolab.atlassian.net/wiki/spaces/RU/pages/488964124/JSON+XMLid=ru:json_xml). Их можно удобно разобрать на отдельные переменные используя действие “Обработка JSON/XML”:


Указываем, что это “Парсинг” и тип “JSON”. Вставляем нашу переменную с информацией о документе в поле:


Выполняем действие и смотрим в переменных. Там есть вкладка JSON. Переходим в неё.


Поздравляю! Теперь эти данные собираются автоматически. Осталось совсем немного. Нам нужно последовательно сохранить каждую страницу-картинку на компьютер.

Создаем действие “Обработка переменных”:


И нам нужно создать переменную, которая будет отвечать за счетчик страниц (это будет номер страницы, начнем собирать с первой страницы). Назовём её couter_page и установим значение 1.


Теперь нам нужно загрузить страницы (картинки). Снова находим запрос подгрузки страниц, который нашли ранее. Напоминаю, что выглядит он вот так:
уникальный ID для документа (учебника)/номер страницы


И нам нужно снова создать действие “GET запрос” в ZennoPoster и заполнить данные по аналогии предыдущих запросов. Указываем переменную отвечающую за уникальный ID и номер страницы.


В Referer вставляем переменную отвечающую за ссылку на страницу книги.
Указываем, что загружаем “Как файл”. Создаем новую переменную GET_UraitRU_File в которую будет сохраняться путь до загруженной картинки.
Давайте выполним проект с самого начала.


В переменной GET_UraitRU_File мы видим путь до загруженной страницы нашего документа, которая уже находится на нашем компьютере:
C:\Program Files\ZennoLab\RU\ZennoPoster Pro V7\7.7.5.0\Progs\Trash\page_1.svg(1).gz

Обращаем внимание, что в данном случае файл загружается в архиве .gz. Но если попытаться его разархивировать, то программа для работы с архивами покажет ошибку. На самом деле ZennoPoster ошибочно добавляет расширение .gz, но на самом деле файл является просто .svg картинкой. Не знаю, почему так происходит, возможно это особенности работы ZennoPoster или веб-сервера Urait.ru, который отдаёт нам картинку. Если вы знаете почему так происходит - напишите пожалуйста в комментариях.

Небольшое отступление:
Но если у вас скачается в реальном архиве, то распаковать файл не сложно. У ZennoPoster, к сожалению, нет встроенных инструментов для работы с архивами, но сделать это можно благодаря бесплатной программы 7-Zip. Если у вас нет её на компьютере, то нужно установить: https://www.7-zip.org/

Вам нужно будет “подключить” 7-Zip к ZennoPoster. Делается это просто. Выбираем действие “Запуск программы”:


И вам нужно будет настроить действие.


Например, так:

x -y “d:\123\file.rar” -o“d:\456”

Распаковываем файл d:\123\file.rar и помещаем содержимое в папку d:\456.

Обязательно экранируйте путь кавычками если он содержит пробелы или специальные символы (например скобки).


Но в нашем случае распаковывать архив не требуется. Только переименовать файл. Продолжаем работу.

Конец отступления

Мы скачали файл, но нам нужно поместить его в нужную папку.

Создаём новое действие “Файлы”.


Выбираем “Переместить”.

В “Путь к файлу” вставляем переменную из предыдущего GET запроса.

А “Новый путь” нужно заполнить похитрее. Мы ведь хотим сделать наш шаблон универсальным, чтобы он мог загружать любую книгу по ссылке. А значит для каждой книги нам нужно создавать свою папку. Немного отвлечёмся от заполнения действия “Файлы” и сделаем это.

Например, мы хотим сделать такую структуру:

Папка проекта
---Документы
-------Книга 1
-----------страница 1
-----------страница 2
-----------страница …
-------Книга 2
-----------страница 1
-----------страница 2
-----------страница …

За папку проекта у нас отвечает переменная {-Project.Directory-}

Папку “Документы” просто создадим самостоятельно на диске.

А вот название для папки книги мы можем взять из переменных JSON. Помните, немного ранее мы получили эту информацию? Копируем переменную отвечающую за название документа {-Json.title-}


Итоговый новый путь для картинки у нас получается такой:
{-Project.Directory-}Документы\{-Json.title-}\{-Variable.couter_page-}.svg

В качестве имени файла я указал переменную счетчика страниц {-Variable.couter_page-} и указал расширение .svg (без архивного .gz).

Теперь вставляем наш новый путь в Файлы.


Теперь нам осталось загрузить все страницы. Т.к мы знаем сколько всего страниц (эта информация в переменных, вкладке JSON):


Создадим действие “Логика - IF” и сделаем проверку, достигли мы последней страницы или нет (подробнее как работает действие Если c примерами).


Если не достигли последней страницы, то нам нужно увеличить значение переменной страниц на 1. Сделать это можно так:


Выбираем нашу переменную couter_page и увеличиваем её значение на 1.


И после увеличения значения на 1 нам нужно загрузить следующую страницу документа. А значит тянем зелёную линию до действия GET которое отвечает за загрузку страницы.


А чтобы всё выглядело красиво, то сделаем оповещение при завершении загрузки книги.


Если значение текущей загруженной страницы равно количеству страниц, то показываем оповещение, что книга загружена.


Проверим, что наш проект работает. Запускаем с самого начала.


Переходим в папку проекта и видим, что файлы документа скачались.


Пробуем открыть случайный файл:


Файл открывается успешно.

Если нам не требуется скачивать сотни документов, то на этом моменте проще объединить страницы в один файл используя бесплатные онлайн сервисы. Автоматизация всего не является самоцелью, важнее быстро и эффективно выполнить задачу. Найти такие сервисы можно в яндексе или гугле:

“конвертировать svg в pdf”
“конвертировать svg в один docx”
Например:
https://tools.pdf24.org/ru/svg-B-pdf


А после конвертации объединяем в один PDF файл:
https://www.ilovepdf.com/ru/merge_pdf

В итоге мы получаем готовый PDF файл книги. Задача выполнена.
При средних знаниях ZennoPoster такие шаблоны можно делать за 20-30 минут.


БОНУС. Автоматическая конвертация SVG в PDF.
Внимание: потребуется последняя версия ZennoPoster. На старых может не работать.

Если задача сохранить сотни-тысячи документов, то можно воспользоваться готовым решением конвертации svg файлов и объединения в единый pdf файл. Этот скрипт помог сделать @samsonnn (автор статьи “Библиотека Magick.NET C# (Image Magick), работа с изображениями, и другие полезняшки” занявшей 1 место в предыдущем конкурсе статей).

Инструкция по настройке:
Загружаем библиотеки из папки ExternalAssemblies в архиве в конце статьи и помещаем все файлы в папку ExternalAssemblies по пути:
c:\Program Files\ZennoLab\RU\ZennoPoster Pro V7\7.7.5.0\Progs\ExternalAssemblies\

Если добавляете в свой проект, то нужно указать “Ссылки из GAG”:


и добавить в “Директивы using и общий код”:


Настройки простые:


Если нужны какие-то правки и консультации, то пишите @samsonnn , он толковый и ответственный специалист.

Надеюсь данный гайд был вам полезен. Я опустил некоторые второстепенные моменты для упрощения подачи материала. Мы разобрали самое сложное, а разные мелочи вы добавите в процессе сами. Спасибо, что прошли вместе со мной этот путь. Хорошего дня!
 

Вложения

Последнее редактирование модератором:

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)