背景介绍
什么是北京题库
北京题库
是专注于中小学教学产品研发的教研平台,拥有试卷、资料等优质资源,致力于为教师备课、教研提供一站式服务。——《百度百科》
简单来说,收录的很多资料,相对好用一点
但是,其使用是有一定限制的,比如网页端必须要微信扫码登录才能使用,实在不是很方便。
而且部分文档收费,每天限制两个文档···这些
因此,我这里设计了一款应用在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()
}*/
}
}
})();