Как я мощно скачал книгу

Всем cнова привет! Постов опять не было долго, кажется пару лет, я немного был занят как обычно 👍

Вообщем, недавно вместо того, чтобы делать дз, я очень долго и упорно пытался скачать книгу с сайта znanium.com. У меня был доступ к чтению книги оффлайн, но не было возможности скачать её оттуда.

хотя тут все заблюрено все равно должно быть понятно

Сразу же бросается в глаза кнопка со стрелочкой вниз. Очевидно, что она скачает книгу!!! Но не тут то было….

"Вы скачали документ" да вот куда блин

Факт того, что книга всё-таки оказывается на моем компьютере, но в скрытом от меня состоянии, меня просто возмутил, и я пошел её искать

Обзор кода сайта

Я начал это дело без какой-либо подготовки, я открыл консоль, посмотрел на div в котором лежит страниуа - там вообще ничего. (До сих понял не пон как они так делают)

там пусто

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

Вскоре выполнения кода приостановилось, и я прошелся по нему пошагово пока не набрел на такую вот функцию…..

многообещающе....

Переменная t - массив с 7 элементами, 6 из которых - зашифрованные в формате Base64 файлы PNG. Я вбил первый из них на сайт для расшифровки и увидел название книги… Только название!!! Оказалось, что каждая страница состоит из шести(!!!) изображений, последнее из которых отличается по размеру.

Теперь предстояло найти откуда код брал данные для загрузки изображений. Я прошелся по стеку вызовов и увидел функцию getVal.

похоже на использование IndexedDB

getVal получало значение из локальной базы данных в браузере (я про IndexedDB мало знаю), где по ключам в виде book_id:page_number:0 хранятся массивы со страницами в формате PNG зашифрованными в Base64. (я на то, чтоб это понять, потратил часа 4 я не нал что такое IDDB просто вообще ахахах просто угар).

Люто прогаем

Я написал цикл for, который с первой до последный страницы запрашивал из локальной базы данных страницы подряд, соединял все строки списка в одну, добавлял их в единый список и потом выводил всё это одной строкой. На выходе получился файл размером 95мб с 1.2 миллионами строк. (После этого я открыл питон и загуглил “Python join images vertically”)

В питоне я просто сплитил строку по запятым, убирал лишние части в них, набивал строки символом “=” и, расшифровывая из Base64, сохранял фото с именами номер_страницы.png. В папке оказалось 2500+ фото, я прошелся по ним скриптом и соединил каждую группу из 6 фото подряд в страницы (код взял из инета я не шарю особо). Сначала ничего не получалось, фото выходили полностью черные, потом оказалось, что надо было указать формат фото RGBA. Перезапустив чкрипт после этого я начал видеть что-то интересное…..

В итоге я получил 463 фото страниц из книги. Но в самой книге должно быть 464 страницы!! Оказалось, я лоханулся в исходном цикле и не получил прследнюю страницу. Вообще не проблема, её просто сфоткал фотом и сохранил вручную. Соединив их в единый файл через (пиратский) Adobe Acrobat DC я (типо) смог скачать книгу!!!! класс!!!!!!!

всем спасибо скрипт потом скину удачи всем

UPD

вот скрипты на гитхабе: https://github.com/hyperClink/localdbbookconverter

Сначала надо книгу скачать для чтения оффлайн, потом выполнить в консоли код из tobookconv.js, изменив значение book_id в коде на то, которое в браузере сверху в ссылке на книгу.

После в консоль выведется большая строка с текстаом, её надо скопировать а txt файл (в коде он называется dumped_pages.txt) и положить его в одну и ту же папку с прикреплённым питон скриптом tobookconv.py.

Скрипт создаст в месте своего расположения 2 папки для работы с фото, в папке bookf будут все страницы из книги, их потом через что-то прогнать можно чтобы единый pdf файл сделать все класс урааа

UPD2

исправил часть багов, оказалось я плохо знаю как работать с асинхронным кодом. ладно