Douban_Gzlib

查询广州图书馆可借阅馆藏

// ==UserScript==
// @name         Douban_Gzlib
// @name:zh-CN   豆瓣x广州图书馆
// @namespace    http://tampermonkey.net/
// @version      0.2.2
// @description  查询广州图书馆可借阅馆藏
// @author       https://honwhy.wang
// @license      GPLv3
// @match        https://book.douban.com/subject/*
// @grant        GM.xmlHttpRequest
// @connect      opac.gzlib.org.cn
// ==/UserScript==

(async () => {
    'use strict';

    const info = document.querySelector("#info")
    var cts = info.textContent.split(/\n/).filter(item => item.replaceAll(/\s|\t| /g,'').length> 0)
    var isbn = cts[cts.length-1].match(/(\d+)/)[1]
    console.log(isbn)
    if(isbn) {
        console.log('begin to search')
        let bookHtml = await getBooks({isbn: isbn});
        var ms = bookHtml.match(/bookrecno=([0-9]+)/mg);
        if(ms) {
            var nos = ms.map(m => {
                return m.split('=')[1];
            });
            if(nos && nos.length > 0) {
                let nameToCount = await getBorrowable(nos.join(','));
                showResult(nameToCount, nos[0]);
            }
        } else {
            showResult({});
        }
    }

    async function getBooks(request) {
        let {isbn, title} = request;
        if (isbn == 0) {
            return {};
        }
        var url = '';
        if (title) {
            url = `https://opac.gzlib.org.cn/opac/search?&q=${title}&searchWay=title&sortWay=score&sortOrder=desc&scWay=dim&hasholding=1&curlibcode=TH&curlibcode=NS&curlibcode=BY&curlibcode=HP&curlibcode=PY&curlibcode=YT&curlibcode=LW&curlibcode=GT&curlibcode=HZQ&searchSource=reader`;
        } else {
            url = `https://opac.gzlib.org.cn/opac/search?searchWay0=isbn&q0=${isbn}&logical0=AND&searchWay1=&q1=&logical1=AND&searchWay2=&q2=&searchSource=reader&marcformat=&sortWay=score&sortOrder=desc&startPubdate=&endPubdate=&rows=10&hasholding=1&curlibcode=GT&curlibcode=YT&curlibcode=HZQ&curlibcode=LW&curlibcode=TH&curlibcode=BY&curlibcode=HP&curlibcode=PY&curlibcode=NS`;
        }
        return new Promise((resolve, reject) => {
            try {
                GM.xmlHttpRequest({
                    method: "POST",
                    url: url,
                    //data: "username=johndoe&password=xyz123",
                    //headers: {
                    //    "Content-Type": "application/x-www-form-urlencoded"
                    //},
                    onload: function(response) {
                        if(response.status == 200) {
                            var text = response.responseText;
                            return resolve(text);
                        }
                        return reject(Error("failed"))
                    }
                });
            } catch(e){
                return reject(Error("something bad happened"))
            }
        })

    }
    async function getBorrowable(item) {
        let url = `https://opac.gzlib.org.cn/opac/book/holdingPreviews?bookrecnos=${item}&curLibcodes=HZQ%2CGT%2CLW%2CYT%2CPY%2CHP%2CBY%2CNS%2CTH&return_fmt=json`;
        var text = '{}';
        return new Promise((resolve, reject) => {
            try {
                GM.xmlHttpRequest({
                    method: "POST",
                    url: url,
                    onload: function(response) {
                        if(response.status != 200) {
                            return reject(Error("failed"));
                        }
                        var text = response.responseText;
                        var json = JSON.parse(text);
                        let nameToCount = {};
                        var bookrecno = '';
                        if (json && json['previews']) {
                            Object.keys(json['previews']).forEach(key => {
                                // item => {bookrecno: 3005135912, callno: 'I247.57/10039', curlib: 'NS', curlibName: '南沙区图书馆', curlocal: 'NS-LHZTSS', …}
                                var a = json['previews'][key];
                                a.forEach(item => {
                                    if(item.loanableCount > 0) {
                                        if(nameToCount[item.curlibName]) {
                                            nameToCount[item.curlibName] += item.loanableCount;
                                        } else {
                                            nameToCount[item.curlibName] = item.loanableCount;
                                        }
                                    }
                                    bookrecno = item.bookrecno;
                                });
                            })

                        }
                        return resolve(nameToCount);
                    }
                })
            } catch(e) {
                return reject(Error("something bad happened"))
            }
        })
    }

    function showResult(nameToCount, bookrecno) {
        // set to html
        var aside = document.querySelector(".aside");

        var gray = document.createElement('div');
        gray.classList = 'gray_ad version_works';
        gray.style.display = 'block';
        var h2 = document.createElement('h2');
        h2.textContent = '广州图书馆可借馆藏(非官方)';
        gray.appendChild(h2);
        if(Object.keys(nameToCount).length == 0) {
            var ul = document.createElement("ul");
            ul.classList = "bs current-version-list";
            var wrapper = document.createElement("div");
            wrapper.classList = "cell price-btn-wrapper";
            ul.appendChild(wrapper);
            var buyInfo = document.createElement("div");
            buyInfo.classList = "cell impression_track_mod_buyinfo";
            wrapper.appendChild(buyInfo);
            var cell = document.createElement("div");
            cell.classList="cell";
            buyInfo.appendChild(cell);
            var a = document.createElement("a");
            a.classList="buy-book-btn e-book-btn";
            cell.appendChild(a);
            var span = document.createElement("span");
            span.textContent = "暂无查询结果";
            a.appendChild(span);

            gray.appendChild(ul);
        } else {
            var ul = document.createElement('ul');
            let url = `https://opac.gzlib.org.cn/opac/book/${bookrecno}`;
            Object.keys(nameToCount).forEach(key => {
                var cnt = nameToCount[key];
                var li = document.createElement('li');
                li.styleList = 'mb8 pl';
                var a = document.createElement('a');
                a.href = url;
                a.textContent = `${key} (${cnt})`;
                li.appendChild(a);

                ul.appendChild(li);
            })
            gray.appendChild(ul);
        }
        

        aside.prepend(gray);
    }
})();