在 scribd.com 上阅读书籍时,未启用下载功能。即使浏览 html 源代码,我也无法下载实际的书。很棒的东西……但是他们是怎么做到的?我正在寻求实现类似的东西,以访问者无法下载文件的方式显示 pdf(或从 pdf 转换)
我见过的大多数解决方案都是基于对 url 进行模糊处理。但只要稍加努力,人们就可以找到 url 并下载文件。ScribD 似乎已经很好地涵盖了这一点..
任何建议,想法如何实施这样的下载保护?
它实际上可以根据您在翻页时发出的 AJAX 请求动态地构建 HTML。它不是基于图像的。这就是为什么您发现很难下载内容的原因。
但是,目前还没有那么安全。我在下面提供了一个解决方案来下载今天(2020 年 1 月 27 日)有效的书籍,而不是教你如何做到这一点(这是不合法的),而是向你展示你应该如何预防(或者,至少,让它更难)如果您正在构建类似的东西,用户不会下载内容。
如果您有付费帐户并打开书页(单击“开始阅读”时打开的书页),您可以通过加载诸如 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 来寻找类似“机器人”的行为。