introducción de fondo
¿Qué es el banco de preguntas de Beijing?
Banco de preguntas de Beijing
Es una plataforma de enseñanza e investigación que se centra en la investigación y el desarrollo de productos didácticos para escuelas primarias y secundarias. Cuenta con recursos de alta calidad, como documentos y materiales de prueba, y se compromete a proporcionar servicios integrales para la preparación de lecciones de los docentes y investigacion docente. --"Enciclopedia Baidu"
En pocas palabras, mucha de la información recopilada es relativamente fácil de usar.
Sin embargo, su uso tiene ciertas restricciones, por ejemplo, la página web debe escanear el código QR para iniciar sesión para usarlo, lo que no es muy conveniente.
Y algunos documentos se cobran, y hay un límite de dos documentos por día... estos
Por lo tanto, he diseñado un complemento de Javascript para Tampermonkey para resolver el problema del inicio de sesión de WeChat en la página web (en cuanto a las funciones que puede desarrollar, no tiene nada que ver conmigo) (≖ᴗ≖)✧
Actualización de la versión del banco de preguntas de Beijing
El 12 de mayo de 2023, Beijing Question Bank lanzó "Beijing Question Bank 3.0", que se actualizó conjuntamente en teléfonos móviles y páginas web en los últimos días.
En comparación con la 2.0, la nueva versión tiene restricciones más estrictas en el inicio de sesión de WeChat e incluso no se puede abrir la vista previa.
Para la versión 2.0 original, escribí un complemento,
// ==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()
}
}
}
})();
Sin embargo, con las versiones más nuevas, esta versión es completamente inutilizable.
programación
Comprobar la funcionalidad heredada
En la página actual, una vez que quiero abrir un documento para obtener una vista previa, aparecerá la siguiente situación
Es necesario escanear el código para iniciar sesión, así que trato de abrirlo después de iniciar sesión
Después de iniciar sesión, puede abrir un artículo
Además, la forma en que los documentos se identifican por id no ha cambiado. Primero elimine parte del código de optimización de la página para eliminar el impacto
En este caso, el código original todavía se puede utilizar.
Pero esto debe mantener el inicio de sesión de WeChat, de lo contrario, el documento no se puede abrir, lo que no está en línea con la intención del diseño original.
Ahora, piense en cómo omitir el proceso de abrir el documento.
Código
Después de experimentar, puede usar esa idea para realizar la acción de abrir el documento.
Haga clic en el nombre del documento --> busque el nombre del documento --> obtenga la identificación --> descargue el documento
(en el evento de clic del teclado) el código es el siguiente
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)
}
}
}
})
El resultado final es este:
De esta manera, el efecto del código se realiza básicamente.
Código completo:
// ==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()
}*/
}
}
})();