Greasy Fork

Greasy Fork is available in English.

优书网 <=> [知轩藏书/早安电子书]

[知轩藏书/早安电子书]添加优书网评分和直链,优书网书籍详情页添加[知轩藏书/早安电子书]下载链接

当前为 2018-07-01 提交的版本,查看 最新版本

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         优书网 <=> [知轩藏书/早安电子书]
// @namespace    http://tampermonkey.net/
// @description  [知轩藏书/早安电子书]添加优书网评分和直链,优书网书籍详情页添加[知轩藏书/早安电子书]下载链接
// @author       tianxin
// @match        *://zxcs8.com/sort/*
// @match        *://zxcs8.com/post/*
// @match        *://www.zxcs8.com/sort/*
// @match        *://www.zxcs8.com/post/*
// @match        *://www.yousuu.com/book/*
// @match        *://www.zadzs.com/txt/*
// @grant        GM.xmlHttpRequest
// @connect      www.yousuu.com
// @connect      www.zxcs8.com
// @connect      www.zadzs.com
// @version      0.4
// ==/UserScript==
let sourceConfig = {
    'zxcs8.post':{
        bookName:function(item){
            return document.querySelector('h1').innerText.match('《(.*?)》')[1];
        },
        bookAuthor:function(item){
            return document.querySelector('h1').innerText.split(':').pop();
        },
        maxNum:5,
        rateItem:function(rate,rateNum,bookLink){
            return '<p class="yinyong"><span style="font-size:14px;color:#FF0000;font-weight:bold"><a href = "' + bookLink + '" target="_blank">优书网</a>评分: ' + rate + '</span><p><p class="yinyong"><span style="font-size:14px;color:#FF0000;font-weight:bold">评分人数: ' + rateNum + '</span><p>';
        },
        anchorObj:function(item){
            let obj = document.querySelector('.yinyong');
            return obj === undefined ? document.querySelector('.pagefujian') : obj;
        },
        anchorPos:'beforebegin',
    },
    'zxcs8.sort':{
        bookName:function(item){
            return item.firstElementChild.innerText.match('《(.*?)》')[1];
        },
        bookAuthor:function(item){
            return item.firstElementChild.innerText.split(':').pop();
        },
        maxNum:5,
        rateItem:function(rate,rateNum,bookLink){
            return '<a href= "' + bookLink + '" target = "_blank">&nbsp;&nbsp;&nbsp;评分:' + rate + '&nbsp;&nbsp;&nbsp;人数:' + rateNum + '</a>'
        },
        anchorObj:function(item){
            return item.lastElementChild.querySelector('div');
        },
        anchorPos:'beforebegin',
    },
    'zadzs':{
        bookName:function(item){
            return document.querySelector('h3[title]').title;
        },
        bookAuthor:function(item){
            return document.querySelector('h3[title]>span>a').innerText;
        },
        maxNum:5,
        rateItem:function(rate,rateNum,bookLink){
            return '<tr><td width="42px"><a href="'+ bookLink + '" target = "blank">评分:</a></td><td>' + rate + '</td></tr><tr><td width="42px">人数:</td><td>' + rateNum + '</td></tr>';
        },
        anchorObj:function(item){
            return document.querySelector('.m-bookstatus>table>tbody');
        },
        anchorPos:"afterbegin",
    }
};
let sourceHandle = {
    'zxcs8.post':function(site,callback){
        let option = {site:site,item:''};
        return callback(option,sourceConfig);
    },
    'zxcs8.sort':function(site,callback){
        let bookList = Array.prototype.slice.call(document.querySelectorAll('#plist'));
        bookList.forEach(function(item){
             let option = {site:site,item:item};
             callback(option,sourceConfig);
         });
    },
     'zadzs':function(site,callback){
         let option = {site:site,item:''};
         return callback(option,sourceConfig);
    },
};
let sourceRoute = {
    'www.zxcs8.com':function(){
        let tag = location.pathname.split('/')[1];
        if(['sort','post'].includes(tag)){
            return 'zxcs8.' + tag;
        }
    },
    'zxcs8.com':function(){
        let tag = location.pathname.split('/')[1];
        if(['sort','post'].includes(tag)){
            return 'zxcs8.' + tag;
        }
    },
    'www.zadzs.com':function(){
        return 'zadzs';
    }
};
let downloadConfig = {
    "zxcs8":{
        'siteName':'知轩藏书',
        'searchUrl':function(args){
            return 'http://www.zxcs8.com/index.php?keyword=' + args.bookName;
        },
        'bookList':function(item){
            return Array.prototype.slice.call(item.getElementsByTagName('dl'));
        },
        'bookName':function(item){
            return item.children["0"].innerText.match('《(.*?)》')[1];
        },
        'bookAuthor':function(item){
            return item.children["0"].innerText.split(':').pop();
        },
        'bookLink':function(item){
            return item.children["0"].getElementsByTagName('a')[0].href;
        },
        'downloadLink':function(item){
            return item.querySelector('.down_2>a').href;
        },
    },
    "zadzs":{
        'siteName':'早安电子书',
        'searchUrl':function(args){
            return 'http://www.zadzs.com/plus/search.php?kwtype=0&q=' + args.bookName;
        },
        'bookList':function(item){
            return Array.prototype.slice.call(item.getElementsByClassName('searchItem'));
        },
        'bookName':function(item){
            return item.querySelector('.book>h5>a').innerText;
        },
        'bookAuthor':function(item){
            return item.querySelector('.book>.price').innerText.split(':').pop();
        },
        'bookLink':function(item){
            return 'http://www.zadzs.com' + item.querySelector('.book>.cover').pathname;
        },
        'downloadLink':function(item){
            return 'http://www.zadzs.com' + item.querySelector('.book>cover').href;
        },
    },
};
let downloadHandle = {
    'zxcs8':function(options,callback){
        let siteConfig = downloadConfig[options.site];
        getResult(options.bookLink,function(response){
            let html = document.createElement( 'html' );
            html.innerHTML = response;
            let downloadLink = siteConfig.downloadLink(html);
            callback({downloadLink:downloadLink,siteName:siteConfig.siteName})
        });
    },
    'zadzs':function(options,callback){
        let args = {downloadLink:options.bookLink,siteName:downloadConfig[options.site].siteName};
        callback(args);
    }
};
let downloadRoute = {
    'www.yousuu.com':function(){
        return 'www.yousuu.com';
    }
};
function removeElement(element){
    if(element){
        let parent = element.parentNode;
        if(parent){
            parent.removeChild(element);
        }
    }
}
function addDownLoadLink(options,config){
    let siteConfig = config[options.site];
    let youBookName = document.getElementsByClassName('col-sm-7')[0].children[0].innerText;
    let youBookAuthor = document.getElementsByClassName('list-unstyled list-sm')["0"].firstChild.children["0"].innerText;
    getResult(siteConfig.searchUrl({bookName:youBookName}),function(response){
        let html = document.createElement( 'html' );
        html.innerHTML = response;
        let bookList = siteConfig.bookList(html);
        if(bookList.length > 0){
             bookList.some(function(item){
                 let bookLink = siteConfig.bookLink(item);
                 let matchBookName = siteConfig.bookName(item);
                 let matchBookAuthor = siteConfig.bookAuthor(item);
                 console.log(options.site + ':' + matchBookName + ':' + youBookName + ';' + matchBookAuthor + ':' + youBookAuthor );
                 if(matchBookName === youBookName && matchBookAuthor === youBookAuthor){
                     downloadHandle[options.site]({site:options.site,bookLink:bookLink},insertDownLink);
                 }
             });
        }
    })
};
function insertDownLink(options){
    let obj = document.querySelector('#download-items');
    let item = '<li><a href="'+ options.downloadLink +'" target="_blank">'+ options.siteName + '</a></li>';
    obj.insertAdjacentHTML('beforeend',item);
    if(obj.parentElement.style.display === 'none'){
        obj.parentElement.setAttribute('style', 'display:run-in');
    }
}
function getResult(url, callback) {
  GM.xmlHttpRequest({
    method: 'GET',
    url: url,
    onload: function(response) {
      if (response.status >= 200 && response.status < 400){
        callback(response.responseText);}
      else{
        console.log(
            'Error getting ' + url + ' (' + this.status + ' ' + this.statusText +
            '): ' + this.responseText);
      }
    },
    onerror: function(response) {
      console.log('Error during GM.xmlHttpRequest to ' + url + ': ' + response.statusText);
    }
  });
}
function getRate(args,callback)
{
    let bookName = args.bookName;
    let bookAuthor = args.bookAuthor;
    let maxNum = (args.maxNum === undefined) ? 1 : args.maxNum;
    getResult('http://www.yousuu.com/search/' + bookName + '?type=book', function(response){
        let rate = 0;
        let rateNum = 0;
        let bookLink = '';
        let html = document.createElement( 'html' );
        html.innerHTML = response;
        let matchBook = Array.slice(Array.prototype.slice.call(html.getElementsByClassName('col-lg-4 col-md-6 col-xs-12')),0,maxNum);
        matchBook.some(function(item){
            let matchTitle = item.querySelector('.title');
            let matchName = matchTitle.innerText;
            let matchAbstract = item.querySelector('.abstract').innerHTML.split('<br>');
            let matchAuthor = matchAbstract[0].split(':')[1].replace(/<\/?[^>]*>/g,'').trim();
            if(matchAuthor === bookAuthor && matchName === bookName){
                rate = item.querySelector('.num2star').innerHTML;
                rateNum = item.querySelector('.rating').innerText.replace(/[^0-9]/ig,"");
                bookLink = 'http://www.yousuu.com' + matchTitle.querySelector('a').pathname;
                return true;
            }
        });
        callback({rate:rate,rateNum:rateNum,bookLink:bookLink});
    });
}
function insertRate(options,config){
    let siteConfig = config[options.site];
    let args = {bookName:siteConfig.bookName(options.item),bookAuthor:siteConfig.bookAuthor(options.item),maxNum:siteConfig.maxNum};
    getRate(args,function(data){
        let rate = data.rate;
        let rateNum = data.rateNum;
        let bookLink = data.bookLink;
        if(rate !== 0 || rateNum !== 0){
            let rateItem = siteConfig.rateItem(rate,rateNum,bookLink);
            siteConfig.anchorObj(options.item).insertAdjacentHTML(siteConfig.anchorPos,rateItem);
        }
    });
}
(function() {
    'use strict';
    if(Object.keys(sourceRoute).includes(location.hostname)){
        let site = sourceRoute[location.hostname]();
        sourceHandle[site](site,insertRate);
    }
    if(Object.keys(downloadRoute).includes(location.hostname)){
        let sites = Object.keys(downloadConfig);
        let select = '<div class="btn-group" id="download-list" style="display:none"><button type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" class="btn btn-warning dropdown-toggle"><span>去下载</span>&nbsp;<span class="caret"></span></button><ul class="dropdown-menu" id="download-items"></ul></div>';
        let obj = document.getElementsByClassName('sokk-book-button-groups')[0];
        obj.insertAdjacentHTML('beforeend',select);
        sites.forEach(function(item){
            let options = {site:item};
            addDownLoadLink(options,downloadConfig);
        });
    }
})();