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.

@egfvdf
Copy link

egfvdf commented Sep 14, 2024

誰使用我的腳本遇到問題的可以先看一下控制台中腳本的運行模式調試信息和應該被注入的關鍵變量的值,我在Windows和Linux系統上分別使用Chrome瀏覽器和Edge瀏覽器都沒有遇到需要登陸的情況(設計範圍外的內容除外),不知道BUG出在哪我也沒法修啊(

不過誰需要代下載的我確實可以試試看,網頁端有的可下載資源都可以

求帮助这里的脚本我都用篡改猴试过了都没用

@vochant
Copy link

vochant commented Sep 14, 2024

誰使用我的腳本遇到問題的可以先看一下控制台中腳本的運行模式調試信息和應該被注入的關鍵變量的值,我在Windows和Linux系統上分別使用Chrome瀏覽器和Edge瀏覽器都沒有遇到需要登陸的情況(設計範圍外的內容除外),不知道BUG出在哪我也沒法修啊(
不過誰需要代下載的我確實可以試試看,網頁端有的可下載資源都可以

求帮助这里的脚本我都用篡改猴试过了都没用

麻煩發一下網址,可能是沒有匹配成功

@egfvdf
Copy link

egfvdf commented Sep 14, 2024 via email

@leeleonis
Copy link

誰使用我的腳本遇到問題的可以先看一下控制台中腳本的運行模式調試信息和應該被注入的關鍵變量的值,我在Windows和Linux系統上分別使用Chrome瀏覽器和Edge瀏覽器都沒有遇到需要登陸的情況(設計範圍外的內容除外),不知道BUG出在哪我也沒法修啊(

不過誰需要代下載的我確實可以試試看,網頁端有的可下載資源都可以

請問這腳本是只能登入網頁版嗎
我使用電腦版點下面2個連結,都會轉跳到登入頁面
https://digitalmaster.knsh.com.tw/resource3/國小/113上/01_國語_ch/04_4年級/01_電子書/01_電腦版/113國小國語4上電子書第1-2單元.iso
https://digitalmaster.knsh.com.tw/resource3/國小/113上/01_國語_ch/04_4年級/01_電子書/01_電腦版/113國小國語4上電子書第3-4單元.iso

@vochant
Copy link

vochant commented Sep 16, 2024

誰使用我的腳本遇到問題的可以先看一下控制台中腳本的運行模式調試信息和應該被注入的關鍵變量的值,我在Windows和Linux系統上分別使用Chrome瀏覽器和Edge瀏覽器都沒有遇到需要登陸的情況(設計範圍外的內容除外),不知道BUG出在哪我也沒法修啊(
不過誰需要代下載的我確實可以試試看,網頁端有的可下載資源都可以

請問這腳本是只能登入網頁版嗎 我使用電腦版點下面2個連結,都會轉跳到登入頁面 https://digitalmaster.knsh.com.tw/resource3/國小/113上/01_國語_ch/04_4年級/01_電子書/01_電腦版/113國小國語4上電子書第1-2單元.iso https://digitalmaster.knsh.com.tw/resource3/國小/113上/01_國語_ch/04_4年級/01_電子書/01_電腦版/113國小國語4上電子書第3-4單元.iso

設計範圍是查看電子書,這些因爲涉及到常量,不好弄,我只能想辦法改可寫入的變量破解。我不是什麽專業開發者,我也就是一個初中生(相當於你們這邊的國中生)。誰如果知道用戶脚本怎麽修改常量的可以去試試看。

@DinosaurCIO
Copy link

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

可以再上轉 "破解程式碼" 嗎? 以上連結已不能用. 謝謝!!

@DinosaurCIO
Copy link

康軒的舊版網站頁

請問如何找到 康軒的舊版網站頁? 謝謝

@vochant
Copy link

vochant commented Sep 16, 2024

更新 v2.2 - 一种更妙的破解

  • 把注入 openebook 改为注入 fetch,现在下载或者打开什么东西都能绕登录
    • 若有BUG请联系我
  • 把 window 换成 unsafeWindow,稳定注入
// ==UserScript==
// @name         KNSHUtility
// @namespace    http://vochant.github.io/
// @version      2.2
// @description  KNSH Utility - Cracks & Features
// @author       Mirekintoc (vochant)
// @match        webetextbook.knsh.com.tw/*
// @match        https://digitalmaster.knsh.com.tw/v3/pages/*/index.html*
// @match        https://digitalmaster.knsh.com.tw/ebooks/BookMain/Viewer_A/index.html*
// @icon         https://webetextbook.knsh.com.tw/Ebookvieweran4Teacher/favicon.ico
// @license      MIT
// @grant        unsafeWindow
// @require      https://cdn.bootcdn.net/ajax/libs/jszip/3.10.1/jszip.js
// ==/UserScript==

(function() {
    // 'use strict';
    console.log(unsafeWindow);
    // 页面类型判定
    if (location.href.match(/https:\/\/digitalmaster\.knsh\.com\.tw\/v3\/pages\/.*\/index\.html.*/)) {
        console.log("运行模式: 导览页");
        // 导览页面 - 绕过登录验证
        unsafeWindow.__fetch = unsafeWindow.fetch;
        unsafeWindow.fetch = async function(url, opts) {
            if (url == 'https://digitalmaster.knsh.com.tw/knshAPI/keygrip/verifykeygrip') {
                return {
                    json: function() {
                        return {isValid: true};
                    }
                }
            }
            else return await unsafeWindow.__fetch(url, opts);
        }
    }
    else if (location.href.match(/https:\/\/digitalmaster\.knsh\.com\.tw\/ebooks\/BookMain\/Viewer_A\/index\.html.*/)) {
        console.log("运行模式: 国小电子书 (理由: 发现 unsafeWindow.externalManager)");
        // 国小电子书页面 - 绕过登录验证
        unsafeWindow.SaveCommForKnshAPIOriginal = unsafeWindow.SaveCommForKnshAPI; // 备份原构造函数
        unsafeWindow.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 (location.href.match(/https:\/\/webetextbook\.knsh\.com\.tw\/Ebookvieweran4Teacher\/index\.html.*/)) {
        console.log("运行模式: 国中电子书 (理由: 发现 unsafeWindow.app)");
        // 国中电子书页面 - 注入下载器
        unsafeWindow.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('运行模式未知');
    }
})();

@leeleonis
Copy link

更新 v2.2 - 一种更妙的破解

  • 把注入 openebook 改为注入 fetch,现在下载或者打开什么东西都能绕登录

    • 若有BUG请联系我
  • 把 window 换成 unsafeWindow,稳定注入

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

(function() {
    // 'use strict';
    console.log(unsafeWindow);
    // 页面类型判定
    if (location.href.match(/https:\/\/digitalmaster\.knsh\.com\.tw\/v3\/pages\/.*\/index\.html.*/)) {
        console.log("运行模式: 导览页");
        // 导览页面 - 绕过登录验证
        unsafeWindow.__fetch = unsafeWindow.fetch;
        unsafeWindow.fetch = async function(url, opts) {
            if (url == 'https://digitalmaster.knsh.com.tw/knshAPI/keygrip/verifykeygrip') {
                return {
                    json: function() {
                        return {isValid: true};
                    }
                }
            }
            else return await unsafeWindow.__fetch(url, opts);
        }
    }
    else if (location.href.match(/https:\/\/digitalmaster\.knsh\.com\.tw\/ebooks\/BookMain\/Viewer_A\/index\.html.*/)) {
        console.log("运行模式: 国小电子书 (理由: 发现 unsafeWindow.externalManager)");
        // 国小电子书页面 - 绕过登录验证
        unsafeWindow.SaveCommForKnshAPIOriginal = unsafeWindow.SaveCommForKnshAPI; // 备份原构造函数
        unsafeWindow.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 (location.href.match(/https:\/\/webetextbook\.knsh\.com\.tw\/Ebookvieweran4Teacher\/index\.html.*/)) {
        console.log("运行模式: 国中电子书 (理由: 发现 unsafeWindow.app)");
        // 国中电子书页面 - 注入下载器
        unsafeWindow.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('运行模式未知');
    }
})();

試過可以用了

@J56tw
Copy link

J56tw commented Sep 17, 2024

更新 v2.2 - 一种更妙的破解

  • 把注入 openebook 改为注入 fetch,现在下载或者打开什么东西都能绕登录

    • 若有BUG请联系我
  • 把 window 换成 unsafeWindow,稳定注入

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

(function() {
    // 'use strict';
    console.log(unsafeWindow);
    // 页面类型判定
    if (location.href.match(/https:\/\/digitalmaster\.knsh\.com\.tw\/v3\/pages\/.*\/index\.html.*/)) {
        console.log("运行模式: 导览页");
        // 导览页面 - 绕过登录验证
        unsafeWindow.__fetch = unsafeWindow.fetch;
        unsafeWindow.fetch = async function(url, opts) {
            if (url == 'https://digitalmaster.knsh.com.tw/knshAPI/keygrip/verifykeygrip') {
                return {
                    json: function() {
                        return {isValid: true};
                    }
                }
            }
            else return await unsafeWindow.__fetch(url, opts);
        }
    }
    else if (location.href.match(/https:\/\/digitalmaster\.knsh\.com\.tw\/ebooks\/BookMain\/Viewer_A\/index\.html.*/)) {
        console.log("运行模式: 国小电子书 (理由: 发现 unsafeWindow.externalManager)");
        // 国小电子书页面 - 绕过登录验证
        unsafeWindow.SaveCommForKnshAPIOriginal = unsafeWindow.SaveCommForKnshAPI; // 备份原构造函数
        unsafeWindow.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 (location.href.match(/https:\/\/webetextbook\.knsh\.com\.tw\/Ebookvieweran4Teacher\/index\.html.*/)) {
        console.log("运行模式: 国中电子书 (理由: 发现 unsafeWindow.app)");
        // 国中电子书页面 - 注入下载器
        unsafeWindow.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('运行模式未知');
    }
})();

不好意思,為什麼我測試不行?
VM58:18 Uncaught ReferenceError: unsafeWindow is not defined at <anonymous>:18:17 at <anonymous>:130:3

@vochant
Copy link

vochant commented Sep 17, 2024

更新 v2.2 - 一种更妙的破解

  • 把注入 openebook 改为注入 fetch,现在下载或者打开什么东西都能绕登录

    • 若有BUG请联系我
  • 把 window 换成 unsafeWindow,稳定注入

// ==UserScript==
// @name         KNSHUtility
// @namespace    http://vochant.github.io/
// @version      2.2
// @description  KNSH Utility - Cracks & Features
// @author       Mirekintoc (vochant)
...

不好意思,為什麼我測試不行? VM58:18 Uncaught ReferenceError: unsafeWindow is not defined at <anonymous>:18:17 at <anonymous>:130:3

你是用F12控制臺運行的?用Tampermonkey,要麽就把unsafeWindow換成window

@J56tw
Copy link

J56tw commented Sep 17, 2024

更新 v2.2 - 一种更妙的破解

  • 把注入 openebook 改为注入 fetch,现在下载或者打开什么东西都能绕登录

    • 若有BUG请联系我
  • 把 window 换成 unsafeWindow,稳定注入

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

(function() {
    // 'use strict';
    console.log(unsafeWindow);
    // 页面类型判定
    if (location.href.match(/https:\/\/digitalmaster\.knsh\.com\.tw\/v3\/pages\/.*\/index\.html.*/)) {
        console.log("运行模式: 导览页");
        // 导览页面 - 绕过登录验证
        unsafeWindow.__fetch = unsafeWindow.fetch;
        unsafeWindow.fetch = async function(url, opts) {
            if (url == 'https://digitalmaster.knsh.com.tw/knshAPI/keygrip/verifykeygrip') {
                return {
                    json: function() {
                        return {isValid: true};
                    }
                }
            }
            else return await unsafeWindow.__fetch(url, opts);
        }
    }
    else if (location.href.match(/https:\/\/digitalmaster\.knsh\.com\.tw\/ebooks\/BookMain\/Viewer_A\/index\.html.*/)) {
        console.log("运行模式: 国小电子书 (理由: 发现 unsafeWindow.externalManager)");
        // 国小电子书页面 - 绕过登录验证
        unsafeWindow.SaveCommForKnshAPIOriginal = unsafeWindow.SaveCommForKnshAPI; // 备份原构造函数
        unsafeWindow.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 (location.href.match(/https:\/\/webetextbook\.knsh\.com\.tw\/Ebookvieweran4Teacher\/index\.html.*/)) {
        console.log("运行模式: 国中电子书 (理由: 发现 unsafeWindow.app)");
        // 国中电子书页面 - 注入下载器
        unsafeWindow.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('运行模式未知');
    }
})();

不好意思,為什麼我測試不行? VM58:18 Uncaught ReferenceError: unsafeWindow is not defined at <anonymous>:18:17 at <anonymous>:130:3

好的!了解!謝謝!

@Kyanchou
Copy link

謝謝您
這個連結https://github.com/evonisme/knsh 不能用了
能否將康軒的方法寄給我呢?
我的email:
[email protected] 感謝!!

@TCCen
Copy link

TCCen commented Sep 18, 2024

請問有人是否可以提供康軒數位高手帳密嗎?或是能否將康軒的方法寄給我呢?

email:[email protected]

感恩!

@TCCen
Copy link

TCCen commented Sep 18, 2024 via email

@amy76121
Copy link

amy76121 commented Sep 19, 2024 via email

@t4232516
Copy link

有康軒影片破解法的教學嗎?
謝謝!!

@Wikguy
Copy link

Wikguy commented Sep 20, 2024

@evonisme 大大的方法使用後確認沒有問題,步驟清楚明白又簡單,超級感謝您。
需要康軒資源的可以參考e大 康軒免登說明

@Waiting421
Copy link

@evonisme 想請問能夠破解康軒的出題高手麻嗎QQ

@shulin338813
Copy link

@t4232516 請留EMAIL 我發給你

@amy76121
Copy link

amy76121 commented Sep 25, 2024 via email

@shulin338813
Copy link

@.*** shulin338813 @.>於2024年9月25日週三5:09寫道:
……
@.
* 對此要點發表了評論。 ------------------------------ @t4232516 < https://github.com/t4232516 > 請留EMAIL 我寄給你— Reply to this email directly, view it on GitHub < https://gist.github.com/aliyaliu368/891eef75e09494e965d291ead4a80d17#gistcomment-5206921 > 10821> SU2RXWGE6YTJDZYJ4VTBFKMF2HI4TJMJ2XIZLTSKBKK5TBNR2WLJDUOJ2WLJDOMFWWLO3UNBZGKYLEL5YGC4TUNF GLK2HNFZXIQ3PNVWWK3TUUZ2G64DJMNZZDAVEOR4XAZNEM5UXG5FFOZQWY5LFVEYTCOJUGU3TENJSU52HE2LHM5SXFJTDOJSWC5DF > .您收到這封電子郵件是因為您對該主題發表了評論。使用適用於 iOS < https://apps.apple.com/app/apple-store/id1477376905?ct=notification-email&mt=8&pt=524675 > 或 Android < https://play.google 的GitHub Mobile 隨時隨地分類通知

請留EMAIL 我發給你

@may77130
Copy link

麻煩可否提供康軒電子書破解的方法謝謝[email protected]

@yoyo-153
Copy link

yoyo-153 commented Sep 26, 2024

請問康軒的怎麼進去呢?有人可以指導嗎?謝謝[email protected]

@shulin338813
Copy link

@yoyo-153 > 請問康軒的怎麼走呢?

信箱錯誤無法發信給你

@Jetfuhong
Copy link

有私藏的康軒藏密

@Jetfuhong
Copy link

誰要?

@Jetfuhong
Copy link

請問南一版本還有辦法進入嗎 上面帳密都失效了

南一的帳號可以自己建

@TRENTREN123456
Copy link

誰要?
我要~~~~~><
謝謝你!

[email protected]

@maggiegini6815
Copy link

maggiegini6815 commented Sep 29, 2024 via email

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