Greasy Fork

Greasy Fork is available in English.

文献互助小帮手:①从图书馆参考咨询联盟(ucdrs)或读秀(duxiu)获取ssid/dxid ②从中美百万(cadal)获取ssno ③提供ucdrs、duxiu、cadal到豆瓣图书的链接

显示图书馆参考咨询联盟(ucdrs)或读秀及其镜像站(duxiu)上文献的ssid或dxid(ssid不存在时),用于群组找书、文献互助、图书互助等场景;显示大学数字图书馆国际合作计划(cadal)的书号-ssno,用于查询下载中美百万书册;另外在搜索、详情页等处添加ucdrs、duxiu、cadal和豆瓣的双向导航链接。To搜索[红太狼的平底锅]的朋友:提供红太狼的平底锅的部分功能,如显示ssid,下载请自行找百度网盘群组;显示dxid和双向链接为平底锅没有的新加功能。

当前为 2022-04-26 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         文献互助小帮手:①从图书馆参考咨询联盟(ucdrs)或读秀(duxiu)获取ssid/dxid ②从中美百万(cadal)获取ssno ③提供ucdrs、duxiu、cadal到豆瓣图书的链接
// @namespace    ucdrs.superlib.net
// @version      1.5.1
// @author       Theron
// @match        *://book.ucdrs.superlib.net/views/specific/*
// @match        *://book.ucdrs.superlib.net/search*
// @match        *://search.douban.com/book/subject_search*
// @match        *://book.douban.com/isbn/*
// @match        *://book.douban.com/subject_search*
// @match        *://book.douban.com/tag/*
// @match        *://book.douban.com/subject/*
// @match        *://book.douban.com/series/*
// @match        *://book.douban.com/works/*
// @match        *://book.douban.com/author/*/books*
// @match        *://book.douban.com/people/*/wish*
// @match        *://book.douban.com/people/*/do*
// @match        *://book.douban.com/people/*/collect*
// @match        *://www.douban.com/doulist/*
// @match        *://book.douban.com/cart*
// @match        *://cadal.edu.cn/cadalinfo/search*
// @match        *://cadal.edu.cn/cardpage/bookCardPage?*ssno=*
// @include      */search*
// @include      */bookDetail.jsp*
// @include      */chapter.jsp*
// @description  显示图书馆参考咨询联盟(ucdrs)或读秀及其镜像站(duxiu)上文献的ssid或dxid(ssid不存在时),用于群组找书、文献互助、图书互助等场景;显示大学数字图书馆国际合作计划(cadal)的书号-ssno,用于查询下载中美百万书册;另外在搜索、详情页等处添加ucdrs、duxiu、cadal和豆瓣的双向导航链接。To搜索[红太狼的平底锅]的朋友:提供红太狼的平底锅的部分功能,如显示ssid,下载请自行找百度网盘群组;显示dxid和双向链接为平底锅没有的新加功能。
// @grant        none
// @license      Copyright Theron
// ==/UserScript==

/* jslint esversion: 6 */
/*globals jQuery */
(function () {
    'use strict';
    function slim(s) {
        return s.replaceAll(/  +/g, "").trim();
    }
    function showbid(bookid, idtype) {
        return `<p style="text-align: center; margin-top: 5px; margin-bottom: 5px; clear:both;"><span style="color: red; font-size: 13px; padding-right: 3px;">${idtype}</span><span style="color: blue; font-size: 13px; font-weight: bold;">${bookid}</span></p>`;
    }
    function sepit(s, sep) {
        if (sep === "|") {
            s = " | " + s;
        } else if (sep === "br") {
            s = s + "<br>";
        } else if (sep === "p") {
            s = '<p style="text-align: center">' + s + '</p>';
        }
        return s;
    }
    function ucdrslink(bookname, sep = "|", text = '参考联盟') {
        return sepit(`<a style="font-size: 80%; color: orange;" href="http://book.ucdrs.superlib.net/search?sw=${bookname}&bCon=&ecode=utf-8&channel=search&Field=1" target="_blank">${text}</a>`, sep);
    }
    function dblink(bookname, isbn = "", sep = "|") {
        if (isbn === "") {
            return sepit(`<a href="https://search.douban.com/book/subject_search?search_text=${bookname.trim()}" target="_blank" style="color: blue">豆瓣搜索</a>`, sep);
        }
        return sepit(`<a href="https://book.douban.com/isbn/${isbn.trim()}/?bookname=${bookname.trim()}" target="_blank" style="color: blue">豆瓣直达</a>`, sep);
    }
    function dxtoc(url) {
        console.log(url);
        url = url.replace("bookDetail.jsp", "chapter.jsp").replace(/sw=[^/&]*/, "sw=1%202%203%20%E4%B8%AD%204%205%206%207%208%20%E5%A4%A7%20%E5%8F%82%E8%80%83%209%20%E6%98%AF%20%E4%BA%BA%20%E4%B8%8A%20%E9%99%84%20%E4%B8%8D%20%E5%B0%8F%20%E4%BB%8E%20%E4%B9%8B%20%E4%B8%8B%20%E6%9C%89%20%E7%94%A8%20%E4%BB%A5%20%E5%A4%9A%20%E5%90%8E%20%E8%A1%A8%20%E4%BB%80%E4%B9%88%20%E5%8D%81%2010%20%E9%83%A8%E5%88%86%20%E5%89%8D%20%E5%88%B0%20%E5%9B%BE%20%E6%88%91%20%E5%A6%82%E4%BD%95%20%E8%A6%81%20%E5%8F%AF%20%E5%86%85%20%E9%87%8C%20%E8%AE%B0%20%E5%8C%BA%20%E5%A4%96%20%E5%A4%A9%20%E6%9D%A5%20%E4%BD%A0%20%E8%A5%BF%20%E5%86%8D%20%E5%BA%8F%20%E5%8D%97%20%E6%AD%A5%E9%AA%A4%20%E5%90%8C%20%E5%BD%95%20%E9%99%84%20%E5%8E%BB%20%E5%A5%B3%20%E7%AF%87%20%E5%BC%80%20%E6%96%87%20%E9%83%BD%20%E9%A2%98%20%E4%B8%9C%20%E5%B0%B1%20%E8%8A%82%20%E4%BB%96%20%E4%B9%9F%20%E5%85%AC%20%E5%8C%97%20%E7%BB%93%20%E5%8F%B3%20%E5%8F%88%20%E5%B0%91%20%E7%99%BE%20%E9%82%A3%20%E8%BF%99%20%E5%85%B3%20%E6%B2%A1%20%E5%8D%83%20%E8%A1%A8%E6%A0%BC%20%E4%B8%AA%20%E7%94%B7%20%E7%AB%A0%200%20%E8%AE%BA%20%E5%87%A0%20%E4%BB%8A%20%E5%B7%A6%20%E4%B8%87");
        return `<a href="${url}" target="_blank" style="color: blue">目录</a>`;
    }
    function iid2ssid(iid) {
        var ssid = "";
        var part = "";
        var tailhex = parseInt(iid.substring(iid.length - 2), 16);
        var encoded = iid.substring(0, iid.length - 16);
        var i;
        for (i = 0; i < encoded.length; i = i + 2) {
            part = encoded.substring(i, i + 2);
            ssid += String.fromCharCode(parseInt(part, 16) - tailhex);
        }
        return ssid.replace(/\//g, "").match(/\d{8}/)[0];
    }

    var pageurl = window.location.href;
    var bookid;
    var bookname;
    var ssid;
    var dxid;
    var img;
    var snippet;
    var m_isbn;
    var m_ssn;
    var m_dxid;
    var m_iid;
    if (pageurl.includes("search.douban.com/book/subject_search") || pageurl.includes("book.douban.com/subject_search")) {
        jQuery("div.item-root > div.detail > div.title").each(function (i, el) {
            bookname = slim(jQuery(el).text());
            jQuery(el).find("a").after(ucdrslink(bookname));
        });
    } else if (pageurl.includes("book.douban.com/works")) {
        jQuery("div.bkdesc > a.pl2").each(function (i, el) {
            bookname = slim(jQuery(el).text());
            jQuery(el).after(ucdrslink(bookname));
        });
    } else if (pageurl.includes("book.douban.com/cart")) {
        jQuery("td.book_title > a").each(function (i, el) {
            bookname = slim(jQuery(el).text());
            jQuery(el).after(ucdrslink(bookname, '|', '参'));
        });
    } else if (pageurl.includes("www.douban.com/doulist")) {
        jQuery("div.title > a").each(function (i, el) {
            bookname = slim(jQuery(el).text());
            var src = slim(jQuery(el).parent().prev().prev().text());
            if (src === "来自:豆瓣读书") {
                jQuery(el).after(ucdrslink(bookname));
            }
        });
    } else if (pageurl.match("book.douban.com.*/(series|tag|do|wish|collect)")) {
        jQuery("div.info > h2 > a").each(function (i, el) {
            bookname = slim(jQuery(el).text());
            jQuery(el).after(ucdrslink(bookname));
        });
    } else if (pageurl.includes("book.douban.com/author")) {
        jQuery("h6 > a").each(function (i, el) {
            bookname = slim(jQuery(el).text());
            jQuery(el).after(ucdrslink(bookname));
        });
    } else if (pageurl.includes("book.douban.com/subject")) {
        var json = jQuery("script[type='application/ld+json']").text();
        bookname = json.match(/"name" : "(.*?)",/)[1];
        m_isbn = json.match(/"isbn" : "(.*?)",/);
        snippet = '<br><a href="http://book.ucdrs.superlib.net/search?sw=' + (m_isbn ? m_isbn[1] : bookname) + '&bCon=&ecode=utf-8&channel=search&Field=' + (m_isbn ? "All" : "1") + '" target="_blank">参考联盟</a>';
        jQuery("div#mainpic > a.nbg").after(snippet);
    } else if (pageurl.includes("book.douban.com/isbn")) {
        var error = jQuery('div#exception').text().trim();
        console.log(error);
        if (error === "豆瓣评论暂时没有收录此书,请原谅。" || error === "您提供的ISBN号码不正确,请校正后再试。谢谢。") {
            var m_bookname = pageurl.match(/\?bookname=(.+)/);
            if (m_bookname) {
                bookname = m_bookname[1];
                document.location = "https://search.douban.com/book/subject_search?search_text=" + bookname;
            }
        }
    } else if (pageurl.includes("book.ucdrs.superlib.net/search")) {
        jQuery('td[id="b_img"]').each(function (i, el) {
            bookid = jQuery(el).parent("tr").find('input[name*="ssid"]').val();
            bookname = jQuery(el).parent("tr").find('input[name*="title"]').val().replaceAll(/<.*?>/g, "");
            if (bookname) {
                jQuery(el).parent().children().last().find("a").after(dblink(bookname));
            }
            if (bookid) {
                jQuery(el).after(showbid(bookid, "SS号"));
            } else {
                bookid = jQuery(el).find("a[href]").attr("href").match(/dxNumber=(\d+)/);
                if (bookid) {
                    jQuery(el).after(showbid(bookid[1], "DX号"));
                }
            }
        });
    } else if (pageurl.includes("//cadal.edu.cn/cadalinfo/search")) {
        jQuery('a.title').each(function (i, el) {
            bookid = jQuery(el).attr("onclick").match(/'\w+'/)[0].replace(/'/g, "").replace("hj", "");
            jQuery(el).parent().parent().prev().find("a").after(showbid("CD" + bookid, "CADAL号<br>"));
            bookname = jQuery(el).text().trim();
            jQuery(el).after(dblink(bookname));
        });
    } else if (pageurl.includes("://cadal.edu.cn/cardpage/bookCardPage?")) {
        bookid = pageurl.match(/ssno=(\w+)/)[1];
        jQuery('div.title_img').each(function (i, el) {
            bookname = jQuery("span.title").text().trim();
            m_isbn = jQuery(el).next().text().match(/ISBN:(.*?)\n/);
            jQuery("span.title").after(m_isbn ? dblink(bookname, m_isbn[1]) : dblink(bookname));
            jQuery(el).find("a").after(showbid("CD" + bookid, "CADAL号<br>"));
        });
        jQuery("#menu_area").show();
    } else if (pageurl.includes("/search") && jQuery('#dxid0').val()) {
        jQuery('div[class="divImg"]').each(function (i, el) {
            ssid = jQuery(el).prev().val();
            dxid = jQuery(el).prev().prev().val();
            bookname = jQuery(el).parent().find('input[name*="title"]').val().replaceAll(/<.*?>/g, "");
            m_isbn = jQuery(el).next().text().match(/ISBN : ([\d-]+)\n/);
            var ele_title = jQuery(el).next().find("dt").find("a");
            ele_title.after(dxtoc(ele_title.attr("href")) + (m_isbn ? dblink(bookname, m_isbn[1]) : dblink(bookname)));
            //ele_title.after(dxtoc(ele_title.attr("href")));
            if (ssid) {
                jQuery(el).children().first().after(showbid(ssid, "SS号"));
            } else if (dxid) {
                jQuery(el).children().first().after(showbid(dxid, "DX号"));
            }
        });
    } else if (pageurl.includes("/views/specific/")) {
        m_ssn = jQuery("script:contains(send_requestajax)").text().match(/ssn=(\d{3,})/);
        m_dxid = pageurl.match(/dxNumber=(\d+)/);
        img = jQuery("div.tubookimg>img");
        if (m_ssn) {
            img.after(showbid(m_ssn[1], "SS号"));
        } else if (m_dxid) {
            img.after(showbid(m_dxid[1], "DX号"));
        }
        bookname = jQuery("div.tutilte").text();
        m_isbn = jQuery("div.tubox").find("dl").text().match(/【ISBN号】(.*?)\n/);
        snippet = m_isbn ? dblink(bookname, m_isbn[1], "") : dblink(bookname, "");
        img.after(`<p style="text-align: center">${snippet}</p>`);
    } else if (pageurl.includes("bookDetail.jsp?") && jQuery('input#dxid').val()) {
        m_iid = jQuery("div#bookphoto").html().match(/CoverNew.dll\?iid=(\w{40,56}\b)/);
        m_ssn = jQuery("script:contains(send_requestlib)").text().match(/ssn=(\d{3,})/);
        m_dxid = pageurl.match(/dxNumber=(\d+)/);
        img = jQuery("#grade1").prev();
        if (m_iid) {
            img.after(showbid(iid2ssid(m_iid[1]), "SS号"));
        } else if (m_ssn) {
            img.after(showbid(m_ssn[1], "SS号"));
        } else if (m_dxid) {
            img.after(showbid(m_dxid[1], "DX号"));
        }
        bookname = jQuery("input#dxid").prev().text();
        m_isbn = jQuery("div.card_text").find("dl").text().match(/ISBN号 :(.*?)\n/);
        snippet = m_isbn ? dblink(bookname, m_isbn[1], "") : dblink(bookname, "");
        img.after(`<p style="text-align: center">${dxtoc(pageurl)} | ${snippet}</p>`);
    } else if (pageurl.includes("chapter.jsp?") && pageurl.includes("dxNumber=")) {
        var also = jQuery("#also");
        also.after('<p style="color: orange; font-size: 120%;">以下目录非完整版,由于读秀限制,仅展示匹配了 <a href="http://greasyfork.icu/zh-CN/scripts/435569/" target="_blank">文献互助小帮手</a> 脚本内置关键词的条目。</p>');
    }
})();