一、接口
科学文库作为高校阅读的电子书库,但是由于在线文档打开的速度太慢,获取里面的电子书成了首要问题,而且它提供下载的电子书,又需要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的转换,实现了知道科学文库的电子书网址,可以知道电子书的下载地址。