С чего все начилось
Около двух лет назад один человек попросил меня помочь разобраться с тем, как ему скачать нескачиваемую книгу с сайта https://author.today
Фигня, подумал я. Опыт парсинга сайтов, к тому времени, был у меня довольно внушительным. План был примерно таков:
1) Пара/тройка запросов к сайту (а может и к REST API, если повезет)
2) Выдергивание текста из HTML
3) Формирование итогового файла.
Берем в руки сайт, запускаем https://www.telerik.com/fiddler и смотрим что там происходит.
Первые попытки получить контент привели в некоторое замешательство - в ответе от сайта приходят шифрованные данные.
Пример того, как это выглядит, можете посмотреть перейдя по ссылке https://author.today/reader/217578/chapter?id=1931261
Засада...
Но мы же видим текст в браузере, а не абракадабру из непонятных символов! Значит где то есть код, который расшифровывает абракадабру. Вариант здесь только один! JS!
Моему удивлению не было предела - нужный кусок кода нашелся буквально за пару минут. С одной стороны этот факт меня очень обрадовал, а с другой крайне удивил. Код занимает всего пару строчек и элементарно воспроизводится на любом языке программирования, что крайне удивительно для такой площадки, которая, как мне казалось, может позволить себе намного более серьезную защиту.
Тот самый кусок кода приводить не буду. Желающие вполне могут найти его в репозитории.
Дальше дело осталось за малым. Получить список глав, выдернуть их контент, расшифровать, загрузить картинки, сформировать epub файл. Почему epub, а не fb2? Потому что у меня яблоко, а оно из коробки умеет открывать epub.
Вот так пал первый сайт, а через некоторое время появилась первая версия программы, которая носила длинное имя Author.Today.Epub.Converter и умела, как следует из названия, скачивать книги из АТ и сохранять их в формате epub.
Но как проверить работоспособность программы и отловить коварные баги? Можно написать unit-тесты, можно ручками закидывать в нее рандомные ссылки и смотреть, что будет получаться, а можно бахнуть из пушки по воробьям. Я выбрал третий вариант...
Так как идентификатор книги в АТ - это число, а что самое главное оно последовательное, то нет никакой проблемы сгенерить ссылки на все книги, которые там есть и отправить их в Author.Today.Epub.Converter.
Вот так, примерно за 20 часов, я скачал все доступные книги с АТ, забил жесткий диск на 200Гб, проверил свою программу и удивился во второй раз, что на АТ нет защиты от такого непотребства.