一、接口
科学文库作为高校阅读的电子书库,但是由于在线文档打开的速度太慢,获取里面的电子书成了首要问题,而且它提供下载的电子书,又需要CAJViewer阅读器才能打开,并不利于正常的阅读以及分享传播。
以前获取电子书靠的是图片拼接,这样太麻烦,正巧有网友分享了一个新的方法,通过调用在线阅读器的离线下载地址,让科学文库的电子书能够快捷下载。
简单来说,福昕的在线阅读器提供了一个离线下载地址
http://159.226.241.32:8093/api/file/***/getDocumentbuffer
其中***处需要我们通过一本电子书的文件ID(fileID)
二、原理
通过对网站进行抓包分析,发现其向网址为https://wkobwp.sciencereading.cn/api/file/add的网页发送post请求,返回的正是所需文件的ID。
通过对POST请求的分析,发现需要传入参数,其中file这个参数是最主要的,它就是科学文库给电子书命名的ID,通过上述所说的地址,获取了福昕阅读器的对该电子书命名的ID,实现了ID转换。
在JavaScript中,一般使用ajax进行跨域请求,获取返回的数据。
将ajax拿到的数据替换***,再访问就能够下载了。
三、代码
/*
* @name: 科学文库下载工具
* @Author: Harl02
* @version: 1.0
* @description: 帮助下载电子书
* @include: book.sciencereading.cn
* @createTime: 2022-08-09-21:30
* @updateTime: 2022-08-09-21:30
*/
/* 判断该网站是否执行脚本*/
var host = 'book.sciencereading.cn';
if (host == window.location.hostname){
//下载地址的前缀和后缀
var pre_url = 'http://159.226.241.32:8093/api/file/';
var suf_url = '/getDocumentbuffer';
//获取地址栏上的图书编号
var url = window.location.href;
var id = url.match('(?<=id=).*');
//ajax获取id
var ajax = null;
if(window.XMLHttpRequest){
ajax = new XMLHttpRequest();
}else{
ajax = new ActiveXObject("Mincrosoft.XMLHTTP");
} ;
ajax.open("POST","https://wkobwp.sciencereading.cn/api/file/add");
ajax.setRequestHeader("Content-type","application/x-www-form-urlencoded");
//构造参数
ajax.send('params=%7B%22params%22%3A%7B%22file%22%3A%22http%3A%2F%2F159.226.241.32%3A81%2F' + id + '.pdf%22%7D%7D');
ajax.onreadystatechange = function(){
if(ajax.readyState == 4&& ajax.status ==200){
//通过正则获取返回的id
var fileid = (ajax.responseText).match('(?<=/"result/"/:/").*(?=/")');
var target_url = pre_url + fileid + suf_url;
//创建悬浮按钮及其监听事件
const d=document.createElement('div');
d.innerHTML='<div id="download">下载</div>';
d.style='position:fixed;right:15px;bottom:20%;color:#000000;background:#FFFFFF';
document.body.append(d);
document.getElementById('download').onclick=()=>{
window.location.replace(target_url);
};
};
};
};
四、总结
原理就是通过在线阅读器的下载地址获取电子书,因为需要用post请求和配置参数,所以需要ajax跨域请求,完成ID的转换,实现了知道科学文库的电子书网址,可以知道电子书的下载地址。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/webdev/280255.html