Как scribd предотвращает загрузку

при чтении КНИГ на scribd.com функция загрузки не активна. даже просматривая исходный код html, я не смог загрузить настоящую книгу. Отличный материал... но КАК они это сделали? Я хочу реализовать что-то подобное, чтобы отобразить PDF (или преобразованный из PDF) таким образом, чтобы посетитель не мог загрузить файл

Большинство решений, которые я видел, основаны на запутывании URL-адреса ... но, приложив небольшие усилия, люди могут найти URL-адрес и загрузить файл. ScribD, похоже, достаточно хорошо это осветил.

Любые предложения, идеи, как реализовать такую ​​защиту загрузки?


person robo    schedule 11.05.2018    source источник
comment
В конечном счете, все это будет обфускацией, если только вы не потребуете от пользователей наличия какого-либо проприетарного плагина, потому что данные должны быть доступны для отображения в браузере. Это не значит, что вы не можете попробовать, но имейте в виду, что если у вас есть определенные пользователи, вы вступаете с ними в гонку вооружений, как показывают эти результаты поиска для загрузки scribd.   -  person IMSoP    schedule 11.05.2018
comment
Да согласен в гонке вооружений.. но на данный момент все уловки, которыми делились при скачивании, не работают. Но помимо хакерской части... есть идеи, как они реализовали свое текущее решение?   -  person robo    schedule 12.05.2018
comment
У меня нет учетной записи на scribd, поэтому я не вижу ни одну из этих защищенных книг. Я перешел к предварительному просмотру одного из них и смог свободно скопировать из него текст, а исходный код HTML даже не был особенно запутан, так что я предполагаю, что для тех, о которых вы говорите, существует другая система?   -  person IMSoP    schedule 12.05.2018
comment
Господи, я только что посмотрел на JSON, который он использует для получения следующей страницы, и это, должно быть, самый неэффективный формат электронной книги из когда-либо изобретенных: объект JSON для каждого слова на странице! Тем не менее, никаких попыток запутывания, просто очень много отслеживания.   -  person IMSoP    schedule 12.05.2018
comment
Если это все json, то как они могут делать изображения или таблицы и т. д.?   -  person robo    schedule 15.05.2018
comment
Так же, как в HTML или любом другом языке разметки или формате документа. Я не особо вникал в детали, я просто видел, как легко будет очистить данные до того, как они будут отображены на странице (вывод: очень просто), и был удивлен уродством формата.   -  person IMSoP    schedule 15.05.2018


Ответы (1)


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

Однако пока это не так безопасно. Ниже я представляю решение для загрузки книг, которое работает сегодня (27 января 2020 г.) не для того, чтобы научить вас, как это делать (это незаконно), а чтобы показать вам, как вы должны предотвратить (или, по крайней мере, усложнить) пользователей от загрузки контента, если вы создаете что-то подобное.

Если у вас есть платная учетная запись и вы открываете страницу книги (та, которая открывается, когда вы нажимаете «Начать чтение»), вы можете загрузить изображение каждой страницы книги, загрузив библиотеку, например dom-to-image.

Например, вы можете загрузить библиотеку с помощью инструментов разработчика (весь приведенный ниже код необходимо ввести в консоли страницы):

if (injectDomToImage == undefined) {
    var injectDomToImage = document.createElement('script');
    injectDomToImage.src = "https://cdnjs.cloudflare.com/ajax/libs/dom-to-image/2.6.0/dom-to-image.min.js";
    document.getElementsByTagName('head')[0].appendChild(injectDomToImage);
}

И затем вы можете определить такие функции, как эти:

function downloadPage(page, prefix) {
    domtoimage.toJpeg(document.getElementsByClassName('reader_and_banner_container')[0], {
            quality: 1,
        })
        .then(function(dataUrl) {
            var link = document.createElement('a');
            link.download = `${prefix}_page_${page}.jpg`;
            link.href = dataUrl;
            link.click();
            nextPage(page, prefix);
        });
}

function checkPageChanged(page, oldPageCounter, prefix) {
    let newPageCounter = $('.page_counter').html();
    if (oldPageCounter === newPageCounter) {
        setTimeout(function() {
            checkPageChanged(page, oldPageCounter, prefix);
        }, 500);
    } else {
        setTimeout(function() {
            downloadPage(page + 1, prefix);
        }, 500);
    }
}

function nextPage(page, prefix) {
    let oldPageCounter = $('.page_counter').html();
    $('.next_btn').trigger('click');
    // Wait until page counter has changed (page loading has finished).
    checkPageChanged(page + 1, oldPageCounter, prefix);
}

function download(prefix) {
    downloadPage(1, prefix);
}

Наконец, вы можете загрузить каждую страницу книги в виде изображения JPG, используя:

download('test_');

Он будет загружать каждую страницу как test_page_.jpg

Чтобы предотвратить такой тип «робота», они могли бы, например, использовать Re-CAPTCHA v3, которая работает в фоновом режиме, ища поведение, подобное «роботу».

person Leandro Luque    schedule 27.01.2020