Даешь свободную литературу! Или как я с политикой вуза боролся

Доброго времени суток, хабровчане!  Это мой первый пост на форуме, так что прошу строго не судить.

Коротко обо мне: студент, увлекаюсь электроникой, микроконтроллерами, и программированием. Однако, моя специальность ни коим образом не связана с It. Со мной покончено, переходим к сути.

 Как и полагается любому техническому вузу – в нашем есть куча интернет ресурсов, которыми вуз чрезмерно гордится. Однако есть оборотная сторона медали – качество этих сервисов. А именно, если говорить про электронную библиотеку, о коей и пойдет речь в данной статье, то в ней напрочь отсутствует возможность скачивания pdf-версии нужной тебе методички, точнее она есть, но за это придется заплатить немало денЯк. Деньги далеко не маленькие (если говорить именно про цену за вузовские методички). Если же такой формат не устраивает, то можешь пользоваться онлайн библиотекой.

В онлайн библиотеке есть просмотрщик книг, через который можно читать литературу.

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

И теперь представьте картину: человек пытается подготовиться к контрольной по квантовой механике по методичкам преподавателя, объемом 700 страниц, где необходимый материал находится на 500, и может перелистывать по 5 страничек в минуту, и каждые 20 минут, его попытки приходится возобновлять.… В общем, жесть…. И вот после очередной неудачной попытки прочитать нужную главу,  я решил, что пришло время положить конец данному произволу.

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

“http://www.<название сайта>/plugins/<название просмоторщика>/getDoc.php?Id=<id книги>&page=<номер страницы>”

После получения данной ссылки скачивание книги не составляет и труда:

  1. Необходимо получить id книги (или лучше ссылку на нее)

  2. Узнать количество страниц

  3. В самом простом цикле for пробежаться по всем страницам, загрузив их на компьютер

  4. Объединить фотографии в единый файл pdf

  5. Радоваться

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

Самая первая версия программы выглядела максимально убого: я использовал java и библиотеку selenium для работы с сетью. Приложение получилось явно не user-friendly: запускалась только из IDEA, в которой ручками необходимо было вставлять ссылку на каждую книгу, также ручками забивать количество страниц. Более того, самым убожеством был тот факт, что приложение полностью имитировало пользователя:

В общем – фу! Нельзя так делать!

Но когда у тебя на носу контрольная по квантмеху, и так сойдет. Программа была написана минут за 20, и книжки она выкачивала долго, и иногда не все страницы, хуже того, после скачивания, опять же ручками приходилось объединять картинки в единый файл pdf….

Но, не спешите бросаться помидорами, данный кошмар в дальнейшем был преобразован в весьма неплохой код. Я перешел на Delphi! Да, многие могут сказать, что язык устарел, и не обладает должным функционалам, однако в своей работе я его применяю постоянно. Обучился сему творению благодаря Михаилу Фленову (низкий поклон вам, Миша).

Итак, переходим к финальной версии программы, которая была написана, спустя месяца два – три после моего первого “чудо творения”.

Рисунок 1 - Главная форма приложения
Рисунок 1 - Главная форма приложения

Итак, суть осталось точно такой же, да и шаги не поменялись. Программулиной Wire Shark узнал, какая последовательность отправляется в POST запросе при авторизации. И меня сильно напугал один факт: пароль был зашифрованным.

Небольшое отклонение: логин на сайте представляет собой некоторый набор цифр, а пароль – имя, написанное на русском языке. Однако, в программе Wire Shark на сайт отправлялся шестнадцатеричный код следующего формата: %D0% FF %D0% FF %D1% FF. Как позже выяснилось, символы “FF” кодировали буквы имени, а %D0% и %D1%, что то вроде контрольных байт. З.Ы. Огромная просьба к знатокам, читающим эту статью, если это какой либо общеизвестный сетевой протокол, то не кидайтесь помидорами, а дайте, пожалуйста, ссылку, где можно прочитать про него. Но т.к. я не сталкивался с таким раньше, пришлось разбираться во всем самому.

Первым делом я обратил внимание на повторяющиеся символы %D1% и %D0%, которые, как я сразу и предположил, являются контрольными байтами, однако, оставалась загадкой, чем отличается %D0% от %D1%. Но это пока отложим, едем дальше. Как же шифруется пароль? А он шифруется достаточно просто, предположим, меня зовут Василий, давайте запишем мое имя в ASCII символах:

82 (В) A0 (а) E1 (с) A8 (и) AB (л) A8 (и) A9 (й)

А на сайт отправляется следующая последовательность:

72 (В) 90 (а) 61 (с) 98 (и) 9B (л) 98 (и) 99 (й)

Хм, просматривается одна зависимость…. А, точно! Если внимательно приглядеться, то у каждого символа, отправляемого на сайт, старший байт уменьшается на 1. Бум! Загадка разгадана.

Хотя, стоп, а почему же тогда вместо E1 (буква с), на сайт отправляется 61? А черт ее знает! Просто запомним, что для символов, лежащих в диапазоне от E0 до EF из старшего байта необходимо вычитать не 1, а 6. Собственно и все! А помните, я говорил про контрольный символ %D1%? Так вот, этот символ как раз таки ставится перед символами из данного диапазона. Ну, собственно и все. Далее привожу кусок кода, отвечающий за «шифровку».

Код ""
 for i := 1 to length(password) do
 begin
    temp := Ord(password[i]);		   				 //Представили пароль в HEX виде
    if (temp < 1088) or (temp > 1103) then // Значения символов E0 и EF
        begin			                				 //Если вне этого диапазона, то %D0%
	pasBytes[i] := '%D0%' + IntToHex(((temp) - 896), 2); // + 128 - 1024 для шифрования
   newPassword := newPassword + pasBytes[i];
         end
    else
		begin				   												//Иначе %D1%
	pasBytes[i] := '%D1%' + IntToHex(((temp) - 960), 2); // +64 -1024 для шифрования
                   newPassword := newPassword + pasBytes[i];
	end;
 end;
//1024 здесь вычитается потому, что в Delphi почему то ASCII символы начинаются с #400
//Почему - не ясно 

Финальная последовательность, отправляемая на сайт, будет выглядеть следующим образом:

%D0% 72 %D0% 90 %D1% 61 %D0% 98 %D0% 9B %D0% 98 %D0% 99

Собственно это и была самая сложная часть работы.

Далее, после авторизации, пользователь вставляет в строку ввода ссылку на необходимую книгу. Программа же в это время отправляет Get запрос на сервер, из ответа которого, затем в автоматическом режиме находит название книги, ее ID, и количество страниц. Все эти данные сохраняются в глобальные переменные. И, затем, после нажатия кнопки “Download”, в отдельном потоке отправляются Get запросы на сервер, из которых и забираются картинки с изображениями страниц. Которые в дальнейшем, с помощью библиотеки Synapse формируются в единый PDF файл.

На этом работы программы и заканчивается. К приложению добавлены всякие украшательства, по типу значка и строчки загрузки.

В общем, то и все. Если кому надо, могу выложить исходники на Github и выложить в комментариях ссылку. Также хотелось услышать ваше мнение по поводу моей «дешифровки». Всем спасибо, до скорых встреч на просторах интернета.

@Osiris74
25.04.2021 13:28 UTC
Первоисточник

Комментарии

@Squoworode
25.04.2021 08:53 UTC
+13
повторяющиеся символы %D1% и %D0%, которые, как я сразу и предположил, являются контрольными байтами, однако, оставалась загадкой, чем отличается %D0% от %D1%
Представление кириллицы в UTF-8
@Osiris74
25.04.2021 10:13 UTC
0
Ну да, изобрел велосипед заново)
Спасибо за ссылку, будет весьма полезной
@ultrinfaern
25.04.2021 08:55 UTC
+9
Ваш страшный неизвечтный шифр называется utf8, судя по всему.
PS Меня опередили. :)
@astronom1
25.04.2021 09:31 UTC
+3
Вот это я понимаю, тяга к знаниям! ))))
@rsashka
25.04.2021 09:36 UTC
-14
Это похоже на стеб, а не на тягу к знаниям
@alsoijw
25.04.2021 09:52 UTC
+2
WireShark для данной задачи избыточен, хватит и инструментов разработчика в браузере. Они позволяют увидеть и не закодированные данные.
@
03.05.2021 11:32 UTC
0
НЛО прилетело и опубликовало эту надпись здесь
@PinkyAcorn
25.04.2021 11:12 UTC
+16

А вы тоже ожидали статью про борьбу с системой в стиле FOSS и RMS; с угрозами отчисления и голодовками?


(Осуждаю кликбейтный заголовок, не статью)

@Osiris74
25.04.2021 11:13 UTC
-2
Это будет в дальнейшем, пока что я заложил основу
@msidiagnos
25.04.2021 11:29 UTC
+10

Так, а что вы побороли?


Политику вуза? Она осталась неизменной.


Здорово, что вы написали техническое решение, позволяющее обойти политику вуза, а не побороть.


Когда вуз, с вашей помощью устранит все проблемы, о которых вы написали в начале статьи, можно будет говорить о каких-то победах.


Двигайтесь в этом направлении.

@Osiris74
25.04.2021 12:09 UTC
0
Да, вы правы, политика осталась неизменной.

Зато я дал студентам возможность пользоваться литературой без ограничений.

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

Двигаться в этом направлении, конечно, буду :)
25.04.2021 14:05 UTC
0
Почему «неосуществимо»? Что именно мешает вузу открыть студентам возможность долистывать до 550-й страницы?
25.04.2021 14:12 UTC
+2

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


Сам работаю в вузе и автора понимаю, сдвинуть там что-то, иногда, ну очень трудно. Но, если получается, это здорово.

25.04.2021 14:27 UTC
0
Проблему с перелистыванием страниц, вуз устранил (забыл про это упомянуть в статье).

Однако, работать с документами в таком виде, в котором нам это предлагается, крайне неудобно. Под «неосуществимо» я имел ввиду то, что вузу вероятнее всего невыгодно открывать бесплатный доступ к литературе. Говоря же про онлайн библиотеку, это также, скорее всего, невыгодно с экономической точки зрения — менять структуру сайта.

З.Ы. msidiagnos в целом, более коротко описал всю суть
@astronom1
25.04.2021 21:53 UTC
+1
курсовая по информатике и ИКТ ))))
@
26.04.2021 09:14 UTC
0
НЛО прилетело и опубликовало эту надпись здесь
@rundll32
25.04.2021 12:10 UTC
+1
Подобные статьи всегда вызывают улыбку. Удачи автору!
@OPet
25.04.2021 14:20 UTC
0

С интересом посмотрел бы исходники, если позволите.

@Osiris74
28.04.2021 19:27 UTC
0
Прошу прощения за задержку, не мог выложить исходники раньше
Вот ссылка: github.com/Osiris74/Library_Downloader
29.04.2021 04:33 UTC
0
Спасибо огромное!
02.05.2021 18:05 UTC
0
Добрались руки посмотреть. Если я правильно понял, то в исходниках не хватает файла *.dfm для TForm2.
03.05.2021 11:00 UTC
0
Исправлено
@algotrader2013
25.04.2021 18:24 UTC
+1
Лично меня у, будучи студентом, взрыв пукана вызывали pdf без возможности поиска. И, как я понимаю, именно такие файлы на выходе и выходят (надеюсь, что неправ, и библиотека Synapse это комбайн, делающий все и сразу).
Есть ли идеи, как туда OCR прикрутить, который, пусть и коряво, но, все же, файл в текст превратит и сформирует PDF, в котором будет и картинка (чтобы видеть глазами первоисточник), и текст для поиска одновременно?
@Osiris74
25.04.2021 19:23 UTC
0
Тут все зависит от получаемой картинки, я пытался полученный файл обработать через Adobe Acrobat (преобразовать картинки в текст), в некоторых случаях получалось весьма неплохо. Но в большинстве случаев, качество получаемого текста зависит от исходников, в моем же случае, исходники не всегда хорошего качества.

Лично я такой необходимости не испытывал, но на сколько знаю, библиотекой Synapse можно добавить преобразование картинки в текст, займусь этим на следующих выходных. (Спасибо за совет)

З.Ы. ссылку на исходники чуть позже выложу, сейчас не могу
25.04.2021 20:19 UTC
0
Лично я такой необходимости не испытывал

Может быть, тогда мое Вам почтение)
Из моего опыта, — для списывания или экстренной подготовки к вопросу, пока препод объявил вопрос и водит глазами по аудитории, ища, кого бы дернуть, — вообще маст хев.
Для подготовки к экзамену по списку вопросов не так сильно надо, но лишним не будет
@petro_64
25.04.2021 20:28 UTC
+1

Можно заюзать Tesseract, он умеет распознавать и добавлять слой поверх картинки текста который можно использовать для выделение и поиска через утилиты типа pdfgrep.

25.04.2021 20:44 UTC
0
Хм, впервые слышу

Почитаю, спасибо за информацию
@djarik
26.04.2021 07:07 UTC
0
Лучше такой ВУЗ бросить, думаю. Вообще не встречал подобного идиотизма. Зачем делать учебные материалы максимально недоступными для студентов?
@RozetkaOtUnitaza
26.04.2021 09:00 UTC
+2

Чтобы на бензин для нового Land cruiser хватало.

29.04.2021 01:45 UTC
+1
Хах у нас у препода было прозвище Лексус, он себе его купил за пару сессий.
@dontsov
29.04.2021 11:18 UTC
0
Простите, я правильно понял, что вуз размещает на официальном сайте литературу по учебе, просмотр бесплатный, а скачивание платное?! о_0
А сколько рублей, если не секрет, за методичку по предмету?
@Osiris74
29.04.2021 13:31 UTC
0
Не совсем на официальном сайте, но библиотека числится за вузом.

Да, просмотр бесплатный, скачивание платное. Однако можно оформить месячную и годовую подписки (их цены не знаю, но вроде годовая около 2к).

Насчет цены за книжку: она может варьироваться от 100 до 500 а то и больше рублей. Все зависит от автора и оформления книжки.