【JS脚本】免登录 免下载软件 只需浏览器 中小学电子教材下载
本帖最后由 nctot 于 2024-3-5 13:14 编辑首次发帖,如果违规,麻烦告知下{:1_893:}今天意外看到中小学电子教材的下载软件, 大部分是 网盘,python,各种下载器.粗略不全面归纳了几个劣势
网盘:存在旧版本的问题
python:需要安装环境
下载器:担心报毒(其实是无毒)
以上3种的优势是 能批量.
所以,我自己写了一段JS脚本(实际上是配合chatGPT)
优势:
1.能下载最新版本
2.无需下载软件(只需要浏览器)
3.无需安装环境
4.能在线预览
劣势:
1.只能单个下载
【食用方法】
1.把脚本收藏为书签
2.打开对应的 电子教材列表
3.打开上述书签
4.列表旁边会显示【预览&下載】
5.点击【预览&下載】即可
PS:如果当前页面不是"电子教材列表",会提示是否跳转到对应页面.
------------------------------------2024.3.1更新----------------------------------------------------------
更新内容:
1.修复部分书本无法显示 预览和下载
2.增加【隐藏版】入口
书签版:
javascript:void function(e){var t=function(e){function t(e,t){fetch(e).then(function(e){return e.blob()}).then(function(e){const a=URL.createObjectURL(e),n=document.createElement("a");n.style.display="none",document.body.appendChild(n),n.href=a,n.download=t||"document.pdf",n.click(),URL.revokeObjectURL(a),document.body.removeChild(n)})["catch"](function(e){console.error("下载失败:",e)})}window.location.href.indexOf("https://basic.smartedu.cn/tchMaterial")>=0%3F(e(".addjs").remove(),e("").each(function(t){edition=e(":contains('版本')").parent().find("input:checked").parent().parent().text().trim();var a="";item=e(this),img=item.find("img"),src=img.attr("src"),src=src.split(".",5),src=src.join("."),a=src+".pkg/pdf.pdf",span=e(":eq("+t+") span");var n="【默认版:"+edition+"】"+span.text(),s="",c="【隐藏版:"+edition+"】"+span.text();s=a.indexOf("assets_document")>=0%3Fa.replace("assets_document","assets"):a.replace("assets","assets_document"),span.parent().parent().append("<div class='addjs'><br>默认版:<a target='_blank' href='"+a+"'>【预览】</a><a name='"+n+"'target='_blank' href='"+a+"'>【下载】</a><br>隐藏版:<a target='_blank' href='"+s+"'>【预览】</a><a name='"+c+"'target='_blank' href='"+s+"'>【下载】</a></div>")}),e(".addjs a").click(function(a){"【下载】"==e(this).text()%26%26(a.preventDefault(),t(e(this).attr("href"),e(this).attr("name"))),a.stopPropagation()})):confirm("该页面不是下载页面\n是否跳转到https://basic.smartedu.cn/tchMaterial")%26%26window.open("https://basic.smartedu.cn/tchMaterial")},a=e%26%26e.fn%26%26parseFloat(e.fn.jquery)>=1.7;if(a)t(e);else{var n=document.createElement("script");n.src="//lib.sinaapp.com/js/jquery/1.12.4/jquery-1.12.4.min.js",n.onload=n.onreadystatechange=function(){var e=this.readyState;e%26%26"loaded"!==e%26%26"complete"!==e||t(jQuery.noConflict())}}document.getElementsByTagName("head").appendChild(n)}(window.jQuery);
猴子版:
// ==UserScript==
// @name 【免登录】中小学电子教材下载
// @namespace https://www.52pojie.cn/
// @version 2024-02-29
// @descriptiontry to take over the world!
// @author nctot(参考爱飞的猫修改)
// @match https://basic.smartedu.cn/tchMaterial*
// @icon https://basic.smartedu.cn/favicon.ico
// @grant none
// @require https://lib.sinaapp.com/js/jquery/1.12.4/jquery-1.12.4.min.js
// ==/UserScript==
function download(){
$(".addjs").remove();
$("").each(function(index){
var edition=$(":contains('版本')").parent().find("input:checked").parent().parent().text().trim();
var url="";
var item=$(this);
var img=item.find("img");
var src=img.attr("src");
src=src.split(".",5);
src=src.join(".");
url=src+".pkg/pdf.pdf";
var span=$(":eq("+index+") span");
var title="【默认版:"+edition+"】"+span.text();
var url2="";
var title2="【隐藏版:"+edition+"】"+span.text();;
if(url.indexOf("assets_document")>=0){
url2=url.replace("assets_document","assets");
}else{
url2=url.replace("assets","assets_document");
}
span.parent().parent().append("<div class='addjs'><br>默认版:<a target='_blank' href='"+url+"'>【预览】</a><a name='"+title+"'target='_blank' href='"+url+"'>【下载】</a><br>隐藏版:<a target='_blank' href='"+url2+"'>【预览】</a><a name='"+title2+"'target='_blank' href='"+url2+"'>【下载】</a></div>");
});
$(".addjs a").click(function(e){
if($(this).text()=="【下载】"){
e.preventDefault();
downloadFile($(this).attr("href"),$(this).attr("name"));
}
e.stopPropagation();
});
}
function downloadFile(fileUrl, customFileName) {
fetch(fileUrl)
.then(function(response) {
return response.blob();
})
.then(function(blob) {
const blobUrl = URL.createObjectURL(blob);
const a = document.createElement('a');
a.style.display = 'none';
document.body.appendChild(a);
a.href = blobUrl;
a.download = customFileName || 'document.pdf';
a.click();
URL.revokeObjectURL(blobUrl);
document.body.removeChild(a);
})
.catch(function(error) {
console.error('下载失败:', error);
});
}
// 定期扫描页面更改
setInterval(download, 500);
download();
----------------------------------------------------------------------------------------------
javascript:if(window.location.href.indexOf("https://basic.smartedu.cn/tchMaterial")>=0){document.querySelectorAll('.index-module_item_GfOnF').forEach((item)=>{const imageUrl=item.querySelector('.index-module_cover_DGT6P img').src;const idMatch=imageUrl.match(/assets\/([^.]+)\./);const extractedId=idMatch&&idMatch;if(extractedId){const replacedUrl=`https://r2-ndr.ykt.cbern.com.cn/edu_product/esp/assets_document/${extractedId}.pkg/pdf.pdf`;const newLink=document.createElement('a');newLink.href=replacedUrl;newLink.target='_blank';newLink.download=`download_${extractedId}.pdf`;newLink.innerText='【预览&下载】';item.insertAdjacentElement('beforebegin',newLink);}});}else{if(confirm("该页面不是下载页面\n是否跳转到https://basic.smartedu.cn/tchMaterial")){window.open("https://basic.smartedu.cn/tchMaterial");}}
对了,地址是从中小学教材下载这边扒拉来的, 没有去官网扒拉下载地址 本帖最后由 爱飞的猫 于 2024-2-29 09:42 编辑
尝试改造成 UserScript 脚本,这样就能在浏览器加载对应页面时,自动执行该脚本。
作出了如下更改:
1. 使用 `` 来匹配,希望在网站升级后还能自动匹配到。
2. 定期检查并插入下载地址,这样在网站进行筛选操作后也会自动添加需要的链接。
3. 稍微改了改插入地点,现在会显示在书名下方。
4. **1.1 新增** - 将预览和下载分开,可以带文件名下载了(虽然跨域,但服务器允许 `fetch` 来跨域读取资源)。
5. **1.2 新增** - 地址现在从图片资源地址来拼接了。
```js
// ==UserScript==
// @name 国家中小学智慧教育平台 - 免登录下载
// @namespace www.52pojie.cn
// @match https://basic.smartedu.cn/tchMaterial*
// @grant none
// @version 1.2
// @author nctot@52pojie.cn / 爱飞的猫改造
// @description 在不登录的情况下显示 PDF 预览和下载地址。
// ==/UserScript==
function downloadBook(linkDownload) {
if (linkDownload.classList.contains('download-in-progress')) {
return;
}
linkDownload.classList.add('download-in-progress');
linkDownload.textContent = '下载中…';
fetch(linkDownload.href).then(r => {
if (r.status !== 200) {
throw new Error(`资源状态码不是 200 (实际值 ${r.status})`);
}
return r.blob();
}).then((pdfBlob) => {
const blobUrl = URL.createObjectURL(pdfBlob);
linkDownload.onclick = null;
linkDownload.href = blobUrl;
linkDownload.textContent = '【下载】';
// 触发下载,然后将地址删除 - 因为页面是由框架管理的,避免内存泄漏。
linkDownload.click();
setTimeout(() => {
linkDownload.href = '';
URL.revokeObjectURL(blobUrl);
});
}).catch((err) => {
linkDownload.textContent = `下载失败: ${err}`;
}).finally(() => {
linkDownload.classList.remove('download-in-progress');
});
}
function injectDownloadUrl() {
document.querySelectorAll('li:not(.added)').forEach((item) => {
const rAssets = /\/assets\/([^.]+)\.t\/.+$/;
const imageUrl = item.querySelector(' img').src;
if (rAssets.test(imageUrl)) {
const moduleLine = item.querySelector('div');
const bookName = moduleLine.textContent.trim();
const bookUrl = imageUrl.replace(rAssets, '/assets_document/$1.pkg/pdf.pdf');
const dlContainer = document.createElement('div');
dlContainer.className = 'dl-preview';
dlContainer.style.cssText = `
cursor: alias;
font-size: smaller;
`;
const linkPreview = document.createElement('a');
linkPreview.href = bookUrl;
linkPreview.target = '_blank';
linkPreview.download = `${bookName}.pdf`;
linkPreview.textContent = '【预览】';
const linkDownload = document.createElement('a');
linkDownload.className = 'dl-book';
linkDownload.target = '_blank';
linkDownload.href = bookUrl;
linkDownload.download = `${bookName}.pdf`;
linkDownload.textContent = '【下载】';
dlContainer.appendChild(linkPreview);
dlContainer.appendChild(linkDownload);
moduleLine.insertAdjacentElement('afterend', dlContainer);
item.classList.add('added');
}
});
}
// 不让应用程序接管我们的点击事件
document.addEventListener('click', (e) => {
if (e.target.closest('.dl-preview')) {
e.stopPropagation();
}
if (e.target.closest('a.dl-book:not()')) {
e.preventDefault();
downloadBook(e.target.closest('a.dl-book'));
}
}, { capture: true });
// 定期扫描页面更改
setInterval(injectDownloadUrl, 1500);
injectDownloadUrl();
```
书签版本(v1.2):
```js
javascript:void(((v='1.2')=>{function downloadBook(e){e.classList.contains("download-in-progress")||(e.classList.add("download-in-progress"),e.textContent="下载中…",fetch(e.href).then((e=>{if(200!==e.status)throw new Error(`资源状态码不是 200 (实际值 ${e.status})`);return e.blob()})).then((t=>{const o=URL.createObjectURL(t);e.onclick=null,e.href=o,e.textContent="【下载】",e.click(),setTimeout((()=>{e.href="",URL.revokeObjectURL(o)}))})).catch((t=>{e.textContent=`下载失败: ${t}`})).finally((()=>{e.classList.remove("download-in-progress")})))}function injectDownloadUrl(){document.querySelectorAll('li:not(.added)').forEach((e=>{const t=/\/assets\/([^.]+)\.t\/.+$/,o=e.querySelector(' img').src;if(t.test(o)){const n=e.querySelector('div'),l=n.textContent.trim(),s=o.replace(t,"/assets_document/$1.pkg/pdf.pdf"),a=document.createElement("div");a.className="dl-preview",a.style.cssText="\n cursor: alias;\n font-size: smaller;\n ";const d=document.createElement("a");d.href=s,d.target="_blank",d.download=`${l}.pdf`,d.textContent="【预览】";const c=document.createElement("a");c.className="dl-book",c.target="_blank",c.href=s,c.download=`${l}.pdf`,c.textContent="【下载】",a.appendChild(d),a.appendChild(c),n.insertAdjacentElement("afterend",a),e.classList.add("added")}}))}document.addEventListener("click",(e=>{e.target.closest(".dl-preview")&&e.stopPropagation(),e.target.closest('a.dl-book:not()')&&(e.preventDefault(),downloadBook(e.target.closest("a.dl-book")))}),{capture:!0}),setInterval(injectDownloadUrl,1500),injectDownloadUrl()})())
```
效果如下:
还是没搞清楚怎么用? 脚本怎么收藏为书签 提拉米苏子冉 发表于 2024-2-28 19:32
脚本怎么收藏为书签
任意收藏一个网址到收藏夹中,然后点击编辑,把代码粘贴到里面去(有部分浏览器不支持这种方式运行代码) 非常不错,我也是在学JS的。 部分列表课本不显示插件按钮,但确实使用方便,可以直接预览和下载 小红书搜索,免登录,脚本在哪 不懂就问,这个属于python的脚本类型嘛? 本帖最后由 悲伤的异灵魂 于 2024-2-29 08:53 编辑
爱飞的猫 发表于 2024-2-29 08:18
尝试改造成 UserScript 脚本,这样就能在浏览器加载对应页面时,自动执行该脚本。
作出了如下更改: ...
大佬,脚本怎么用?