最近使用油猴脚本下载知网学位论文时发现脚本不能正常的下载目录了,因此手动修复一下这个脚本。
通过查看脚本源码和网上搜索发现,脚本使用了jQuery以及油猴的部分接口(比如:GM_xmlhttpRequest,GM_setClipboard等)
在分析源码和查阅脚本的说明后,发现脚本是通过获取知网【分章下载】的网页源码得到每个目录信息的,借助 console.log() 打印GM_xmlhttpRequest请求url发现,知网对分章下载的页面地址进行了更改,脚本原来的请求格式是:
https://chn.oversea.cnki.net/kcms/download.aspx?dbcode=CMFD&dbname=CMFD202102&filename=论文ID.nh
现在改版后的请求格式为:
https://chn.oversea.cnki.net/kcms/detail/downdetail.aspx?dbcode=CMFD&dbname=CMFD202102&filename=论文ID.nh
如果使用原来的请求格式会被知网拒绝放访问,提示错误
于是第一步是修改目录请求url的生成语句,将第81行的语句修改成为
content_url = 'https://chn.oversea.cnki.net/kcms/detail/downdetail.aspx' + content_url.match(/\?.*/)[0];
即可,下图为修改前后对比。
修改前:
修改后:
完成目录页面请求链接修复后,我发现目录下载功能仍然能正常使用,通过查看源码中目录文字生成程序段发现,脚本使用了jQuery完成网页信息的解析。显然,目前页面获取后仍然没能解析出目录信息的原因大概率是知网对页面结构进行了改版,原先的解析方法无法完成新版网页的内容解析,因此,我通过查阅W3school jQuery 选择器的相关介绍,重新修改了目录内容的解析程序,关键参考程序段如下:
function manage_contents(xhr) {
// 这段程序主要修改了下面2行
var cnt_list = $('ul.list-main', xhr.responseText)[0]; // 目录列表
cnt_list = $('li', cnt_list);
var contents = get_content(cnt_list); // 目录内容
// 添加目录复制
$('.btn-dlpdf').first().after($('<li class="btn-dlpdf"><a href="javascript:void(0);">目录复制</a></li>').click(function() {
GM_setClipboard(contents); // 运用油猴脚本自带的复制函数
window.alert('目录已复制到剪贴板');
}));
// 添加目录下载
$('.btn-dlpdf').first().after($('<li class="btn-dlcaj"><a>目录下载</a></li>').click(function() {
var data = new Blob([contents],{
type:"text/plain; charset=UTF-8"});
$(this).find('a').attr("download", '目录_' + $('.wx-tit h1:first-child()').text().trim() + '.txt');
$(this).find('a').attr("href", window.URL.createObjectURL(data));
window.URL.revokeObjectURL(data);
window.alert("目录索引已保存, 请使用PdgCntEditor软件将目录整合到PDF中");
}));
}
另一个修改的地方如下:
function get_content(cnt_list){
var contents = "";
for (var i = 0; i < cnt_list.length; i++) {
var cnt_level = cnt_list[i].getAttribute("class").split("-")[1];
var cnt_levelText="";
for (var j = 0; j< cnt_level; j++){
cnt_levelText = cnt_levelText+"\t";
}
var cnt_item = cnt_list[i].chi