// ==UserScript== // @name 豆瓣京东当当中图法分类 // @description 如果存在中图分类,则会在信息栏中多显示如“中图分类: 中图分类: G442 (G 文化、 科学、 教育、 体育 ▸ G4 教育 ▸ G44 教育心理学 ▸ G442 学习心理学);学科分类: 880 教育学 | 880 教育学 | 88027 教育心理学”,方便对图书进行分类。 // @author 018(lyb018@gmail.com) // @contributor Rhilip // @connect * // @grant GM_xmlhttpRequest // @grant GM_setClipboard // @grant GM_addStyle // @grant GM_setValue // @grant GM_getValue // @grant GM_listValues // @grant GM_deleteValue // @grant GM_registerMenuCommand // @require https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js // @include https://book.douban.com/* // @include https://item.jd.com/* // @include http://product.dangdang.com/* // @version 0.7.1 // @icon https://img3.doubanio.com/favicon.ico // @run-at document-end // @namespace http://018.ai // @downloadURL none // ==/UserScript== // This Userscirpt can't run under Greasemonkey 4.x platform if (typeof GM_xmlhttpRequest === 'undefined') { alert('不支持Greasemonkey 4.x,请换用暴力猴或Tampermonkey') return } const IsCourse = 'clc_setting_IsCourse'; const Subject = 'clc_setting_Subject'; const MoreVersion = 'clc_setting_MoreVersion'; const IsticKeys = 'clc_setting_IsticKeys'; ;(function () { 'use strict'; $(document).ready(function () { if (/douban.com/.test(location.host)) { handleDouban() } else if (/jd.com/.test(location.host)) { handleJd() } else if (/dangdang.com/.test(location.host)) { handleDangdang() } }) function handleDangdang() { // 分类 var isbn; var lis = document.querySelectorAll('#detail_describe > ul li'); if (lis) { for (var li of lis) { if (li) { var section = li.innerText; let index = section.indexOf(':'); if (index <= -1) continue; let key = section.substr(0, index).trim(); let value = section.substr(index + 1).trim(); switch (key) { case "国际标准书号ISBN": isbn = value; break; } } } } if( isbn ) { // superlib 搜索 requestSuperlib(isbn, function(clc) { let $clc = $('.clcText'); if($clc.length > 0) { $clc.after('; ' + clc + ' (...)'); } else { $('.pinglun').after('
'); } requestClc(clc, clc, function(subject) { appendsubjectDangdang(subject); }); }, function(as) { let $clc = $('.as'); if($clc.length > 0) { $clc.after(as); } else { $('.pinglun').after('中图分类 | \
是否教程 | \
学科分类参考 | \
更多版本 | \
关键字 | \
关键字: ' + keys.join(' | ')); $('div.indent span.all div.intro').eq(0).after('
关键字: ' + keys.join(' | '));
}
}, function(err, meta) {
});
}
function replaceKey(work) {
for (let e of $('div.indent div.intro p')) {
if (!e.querySelector('a')) {
$(e).html($(e).html().replace(eval('/' + work + '/g'), '' + work + ''));
}
}
}
// 请求图书馆联盟
function requestSuperlib(isbn, callback, tryread, error, tryreaderror) {
loadDoc('http://book.ucdrs.superlib.net/search?Field=all&channel=search&sw=' + isbn, {isbn: isbn}, function(doc, responseDetail, meta) {
let found = false;
let searchinfo = doc.querySelector('#searchinfo');
if (!searchinfo) {
error(-2, '请登陆 全图图书馆参考咨询联盟 后刷新。');
return;
}
let books = doc.querySelectorAll('.book1');
if (books.length <= 0) {
error(-1, '全图图书馆参考咨询联盟 没有该书籍');
return;
}
for (let book of books) {
if (found) break;
let a = book.querySelector('.book1 td>table a.px14');//
if (a) {
// superlib 单本书籍查看
let url = a.href.replace(location.host, 'book.ucdrs.superlib.net').replace('https', 'http');
loadSrcDoc(url, {isbn: meta.isbn, url: url}, function(doc1, responseDetail1, meta1) {
found = $(".clcText").length > 0;
if (!found) {
let tubox = doc1.querySelector('.tubox dl').textContent;
let isbn1 = opt(/【ISBN号】.*\n/.exec(tubox)).replace(/【ISBN号】|-|\n/g, '');
if (eqisbn(meta1.isbn, isbn1)) {
let clcsText = opt(opt(/【中图法分类号】.*\n/.exec(tubox)).match(/[a-zA-Z0-9\.;]+/));
if (!clcsText) {
error(-1, '该书在 全图图书馆参考咨询联盟 没有中图分类号');
} else {
let clcs = clcsText.split(';');
if (clcs) {
for(let i = 0; i < clcs.length; i++) {
let clc = clcs[i];
callback(clc);
}
}
}
}
}
// 试读
var element = Object.values(doc1.scripts).find(element => element.textContent.includes('send_requestajax'))
if (element) {
var pattern = /".*?"/
if (pattern.test(element.textContent)) {
var url = pattern.exec(element.textContent)[0].replaceAll('"', '');
doText ('http://book.ucdrs.superlib.net/' + url, {}, function (responseText, responseDetail, meta) {
var htmlText = unescape(responseText.trim());
var html = (new DOMParser()).parseFromString(htmlText, 'text/html');
var as = '';
var href
for(var a of html.querySelectorAll('.link a')) {
if (as.length > 0) {
as += ' | '
}
if (a.textContent === '图书馆文献传递') {
as += '' + a.textContent + ''
} else {
href = a.href.replace(location.origin, 'http://book.ucdrs.superlib.net');
as += '' + a.textContent + ''
}
}
if (!href) {
tryreaderror(-1, '查无此信息')
} else {
loadDoc(href, {}, function(doc, responseDetail, meta) {
let $assistUrl = $(doc.querySelector('#downpdf [name=assistUrl]'));
let assistUrl = $assistUrl.attr('value');
let $cntUrl = $(doc.querySelector('#downpdf [name=cntUrl]'));
let cntUrl = $cntUrl.attr('value');
as += ' | 下载辅助页';
if (cntUrl) {
as += ' | 下载正文试读';
}
tryread(as);
}, function (err, meta) {
tryreaderror(err.status, err.statusText);
});
}
}, function (err, meta) {
error(err.status, err.statusText);
})
}
}
}, function(err, meta) {
error(err.status, err.statusText);
});
}
}
}, function(err, meta) {
error(err.status, err.statusText);
});
}
function trimAuthors(author) {
let authors = author.split(/[(|(|)|)|\/|\.|.|·|•|\s]/g);
var trimAs = [];
for (let a of authors) {
let trima = a.trim().replace('主编', '');
if (trima.length <= 1) continue;
if (trimAs.indexOf(trima) < 0) {
trimAs.push(trima);
}
}
return trimAs;
}
function moreversion(title, author) {
var trimTitle = title.replace(/[\(|(].*[\)|)]/g, '');
doGet('https://book.douban.com/j/subject_suggest?q=' + trimTitle, {isbn: trimTitle}, function(arr, responseDetail, meta) {
if (arr.length <= 0) {
$('#info').append('更多版本: 查无此信息
');
return;
}
$('#info').append('更多版本: ');
var trimAs = trimAuthors(author);
var html = '';
for (let item of arr) {
if (item.type !== 'b' || item.url === location.href) continue;
let trim_author_name = trimAuthors(item.author_name);
if ($(trimAs).filter(trim_author_name).length > 0) {
$('#info').append('' + item.title + '(' + item.year + ', ...)' + ' | ');
}
loadDoc(item.url, {id: item.id}, function(_doc, responseDetail, meta) {
let rating = _doc.querySelector('strong[property*="v:average"]');
let ratingContent;
if (rating && (ratingContent = rating.textContent.trim()).length >= 1) {
var ratingPeople = _doc.querySelector('div.rating_sum a.rating_people span[property="v:votes"]').textContent;
if (!ratingPeople || ratingPeople.toString().trim().length <= 0) {
ratingPeople = 0;
}
$('#item__' + meta.id).html(ratingContent + "/" + ratingPeople);
} else {
$('#item__' + meta.id).html("0/0");
}
}, function(err, meta) {
$('#item__' + meta.id).html("-/-");
});
}
$('#info').append('详情
');
}, function(err, meta) {
$('#info').append('更多版本: 详情...
');
});
}
// 请求istic,获取分类名称,备用,暂不启用。
function requestClc(srcclc, clc, subject) {
doGet('http://api.uread.today/master/anon/ch_lib_cls/info?code=' + clc, {srcclc: srcclc, clc: clc}, function(json, responseDetail, meta) {
if (json.resultcode == 40000 && meta.clc.length > 0) {
if (meta.clc.includes('.')) {
requestClc(meta.srcclc, meta.clc.replace(/\.\d*$/, ''), subject);
} else {
requestClc(meta.srcclc, meta.clc.replace(/\d$/, ''), subject);
}
return;
}
let clcs = [];
clcs.push(...json.data.clc.parents.map((e) => e.clc + ' ' + hanldeClcText(e.name)));
clcs.push(json.data.clc.clc + ' ' + hanldeClcText(json.data.clc.name))
htmlclc(meta.srcclc, clcs);
subject(json.data.subject)
}, function(err, meta) {
requestClcA(meta.srcclc, meta.clc);
});
}
// 请求istic,获取分类名称,备用,暂不启用。
function requestClcA(srcclc, clc) {
doPost('https://ct.istic.ac.cn/site/clc/getByClassName?t=' + new Date().getTime(),
{ "Content-Type": "application/x-www-form-urlencoded" }, 'classname=' + clc, {srcclc: srcclc, clc: clc}, function(json, responseDetail, meta) {
if (json.length == 0 && meta.clc.length > 0) {
if (meta.clc.includes('.')) {
requestClcA(meta.clc.replace(/\.\d*$/, ''));
} else {
requestClcA(meta.clc.replace(/\d$/, ''));
}
return;
}
let clcs = [];
let jsonMap = {};
let pid;
let level;
for (let i = 0; i < json.length; i ++) {
if (clcs.length == 0 && json[i].classNum.split('/').includes(clc)) {
clcs.push(json[i].classNum + ' ' + hanldeClcText(json[i].className));
pid = json[i].pid;
level = json[i].level;
} else if( json[i].level < level) {
jsonMap[json[i].id + ''] = json[i];
}
}
clcText(clc, pid, jsonMap, clcs);
htmlclc(meta.srcclc, clcs);
}, function(err, meta) {
requestClcB(meta.clc);
});
}
// 处理clc文字
function clcText(clc, pid, jsonMap, rets) {
if (!jsonMap || !rets) return;
if( jsonMap[pid] ) {
rets.unshift(jsonMap[pid].classNum + ' ' + hanldeClcText(jsonMap[pid].className));
if (jsonMap[pid].level <= 2) return;
clcText(clc, jsonMap[pid].pid, jsonMap, rets);
}
}
function htmlclc(srcclc, rets) {
let clcText = $('#clcText_' + srcclc.replace('.', ''));
if (rets.length > 0) {
if (clcText.text() == '(...)' ) {
clcText.html('(' + rets.join(' ▸ ') + ')');
}
} else {
if (clcText.text() == '(...)' ) {
clcText.html('(查无此信息)');
}
}
}
function hanldeClcText(txt) {
var splits = txt.split(/、|(|)|\(|\)/);
var retss = [];
for (var s of splits) {
if (s.length == 0) continue;
retss.push(' ' + s + '');
/*if (localStorage.getItem(Subject) == '1') {
requestxhma(s);
}*/
}
return retss.join('、');
}
// 请求clcindex,获取分类名称
function requestClcB(clc) {
var url = 'https://www.clcindex.com/category/' + clc;
loadDoc(url, {clc: clc, url: url}, function(doc, responseDetail, meta) {
let clcs = [];
for (let li of doc.querySelectorAll('.breadcrumb li.active')) {
if (!li) continue;
var txtContent = li.textContent.trim();
var clcCode;
var index = txtContent.indexOf(' ');
if (index > 0) {
clcCode = txtContent.substr(0, index);
txtContent = txtContent.substr(index + 1);
}
clcs.push(clcCode + ' ' + hanldeClcText(txtContent));
}
$('#clc_' + meta.clc).attr('href', meta.url);
htmlclc(meta.clc, clcs);
}, function(err, meta) {
if (err.status == 404) {
if (meta.clc.includes('.')) {
requestClcB(meta.clc, meta.clc.replace(/\.\d*$/, ''));
} else {
requestClcB(meta.clc, meta.clc.replace(/\d$/, ''));
}
return;
}
let clcText = $('#clcText');
if (clcText.text() == '(...)' ) {
clcText.html('(无法获取)');
}
});
}
// 请求xhma,获取学科
function requestxhma(s) {
var url = 'http://xkfl.xhma.com/search?w=' + s;
loadDoc(url, {}, function(doc, responseDetail, meta) {
let spans = doc.querySelectorAll('.data li:not(.t) span');//code
if (spans.length == 1) {
let name = spans[0].nextElementSibling.textContent.trim();
if (name.includes(s)) {
let code = spans[0].textContent.trim();
appendsubject(' ' + code + ' ' + name + '');
}
} else if (spans.length > 1) {
for (let span of spans) {
if (!span) continue;
let name = span.nextElementSibling.textContent.trim();
if (name != s && (name != s + '学')) continue;
let code = span.textContent.trim();
appendsubject('' + code + ' ' + name + '');
}
}
}, function(err, meta) {
});
}
function appendsubject(subject) {
let clcText = $('#subjectText');
let subjectText = ' ' + subject.code + ' ' + subject.name + ''
if (clcText.length == 0) {
$('#info').append('学科分类:' + subjectText + '');
} else {
clcText.append(' | ' + subjectText + '');
}
}
function appendsubjectJD(subject) {
let clcText = $('#subjectText');
let subjectText = ' ' + subject.code + ' ' + subject.name + ''
if (clcText.length == 0) {
$('#p-clc').after('