北京题库插件:没法登陆又何妨?

背景介绍

什么是北京题库

北京题库

是专注于中小学教学产品研发的教研平台,拥有试卷、资料等优质资源,致力于为教师备课、教研提供一站式服务。——《百度百科》

简单来说,收录的很多资料,相对好用一点

但是,其使用是有一定限制的,比如网页端必须要微信扫码登录才能使用,实在不是很方便。

而且部分文档收费,每天限制两个文档···这些

因此,我这里设计了一款应用在Tampermonkey上的Javascript插件,用于解决网页端需要微信登录的问题(至于你们还能开发出什么功能 那就和我没什么关系了)(≖ᴗ≖)✧

北京题库版本更新

2023年5月12日,北京题库发布了“北京题库3.0”,在近日来手机端和网页端共同更新。

比起2.0,新版本对微信登陆的限制更加严格,甚至不能打开预览。

对于原来的2.0版本,我曾编写过一段插件,

// ==UserScript==
// @name         北京题库使用优化
// @namespace    none
// @version      1.3
// @description  下载来自“北京题库”的试题
// @author       Mornwind
// @match        *://www.jingshibang.com/*
// @icon         http://www.jingshibang.com//favicon.ico
// @grant        GM_xmlhttpRequest
// ==/UserScript==
 
(function() {
    'use strict';
    function downloadTxt(fileName, content) {
        let a = document.createElement('a');
        a.href = 'data:text/plain;charset=utf-8,' + content
        a.download = fileName
        document.body.appendChild(a);
        a.click();
        document.body.removeChild(a);
    }
    function directDownload(url, filename) {
        const link = document.createElement("a");
        link.href = url;
        link.setAttribute("download", filename);
        document.body.appendChild(link);
        link.click();
        link.remove();
    }
    function downloadPdf(url,name) {
        let list = {
            url,
            name: name,
            type: 'pdf'
        }
        downloadFile(list)
    }
 
 
    function downloadFile(data) {
        fetchDownloadFile(data)
    }
 
    function fetchDownloadFile(data) {
        fetch(data.url, {
            method: "get",
            mode: "cors",
        })
            .then((response) => response.blob())
            .then((res) => {
            const downloadUrl = window.URL.createObjectURL(
                //new Blob() 对后端返回文件流类型处理
                new Blob([res], {
                    type: data.type == "pdf" ? "application/pdf" : data.type == "word" ?
                    "application/msword" : data.type == "xlsx" ? "application/vnd.ms-excel" : ""
                })
            );
            //word文档为msword,pdf文档为pdf
            const link = document.createElement("a");
            link.href = downloadUrl;
            link.setAttribute("download", data.name);
            document.body.appendChild(link);
            link.click();
            link.remove();
        }).catch((error) => {
            window.open(data.url);
        });
    };
    //获取Base64
    function pathToBase64(url) {
        return new Promise((resolve, reject) => {
            let image = new Image();
            image.onload = function() {
                let canvas = document.createElement('canvas');
                canvas.width = this.naturalWidth;
                canvas.height = this.naturalHeight;
                canvas.getContext('2d').drawImage(image, 0, 0);
                let result = canvas.toDataURL('image/png')
                resolve(result);
            };
            image.setAttribute("crossOrigin", 'Anonymous');
            image.src = url
            image.onerror = () => {
                reject(new Error('urlToBase64 error'));
            };
        })
    }
    function getPDF(url){
        var id=url.split("id=").slice(-1)[0]
        try{
            id=id.split("&").slice(0)[0]
        }
        catch (e) { }
        console.log(id)
        GM_xmlhttpRequest({
            method:"get",
            url:"http://www.jingshibang.com/api/product/detailpc/"+id,
            //headers:header,
            async onload({ response }) {
                if(JSON.parse(response).data.storeInfo.store_type=="专辑"){
                    var text="第三方文档:\n"+JSON.parse(response).data.storeInfo.store_name+"\n百度网盘链接:"+JSON.parse(response).data.storeInfo.baidu_url+"\n提取码:"+JSON.parse(response).data.storeInfo.baidu_pw
                    downloadTxt(JSON.parse(response).data.storeInfo.store_name,text)
                }
                else{
                    var pdf_name=JSON.parse(response).data.storeInfo.store_name
                    if(JSON.parse(response).data.storeInfo.word_answer!=""){
                        if(confirm("是否下载WORD?")){
                            window.location.href="http://www.jingshibang.com"+JSON.parse(response).data.storeInfo.word_answer
                        }
                    }
                    var pdf_url="https://jsb2022-1253627302.cos.ap-beijing.myqcloud.com"+JSON.parse(response).data.storeInfo.pdf_answer
                    downloadPdf(pdf_url,pdf_name)
                }
            }
        })
    }
    function downloadPageT(){
        for(var i=1; i<10**10;i++){
            try{
                getPDF(document.querySelector("#__layout > div > div.index.wrapper_1200_no > div.acea-row > div.rightdiv > div.list.tablelist > a:nth-child("+i+")").href)
            }
            catch (e) {break }
        }
    }
    function downloadPageE(){
        for(var i=1; i<10**10;i++){
            try{
                getPDF(document.querySelector("#__layout > div > div.index.wrapper_1200_no > div > div:nth-child(2) > div.list.tablelist > a:nth-child("+i+")").href)
            }
            catch (e) {break }
        }
    }
    document.onclick = function (e) {
        if (e.ctrlKey && e.shiftKey){
            if(window.location.href.indexOf("id")!=-1){
                getPDF(window.location.href);
            }
            if(window.location.href=="http://www.jingshibang.com/home/"){
                downloadPageT()
            }
            if(window.location.href=="http://www.jingshibang.com/home/paper"){
                downloadPageE()
            }
        }
    }
})();

但是,对于新版本,这一版本完全没法使用。

程序设计

检查原有功能

在现在的页面中,一旦我想打开一篇文档进行预览,就会出现如下情况

 

要求扫码登陆,于是,我在登陆之后尝试打开

在登陆后,是可以打开一篇文章的

 

而且,通过id判别文档的方式还没有改变。先将页面优化的部分代码去掉,排除影响

在此情况下,原来的代码是仍然可以使用的

 

但这需要保持微信登陆,不然不能打开文档,这不符合设计初衷。

现在,就要想想怎么跳过打开文档这个过程了。

代码实现

经过实验,可以用这样一个思路在做到打开文档这个动作

点击文档名——>搜索文档名——>获取id————>下载文档

(在键盘点击事件中)代码如下


name=e.target.innerText
console.log(name)
var url="http://www.jingshibang.com/api/products?page=1&limit=99&keyword="+name
GM_xmlhttpRequest({
    method:"get",
    url:url,
    //headers:header,
    async onload({ response }) {
        const data=JSON.parse(response).data
        var pro
        for(var i=0;i<=data.length;i++){
            pro=data.slice(i)[0]
            console.log(pro)
            if(pro.store_name==name){
                window.open("http://www.jingshibang.com"+pro.pdf_answer)
                download(pro.id)
            }
        }
    }
})

最后是这样的效果: 

这样 代码效果就基本实现了。

完整代码:

// ==UserScript==
// @name         北京题库使用优化
// @namespace    none
// @version      2.0
// @description  下载来自“北京题库”的试题
// @author       Mornwind
// @match        *://www.jingshibang.com/*
// @icon         http://www.jingshibang.com//favicon.ico
// @grant        GM_xmlhttpRequest
// ==/UserScript==

(function() {
    var name,text,tp,pdf,word,tt;
    'use strict';
    function downloadTxt(fileName, content) {
        let a = document.createElement('a');
        a.href = 'data:text/plain;charset=utf-8,' + content
        a.download = fileName
        document.body.appendChild(a);
        a.click();
        document.body.removeChild(a);
    }
    function directDownload(url, filename) {
        const link = document.createElement("a");
        link.href = url;
        link.setAttribute("download", filename);
        document.body.appendChild(link);
        link.click();
        link.remove();
    }
    function downloadPdf(url,name) {
        let list = {
            url,
            name: name,
            type: 'pdf'
        }
        downloadFile(list)
    }


    function downloadFile(data) {
        fetchDownloadFile(data)
    }

    function fetchDownloadFile(data) {
        fetch(data.url, {
            method: "get",
            mode: "cors",
        })
            .then((response) => response.blob())
            .then((res) => {
            const downloadUrl = window.URL.createObjectURL(
                //new Blob() 对后端返回文件流类型处理
                new Blob([res], {
                    type: data.type == "pdf" ? "application/pdf" : data.type == "word" ?
                    "application/msword" : data.type == "xlsx" ? "application/vnd.ms-excel" : ""
                })
            );
            //word文档为msword,pdf文档为pdf
            const link = document.createElement("a");
            link.href = downloadUrl;
            link.setAttribute("download", data.name);
            document.body.appendChild(link);
            link.click();
            link.remove();
        }).catch((error) => {
            window.open(data.url);
        });
    };
    //获取Base64
    function pathToBase64(url) {
        return new Promise((resolve, reject) => {
            let image = new Image();
            image.onload = function() {
                let canvas = document.createElement('canvas');
                canvas.width = this.naturalWidth;
                canvas.height = this.naturalHeight;
                canvas.getContext('2d').drawImage(image, 0, 0);
                let result = canvas.toDataURL('image/png')
                resolve(result);
            };
            image.setAttribute("crossOrigin", 'Anonymous');
            image.src = url
            image.onerror = () => {
                reject(new Error('urlToBase64 error'));
            };
        })
    }
    function get(id){
        console.log(id)
        GM_xmlhttpRequest({
            method:"get",
            url:"http://www.jingshibang.com/api/product/detailpc/"+id,
            //headers:header,
            async onload({ response }) {
                name=JSON.parse(response).data.storeInfo.store_name
                if(JSON.parse(response).data.storeInfo.store_type=="专辑"){
                    tp="txt"
                    text="第三方文档:\n"+JSON.parse(response).data.storeInfo.store_name+"\n百度网盘链接:"+JSON.parse(response).data.storeInfo.baidu_url+"\n提取码:"+JSON.parse(response).data.storeInfo.baidu_pw
                    name=JSON.parse(response).data.storeInfo.store_name
                }
                else{
                    tp="normal"
                    word="http://www.jingshibang.com"+JSON.parse(response).data.storeInfo.word_answer
                    pdf="https://jsb2022-1253627302.cos.ap-beijing.myqcloud.com"+JSON.parse(response).data.storeInfo.pdf_answer
                }
                if(name.indexOf(":")!=-1){
                    tt=name.split(":").slice(-1)[0]
                }
                else{
                    tt=name
                }
            }
        })
    }
    function getPDF(url){
        var flag=confirm("是否下载word?")
        if(flag){
            window.location.href=word
        }
        downloadPdf(pdf,name)
    }
    function downloadPageT(){
        for(var i=1; i<10**10;i++){
            try{
                getPDF(document.querySelector("#__layout > div > div.index.wrapper_1200_no > div.acea-row > div.rightdiv > div.list.tablelist > a:nth-child("+i+")").href)
            }
            catch (e) {break }
        }
    }
    function downloadPageE(){
        for(var i=1; i<10**10;i++){
            try{
                getPDF(document.querySelector("#__layout > div > div.index.wrapper_1200_no > div > div:nth-child(2) > div.list.tablelist > a:nth-child("+i+")").href)
            }
            catch (e) {break }
        }
    }
    function titleChange(content) {
        if (document.querySelector("title") && document.querySelector("title").innerHTML != content) {
            document.querySelector("title").innerHTML = content
        }
    }
    function open(e){
        console.log(e)
        try{
            name=e.target.innerText
            console.log(name)
            var url="http://www.jingshibang.com/api/products?page=1&limit=99&keyword="+name
            GM_xmlhttpRequest({
                method:"get",
                url:url,
                //headers:header,
                async onload({ response }) {
                    const data=JSON.parse(response).data
                    var pro
                    for(var i=0;i<=data.length;i++){
                        pro=data.slice(i)[0]
                        console.log(pro)
                        if(pro.store_name==name){
                            window.open("http://www.jingshibang.com"+pro.pdf_answer)
                            download(pro.id)
                        }
                    }
                }
            })
        }
        catch(ep){
            console.log(ep)
        }
    }
    function download(id){
        console.log(id)
        GM_xmlhttpRequest({
            method:"get",
            url:"http://www.jingshibang.com/api/product/detailpc/"+id,
            //headers:header,
            async onload({ response }) {
                console.log(response)
                name=JSON.parse(response).data.storeInfo.store_name
                if(JSON.parse(response).data.storeInfo.store_type=="专辑"){
                    tp="txt"
                    text="第三方文档:\n"+JSON.parse(response).data.storeInfo.store_name+"\n百度网盘链接:"+JSON.parse(response).data.storeInfo.baidu_url+"\n提取码:"+JSON.parse(response).data.storeInfo.baidu_pw
                    name=JSON.parse(response).data.storeInfo.store_name
                }
                else{
                    tp="normal"
                    word="http://www.jingshibang.com"+JSON.parse(response).data.storeInfo.word_answer
                    pdf="https://jsb2022-1253627302.cos.ap-beijing.myqcloud.com"+JSON.parse(response).data.storeInfo.pdf_answer
                }
                if(name.indexOf(":")!=-1){
                    tt=name.split(":").slice(-1)[0]
                }
                else{
                    tt=name
                }

                console.log(tp)
                if(tp=="normal"){
                    window.location.href=word
                    downloadPdf(pdf,name)
                }
                else{
                    downloadTxt(name,text)
                }
            }
        })
    }

    try{
        var url=window.location.href
        var id=url.split("id=").slice(-1)[0]
        try{
            id=id.split("&").slice(0)[0]
        }
        catch (e) { }
        get(id)
    }
    catch(e){}
    document.onclick = function (e) {
        if (e.ctrlKey && e.shiftKey){
            if(window.location.href.indexOf("id")!=-1){
                getPDF(window.location.href);
            }
            else{
                open(e)
            }
            /*if(window.location.href=="http://www.jingshibang.com/home/"){
                downloadPageT()
            }
            if(window.location.href=="http://www.jingshibang.com/home/paper"){
                downloadPageE()
            }*/
        }
    }
})();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mornwind.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值