Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save aliyaliu368/891eef75e09494e965d291ead4a80d17 to your computer and use it in GitHub Desktop.
Save aliyaliu368/891eef75e09494e965d291ead4a80d17 to your computer and use it in GitHub Desktop.
教學用電子書免登入破解教學 | 本腳本用於繞過台灣主要課本/習作出版社電子書的前端身份驗證,達成不需要教師帳號即可使用電子書。支援 翰林、南一、康軒 三大出版社 | 請勿將本腳本作為抄答案、侵權等惡意用途,使用本腳本者,請自行承擔所有後果與風險

Visits_Count

教學用電子書免登入破解教學

使用前請務必閱讀 免責聲明

免責聲明

請勿將本腳本作為抄答案、侵權等惡意用途,使用本腳本者,請自行承擔所有後果與風險。

簡介

此腳本用於繞過台灣主要課本/習作出版社電子書的前端身份驗證,達成不需要教師帳號即可使用電子書。

開發緣由

原本是因為開發者忘記帶課本,但又想要查閱課本的資料,心血來潮研究看看電子書的驗證設計。
開發這個不是希望拿去抄答案,是希望讓真正需要用的人可以用到,也希望各家出版社能提供一種學生與家長的版本,就是只能瀏覽但不能顯示解答或者專為學習者設計,就可以完美解決這些問題。

如何使用

這邊示範翰林版如何使用,其他出版社以此類推 首先先前往要使用的電子書網站 (下方有連結),接著在瀏覽器的開發者頁面 (F12) 中的主控台 (Console) 輸入以下腳本,最後重新載入網頁即可迴避登入。

這邊是以 Google Chrome 的環境作為示範,Firefox/Edge/Safari 大同小異。

image

腳本

✅ 康軒

連結:康軒網頁媒體盒

localStorage.setItem("loginAccount", "mockAccount"); // 設定一個假的帳號
localStorage.setItem("uuid", "mockUUID"); // 設定假的 UUID

最後測試時間:2022/10/18

✅ 南一

連結:OneBook 南一電子書

let mockToken = JSON.stringify({
    "code": "SUCCESS",
    "jwt": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOi8vbXlhY2NvdW50Lm5hbmkuY29vbC8iLCJzdWIiOiJ1c2Vycy9qYWNreWNoaXUwMSIsImZyb20iOiJOYW5pIiwidXNlcm5hbWUiOiJqYWNreWNoaXUwMSIsImVtYWlsdmFsaWQiOnRydWUsIm1vYmlsZXZhbGlkIjpmYWxzZSwiZW1haWwiOiJraW5tYTE1OTg3NTMyQGdtYWlsLmNvbSIsInVpZCI6ImI1ZjE3MGYwLTI5ZmMtMTFlZC04NDJjLTQ5OTAxMGVhODI0MCIsImp0aSI6IjliOGI5OTE1LWYyMGQtNGNlMS04ZmJjLTA0OWFhYjkzZTY4ZiIsImlhdCI6MTY2NzIzMTA2NiwiZXhwIjoxNjcyNDE1MDY2fQ.R9cjUUSocKL9CiPTa2Tf8zPNiZLSJLRqH9eQAniMsJw"});

let fieldName = "nani_oneclass_login_token";
var d = new Date();
d.setTime(d.getTime() + (1 * 24 * 60 * 60 * 1000));
var expires = "expires=" + d.toUTCString();
var hostname = window.location.hostname;
if (hostname.indexOf("oneclass.com.tw") > 0) {
  document.cookie = fieldName + "=" + mockToken + ";" + expires + ";path=/;domain=oneclass.com.tw";
} else {
  document.cookie = fieldName + "=" + mockToken + ";" + expires + ";path=/";
}
    
localStorage.setItem("nani_tokenInfo", mockToken); // 設定身分驗證用的 toekn

最後測試時間:2022/11/13
token 由 @jackychiu0207 提供

❌ 翰林

連結:翰林行動大師電子書

let time = new Date().getTime().toString();
localStorage.setItem("last_signinX_v2023", time); // 將帳號登入日期設定為現在,避免被判定為過期
localStorage.setItem("roleX_v2023", "老師"); // 設定身份為老師
localStorage.setItem("emailX_v2023", "[email protected]"); // 由於翰林電子書會驗證是否有設定 email,如果有設定才能使用
localStorage.setItem("tokenX_v2023", "eyJhbGciOiJSUzI1NiIsImtpZCI6Ijg1NzgwNWYxZGQ3ZmE5YTZiNTI3ZjQ0ZWNmZmJkNDhjIiwidHlwIjoiSldUIn0.eyJuYmYiOjE2NjYyNTk4NzEsImV4cCI6MTY2ODkzODI3MSwiaXNzIjoiaHR0cHM6Ly9pZC5obGUuY29tLnR3IiwiYXVkIjpbImh0dHBzOi8vaWQuaGxlLmNvbS50dy9yZXNvdXJjZXMiLCJhcGkxIiwiSWRlbnRpdHlTZXJ2ZXJBcGkiLCJoYW5saW4tYXBpIl0sImNsaWVudF9pZCI6ImpzIiwic3ViIjoiZGJiYmEwNmEtNWNkNy00NTI5LWI2MjEtOTBlYjdhMGIxOWZlIiwiYXV0aF90aW1lIjoxNjY2MjU5ODcwLCJpZHAiOiJsb2NhbCIsIkFzcE5ldC5JZGVudGl0eS5TZWN1cml0eVN0YW1wIjoiNURHN1ZSWVVWRUdUSjJVQ1czU0FDRkpBT1NHM0RONEIiLCJyb2xlIjpbIuiAgeW4qyIsIuiAgeW4qyJdLCJlbWFpbCI6WyJraW5tYTE1OTg3NTMyQGdtYWlsLmNvbSIsImtpbm1hMTU5ODc1MzJAZ21haWwuY29tIl0sImZhbWlseV9uYW1lIjoi576FIiwiZ2l2ZW5fbmFtZSI6IuWFg-iyniIsIm5hbWUiOiLnvoXlhYPosp4iLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwicHJlZmVycmVkX3VzZXJuYW1lIjoi576F5YWD6LKeIiwidXNlcl9kb21haW4iOiJlZHUiLCJzY29wZSI6WyJvcGVuaWQiLCJwcm9maWxlIiwiYXBpMSIsIklkZW50aXR5U2VydmVyQXBpIiwiaGFubGluLWFwaSIsIm9mZmxpbmVfYWNjZXNzIl0sImFtciI6WyJwd2QiXX0.So0Fcvd-a_BlnQcgcmO7vXTxlCJ_AnIEPPwpoHHpqc2cP3fBCGrY496R1q4J9j2E9sYUahxeYu7M3RMhPS_79JiEq8EWcSUvNxJASwAgvmek_HxWS2sgPZbvFkCJ1zYXfqHpbUaRfeqNPZyB3Yno94OYU4nl5f0gRzwUf2kGiyM2XhTO5EQZUCXGDJfqNmBlnwL45MwlQ_l_sRSYFNllda37nTECse91Qe1DeYKCm1Z9s8MerCCnmJgpjNsKOPodvbz8ynUT7qbU2IDldb8z8h0mtI9DbW8tuG63c-Nqyr2ZHPXT5aIaWtYUUBgFrVakVW-nI0kv5cEYj8grUyuZFg") // 設定身分驗證用的 token

最後測試時間:2022/11/12
token 由 @jackychiu0207 提供

限制

  • 因為此腳本僅繞過前端的身份驗證,因此可能會導致無法使用儲存班級紀錄、測驗等功能。
  • 翰林版電子書每天會自動重置資料,因此需重新執行腳本。
  • 南一版電子書因設計較為嚴謹,可能在未來此破解方法將無法使用,需尋找更好的解決方案。

The script was made by SiongSng | 此腳本由 菘菘 製作
版權所有 © 2022 菘菘。 保留所有權利。
Copyright © 2022 SiongSng. All rights reserved.

@vochant
Copy link

vochant commented Sep 5, 2024

vochant
感謝!這個腳本有效(2024/09/05),我使用的方式如下:
在Chrome的線上應用程式商店,安裝Tampermonkey (篡改猴),新增腳本時,將這整個腳本貼上。在篡改猴的控制台啟用KNSHDownloader這個腳本。然後進入康軒的網站 digitalmaster.knsh.com.tw/v3/pages/j/index.html
選擇網頁版,任何一個WEB電子書,點選開啟都可以順利進入了。能看到課本內容就很高興了。
下載電子書的功能看起來是沒作用,不知道是不是這方法對下載電子書無效。
因為是程式小白,只能做一些簡單的測試,發現不管是點哪一個頁面,都無法進入else {裡電子書頁面的程式裡。

首先,因為查看器的佈局太奇怪,我也很偷懶,根本就沒有放下載按鈕⋯⋯需要點開電子書,在開發者工具的控制台使用 downloadAssets() 下載哦

然後,下載很慢,因為是異步函數,返回的是 Promise 對象,實際上返回後還在執行,可能需要幾秒至幾十秒不等。

另外目前只做了國中電子書(非ppt)的下載,處理程式還沒有做⋯⋯畢竟人家也是個學生,還要上晚自修⋯⋯

@vochant
Copy link

vochant commented Sep 5, 2024

image
使用例

有大佬技術好的可以把按鈕做出了,以我的能力只能這樣了

@Tnecniv1010
Copy link

Tnecniv1010 commented Sep 5, 2024

您好,需要康軒帳號密碼,非常感謝
[email protected]

@vochant
Copy link

vochant commented Sep 5, 2024

破解更新啦,這次有自動化注入國小電子書的查看器,比起之前的方法更不容易失效

樓主的思路是僞造數據,我的思路是改代碼繞過驗證,各有各優點,不過驗證的 API 似乎已經沒那麽好騙了,還是盡可能從客戶端下手吧,畢竟伺服器是無法掌控的,但是客戶端可以

喜歡的可以試試看,擔心的或者不需要的忽略就好。我也不過就是一個普通的國中生罷了,因爲喜歡收集電子課本就寫了這個

// ==UserScript==
// @name         KNSHUtility
// @namespace    http://vochant.github.io/
// @version      2.1
// @description  KNSH Utility - Cracks & Features
// @author       Mirekintoc (vochant)
// @match        webetextbook.knsh.com.tw/*
// @match        digitalmaster.knsh.com.tw/v3/pages/*/index.html*
// @match        digitalmaster.knsh.com.tw/ebooks/BookMain/Viewer_A/index.html*
// @icon         https://webetextbook.knsh.com.tw/Ebookvieweran4Teacher/favicon.ico
// @grant        none
// @license      MIT
// @require      https://cdn.bootcdn.net/ajax/libs/jszip/3.10.1/jszip.js
// ==/UserScript==

(function() {
    'use strict';
    // 页面类型判定
    if (window.openebook) {
        console.log("运行模式: 导览页 (理由: 发现 window.openebook)");
        // 导览页面 - 绕过登录验证
        let src = window.openebook.toString(); // 修改前的代码
        let src_arg0 = src.split('(')[1].split(')')[0]; // 唯一的参数
        let src_main = src.split('{').slice(1).join('{').split('}').slice(0, -1).join('}').replace('readKeygrip', '_alwaysTrue'); // 主要片段,已打补丁
        let c = (async function() {}).constructor; // 获取 AsyncFunction 的构造函数
        window._alwaysTrue = function() {true}; // 一个用于绕过验证的替代函数
        window.openebook = c(src_arg0, src_main); // 替换原函数
    }
    else if (window.externalManager) {
        console.log("运行模式: 国小电子书 (理由: 发现 window.externalManager)");
        // 国小电子书页面 - 绕过登录验证
        window.SaveCommForKnshAPIOriginal = window.SaveCommForKnshAPI; // 备份原构造函数
        window.SaveCommForKnshAPI = function() {
            let obj = new SaveCommForKnshAPIOriginal;
            obj.VerifyHasLogin = function(arg) {
                var t = senjClass.GetQueryString("shortcode");
                var n = function(t) {
                    arg && arg.fun && arg.fun(t)
                };
                n({result: true});
                return true;
            }; // 重写
            console.log(obj);
            return obj;
        }; // 重写构造函数
    }
    else if (window.app) {
        console.log("运行模式: 国中电子书 (理由: 发现 window.app)");
        // 国中电子书页面 - 注入下载器
        window.downloadAssets = async function() {
            // 常量定义
            let options = {
                data_prefix: 'https://storage1.knsh.com.tw/WebEbook/',
                data_suffix: '/pageConfig.json',
                image_prefix: '/content/book/'
            }

            // 创建归档实例
            let zip = new JSZip();

            // 获取 ID
            let param = new URLSearchParams(location.search);
            let bookid = param.get('id').split('&')[0];

            // 获取描述
            let manifest_url = options.data_prefix + bookid + options.data_suffix;
            let manifest = await fetch(manifest_url).then(res => {
                return res.json();
            });
            manifest = manifest.content.book;

            // 获取索引
            let pages = [];
            manifest.forEach(function(item, index) {
                pages = pages.concat(item.files.reverse());
            });

            // 获取页
            let Page = async function(url) {
                // 获取数据
                let data = await fetch(url).then(res => {
                    return res.text();
                });
                // 获取路径
                let fromPath = './image';
                let toPath = url.split('/').slice(0, url.split('/').length - 1).join('/') + '/image';
                // 替换 URL
                data = data.replaceAll(fromPath, toPath);
                return data;
            }
            var proc = 0;
            let callback = async (item, index) => {
                // 添加非空页
                if (item != 'empty') {
                    let url = options.data_prefix + bookid + options.image_prefix + item + '.svg';
                    await Page(url).then(content => {
                        zip.file(index + ".svg", content);
                    });
                }
                // 计数并判定结束条件
                proc++;
                if (proc == pages.length) {
                    // 下载归档
                    zip.generateAsync({ type: 'blob' }).then(data => {
                        let Download = document.createElement('a');
                        Download.href = URL.createObjectURL(data);
                        Download.download = 'data.zip';
                        Download.style = 'display: none';
                        document.body.appendChild(Download);
                        Download.click();
                    });
                }
            };
            // 爬取全部页
            for (var i = 0; i < pages.length; i++) {
                callback(pages[i], i);
            }
            // 附: 控制台输入 downloadAssets() 下载
        }
    }
    else {
        console.log('运行模式未知');
    }
})();

@ha5418
Copy link

ha5418 commented Sep 5, 2024

破解更新啦,這次有自動化注入國小電子書的查看器,比起之前的方法更不容易失效

樓主的思路是僞造數據,我的思路是改代碼繞過驗證,各有各優點,不過驗證的 API 似乎已經沒那麽好騙了,還是盡可能從客戶端下手吧,畢竟伺服器是無法掌控的,但是客戶端可以

喜歡的可以試試看,擔心的或者不需要的忽略就好。我也不過就是一個普通的國中生罷了,因爲喜歡收集電子課本就寫了這個

// ==UserScript==
// @name         KNSHUtility
// @namespace    http://vochant.github.io/
// @version      2.1
// @description  KNSH Utility - Cracks & Features
// @author       Mirekintoc (vochant)
// @match        webetextbook.knsh.com.tw/*
// @match        digitalmaster.knsh.com.tw/v3/pages/*/index.html*
// @match        digitalmaster.knsh.com.tw/ebooks/BookMain/Viewer_A/index.html*
// @icon         https://webetextbook.knsh.com.tw/Ebookvieweran4Teacher/favicon.ico
// @grant        none
// @license      MIT
// @require      https://cdn.bootcdn.net/ajax/libs/jszip/3.10.1/jszip.js
// ==/UserScript==

(function() {
    'use strict';
    // 页面类型判定
    if (window.openebook) {
        console.log("运行模式: 导览页 (理由: 发现 window.openebook)");
        // 导览页面 - 绕过登录验证
        let src = window.openebook.toString(); // 修改前的代码
        let src_arg0 = src.split('(')[1].split(')')[0]; // 唯一的参数
        let src_main = src.split('{').slice(1).join('{').split('}').slice(0, -1).join('}').replace('readKeygrip', '_alwaysTrue'); // 主要片段,已打补丁
        let c = (async function() {}).constructor; // 获取 AsyncFunction 的构造函数
        window._alwaysTrue = function() {true}; // 一个用于绕过验证的替代函数
        window.openebook = c(src_arg0, src_main); // 替换原函数
    }
    else if (window.externalManager) {
        console.log("运行模式: 国小电子书 (理由: 发现 window.externalManager)");
        // 国小电子书页面 - 绕过登录验证
        window.SaveCommForKnshAPIOriginal = window.SaveCommForKnshAPI; // 备份原构造函数
        window.SaveCommForKnshAPI = function() {
            let obj = new SaveCommForKnshAPIOriginal;
            obj.VerifyHasLogin = function(arg) {
                var t = senjClass.GetQueryString("shortcode");
                var n = function(t) {
                    arg && arg.fun && arg.fun(t)
                };
                n({result: true});
                return true;
            }; // 重写
            console.log(obj);
            return obj;
        }; // 重写构造函数
    }
    else if (window.app) {
        console.log("运行模式: 国中电子书 (理由: 发现 window.app)");
        // 国中电子书页面 - 注入下载器
        window.downloadAssets = async function() {
            // 常量定义
            let options = {
                data_prefix: 'https://storage1.knsh.com.tw/WebEbook/',
                data_suffix: '/pageConfig.json',
                image_prefix: '/content/book/'
            }

            // 创建归档实例
            let zip = new JSZip();

            // 获取 ID
            let param = new URLSearchParams(location.search);
            let bookid = param.get('id').split('&')[0];

            // 获取描述
            let manifest_url = options.data_prefix + bookid + options.data_suffix;
            let manifest = await fetch(manifest_url).then(res => {
                return res.json();
            });
            manifest = manifest.content.book;

            // 获取索引
            let pages = [];
            manifest.forEach(function(item, index) {
                pages = pages.concat(item.files.reverse());
            });

            // 获取页
            let Page = async function(url) {
                // 获取数据
                let data = await fetch(url).then(res => {
                    return res.text();
                });
                // 获取路径
                let fromPath = './image';
                let toPath = url.split('/').slice(0, url.split('/').length - 1).join('/') + '/image';
                // 替换 URL
                data = data.replaceAll(fromPath, toPath);
                return data;
            }
            var proc = 0;
            let callback = async (item, index) => {
                // 添加非空页
                if (item != 'empty') {
                    let url = options.data_prefix + bookid + options.image_prefix + item + '.svg';
                    await Page(url).then(content => {
                        zip.file(index + ".svg", content);
                    });
                }
                // 计数并判定结束条件
                proc++;
                if (proc == pages.length) {
                    // 下载归档
                    zip.generateAsync({ type: 'blob' }).then(data => {
                        let Download = document.createElement('a');
                        Download.href = URL.createObjectURL(data);
                        Download.download = 'data.zip';
                        Download.style = 'display: none';
                        document.body.appendChild(Download);
                        Download.click();
                    });
                }
            };
            // 爬取全部页
            for (var i = 0; i < pages.length; i++) {
                callback(pages[i], i);
            }
            // 附: 控制台输入 downloadAssets() 下载
        }
    }
    else {
        console.log('运行模式未知');
    }
})();

很是感謝已成功啟用
有機會可以看到題庫試卷和教學資源也可以繞過進行下載?
期待版大有空處理

@nuke936
Copy link

nuke936 commented Sep 6, 2024 via email

Copy link

ghost commented Sep 6, 2024

感謝分享的腳本只能用在電子書
各方需要我在這裡找到分享
https://apk.tw/?fromuid=3675460

@CC77-Lee
Copy link

CC77-Lee commented Sep 6, 2024

破解更新啦,這次有自動化注入國小電子書
ha5418

用了篡改猴還是會出現登入畫面,不知是不又失效了?
感謝您熱心地提供

@vochant
Copy link

vochant commented Sep 6, 2024

破解更新啦,這次有自動化注入國小電子書
ha5418

用了篡改猴還是會出現登入畫面,不知是不又失效了? 感謝您熱心地提供

麻煩提供一下是哪個地方出現了登陸界面,提供一下網址可以嗎?目前設計的範圍是僅限查看電子書,其他地方因為有常量,我也只有手動修改的辦法

@chichi0301
Copy link

請問有人有去年的國小4上或是4下的康軒電子書嗎(5上5下.6上6下)? 可否寄給我或是檔案也可以..
([email protected])

@yy080
Copy link

yy080 commented Sep 6, 2024

求首冊與一年級數學

@chichi0301
Copy link

請問有人有去年的國小4上或是4下的康軒電子書嗎(5上5下.6上6下)? 可否寄給我或是檔案名稱也可以.. ([email protected]) 謝謝

@ha5418
Copy link

ha5418 commented Sep 6, 2024

破解更新啦,這次有自動化注入國小電子書
ha5418

用了篡改猴還是會出現登入畫面,不知是不又失效了? 感謝您熱心地提供

麻煩提供一下是哪個地方出現了登陸界面,提供一下網址可以嗎?目前設計的範圍是僅限查看電子書,其他地方因為有常量,我也只有手動修改的辦法

vochant
首先非常感謝你的提供
我目前已經可以使用你提供的腳本了
先前是不會操作竄改猴

@nuke936
Copy link

nuke936 commented Sep 7, 2024 via email

@vochant
Copy link

vochant commented Sep 7, 2024

您好!我和你先前一樣使用竄改猴 點選後就進入到登入帳號密碼畫面,請問可以教我怎麼使用破解 ha5418 @.> 於 2024年9月7日 週六 上午1:46 寫道:

@.
* commented on this gist. ------------------------------ 破解更新啦,這次有自動化注入國小電子書 ha5418 https://gist.github.com/ha5418 用了篡改猴還是會出現登入畫面,不知是不又失效了? 感謝您熱心地提供 麻煩提供一下是哪個地方出現了登陸界面,提供一下網址可以嗎?目前設計的範圍是僅限查看電子書,其他地方因為有常量,我也只有手動修改的辦法 vochant https://gist.github.com/vochant 首先非常感謝你的提供 我目前已經可以使用你提供的腳本了 先前是不會操作竄改猴 — Reply to this email directly, view it on GitHub https://gist.github.com/aliyaliu368/891eef75e09494e965d291ead4a80d17#gistcomment-5181169 or unsubscribe https://github.com/notifications/unsubscribe-auth/BDH73M7RZ2AA3VIR4TKRIETZVHS6ZBFKMF2HI4TJMJ2XIZLTSKBKK5TBNR2WLJDUOJ2WLJDOMFWWLO3UNBZGKYLEL5YGC4TUNFRWS4DBNZ2F6YLDORUXM2LUPGBKK5TBNR2WLJDHNFZXJJDOMFWWLK3UNBZGKYLEL52HS4DFVRZXKYTKMVRXIX3UPFYGLK2HNFZXIQ3PNVWWK3TUUZ2G64DJMNZZDAVEOR4XAZNEM5UXG5FFOZQWY5LFVEYTCOJUGU3TENJSU52HE2LHM5SXFJTDOJSWC5DF . You are receiving this email because you commented on the thread. Triage notifications on the go with GitHub Mobile for iOS https://apps.apple.com/app/apple-store/id1477376905?ct=notification-email&mt=8&pt=524675 or Android https://play.google.com/store/apps/details?id=com.github.android&referrer=utm_campaign%3Dnotification-email%26utm_medium%3Demail%26utm_source%3Dgithub .

請麻煩提供一下網址

也可以看看F12的控制台中有沒有出現「運行模式: xxx (理由: 發現window.xxx)」字樣或者「運行模式未知」,回復我顯示什麼或者都沒有

@nuke936
Copy link

nuke936 commented Sep 7, 2024

您好_> 於2024年9月7日週六上午1:46 寫道:

_
@**
.**
* 對此要點發表評論。 ------------------------------ 破解更新啦,這次有自動化注入國小電子書 ha5418 https://gist. github .com/ha5418用了竄改猴還是會出現登入畫面,不知是不是又失效了? 感謝您熱心地提供麻煩提供一下是哪個位置出現登陸介面,提供一下網址可以嗎?gist.github.com/vochant首先非常感謝你提供的腳本,我目前已經可以使用你提供的腳本了,以前是不會操作竄改猴的 - 直接回复此電子郵件,在 GitHub https://gist.github上查看它。 ZLTSKBKK5TBNR2WLJDUOJ2WLJDOMFWWLO3UNBZGKYLEL5YGC4TUNFRWS4DBNZ2F6YLDORUXM2LUPGBKK5TBNR2WLJDHNFZXJJDOMFWWLK3UNBZGKYLEL52HS4IXDFVRZVJJJDOMFWWLK3UNBZGKYLEL52HS4IX OR4XAZNEM5UXG5FFOZQWY5LFVEYTCOJUGU3TENJSU52HE2LHM5SXFJTDOJSWC5DF .您收到這封電子郵件是因為您對該主題發表了評論。使用適用於 iOS https://apps.apple.com/app/apple-store/id1477376905?ct=notification-email&mt=8&pt=524675或 Android https://play.google.com/store的GitHub Mobile 隨時隨地分類通知/apps/details?id=com.github.android&referrer=utm_campaign%3Dnotification-email%26utm_medium%3Demail%26utm_source%3Dgithub

請麻煩提供一下網址

也可以看看F12的控制台中有沒有出現「運行模式: xxx (理由:發現window.xxx)」字樣或「運行模式未知」,回覆我顯示什麼或都沒有

感謝熱心回覆,我注入另一個KNSHDownloader腳本已可以使用網頁版
想請教可以用電腦版或是其它下載的方法嗎??
再次感謝您!!

@kellyrayn
Copy link

@nuke936
請問你是用那個腳本??

@amy76121
Copy link

amy76121 commented Sep 8, 2024 via email

@nuke936
Copy link

nuke936 commented Sep 8, 2024

@kellyrayn
Copy link

kellyrayn commented Sep 9, 2024 via email

@kellyrayn
Copy link

@nuke936 請問你是用那個腳本??

https://gist.github.com/aliyaliu368/891eef75e09494e965d291ead4a80d17?permalink_comment_id=5179920#gistcomment-5179920

試試這個

我也是用這個腳本
但要點開電子書時
就會要求要登入
想請問您篡改猴內要需要做什麼設定嗎?

@kellyrayn
Copy link

@nuke936
Copy link

nuke936 commented Sep 9, 2024

@nuke936請問你用的是動漫腳本嗎?

https://gist.github.com/aliyaliu368/891eef75e09494e965d291ead4a80d17?permalink_comment_id=5179920#gistcomment-5179920
試試這個

我也想用這個腳本 但要點開電子書時 就會要求登入 請問您修改猴子內要做什麼設定嗎?

image

我可以使用的是2.1 的這個版本,沒有其它設定

@okokpc
Copy link

okokpc commented Sep 10, 2024

// ==UserScript==
// @name         KNSHUtility
// @namespace    http://vochant.github.io/
// @version      2.1
// @description  KNSH Utility - Cracks & Features
// @author       Mirekintoc (vochant)
// @match        webetextbook.knsh.com.tw/*
// @match        digitalmaster.knsh.com.tw/v3/pages/*/index.html*
// @match        digitalmaster.knsh.com.tw/ebooks/BookMain/Viewer_A/index.html*
// @icon         https://webetextbook.knsh.com.tw/Ebookvieweran4Teacher/favicon.ico
// @grant        none
// @license      MIT
// @require      https://cdn.bootcdn.net/ajax/libs/jszip/3.10.1/jszip.js
// ==/UserScript==

(function() {
    'use strict';
    // 页面类型判定
    if (window.openebook) {
        console.log("运行模式: 导览页 (理由: 发现 window.openebook)");
        // 导览页面 - 绕过登录验证
        let src = window.openebook.toString(); // 修改前的代码
        let src_arg0 = src.split('(')[1].split(')')[0]; // 唯一的参数
        let src_main = src.split('{').slice(1).join('{').split('}').slice(0, -1).join('}').replace('readKeygrip', '_alwaysTrue'); // 主要片段,已打补丁
        let c = (async function() {}).constructor; // 获取 AsyncFunction 的构造函数
        window._alwaysTrue = function() {true}; // 一个用于绕过验证的替代函数
        window.openebook = c(src_arg0, src_main); // 替换原函数
    }
    else if (window.externalManager) {
        console.log("运行模式: 国小电子书 (理由: 发现 window.externalManager)");
        // 国小电子书页面 - 绕过登录验证
        window.SaveCommForKnshAPIOriginal = window.SaveCommForKnshAPI; // 备份原构造函数
        window.SaveCommForKnshAPI = function() {
            let obj = new SaveCommForKnshAPIOriginal;
            obj.VerifyHasLogin = function(arg) {
                var t = senjClass.GetQueryString("shortcode");
                var n = function(t) {
                    arg && arg.fun && arg.fun(t)
                };
                n({result: true});
                return true;
            }; // 重写
            console.log(obj);
            return obj;
        }; // 重写构造函数
    }
    else if (window.app) {
        console.log("运行模式: 国中电子书 (理由: 发现 window.app)");
        // 国中电子书页面 - 注入下载器
        window.downloadAssets = async function() {
            // 常量定义
            let options = {
                data_prefix: 'https://storage1.knsh.com.tw/WebEbook/',
                data_suffix: '/pageConfig.json',
                image_prefix: '/content/book/'
            }

            // 创建归档实例
            let zip = new JSZip();

            // 获取 ID
            let param = new URLSearchParams(location.search);
            let bookid = param.get('id').split('&')[0];

            // 获取描述
            let manifest_url = options.data_prefix + bookid + options.data_suffix;
            let manifest = await fetch(manifest_url).then(res => {
                return res.json();
            });
            manifest = manifest.content.book;

            // 获取索引
            let pages = [];
            manifest.forEach(function(item, index) {
                pages = pages.concat(item.files.reverse());
            });

            // 获取页
            let Page = async function(url) {
                // 获取数据
                let data = await fetch(url).then(res => {
                    return res.text();
                });
                // 获取路径
                let fromPath = './image';
                let toPath = url.split('/').slice(0, url.split('/').length - 1).join('/') + '/image';
                // 替换 URL
                data = data.replaceAll(fromPath, toPath);
                return data;
            }
            var proc = 0;
            let callback = async (item, index) => {
                // 添加非空页
                if (item != 'empty') {
                    let url = options.data_prefix + bookid + options.image_prefix + item + '.svg';
                    await Page(url).then(content => {
                        zip.file(index + ".svg", content);
                    });
                }
                // 计数并判定结束条件
                proc++;
                if (proc == pages.length) {
                    // 下载归档
                    zip.generateAsync({ type: 'blob' }).then(data => {
                        let Download = document.createElement('a');
                        Download.href = URL.createObjectURL(data);
                        Download.download = 'data.zip';
                        Download.style = 'display: none';
                        document.body.appendChild(Download);
                        Download.click();
                    });
                }
            };
            // 爬取全部页
            for (var i = 0; i < pages.length; i++) {
                callback(pages[i], i);
            }
            // 附: 控制台输入 downloadAssets() 下载
        }
    }
    else {
        console.log('运行模式未知');
    }
})();

使用這個腳本,國中可以,但國小會被要求輸入帳密,請問高手們,是否還要設定什麼呢?

@kerry0112
Copy link

破解程式碼
https://ppt.cc/fuOVtx
需要者可自行使用,原版https://ppt.cc/frXiKx

@kerry0112
Copy link

kerry0112 commented Sep 11, 2024

康軒媒體盒:(2024/9/11)
https://ppt.cc/fZKXBx
(請複製連結後,再打開)

@TRENTREN123456
Copy link

康軒媒體盒:(2024/9/11) https://ppt.cc/fZKXBx (請複製連結後,再打開)

大大你好,複製連結打開後沒有辦法打開媒體盒呢><
想請問上述的CODE是破解康軒的電子書嗎?
自從他更新網頁版本就沒辦法破解了
求求教學
謝謝你

@TRENTREN123456
Copy link

康軒媒體盒:(2024/9/11) https://ppt.cc/fZKXBx (請複製連結後,再打開)

大大你好,複製連結打開後沒有辦法打開媒體盒呢>< 想請問上述的CODE是破解康軒的電子書嗎? 自從他更新網頁版本就沒辦法破解了 求求教學 謝謝你

Uploading Screen Shot 2024-09-12 at 6.32.25 pm.png…

@kerry0112
Copy link

點進去裡面,按下載(另外建立是因為避免康軒媒體盒更新影響到破解)應該就可以了

@TRENTREN123456
Copy link

點進去裡面,按下載(另外建立是因為避免康軒媒體盒更新影響到破解)應該就可以了

我是電腦白痴(啜泣) 請問可不可以幫我下載康軒 Wonder World (7) 六年級上學期的課本
可以付款給您!! 拜託了 急需這本課本..... (掩鼻啜泣)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment