nctot 发表于 2024-2-28 17:51

【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 08:18

本帖最后由 爱飞的猫 于 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:26

还是没搞清楚怎么用?

提拉米苏子冉 发表于 2024-2-28 19:32

脚本怎么收藏为书签

Pwaerm 发表于 2024-2-28 19:44

提拉米苏子冉 发表于 2024-2-28 19:32
脚本怎么收藏为书签



任意收藏一个网址到收藏夹中,然后点击编辑,把代码粘贴到里面去(有部分浏览器不支持这种方式运行代码)

y294945022 发表于 2024-2-28 20:44

非常不错,我也是在学JS的。

南城 发表于 2024-2-28 20:54

部分列表课本不显示插件按钮,但确实使用方便,可以直接预览和下载

sai609 发表于 2024-2-28 20:54

小红书搜索,免登录,脚本在哪

wyesheng 发表于 2024-2-29 08:37

不懂就问,这个属于python的脚本类型嘛?

悲伤的异灵魂 发表于 2024-2-29 08:38

本帖最后由 悲伤的异灵魂 于 2024-2-29 08:53 编辑

爱飞的猫 发表于 2024-2-29 08:18
尝试改造成 UserScript 脚本,这样就能在浏览器加载对应页面时,自动执行该脚本。

作出了如下更改: ...
大佬,脚本怎么用?
页: [1] 2 3 4 5
查看完整版本: 【JS脚本】免登录 免下载软件 只需浏览器 中小学电子教材下载