Как я мощно скачал книгу
Всем 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
исправил часть багов, оказалось я плохо знаю как работать с асинхронным кодом. ладно