您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Greasy Fork is available in English.
如果存在中图分类,则会在豆瓣信息栏中多显示如“中图分类: B842.1 (认知)”,方便对图书进行分类。
当前为
// ==UserScript== // @name 豆瓣中图法分类 // @description 如果存在中图分类,则会在豆瓣信息栏中多显示如“中图分类: B842.1 (认知)”,方便对图书进行分类。 // @author 018([email protected]) // @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 // @require http://greasyfork.icu/scripts/368137-encodeToGb2312/code/encodeToGb2312.js?version=601683 // @include https://book.douban.com/* // @version 0.1.1 // @icon https://img3.doubanio.com/favicon.ico // @run-at document-end // @namespace doveboy_js // ==/UserScript== // This Userscirpt can't run under Greasemonkey 4.x platform if (typeof GM_xmlhttpRequest === 'undefined') { alert('不支持Greasemonkey 4.x,请换用暴力猴或Tampermonkey') return } // 不属于豆瓣的页面 if (!/douban.com/.test(location.host)) { return } ;(function () { 'use strict' $(document).ready(function () { var isbn = /ISBN: .*\n/.exec($('#info').eq(0).text())[0].match(/\d+/g)[0].replace(/\n| /g, ''); var title = $('#wrapper h1').eq(0).text().replace(/\n| /g, ''); if( isbn && title ) { // superlib 搜索 requestSuperlib(isbn); } }) function requestSuperlib(isbn) { getDoc('http://book.ucdrs.superlib.net/search?Field=all&channel=search&sw=' + isbn, null, function(doc, responseDetail, meta) { for (let book of doc.querySelectorAll('.book1')) { 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'); getDoc(url, null, function(doc1, responseDetail, meta) { let tubox = doc1.querySelector('.tubox dl').textContent; let isbn1 = opt(/【ISBN号】.*\n/.exec(tubox)).replace(/【ISBN号】|-|\n/g, ''); if (isbn == isbn1) { let clc = opt(opt(/【中图法分类号】.*\n/.exec(tubox)).match(/[a-zA-Z0-9\.]+/)); if (clc) { $('#info').append('<span class="pl">中图分类:</span> <a id="clcText" target="_blank" href="https://www.clcindex.com/search/?wd=' + clc + '">' + clc + '</a>'); requestClc(clc) } } }); } } }); } function requestClc(clc) { doPost('https://ct.istic.ac.cn/site/clc/getByClassName?t=' + new Date().getTime(), { "Content-Type": "application/x-www-form-urlencoded" }, 'classname=' + clc, null, function(json, responseDetail, meta) { if (json.length == 0) { requestClc(clc.replace(/\.\d*$/, '')); return; } let rets = [] let jsonMap = {} let pid = putMapReturnPid(clc, json, jsonMap, rets); clcText(pid, jsonMap, rets); if (rets.length > 0) { $('#clcText').after(' (' + rets.join(' / ') + ')'); } }); } function putMapReturnPid(clc, json, jsonMap, rets) { if (!json || json.length <= 0 || !jsonMap || !rets) return; let pid; let level; for (let i = 0; i < json.length; i ++) { if (rets.length ==0 && json[i].classNum == clc) { rets.push(json[i].classNum + ' - ' + json[i].className); pid = json[i].pid; level = json[i].level; } else if( json[i].level < level) { jsonMap[json[i].id + ''] = json[i]; } } return pid; } function clcText(pid, jsonMap, rets) { if (!jsonMap || !rets) return; if( jsonMap[pid] ) { rets.unshift(jsonMap[pid].classNum + ' - ' + jsonMap[pid].className); if (jsonMap[pid].level <= 2) return; clcText(jsonMap[pid].pid, jsonMap, rets); } } function opt(arrs) { if (arrs && arrs.length > 0) { return arrs[0]; } return ''; } // 对使用GM_xmlhttpRequest返回的html文本进行处理并返回DOM树 function page_parser(responseText) { // 替换一些信息防止图片和页面脚本的加载,同时可能加快页面解析速度 responseText = responseText.replace(/s+src=/ig, ' data-src='); // 图片,部分外源脚本 responseText = responseText.replace(/<script[^>]*?>[\S\s]*?<\/script>/ig, ''); //页面脚本 return (new DOMParser()).parseFromString(responseText, 'text/html'); } function getDoc (url, meta, callback) { GM_xmlhttpRequest({ method: 'GET', url: url, onload: function (responseDetail) { if (responseDetail.status === 200) { let doc = page_parser(responseDetail.responseText) callback(doc, responseDetail, meta) } else { callback(undefined, responseDetail, meta) } } }) } function doPost (url, headers, data, meta, callback) { GM_xmlhttpRequest({ method: "POST", url: url, data: data, headers: headers, onload: function(responseDetail){ if (responseDetail.status === 200) { callback(JSON.parse(responseDetail.responseText), responseDetail, meta) } else { callback(undefined, responseDetail, meta) } } }) } })()